codexmate 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/README.vi.md +6 -3
- package/README.zh.md +6 -3
- package/cli/system-prompt-files.js +177 -0
- package/cli.js +27 -0
- package/package.json +1 -1
- package/skills/{codexmate-project-context-recovery → context-recovery}/SKILL.md +2 -2
- package/web-ui/app.js +19 -0
- package/web-ui/modules/app.computed.session.mjs +1 -1
- package/web-ui/modules/app.methods.agents.mjs +5 -12
- package/web-ui/modules/app.methods.index.mjs +2 -0
- package/web-ui/modules/app.methods.session-actions.mjs +27 -0
- package/web-ui/modules/app.methods.session-browser.mjs +21 -1
- package/web-ui/modules/app.methods.session-trash.mjs +5 -0
- package/web-ui/modules/app.methods.system-prompt.mjs +294 -0
- package/web-ui/modules/i18n/locales/en.mjs +29 -0
- package/web-ui/modules/i18n/locales/ja.mjs +43 -0
- package/web-ui/modules/i18n/locales/vi.mjs +27 -0
- package/web-ui/modules/i18n/locales/zh-tw.mjs +27 -0
- package/web-ui/modules/i18n/locales/zh.mjs +27 -0
- package/web-ui/modules/request-token.mjs +9 -0
- package/web-ui/partials/index/panel-prompts.html +96 -1
- package/web-ui/partials/index/panel-settings.html +0 -23
- package/web-ui/partials/index/panel-trash.html +36 -1
- package/web-ui/res/web-ui-render.precompiled.js +750 -456
- package/web-ui/session-helpers.mjs +9 -0
- package/web-ui/styles/responsive.css +18 -0
- package/web-ui/styles/sessions-list.css +5 -0
- package/web-ui/styles/sessions-usage.css +20 -1
- package/web-ui/styles/system-prompt.css +23 -0
- package/web-ui/styles/trash-panel.css +9 -0
- package/web-ui/styles.css +1 -0
- /package/skills/{codexmate-project-context-recovery → context-recovery}/scripts/search_sessions.py +0 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildAgentsDiffPreview,
|
|
3
|
+
buildAgentsDiffPreviewRequest,
|
|
4
|
+
isAgentsDiffPreviewPayloadTooLarge,
|
|
5
|
+
shouldApplyAgentsDiffPreviewResponse
|
|
6
|
+
} from '../logic.mjs';
|
|
7
|
+
import { issueLatestRequestToken, isLatestRequestToken } from './request-token.mjs';
|
|
8
|
+
|
|
9
|
+
export function createSystemPromptMethods(options = {}) {
|
|
10
|
+
const {
|
|
11
|
+
api,
|
|
12
|
+
apiWithMeta
|
|
13
|
+
} = options;
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
|
|
17
|
+
switchSysPromptScope(scope) {
|
|
18
|
+
if (this.sysPromptLoading || this.sysPromptSaving) return;
|
|
19
|
+
const normalized = scope === 'project' ? scope : 'global';
|
|
20
|
+
if (normalized === this.sysPromptScope) return;
|
|
21
|
+
this.sysPromptScope = normalized;
|
|
22
|
+
this.loadSystemPrompt();
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
switchSysPromptMode(mode) {
|
|
26
|
+
if (this.sysPromptLoading || this.sysPromptSaving) return;
|
|
27
|
+
const normalized = mode === 'system' ? mode : 'append';
|
|
28
|
+
if (normalized === this.sysPromptMode) return;
|
|
29
|
+
this.sysPromptMode = normalized;
|
|
30
|
+
this.loadSystemPrompt();
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
resetSysPromptDiffState() {
|
|
34
|
+
this.sysPromptDiffVisible = false;
|
|
35
|
+
this.sysPromptDiffLoading = false;
|
|
36
|
+
this.sysPromptDiffError = '';
|
|
37
|
+
this.sysPromptDiffLines = [];
|
|
38
|
+
this.sysPromptDiffStats = { added: 0, removed: 0, unchanged: 0 };
|
|
39
|
+
this.sysPromptDiffTruncated = false;
|
|
40
|
+
this.sysPromptDiffHasChangesValue = false;
|
|
41
|
+
this.sysPromptDiffFingerprint = '';
|
|
42
|
+
this._sysPromptDiffPreviewRequestToken = null;
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
hasSysPromptContentChanged() {
|
|
46
|
+
const original = typeof this.sysPromptOriginalContent === 'string' ? this.sysPromptOriginalContent : '';
|
|
47
|
+
const current = typeof this.sysPromptContent === 'string' ? this.sysPromptContent : '';
|
|
48
|
+
return original !== current;
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
buildSysPromptDiffFingerprint() {
|
|
52
|
+
const scope = this.sysPromptScope || 'global';
|
|
53
|
+
const mode = this.sysPromptMode || 'append';
|
|
54
|
+
const content = typeof this.sysPromptContent === 'string' ? this.sysPromptContent : '';
|
|
55
|
+
const original = typeof this.sysPromptOriginalContent === 'string' ? this.sysPromptOriginalContent : '';
|
|
56
|
+
return `${scope}::${mode}::${content.length}::${content}::${original.length}::${original}`;
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
async loadSystemPrompt() {
|
|
60
|
+
const requestToken = issueLatestRequestToken(this, '_sysPromptOpenRequestToken');
|
|
61
|
+
this.sysPromptLoading = true;
|
|
62
|
+
this.resetSysPromptDiffState();
|
|
63
|
+
try {
|
|
64
|
+
const params = {
|
|
65
|
+
scope: this.sysPromptScope || 'global',
|
|
66
|
+
mode: this.sysPromptMode || 'append'
|
|
67
|
+
};
|
|
68
|
+
const res = await api('get-system-prompt', params);
|
|
69
|
+
if (!isLatestRequestToken(this, '_sysPromptOpenRequestToken', requestToken)) return;
|
|
70
|
+
if (res.error) {
|
|
71
|
+
this.showMessage(res.error, 'error');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this.sysPromptContent = res.content || '';
|
|
75
|
+
this.sysPromptOriginalContent = this.sysPromptContent;
|
|
76
|
+
this.sysPromptPath = res.path || '';
|
|
77
|
+
this.sysPromptExists = !!res.exists;
|
|
78
|
+
this.sysPromptHash = res.hash || '';
|
|
79
|
+
} catch (e) {
|
|
80
|
+
if (!isLatestRequestToken(this, '_sysPromptOpenRequestToken', requestToken)) return;
|
|
81
|
+
this.showMessage(this.t('toast.load.fail'), 'error');
|
|
82
|
+
} finally {
|
|
83
|
+
if (isLatestRequestToken(this, '_sysPromptOpenRequestToken', requestToken)) {
|
|
84
|
+
this.sysPromptLoading = false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
async prepareSysPromptDiff() {
|
|
90
|
+
const requestFingerprint = this.buildSysPromptDiffFingerprint();
|
|
91
|
+
const requestToken = Symbol('sys-prompt-diff-preview');
|
|
92
|
+
this._sysPromptDiffPreviewRequestToken = requestToken;
|
|
93
|
+
this.sysPromptDiffVisible = true;
|
|
94
|
+
this.sysPromptDiffLoading = true;
|
|
95
|
+
this.sysPromptDiffError = '';
|
|
96
|
+
this.sysPromptDiffLines = [];
|
|
97
|
+
this.sysPromptDiffStats = { added: 0, removed: 0, unchanged: 0 };
|
|
98
|
+
this.sysPromptDiffTruncated = false;
|
|
99
|
+
this.sysPromptDiffHasChangesValue = false;
|
|
100
|
+
try {
|
|
101
|
+
const shouldApplyPreviewState = () => shouldApplyAgentsDiffPreviewResponse({
|
|
102
|
+
isVisible: this.sysPromptDiffVisible,
|
|
103
|
+
requestToken,
|
|
104
|
+
activeRequestToken: this._sysPromptDiffPreviewRequestToken,
|
|
105
|
+
requestFingerprint,
|
|
106
|
+
currentFingerprint: this.buildSysPromptDiffFingerprint()
|
|
107
|
+
});
|
|
108
|
+
const applyPreviewState = (diff) => {
|
|
109
|
+
if (!shouldApplyPreviewState()) return false;
|
|
110
|
+
const normalizedDiff = diff && typeof diff === 'object' ? diff : {};
|
|
111
|
+
const rawLines = Array.isArray(normalizedDiff.lines) ? normalizedDiff.lines : [];
|
|
112
|
+
this.sysPromptDiffLines = rawLines.filter(line => line && line.type);
|
|
113
|
+
this.sysPromptDiffTruncated = !!normalizedDiff.truncated;
|
|
114
|
+
this.sysPromptDiffHasChangesValue = !!normalizedDiff.hasChanges;
|
|
115
|
+
if (normalizedDiff.stats && typeof normalizedDiff.stats === 'object') {
|
|
116
|
+
this.sysPromptDiffStats = {
|
|
117
|
+
added: Number(normalizedDiff.stats.added || 0),
|
|
118
|
+
removed: Number(normalizedDiff.stats.removed || 0),
|
|
119
|
+
unchanged: Number(normalizedDiff.stats.unchanged || 0)
|
|
120
|
+
};
|
|
121
|
+
} else {
|
|
122
|
+
const stats = { added: 0, removed: 0, unchanged: 0 };
|
|
123
|
+
for (const line of this.sysPromptDiffLines) {
|
|
124
|
+
if (line && line.type === 'add') stats.added += 1;
|
|
125
|
+
else if (line && line.type === 'del') stats.removed += 1;
|
|
126
|
+
else stats.unchanged += 1;
|
|
127
|
+
}
|
|
128
|
+
this.sysPromptDiffStats = stats;
|
|
129
|
+
}
|
|
130
|
+
this.sysPromptDiffFingerprint = requestFingerprint;
|
|
131
|
+
return true;
|
|
132
|
+
};
|
|
133
|
+
const previewRequest = buildAgentsDiffPreviewRequest({
|
|
134
|
+
baseContent: this.sysPromptOriginalContent,
|
|
135
|
+
content: this.sysPromptContent,
|
|
136
|
+
lineEnding: '\n',
|
|
137
|
+
context: 'sys-prompt',
|
|
138
|
+
baseDir: undefined
|
|
139
|
+
});
|
|
140
|
+
if (previewRequest.exceedsBodyLimit) {
|
|
141
|
+
applyPreviewState(buildAgentsDiffPreview({
|
|
142
|
+
baseContent: this.sysPromptOriginalContent,
|
|
143
|
+
content: this.sysPromptContent
|
|
144
|
+
}));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const rpcParams = {
|
|
148
|
+
...previewRequest.params,
|
|
149
|
+
scope: this.sysPromptScope || 'global',
|
|
150
|
+
mode: this.sysPromptMode || 'append'
|
|
151
|
+
};
|
|
152
|
+
const res = await apiWithMeta('preview-system-prompt-diff', rpcParams);
|
|
153
|
+
if (!shouldApplyPreviewState()) return;
|
|
154
|
+
if (res.error) {
|
|
155
|
+
if (isAgentsDiffPreviewPayloadTooLarge(res)) {
|
|
156
|
+
applyPreviewState(buildAgentsDiffPreview({
|
|
157
|
+
baseContent: this.sysPromptOriginalContent,
|
|
158
|
+
content: this.sysPromptContent
|
|
159
|
+
}));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
this.sysPromptDiffError = res.error;
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
applyPreviewState(res.diff);
|
|
166
|
+
} catch (e) {
|
|
167
|
+
if (shouldApplyAgentsDiffPreviewResponse({
|
|
168
|
+
isVisible: this.sysPromptDiffVisible,
|
|
169
|
+
requestToken,
|
|
170
|
+
activeRequestToken: this._sysPromptDiffPreviewRequestToken,
|
|
171
|
+
requestFingerprint,
|
|
172
|
+
currentFingerprint: this.buildSysPromptDiffFingerprint()
|
|
173
|
+
})) {
|
|
174
|
+
this.sysPromptDiffError = '生成差异失败';
|
|
175
|
+
}
|
|
176
|
+
} finally {
|
|
177
|
+
if (this._sysPromptDiffPreviewRequestToken === requestToken) {
|
|
178
|
+
this.sysPromptDiffLoading = false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
cancelSysPromptEdit() {
|
|
184
|
+
if (this.sysPromptSaving || this.sysPromptDiffLoading) return;
|
|
185
|
+
this.resetSysPromptDiffState();
|
|
186
|
+
this.loadSystemPrompt();
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
async applySystemPrompt() {
|
|
190
|
+
if (this.sysPromptSaving) return;
|
|
191
|
+
if (!this.sysPromptDiffVisible) {
|
|
192
|
+
if (!this.hasSysPromptContentChanged()) {
|
|
193
|
+
this.showMessage(this.t('toast.noChanges'), 'info');
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
await this.prepareSysPromptDiff();
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (this.sysPromptDiffLoading) return;
|
|
200
|
+
if (this.sysPromptDiffError) {
|
|
201
|
+
this.showMessage(this.sysPromptDiffError, 'error');
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const fingerprint = this.buildSysPromptDiffFingerprint();
|
|
205
|
+
if (this.sysPromptDiffFingerprint !== fingerprint) {
|
|
206
|
+
await this.prepareSysPromptDiff();
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (!this.sysPromptDiffHasChangesValue) {
|
|
210
|
+
this.showMessage(this.t('toast.noChanges'), 'info');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.sysPromptSaving = true;
|
|
214
|
+
try {
|
|
215
|
+
const params = {
|
|
216
|
+
scope: this.sysPromptScope || 'global',
|
|
217
|
+
mode: this.sysPromptMode || 'append',
|
|
218
|
+
content: this.sysPromptContent,
|
|
219
|
+
baseHash: this.sysPromptHash
|
|
220
|
+
};
|
|
221
|
+
const res = await api('apply-system-prompt', params);
|
|
222
|
+
if (res.error) {
|
|
223
|
+
this.showMessage(res.error, 'error');
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
this.showMessage(this.t('sysPrompt.toast.saved'), 'success');
|
|
227
|
+
await this.loadSystemPrompt();
|
|
228
|
+
} catch (e) {
|
|
229
|
+
this.showMessage(this.t('toast.save.fail'), 'error');
|
|
230
|
+
} finally {
|
|
231
|
+
this.sysPromptSaving = false;
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
copySysPromptContent() {
|
|
236
|
+
const content = typeof this.sysPromptContent === 'string' ? this.sysPromptContent : '';
|
|
237
|
+
if (!content) return;
|
|
238
|
+
try {
|
|
239
|
+
navigator.clipboard?.writeText(content);
|
|
240
|
+
this.showMessage(this.t('common.copy'), 'success');
|
|
241
|
+
} catch (_) {}
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
exportSysPromptContent() {
|
|
245
|
+
const content = typeof this.sysPromptContent === 'string' ? this.sysPromptContent : '';
|
|
246
|
+
if (!content) return;
|
|
247
|
+
const filename = (this.sysPromptMode === 'system' ? 'SYSTEM.md' : 'APPEND_SYSTEM.md');
|
|
248
|
+
const blob = new Blob([content], { type: 'text/markdown' });
|
|
249
|
+
const a = document.createElement('a');
|
|
250
|
+
a.href = URL.createObjectURL(blob);
|
|
251
|
+
a.download = filename;
|
|
252
|
+
document.body.appendChild(a);
|
|
253
|
+
a.click();
|
|
254
|
+
a.remove();
|
|
255
|
+
URL.revokeObjectURL(a.href);
|
|
256
|
+
},
|
|
257
|
+
|
|
258
|
+
async pasteSysPromptContent() {
|
|
259
|
+
if (this.sysPromptLoading || this.sysPromptSaving || this.sysPromptDiffVisible) return;
|
|
260
|
+
try {
|
|
261
|
+
const text = await navigator.clipboard.readText();
|
|
262
|
+
if (text) {
|
|
263
|
+
this.sysPromptContent = text;
|
|
264
|
+
this.showMessage(this.t('common.paste'), 'success');
|
|
265
|
+
}
|
|
266
|
+
} catch (_) {}
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
sysPromptContextHint() {
|
|
270
|
+
if (!this.sysPromptLoading && !this.sysPromptDiffVisible && this.hasSysPromptContentChanged()) {
|
|
271
|
+
return { text: this.t('sysPrompt.hint.unsaved'), warn: true };
|
|
272
|
+
}
|
|
273
|
+
if (this.sysPromptDiffVisible && (this.sysPromptDiffLoading || this.sysPromptSaving)) {
|
|
274
|
+
return { text: this.t('diff.hint.busy'), warn: false };
|
|
275
|
+
}
|
|
276
|
+
if (this.sysPromptDiffVisible && this.sysPromptDiffError) {
|
|
277
|
+
return { text: this.t('diff.hint.failedBack'), warn: false };
|
|
278
|
+
}
|
|
279
|
+
if (this.sysPromptDiffVisible && !this.sysPromptDiffHasChangesValue) {
|
|
280
|
+
return { text: this.t('diff.hint.noChangesBack'), warn: false };
|
|
281
|
+
}
|
|
282
|
+
if (this.sysPromptDiffVisible && this.sysPromptDiffTruncated) {
|
|
283
|
+
return { text: this.t('diff.viewHint.truncated'), warn: false };
|
|
284
|
+
}
|
|
285
|
+
if (this.sysPromptDiffVisible) {
|
|
286
|
+
return { text: this.t('diff.viewHint.preview'), warn: false };
|
|
287
|
+
}
|
|
288
|
+
if (!this.sysPromptLoading) {
|
|
289
|
+
return { text: this.t('sysPrompt.hint.twoStepSave'), warn: false };
|
|
290
|
+
}
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
}
|
|
@@ -42,6 +42,8 @@ const en = Object.freeze({
|
|
|
42
42
|
'common.refresh': 'Refresh',
|
|
43
43
|
'common.refreshing': 'Refreshing...',
|
|
44
44
|
'common.loading': 'Loading...',
|
|
45
|
+
'common.menu': 'Menu',
|
|
46
|
+
'common.registry': 'Registry',
|
|
45
47
|
'common.saving': 'Saving...',
|
|
46
48
|
'common.sending': 'Sending...',
|
|
47
49
|
'common.scanning': 'Scanning...',
|
|
@@ -68,6 +70,7 @@ const en = Object.freeze({
|
|
|
68
70
|
'common.notConfigured': 'Not configured',
|
|
69
71
|
'common.enabled': 'Enabled',
|
|
70
72
|
'common.disabled': 'Disabled',
|
|
73
|
+
'common.retry': 'Retry',
|
|
71
74
|
'cli.missing.title': '{name} CLI not installed',
|
|
72
75
|
'cli.missing.subtitle': 'Install {name} CLI before using this page.',
|
|
73
76
|
'cli.missing.openDocs': 'Open install guide',
|
|
@@ -89,6 +92,7 @@ const en = Object.freeze({
|
|
|
89
92
|
'field.apiEndpoint': 'API endpoint',
|
|
90
93
|
'field.apiKey': 'API key',
|
|
91
94
|
'field.baseUrl': 'Base URL',
|
|
95
|
+
'field.url': 'URL',
|
|
92
96
|
'field.provider': 'Provider',
|
|
93
97
|
'field.providerName': 'Provider name',
|
|
94
98
|
'field.modelName': 'Model name',
|
|
@@ -227,6 +231,7 @@ const en = Object.freeze({
|
|
|
227
231
|
'subtitle.prompts': 'Edit AGENTS.md and CLAUDE.md.',
|
|
228
232
|
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
229
233
|
'prompts.subTab.project': 'CLAUDE.md',
|
|
234
|
+
'prompts.subTab.system': 'System Prompt',
|
|
230
235
|
'prompts.subTab.presets': 'Preset pool',
|
|
231
236
|
'prompts.presets.title': 'Presets',
|
|
232
237
|
'prompts.presets.hint': 'Manage presets.',
|
|
@@ -459,6 +464,7 @@ const en = Object.freeze({
|
|
|
459
464
|
'toast.templates.builtinNotDuplicable': 'Built-in templates cannot be duplicated',
|
|
460
465
|
'toast.templates.builtinNotDeletable': 'Built-in templates cannot be deleted',
|
|
461
466
|
'toast.operation.success': 'Operation successful',
|
|
467
|
+
'toast.operation.fail': 'Operation failed',
|
|
462
468
|
'toast.load.fail': 'Failed to load file',
|
|
463
469
|
'toast.apply.success': 'Configuration applied',
|
|
464
470
|
'toast.apply.fail': 'Failed to apply configuration',
|
|
@@ -915,6 +921,11 @@ const en = Object.freeze({
|
|
|
915
921
|
'config.template.editFirst': 'Edit template first, then apply.',
|
|
916
922
|
'config.template.bridgeCodexOnly': '{hint} template is editable in Codex mode only.',
|
|
917
923
|
'config.localBridge.enabledCount': '{enabled}/{total} enabled',
|
|
924
|
+
'config.localBridge.poolSettings': 'Pool settings',
|
|
925
|
+
'config.localBridge.poolHint': 'Select candidate providers to join load balancing.',
|
|
926
|
+
'config.localBridge.noProviders': 'No candidate providers available. Add a direct provider first.',
|
|
927
|
+
'config.transformProvider.title': 'Using transform provider',
|
|
928
|
+
'config.providerBridgeHint': '{label} bridge mode',
|
|
918
929
|
'config.template.openEditor': 'Open template editor',
|
|
919
930
|
'modal.configTemplate.title': 'Config template editor (manual confirm)',
|
|
920
931
|
'modal.configTemplate.placeholder': 'Edit config.toml template here',
|
|
@@ -1319,6 +1330,8 @@ const en = Object.freeze({
|
|
|
1319
1330
|
'settings.claude.meta': 'Backup / import ~/.claude',
|
|
1320
1331
|
'settings.codex.title': 'Codex config',
|
|
1321
1332
|
'settings.codex.meta': 'Backup / import ~/.codex',
|
|
1333
|
+
'settings.backup.title': 'Data backup',
|
|
1334
|
+
'settings.backup.meta': 'Export / import Claude and Codex config',
|
|
1322
1335
|
'settings.backup.progress': 'Backing up {percent}%',
|
|
1323
1336
|
'settings.backup.oneClickClaude': 'Backup ~/.claude',
|
|
1324
1337
|
'settings.backup.importClaude': 'Import ~/.claude backup',
|
|
@@ -1384,6 +1397,12 @@ const en = Object.freeze({
|
|
|
1384
1397
|
'settings.trash.retentionLabel': 'Retention days',
|
|
1385
1398
|
'settings.trash.retentionUnit': 'days',
|
|
1386
1399
|
'settings.trash.retentionHint': 'Range 1-365 days, default 30. Expired entries are purged on each trash load.',
|
|
1400
|
+
'settings.trash.count': '{count} item(s)',
|
|
1401
|
+
'settings.trash.retentionShort': 'Kept {days} days',
|
|
1402
|
+
'settings.trash.disabled': 'Trash is disabled',
|
|
1403
|
+
'settings.trash.disabledHint': 'Deleted sessions are permanently removed and no longer move to trash.',
|
|
1404
|
+
'settings.trash.clearShort': 'Clear',
|
|
1405
|
+
'settings.trash.loadMoreItems': 'Load more (remaining {count})',
|
|
1387
1406
|
|
|
1388
1407
|
'settings.webhook.title': 'Webhook',
|
|
1389
1408
|
'settings.webhook.meta': 'Send event notifications to an external service',
|
|
@@ -1557,6 +1576,16 @@ const en = Object.freeze({
|
|
|
1557
1576
|
'kilocode.writeRequired': 'Enable KiloCode write access first',
|
|
1558
1577
|
'kilocode.saved': 'KiloCode config saved',
|
|
1559
1578
|
'kilocode.autoSaved': 'KiloCode config synced',
|
|
1579
|
+
'sysPrompt.scope.label': 'Scope',
|
|
1580
|
+
'sysPrompt.scope.global': 'Global (~/.pi/agent/)',
|
|
1581
|
+
'sysPrompt.scope.project': 'Project (<cwd>/.pi/)',
|
|
1582
|
+
'sysPrompt.mode.label': 'Mode',
|
|
1583
|
+
'sysPrompt.mode.append': 'Append to default prompt (APPEND_SYSTEM.md)',
|
|
1584
|
+
'sysPrompt.mode.system': 'Replace default prompt (SYSTEM.md)',
|
|
1585
|
+
'sysPrompt.placeholder': 'Type system prompt content here…',
|
|
1586
|
+
'sysPrompt.hint.unsaved': 'Unsaved changes detected',
|
|
1587
|
+
'sysPrompt.hint.twoStepSave': 'Click preview to see the diff, then confirm to save.',
|
|
1588
|
+
'sysPrompt.toast.saved': 'System prompt saved',
|
|
1560
1589
|
});
|
|
1561
1590
|
|
|
1562
1591
|
export { en };
|
|
@@ -43,6 +43,8 @@ const ja = Object.freeze({
|
|
|
43
43
|
'common.refresh': '更新',
|
|
44
44
|
'common.refreshing': '更新中...',
|
|
45
45
|
'common.loading': '読み込み中...',
|
|
46
|
+
'common.menu': 'メニュー',
|
|
47
|
+
'common.registry': 'レジストリ',
|
|
46
48
|
'common.saving': '保存中...',
|
|
47
49
|
'common.sending': '送信中...',
|
|
48
50
|
'common.scanning': 'スキャン中...',
|
|
@@ -69,6 +71,7 @@ const ja = Object.freeze({
|
|
|
69
71
|
'common.notConfigured': '未設定',
|
|
70
72
|
'common.enabled': '有効',
|
|
71
73
|
'common.disabled': '無効',
|
|
74
|
+
'common.retry': '再試行',
|
|
72
75
|
'cli.missing.title': '{name} CLI がインストールされていません',
|
|
73
76
|
'cli.missing.subtitle': '{name} CLI をインストールしてからこのページをご利用ください。',
|
|
74
77
|
'cli.missing.openDocs': 'インストールガイドを開く',
|
|
@@ -90,6 +93,7 @@ const ja = Object.freeze({
|
|
|
90
93
|
'field.apiEndpoint': 'API エンドポイント',
|
|
91
94
|
'field.apiKey': '認証キー',
|
|
92
95
|
'field.baseUrl': 'Base URL',
|
|
96
|
+
'field.url': 'URL',
|
|
93
97
|
'field.provider': 'プロバイダー',
|
|
94
98
|
'field.providerName': 'プロバイダー名',
|
|
95
99
|
'field.modelName': 'モデル名',
|
|
@@ -228,6 +232,7 @@ const ja = Object.freeze({
|
|
|
228
232
|
'subtitle.prompts': 'AGENTS.md と CLAUDE.md を編集。',
|
|
229
233
|
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
230
234
|
'prompts.subTab.project': 'CLAUDE.md',
|
|
235
|
+
'prompts.subTab.system': 'System Prompt',
|
|
231
236
|
'prompts.subTab.presets': 'プリセット',
|
|
232
237
|
'prompts.presets.title': 'プリセット',
|
|
233
238
|
'prompts.presets.hint': 'プリセットを管理します。',
|
|
@@ -465,6 +470,7 @@ const ja = Object.freeze({
|
|
|
465
470
|
'toast.templates.deleteConfirm': '削除',
|
|
466
471
|
'toast.templates.deleteCancel': 'キャンセル',
|
|
467
472
|
'toast.operation.success': '操作が成功しました',
|
|
473
|
+
'toast.operation.fail': '操作に失敗しました',
|
|
468
474
|
'toast.load.fail': 'ファイルの読み込みに失敗しました',
|
|
469
475
|
'toast.apply.success': '設定が適用されました',
|
|
470
476
|
'toast.apply.fail': '設定の適用に失敗しました',
|
|
@@ -666,6 +672,20 @@ const ja = Object.freeze({
|
|
|
666
672
|
'sessions.preview.moving': '移動中...',
|
|
667
673
|
'sessions.preview.export': 'エクスポート',
|
|
668
674
|
'sessions.preview.exporting': 'エクスポート中...',
|
|
675
|
+
'sessions.preview.importNative': 'ネイティブディレクトリへインポート',
|
|
676
|
+
'sessions.preview.importingNative': 'インポート中...',
|
|
677
|
+
'sessions.preview.importNative.unsupported': 'この操作はサポートされていません',
|
|
678
|
+
'sessions.preview.importNative.confirmTitle': 'ネイティブセッションファイルを上書きしますか?',
|
|
679
|
+
'sessions.preview.importNative.confirmMessage': 'ネイティブセッションファイルが既に存在します。上書きすると、対象ツールのネイティブディレクトリ内の同名セッションが置き換えられます。',
|
|
680
|
+
'sessions.preview.importNative.confirmText': '上書き',
|
|
681
|
+
'sessions.preview.importNative.cancelled': 'インポートをキャンセルしました',
|
|
682
|
+
'sessions.preview.importNative.conflict': 'ネイティブセッションは既に存在します',
|
|
683
|
+
'sessions.preview.importNative.invalidSource': 'セッションソースが無効です',
|
|
684
|
+
'sessions.preview.importNative.fileNotFound': 'セッションファイルが見つかりません',
|
|
685
|
+
'sessions.preview.importNative.nativePathUnavailable': 'ネイティブセッションパスを解析できません',
|
|
686
|
+
'sessions.preview.importNative.success': 'ネイティブディレクトリへインポートしました',
|
|
687
|
+
'sessions.preview.importNative.failed': 'インポート失敗',
|
|
688
|
+
'sessions.preview.importNative.failedWithReason': 'ネイティブへのインポートに失敗しました:{reason}',
|
|
669
689
|
'sessions.preview.convert': '派生セッションを生成',
|
|
670
690
|
'sessions.preview.converting': '変換中...',
|
|
671
691
|
'sessions.preview.convert.loadedOnly': '読み込み済みのみ変換',
|
|
@@ -904,6 +924,11 @@ const ja = Object.freeze({
|
|
|
904
924
|
'config.template.editFirst': '先にテンプレートを編集してから適用してください。',
|
|
905
925
|
'config.template.bridgeCodexOnly': '{hint} テンプレートは Codex のみ編集可能です。',
|
|
906
926
|
'config.localBridge.enabledCount': '{enabled}/{total} 件有効',
|
|
927
|
+
'config.localBridge.poolSettings': 'プール設定',
|
|
928
|
+
'config.localBridge.poolHint': '負荷分散に参加する候補プロバイダーを選択してください。',
|
|
929
|
+
'config.localBridge.noProviders': '利用可能な候補プロバイダーがありません。先に直接プロバイダーを追加してください。',
|
|
930
|
+
'config.transformProvider.title': '変換プロバイダーを使用',
|
|
931
|
+
'config.providerBridgeHint': '{label} ブリッジモード',
|
|
907
932
|
'config.template.openEditor': 'テンプレートエディタを開く',
|
|
908
933
|
'modal.configTemplate.title': 'Config テンプレートエディタ(手動確認適用)',
|
|
909
934
|
'modal.configTemplate.placeholder': 'ここに config.toml テンプレート内容を編集してください',
|
|
@@ -1374,6 +1399,12 @@ const ja = Object.freeze({
|
|
|
1374
1399
|
'settings.trash.retentionLabel': '保持日数',
|
|
1375
1400
|
'settings.trash.retentionUnit': '日',
|
|
1376
1401
|
'settings.trash.retentionHint': '範囲 1-365 日、デフォルト 30 日。ゴミ箱読み込み時に期限切れレコードを自動クリーンアップします。',
|
|
1402
|
+
'settings.trash.count': '全 {count} 件',
|
|
1403
|
+
'settings.trash.retentionShort': '保持 {days} 日',
|
|
1404
|
+
'settings.trash.disabled': 'ゴミ箱は無効です',
|
|
1405
|
+
'settings.trash.disabledHint': '削除済みセッションは直接完全削除され、ゴミ箱に移動しません。',
|
|
1406
|
+
'settings.trash.clearShort': '空にする',
|
|
1407
|
+
'settings.trash.loadMoreItems': 'さらに読み込む(残り {count} 件)',
|
|
1377
1408
|
|
|
1378
1409
|
'settings.webhook.title': 'Webhook',
|
|
1379
1410
|
'settings.webhook.meta': 'イベント通知を外部サービスへ送信',
|
|
@@ -1499,6 +1530,8 @@ const ja = Object.freeze({
|
|
|
1499
1530
|
|
|
1500
1531
|
// OpenClaw config panel
|
|
1501
1532
|
'openclaw.applyHint': '~/.openclaw/openclaw.json に書き込みます。JSON5 対応。',
|
|
1533
|
+
'openclaw.workspace.title': 'OpenClaw ワークスペース',
|
|
1534
|
+
'openclaw.configs.hint': 'よく使う設定を選択、またはエディタで完全な JSON5 を維持します。',
|
|
1502
1535
|
'openclaw.agents.hint': 'Workspace の AGENTS.md を読み書きします。デフォルトパス ~/.openclaw/workspace/AGENTS.md。',
|
|
1503
1536
|
'openclaw.agents.open': 'AGENTS.md を開く',
|
|
1504
1537
|
'openclaw.workspaceFile': 'ワークスペースファイル',
|
|
@@ -1544,6 +1577,16 @@ const ja = Object.freeze({
|
|
|
1544
1577
|
'kilocode.writeRequired': '先に KiloCode の書き込みを有効化してください',
|
|
1545
1578
|
'kilocode.saved': 'KiloCode 設定を保存しました',
|
|
1546
1579
|
'kilocode.autoSaved': 'KiloCode 設定を同期しました',
|
|
1580
|
+
'sysPrompt.scope.label': 'スコープ',
|
|
1581
|
+
'sysPrompt.scope.global': 'グローバル (~/.pi/agent/)',
|
|
1582
|
+
'sysPrompt.scope.project': 'プロジェクト (<cwd>/.pi/)',
|
|
1583
|
+
'sysPrompt.mode.label': 'モード',
|
|
1584
|
+
'sysPrompt.mode.append': 'デフォルトに追加 (APPEND_SYSTEM.md)',
|
|
1585
|
+
'sysPrompt.mode.system': 'デフォルトを置換 (SYSTEM.md)',
|
|
1586
|
+
'sysPrompt.placeholder': 'システムプロンプトの内容を入力…',
|
|
1587
|
+
'sysPrompt.hint.unsaved': '未保存の変更があります',
|
|
1588
|
+
'sysPrompt.hint.twoStepSave': 'プレビューで差分を確認し、確認後に保存します。',
|
|
1589
|
+
'sysPrompt.toast.saved': 'System prompt を保存しました',
|
|
1547
1590
|
});
|
|
1548
1591
|
|
|
1549
1592
|
export { ja };
|
|
@@ -51,6 +51,8 @@ const vi = Object.freeze({
|
|
|
51
51
|
'common.refresh': 'Làm mới',
|
|
52
52
|
'common.refreshing': 'Đang làm mới...',
|
|
53
53
|
'common.loading': 'Đang tải...',
|
|
54
|
+
'common.menu': 'Menu',
|
|
55
|
+
'common.registry': 'Nguồn',
|
|
54
56
|
'common.saving': 'Đang lưu...',
|
|
55
57
|
'common.sending': 'Đang gửi...',
|
|
56
58
|
'common.scanning': 'Đang quét...',
|
|
@@ -78,6 +80,7 @@ const vi = Object.freeze({
|
|
|
78
80
|
'common.notConfigured': 'Chưa cấu hình',
|
|
79
81
|
'common.enabled': 'Đã bật',
|
|
80
82
|
'common.disabled': 'Đã tắt',
|
|
83
|
+
'common.retry': 'Thử lại',
|
|
81
84
|
'common.notSelected': 'Chưa chọn',
|
|
82
85
|
|
|
83
86
|
// Roles / labels
|
|
@@ -152,6 +155,11 @@ const vi = Object.freeze({
|
|
|
152
155
|
'side.system.settings.meta': 'Dữ liệu / Sao lưu',
|
|
153
156
|
'side.newTab': 'Tab mới',
|
|
154
157
|
'config.localBridge.enabledCount': 'Đã bật {enabled}/{total}',
|
|
158
|
+
'config.localBridge.poolSettings': 'Cài đặt pool',
|
|
159
|
+
'config.localBridge.poolHint': 'Chọn nhà cung cấp ứng viên tham gia cân bằng tải.',
|
|
160
|
+
'config.localBridge.noProviders': 'Không có nhà cung cấp ứng viên. Vui lòng thêm nhà cung cấp trực tiếp trước.',
|
|
161
|
+
'config.transformProvider.title': 'Đang dùng nhà cung cấp biến đổi',
|
|
162
|
+
'config.providerBridgeHint': 'Chế độ cầu nối {label}',
|
|
155
163
|
'toolConfig.allow': 'Cho phép ghi',
|
|
156
164
|
'toolConfig.viewOnly': 'Chỉ đọc',
|
|
157
165
|
'toolConfig.enableWrite': 'Bật ghi',
|
|
@@ -242,6 +250,7 @@ const vi = Object.freeze({
|
|
|
242
250
|
'subtitle.prompts': 'Chỉnh sửa AGENTS.md và CLAUDE.md.',
|
|
243
251
|
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
244
252
|
'prompts.subTab.project': 'CLAUDE.md',
|
|
253
|
+
'prompts.subTab.system': 'System Prompt',
|
|
245
254
|
'prompts.subTab.presets': 'Kho preset',
|
|
246
255
|
'prompts.presets.title': 'Preset',
|
|
247
256
|
'prompts.presets.hint': 'Quản lý preset.',
|
|
@@ -434,6 +443,7 @@ const vi = Object.freeze({
|
|
|
434
443
|
'toast.delete.ok': 'Đã xóa',
|
|
435
444
|
'toast.delete.fail': 'Xóa thất bại',
|
|
436
445
|
'toast.operation.success': 'Thao tác thành công',
|
|
446
|
+
'toast.operation.fail': 'Thao tác thất bại',
|
|
437
447
|
'toast.load.fail': 'Tải tệp thất bại',
|
|
438
448
|
'toast.apply.success': 'Đã áp dụng cấu hình',
|
|
439
449
|
'toast.apply.fail': 'Áp dụng cấu hình thất bại',
|
|
@@ -530,6 +540,7 @@ const vi = Object.freeze({
|
|
|
530
540
|
'field.apiEndpoint': 'API endpoint',
|
|
531
541
|
'field.apiKey': 'API key',
|
|
532
542
|
'field.baseUrl': 'Base URL',
|
|
543
|
+
'field.url': 'URL',
|
|
533
544
|
'field.provider': 'Nhà cung cấp',
|
|
534
545
|
'field.providerName': 'Tên nhà cung cấp',
|
|
535
546
|
'field.modelName': 'Tên model',
|
|
@@ -1400,6 +1411,12 @@ const vi = Object.freeze({
|
|
|
1400
1411
|
'settings.trash.retentionMeta': 'Mục trong thùng rác cũ hơn số ngày lưu giữ sẽ tự động bị xóa',
|
|
1401
1412
|
'settings.trash.retentionLabel': 'Số ngày lưu giữ',
|
|
1402
1413
|
'settings.trash.retentionHint': 'Phạm vi 1-365 ngày, mặc định 30. Mục hết hạn bị xóa khi tải thùng rác.',
|
|
1414
|
+
'settings.trash.count': 'Tổng {count} mục',
|
|
1415
|
+
'settings.trash.retentionShort': 'Lưu {days} ngày',
|
|
1416
|
+
'settings.trash.disabled': 'Thùng rác đã tắt',
|
|
1417
|
+
'settings.trash.disabledHint': 'Phiên đã xóa sẽ bị xóa vĩnh viễn, không chuyển vào thùng rác nữa.',
|
|
1418
|
+
'settings.trash.clearShort': 'Làm trống',
|
|
1419
|
+
'settings.trash.loadMoreItems': 'Tải thêm (còn lại {count})',
|
|
1403
1420
|
'settings.templateConfirm.title': 'Xác nhận áp dụng template',
|
|
1404
1421
|
'settings.templateConfirm.meta': 'Giảm ghi nhầm',
|
|
1405
1422
|
'settings.templateConfirm.toggle': 'Xem trước diff trước khi áp dụng (Xác nhận → Áp dụng)',
|
|
@@ -1529,6 +1546,16 @@ const vi = Object.freeze({
|
|
|
1529
1546
|
'kilocode.writeRequired': 'Hãy bật quyền ghi KiloCode trước',
|
|
1530
1547
|
'kilocode.saved': 'Đã lưu cấu hình KiloCode',
|
|
1531
1548
|
'kilocode.autoSaved': 'Đã đồng bộ cấu hình KiloCode',
|
|
1549
|
+
'sysPrompt.scope.label': 'Phạm vi',
|
|
1550
|
+
'sysPrompt.scope.global': 'Toàn cục (~/.pi/agent/)',
|
|
1551
|
+
'sysPrompt.scope.project': 'Dự án (<cwd>/.pi/)',
|
|
1552
|
+
'sysPrompt.mode.label': 'Chế độ',
|
|
1553
|
+
'sysPrompt.mode.append': 'Thêm vào prompt mặc định (APPEND_SYSTEM.md)',
|
|
1554
|
+
'sysPrompt.mode.system': 'Thay thế prompt mặc định (SYSTEM.md)',
|
|
1555
|
+
'sysPrompt.placeholder': 'Nhập nội dung system prompt…',
|
|
1556
|
+
'sysPrompt.hint.unsaved': 'Có thay đổi chưa lưu',
|
|
1557
|
+
'sysPrompt.hint.twoStepSave': 'Nhấn xem trước để xem diff, sau đó xác nhận để lưu.',
|
|
1558
|
+
'sysPrompt.toast.saved': 'Đã lưu system prompt',
|
|
1532
1559
|
});
|
|
1533
1560
|
|
|
1534
1561
|
export { vi };
|
|
@@ -42,6 +42,8 @@ const zhTw = Object.freeze({
|
|
|
42
42
|
'common.refresh': '重新整理',
|
|
43
43
|
'common.refreshing': '重新整理中...',
|
|
44
44
|
'common.loading': '載入中...',
|
|
45
|
+
'common.menu': '選單',
|
|
46
|
+
'common.registry': '鏡像源',
|
|
45
47
|
'common.saving': '保存中...',
|
|
46
48
|
'common.sending': '發送中...',
|
|
47
49
|
'common.scanning': '掃描中...',
|
|
@@ -68,6 +70,7 @@ const zhTw = Object.freeze({
|
|
|
68
70
|
'common.notConfigured': '未設定',
|
|
69
71
|
'common.enabled': '已啟用',
|
|
70
72
|
'common.disabled': '已停用',
|
|
73
|
+
'common.retry': '重試',
|
|
71
74
|
'cli.missing.title': '{name} CLI 未安裝',
|
|
72
75
|
'cli.missing.subtitle': '請先安裝 {name} CLI 後再繼續使用此頁面。',
|
|
73
76
|
'cli.missing.openDocs': '打開安裝指南',
|
|
@@ -89,6 +92,7 @@ const zhTw = Object.freeze({
|
|
|
89
92
|
'field.apiEndpoint': 'API 端點',
|
|
90
93
|
'field.apiKey': '認證密鑰',
|
|
91
94
|
'field.baseUrl': 'Base URL',
|
|
95
|
+
'field.url': 'URL',
|
|
92
96
|
'field.provider': '提供商',
|
|
93
97
|
'field.providerName': 'Provider 名稱',
|
|
94
98
|
'field.modelName': '模型名稱',
|
|
@@ -227,6 +231,7 @@ const zhTw = Object.freeze({
|
|
|
227
231
|
'subtitle.prompts': '編輯 AGENTS.md 與 CLAUDE.md。',
|
|
228
232
|
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
229
233
|
'prompts.subTab.project': 'CLAUDE.md',
|
|
234
|
+
'prompts.subTab.system': 'System Prompt',
|
|
230
235
|
'prompts.subTab.presets': '預設池',
|
|
231
236
|
'prompts.presets.title': '預設池',
|
|
232
237
|
'prompts.presets.hint': '管理預設。',
|
|
@@ -463,6 +468,7 @@ const zhTw = Object.freeze({
|
|
|
463
468
|
'toast.templates.deleteConfirm': '刪除',
|
|
464
469
|
'toast.templates.deleteCancel': '取消',
|
|
465
470
|
'toast.operation.success': '操作成功',
|
|
471
|
+
'toast.operation.fail': '操作失敗',
|
|
466
472
|
'toast.load.fail': '載入文件失敗',
|
|
467
473
|
'toast.apply.success': '設定已應用',
|
|
468
474
|
'toast.apply.fail': '應用設定失敗',
|
|
@@ -914,6 +920,11 @@ const zhTw = Object.freeze({
|
|
|
914
920
|
'config.template.editFirst': '先改模板,再應用。',
|
|
915
921
|
'config.template.bridgeCodexOnly': '{hint} 模板僅限 Codex 編輯。',
|
|
916
922
|
'config.localBridge.enabledCount': '已啟用 {enabled}/{total}',
|
|
923
|
+
'config.localBridge.poolSettings': '輪詢池設定',
|
|
924
|
+
'config.localBridge.poolHint': '選擇參與負載均衡的候選提供商。',
|
|
925
|
+
'config.localBridge.noProviders': '暫無可用候選提供商,請先新增直連提供商。',
|
|
926
|
+
'config.transformProvider.title': '使用轉換提供商',
|
|
927
|
+
'config.providerBridgeHint': '{label} 橋接模式',
|
|
917
928
|
'config.template.openEditor': '打開模板編輯器',
|
|
918
929
|
'modal.configTemplate.title': 'Config 模板編輯器(手動確認應用)',
|
|
919
930
|
'modal.configTemplate.placeholder': '在這裡編輯 config.toml 模板內容',
|
|
@@ -1384,6 +1395,12 @@ const zhTw = Object.freeze({
|
|
|
1384
1395
|
'settings.trash.retentionLabel': '保留天數',
|
|
1385
1396
|
'settings.trash.retentionUnit': '天',
|
|
1386
1397
|
'settings.trash.retentionHint': '範圍 1-365 天,預設 30 天。每次載入回收站時自動清理過期記錄。',
|
|
1398
|
+
'settings.trash.count': '共 {count} 項',
|
|
1399
|
+
'settings.trash.retentionShort': '保留 {days} 天',
|
|
1400
|
+
'settings.trash.disabled': '回收站已關閉',
|
|
1401
|
+
'settings.trash.disabledHint': '已刪除的工作階段將直接永久刪除,不再進入回收站。',
|
|
1402
|
+
'settings.trash.clearShort': '清空',
|
|
1403
|
+
'settings.trash.loadMoreItems': '載入更多(剩餘 {count} 項)',
|
|
1387
1404
|
|
|
1388
1405
|
'settings.webhook.title': 'Webhook',
|
|
1389
1406
|
'settings.webhook.meta': '發送事件通知到外部服務',
|
|
@@ -1557,6 +1574,16 @@ const zhTw = Object.freeze({
|
|
|
1557
1574
|
'kilocode.writeRequired': '請先開啟 KiloCode 寫入開關',
|
|
1558
1575
|
'kilocode.saved': 'KiloCode 設定已儲存',
|
|
1559
1576
|
'kilocode.autoSaved': 'KiloCode 設定已同步',
|
|
1577
|
+
'sysPrompt.scope.label': '作用域',
|
|
1578
|
+
'sysPrompt.scope.global': '全域 (~/.pi/agent/)',
|
|
1579
|
+
'sysPrompt.scope.project': '專案 (<cwd>/.pi/)',
|
|
1580
|
+
'sysPrompt.mode.label': '模式',
|
|
1581
|
+
'sysPrompt.mode.append': '追加到預設提示詞 (APPEND_SYSTEM.md)',
|
|
1582
|
+
'sysPrompt.mode.system': '替換預設提示詞 (SYSTEM.md)',
|
|
1583
|
+
'sysPrompt.placeholder': '在此輸入 system prompt 內容…',
|
|
1584
|
+
'sysPrompt.hint.unsaved': '有未儲存的變更',
|
|
1585
|
+
'sysPrompt.hint.twoStepSave': '點擊預覽查看差異,確認後儲存。',
|
|
1586
|
+
'sysPrompt.toast.saved': 'System prompt 已儲存',
|
|
1560
1587
|
});
|
|
1561
1588
|
|
|
1562
1589
|
export { zhTw };
|