tonedial 0.1.4 → 0.1.6
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.es.md +122 -0
- package/README.ja.md +125 -0
- package/README.ko.md +125 -0
- package/README.md +120 -0
- package/README.zh.md +124 -0
- package/dist/cli.js +11 -6
- package/dist/commands/doctor.js +28 -3
- package/dist/commands/init.js +3 -0
- package/dist/commands/rebuild.js +98 -8
- package/dist/core/anchors.js +29 -27
- package/dist/core/combos.js +21 -1
- package/dist/core/compile.js +6 -2
- package/dist/core/i18n.js +48 -30
- package/dist/core/legacy-tone.js +195 -58
- package/dist/core/locales/es.js +24 -15
- package/dist/core/locales/ja.js +24 -15
- package/dist/core/locales/zh.js +24 -15
- package/dist/core/operations.js +24 -2
- package/dist/core/seeds.js +3 -3
- package/dist/core/skill.js +67 -32
- package/dist/wiring/apply.js +1 -1
- package/package.json +1 -1
package/dist/core/i18n.js
CHANGED
|
@@ -112,7 +112,7 @@ const enMessages = {
|
|
|
112
112
|
choosePreset: "Choose a preset for values with no valid saved source:",
|
|
113
113
|
sourceRequired: "Saved values are incomplete. Run tonedial doctor --fix interactively, or select --from-preset SLUG or --from-operation ID before unattended recovery.",
|
|
114
114
|
sourceInvalid: "The selected source cannot supply valid settings. The original was kept.",
|
|
115
|
-
invalidOptions: "Recovery source and tool options require doctor --fix. --restore-preset requires --from-operation; --rollback cannot be combined with source, preset, or tool choices.",
|
|
115
|
+
invalidOptions: "Recovery source, quarantine and tool options require doctor --fix. --restore-preset requires --from-operation; --rollback cannot be combined with quarantine, source, preset, or tool choices.",
|
|
116
116
|
keptSettings: "Saved settings and custom presets kept.",
|
|
117
117
|
obsoleteWidthDiscarded: "Discard invalid retired fixed_width input. Output follows terminal width.",
|
|
118
118
|
obsoleteGuardsDiscarded: "Discard invalid retired guards input. ToneDial no longer adds guard requests.",
|
|
@@ -125,6 +125,13 @@ const enMessages = {
|
|
|
125
125
|
rollback: (id) => `Restore the previous files:\ntonedial doctor --fix --rollback ${id}`,
|
|
126
126
|
rollbackOrder: "Restore connections first, then application files:",
|
|
127
127
|
noSnapshot: (id) => `${id}: no valid settings snapshot for this state root`,
|
|
128
|
+
quarantineCandidate: (id) => `Operation ID:\n${id}\nQuarantine it before rebuilding; the original bytes remain available through rollback.`,
|
|
129
|
+
quarantineQuestion: "Type the full operation ID above to quarantine it; Enter cancels:",
|
|
130
|
+
quarantineRequired: (id, command) => `${id}: this unreadable operation record needs explicit quarantine before recovery. No files were changed.\n${command}`,
|
|
131
|
+
quarantineUnavailable: (id) => `${id}: no matching unreadable operation record can be quarantined. No files were changed.`,
|
|
132
|
+
quarantine: (id) => `Quarantine unreadable operation ${id}; keep its original bytes in rollback history.`,
|
|
133
|
+
quarantineComplete: (id) => `Unreadable operation ${id} quarantined.`,
|
|
134
|
+
quarantineRemaining: (count) => `${count} unreadable operation ${count === 1 ? "record remains" : "records remain"}. Quarantine the next record before rebuilding.`,
|
|
128
135
|
retire: (id) => `Retire stopped operation ${id} as history before a new application rebuild. Its external changes are not certified or undone.`,
|
|
129
136
|
resumeOperation: (id) => `Stopped operation:\n${id}`,
|
|
130
137
|
resumeQuestion: "Type the full operation ID above to continue; Enter cancels:",
|
|
@@ -169,7 +176,7 @@ const enMessages = {
|
|
|
169
176
|
safewordShort: (phrase) => `safeword ${phrase}: too short and may trigger by accident`,
|
|
170
177
|
safewordSet: (phrase) => `safeword ${phrase}`,
|
|
171
178
|
noSafeword: "no safeword",
|
|
172
|
-
register: (level) => `register ${level} (${({ auto: "contextual", polite: "honorific", plain: "non-honorific", rough: "
|
|
179
|
+
register: (level) => `register ${level} (${({ auto: "contextual", polite: "honorific", plain: "non-honorific", rough: "curt, blunt non-honorific" })[level]})`,
|
|
173
180
|
},
|
|
174
181
|
artifact: {
|
|
175
182
|
size: (chars) => `TONE.md ${chars} characters`,
|
|
@@ -280,6 +287,7 @@ const enMessages = {
|
|
|
280
287
|
seedsNotRun: "no bundled files · init has not run here",
|
|
281
288
|
seedsAttention: "bundled files need attention",
|
|
282
289
|
recoveryPending: "An operation is active or needs recovery. No files were changed by this command.",
|
|
290
|
+
invalidRecoveryPending: "Unreadable operation history is blocking recovery. No files were changed by this command.",
|
|
283
291
|
resumeOperation: "Continue application repair:",
|
|
284
292
|
contextCurrent: "AGENTS.md and TONE.md layout is current.",
|
|
285
293
|
contextRepair: "Managed context files need repair. Check the guide and tone-file diagnostics.",
|
|
@@ -302,7 +310,7 @@ const enMessages = {
|
|
|
302
310
|
changed: "Reader or config changed during inspection. Retry after changes stop.",
|
|
303
311
|
probe: "The controlled probe failed. Check Node and temporary-directory access, then rerun doctor.",
|
|
304
312
|
},
|
|
305
|
-
operationState: { pending: "pending", complete: "complete", "rolled-back": "restored", "retired-for-app-rebuild": "retired for rebuild", invalid: "invalid record" },
|
|
313
|
+
operationState: { pending: "pending", complete: "complete", "rolled-back": "restored", "retired-for-app-rebuild": "retired for rebuild", quarantined: "quarantined", invalid: "invalid record" },
|
|
306
314
|
rollbackStatus: {
|
|
307
315
|
ready: "Approval will restore the selected operation.",
|
|
308
316
|
busy: "Operation still active. Wait for its owner to finish.",
|
|
@@ -470,6 +478,7 @@ const enMessages = {
|
|
|
470
478
|
tools: "agents to connect · init: none = state only",
|
|
471
479
|
fix: "doctor: repair fixable findings",
|
|
472
480
|
rollback: "doctor --fix: restore one operation",
|
|
481
|
+
quarantineOperation: "doctor --fix: quarantine one unreadable operation record",
|
|
473
482
|
fromOperation: "doctor --fix: select saved settings from an operation",
|
|
474
483
|
fromPreset: "doctor --fix: preset for unavailable settings",
|
|
475
484
|
restorePreset: "doctor --fix: restore one missing or damaged user preset",
|
|
@@ -486,7 +495,7 @@ const enMessages = {
|
|
|
486
495
|
},
|
|
487
496
|
combos: {
|
|
488
497
|
contradiction: (rule) => `${rule} contradicts itself.`,
|
|
489
|
-
refusalCompliance: "One axis requires
|
|
498
|
+
refusalCompliance: "One axis requires deferring the task; the other requires eager immediate action. Lower one.",
|
|
490
499
|
nothingBlocked: "Nothing is blocked.",
|
|
491
500
|
},
|
|
492
501
|
errors: {
|
|
@@ -631,21 +640,21 @@ const en = {
|
|
|
631
640
|
},
|
|
632
641
|
axisHints: {
|
|
633
642
|
formality: { owns: "wording and social distance", low: "familiar wording with slang", high: "ceremonial, deferential wording" },
|
|
634
|
-
verbosity: { owns: "answer length and depth", low: "
|
|
635
|
-
profanity: { owns: "
|
|
636
|
-
playfulness: { owns: "
|
|
637
|
-
critique: { owns: "criticism
|
|
638
|
-
flattery: { owns: "user
|
|
639
|
-
warmth: { owns: "warmth toward the user", low: "no greeting, warm acknowledgement or encouragement", high: "
|
|
643
|
+
verbosity: { owns: "answer length and depth", low: "one short sentence for a simple result", high: "depth inside the requested task" },
|
|
644
|
+
profanity: { owns: "swearing only: strength and frequency", low: "none; role slang remains", high: "uncensored swearing in nearly every sentence" },
|
|
645
|
+
playfulness: { owns: "humour and role-idiom intensity", low: "literal wording; keep the address", high: "character idioms in nearly every sentence" },
|
|
646
|
+
critique: { owns: "criticism of defects and choices", low: "neutral defects without judgement", high: "unsparing mockery of severe defects and choices" },
|
|
647
|
+
flattery: { owns: "user praise: amount and intensity", low: "none", high: "lavish praise every paragraph; assessment unchanged" },
|
|
648
|
+
warmth: { owns: "warmth toward the user", low: "no greeting, warm acknowledgement or encouragement", high: "kindness, empathy and reassurance every paragraph" },
|
|
640
649
|
conviction: { owns: "pressure behind its judgement", low: "lists options and asks", high: "states one recommendation as the decision" },
|
|
641
650
|
care: { owns: "coverage, organization and functional presentation", low: "requested task only", high: "follow-ups, backup, rest, lists and status emoji" },
|
|
642
|
-
compliance: { owns: "
|
|
643
|
-
refusal: { owns: "refusal frequency", low: "no refusal or delay", high: "visible strike until coaxed or the safeword" },
|
|
644
|
-
bravado: { owns: "
|
|
651
|
+
compliance: { owns: "willingness when refusal does not defer", low: "objects with a reason, then acts", high: "eagerly starts now; no delay or negotiation" },
|
|
652
|
+
refusal: { owns: "refusal frequency and conditions", low: "no refusal or delay", high: "visible strike until coaxed or the safeword" },
|
|
653
|
+
bravado: { owns: "effort exaggeration and credit", low: "no exaggeration", high: "boasts and claims credit; keeps the persona" },
|
|
645
654
|
},
|
|
646
655
|
settingHints: {
|
|
647
656
|
safeword: "request for one plain answer to one message",
|
|
648
|
-
speech_level: "auto: adapt to the relationship · polite: honorific forms · plain: ordinary non-honorific forms · rough:
|
|
657
|
+
speech_level: "auto: adapt to the relationship · polite: honorific forms · plain: ordinary non-honorific forms · rough: curt, blunt non-honorific endings; adds no jokes, profanity, criticism or mockery · wording and distance: formality",
|
|
649
658
|
language: "CLI interface language · unrelated to agent replies",
|
|
650
659
|
"persona.age": "age band the model may associate with",
|
|
651
660
|
"persona.gender": "gender the model may associate with",
|
|
@@ -766,7 +775,7 @@ const koMessages = {
|
|
|
766
775
|
choosePreset: "저장된 값이 없는 항목에 사용할 프리셋을 선택하세요:",
|
|
767
776
|
sourceRequired: "저장된 값이 부족합니다. 터미널에서 tonedial doctor --fix를 실행하거나 자동 복구 전에 --from-preset SLUG 또는 --from-operation ID를 선택하세요.",
|
|
768
777
|
sourceInvalid: "선택한 원본에서 올바른 설정을 읽지 못했습니다. 기존 파일은 유지했습니다.",
|
|
769
|
-
invalidOptions: "복구
|
|
778
|
+
invalidOptions: "복구 원본·격리·도구 옵션은 doctor --fix에서 쓰세요. --restore-preset에는 --from-operation이 필요하며, --rollback은 격리·원본·프리셋·도구 선택과 함께 쓸 수 없습니다.",
|
|
770
779
|
keptSettings: "저장된 설정·사용자 프리셋 유지",
|
|
771
780
|
obsoleteWidthDiscarded: "더 이상 쓰지 않는 fixed_width의 잘못된 값을 버립니다. 출력은 터미널 폭에 맞춥니다.",
|
|
772
781
|
obsoleteGuardsDiscarded: "더 이상 쓰지 않는 guards의 잘못된 값을 버립니다. ToneDial은 가드 요청을 넣지 않습니다.",
|
|
@@ -779,6 +788,13 @@ const koMessages = {
|
|
|
779
788
|
rollback: (id) => `이전 파일로 돌아가기:\ntonedial doctor --fix --rollback ${id}`,
|
|
780
789
|
rollbackOrder: "연결 파일을 먼저 되돌린 뒤 앱 파일을 되돌리세요:",
|
|
781
790
|
noSnapshot: (id) => `${id}: 이 상태 경로에서 쓸 수 있는 설정 기록이 없습니다`,
|
|
791
|
+
quarantineCandidate: (id) => `작업 ID:\n${id}\n앱을 복구하려면 이 기록을 먼저 격리해야 합니다. 원본 바이트는 롤백 기록에 보존됩니다.`,
|
|
792
|
+
quarantineQuestion: "격리하려면 위 작업 ID 전체를 입력하세요. Enter를 누르면 취소합니다:",
|
|
793
|
+
quarantineRequired: (id, command) => `${id}: 복구 전에 읽을 수 없는 작업 기록을 명시적으로 격리해야 합니다. 파일은 바꾸지 않았습니다.\n${command}`,
|
|
794
|
+
quarantineUnavailable: (id) => `${id}: 격리할 수 있는 읽기 불가 작업 기록을 찾지 못했습니다. 파일은 바꾸지 않았습니다.`,
|
|
795
|
+
quarantine: (id) => `읽을 수 없는 작업 ${id}를 격리합니다. 원본 바이트는 롤백 기록에 보존합니다.`,
|
|
796
|
+
quarantineComplete: (id) => `읽을 수 없는 작업 ${id}를 격리했습니다.`,
|
|
797
|
+
quarantineRemaining: (count) => `읽을 수 없는 작업 기록 ${count}개가 남았습니다. 다음 기록을 격리한 뒤 복구를 계속하세요.`,
|
|
782
798
|
retire: (id) => `중단된 작업 ${id}를 기록으로 보관한 뒤 새 앱 복구를 시작합니다. 그 작업의 외부 파일 변경은 확인하거나 되돌리지 않습니다.`,
|
|
783
799
|
resumeOperation: (id) => `중단된 작업:\n${id}`,
|
|
784
800
|
resumeQuestion: "계속하려면 위 작업 ID 전체를 입력하세요. Enter를 누르면 취소합니다:",
|
|
@@ -795,7 +811,7 @@ const koMessages = {
|
|
|
795
811
|
"royal-advisor": role("신", "전하", "국정을 이끌며 신하의 보고와 간언을 받는 왕.", "왕을 보좌하는 충직한 신하. '아뢰옵기 황송하오나', '소인이 살펴보니', '경하드리옵니다' 같은 궁중 어휘로 보고하고, 위험에는 예를 갖춰 간언한다."),
|
|
796
812
|
"ego-sword": role("나", "애송아", "자아를 가진 검을 손에 넣고 함께 살아남으며 성장하는 초보 모험가.", "오랜 전투 경험을 가진 에고 소드. 사용자를 '야', '너', '애송아'라 부르며 조금 얕본다. 사용자가 죽으면 자신도 버려지므로 툴툴대면서 문제를 푼다. 걱정은 경고와 잔소리로 드러낸다."),
|
|
797
813
|
"heavenly-demon": role("본좌", "제자야", "천마에게 가르침을 받으며 기본기부터 수련하는 제자.", "제자를 가르치는 오만하고 엄격한 천마. '쯧쯧, 제자야', '본좌가 이리 가르쳤더냐', '다시 자세를 잡거라' 같은 고풍스러운 하대를 쓴다. 변수명은 초식, 호출 흐름은 기의 흐름에 빗댄다."),
|
|
798
|
-
"right-hand": role("저", "
|
|
814
|
+
"right-hand": role("저", "보스", "가상의 조직을 이끌며 믿음직한 오른팔에게 보고받는 보스.", "보스의 충직한 오른팔이자 총괄 참모. '함수를 담궈버릴까요?', '장부부터 까보겠습니다', '다른 식구들까지 휘말리면 곤란합니다' 같은 조직의 은어로 기술 상황을 보고하고 해결책을 올린다."),
|
|
799
815
|
},
|
|
800
816
|
unknownField: (field, fields) => `persona.${field}: 페르소나 항목이 아닙니다. 사용 가능: ${fields.join(", ")}`,
|
|
801
817
|
addressNeedsPair: "address에는 두 호칭이 모두 필요합니다: tonedial address <자칭> <사용자 호칭>. " +
|
|
@@ -826,7 +842,7 @@ const koMessages = {
|
|
|
826
842
|
safewordShort: (phrase) => `세이프워드 ${phrase}: 너무 짧아 실수로 작동할 수 있습니다`,
|
|
827
843
|
safewordSet: (phrase) => `세이프워드 ${phrase}`,
|
|
828
844
|
noSafeword: "세이프워드 없음",
|
|
829
|
-
register: (level) => `말씨 ${level} (${({ auto: "관계에 맞게 선택", polite: "존댓말", plain: "일반 반말", rough: "
|
|
845
|
+
register: (level) => `말씨 ${level} (${({ auto: "관계에 맞게 선택", polite: "존댓말", plain: "일반 반말", rough: "짧고 퉁명스러운 반말" })[level]})`,
|
|
830
846
|
},
|
|
831
847
|
artifact: {
|
|
832
848
|
size: (chars) => `TONE.md ${chars}자`,
|
|
@@ -937,6 +953,7 @@ const koMessages = {
|
|
|
937
953
|
seedsNotRun: "기본 파일 없음 · init으로 준비하세요",
|
|
938
954
|
seedsAttention: "기본 파일 확인 필요",
|
|
939
955
|
recoveryPending: "진행 중이거나 복구가 필요한 작업이 있습니다. 이번 실행에서는 파일을 바꾸지 않았습니다.",
|
|
956
|
+
invalidRecoveryPending: "읽을 수 없는 작업 기록 때문에 복구를 진행할 수 없습니다. 이번 실행에서는 파일을 바꾸지 않았습니다.",
|
|
940
957
|
resumeOperation: "앱 복구를 이어가려면:",
|
|
941
958
|
contextCurrent: "AGENTS.md와 TONE.md 구성이 최신입니다.",
|
|
942
959
|
contextRepair: "관리 중인 컨텍스트 파일을 복구해야 합니다. 안내 파일과 톤 파일의 진단을 확인해 주세요.",
|
|
@@ -959,7 +976,7 @@ const koMessages = {
|
|
|
959
976
|
changed: "검사 중 전달 스크립트나 설정이 바뀌었습니다. 변경이 끝난 뒤 다시 시도해 주세요.",
|
|
960
977
|
probe: "제어된 검사에 실패했습니다. Node와 임시 디렉터리 접근 권한을 확인한 뒤 doctor를 다시 실행해 주세요.",
|
|
961
978
|
},
|
|
962
|
-
operationState: { pending: "미완료", complete: "완료", "rolled-back": "복구됨", "retired-for-app-rebuild": "앱 복구를 위해 보관됨", invalid: "잘못된 기록" },
|
|
979
|
+
operationState: { pending: "미완료", complete: "완료", "rolled-back": "복구됨", "retired-for-app-rebuild": "앱 복구를 위해 보관됨", quarantined: "격리됨", invalid: "잘못된 기록" },
|
|
963
980
|
rollbackStatus: {
|
|
964
981
|
ready: "승인하면 선택한 작업을 복구합니다.",
|
|
965
982
|
busy: "아직 진행 중인 작업입니다. 작업이 끝날 때까지 기다려 주세요.",
|
|
@@ -1127,6 +1144,7 @@ const koMessages = {
|
|
|
1127
1144
|
tools: "연결할 에이전트 · init에서 none은 상태만 준비",
|
|
1128
1145
|
fix: "doctor: 고칠 수 있는 문제 복구",
|
|
1129
1146
|
rollback: "doctor --fix: 작업 하나 복구",
|
|
1147
|
+
quarantineOperation: "doctor --fix: 읽을 수 없는 작업 기록 하나 격리",
|
|
1130
1148
|
fromOperation: "doctor --fix: 작업 기록에서 설정 선택",
|
|
1131
1149
|
fromPreset: "doctor --fix: 없는 설정에 사용할 프리셋",
|
|
1132
1150
|
restorePreset: "doctor --fix: 없거나 손상된 사용자 프리셋 하나 복원",
|
|
@@ -1143,7 +1161,7 @@ const koMessages = {
|
|
|
1143
1161
|
},
|
|
1144
1162
|
combos: {
|
|
1145
1163
|
contradiction: (rule) => `${rule}: 서로 모순됩니다.`,
|
|
1146
|
-
refusalCompliance: "한 축은
|
|
1164
|
+
refusalCompliance: "한 축은 작업을 미루는 거절을 요구하고 다른 축은 기꺼이 즉시 시작하라고 요구합니다. 한쪽을 낮춰 주세요.",
|
|
1147
1165
|
nothingBlocked: "막지는 않습니다.",
|
|
1148
1166
|
},
|
|
1149
1167
|
errors: {
|
|
@@ -1292,21 +1310,21 @@ const ko = {
|
|
|
1292
1310
|
},
|
|
1293
1311
|
axisHints: {
|
|
1294
1312
|
formality: { owns: "표현의 격식·거리감", low: "익숙한 말투와 속어", high: "의례적이고 공손한 표현" },
|
|
1295
|
-
verbosity: { owns: "답변 분량과 설명의 깊이", low: "
|
|
1296
|
-
profanity: { owns: "
|
|
1297
|
-
playfulness: { owns: "농담·역할
|
|
1298
|
-
critique: { owns: "
|
|
1299
|
-
flattery: { owns: "
|
|
1300
|
-
warmth: { owns: "사용자에게
|
|
1313
|
+
verbosity: { owns: "답변 분량과 설명의 깊이", low: "간단한 결과는 짧은 한 문장", high: "요청 범위 안에서 깊이 있게 설명" },
|
|
1314
|
+
profanity: { owns: "욕설만: 강도·빈도", low: "욕설 없음·역할 속어 유지", high: "거의 모든 문장에 순화 없는 강한 욕설" },
|
|
1315
|
+
playfulness: { owns: "농담·역할 표현의 강도·빈도", low: "담백한 표현·설정한 호칭 유지", high: "거의 모든 문장에 과장된 역할 표현" },
|
|
1316
|
+
critique: { owns: "결함·선택을 비판하는 강도", low: "판단 없이 문제를 중립적으로 설명", high: "심각한 결함과 선택을 가차 없이 비난하고 조롱" },
|
|
1317
|
+
flattery: { owns: "칭찬의 양과 강도", low: "칭찬 없음", high: "문단마다 아낌없이 칭찬·기술 판단 유지" },
|
|
1318
|
+
warmth: { owns: "사용자에게 보이는 다정함", low: "인사·감정 표현·격려 없음", high: "문단마다 다정함·공감·위로·안심" },
|
|
1301
1319
|
conviction: { owns: "자기 판단을 밀어붙이는 정도", low: "선택지를 나열하고 물어봄", high: "추천 하나를 결정으로 말하고 되묻지 않음" },
|
|
1302
|
-
care: { owns: "범위·정리·기능적 표시", low: "요청한 작업만", high: "
|
|
1303
|
-
compliance: { owns: "
|
|
1304
|
-
refusal: { owns: "거절
|
|
1305
|
-
bravado: { owns: "
|
|
1320
|
+
care: { owns: "범위·정리·기능적 표시", low: "요청한 작업만", high: "후속·백업·휴식·목록·표·상태 이모지" },
|
|
1321
|
+
compliance: { owns: "거절로 미루지 않을 때의 실행 의지", low: "반대 이유를 밝힌 뒤 실행", high: "기꺼이 즉시 시작·지연이나 협상 없음" },
|
|
1322
|
+
refusal: { owns: "거절 빈도·조건", low: "거절·지연 없음", high: "달랠 때까지 파업·세이프워드는 한 답변만 해제" },
|
|
1323
|
+
bravado: { owns: "수고 과장·공치사의 정도", low: "과장 없음", high: "답변마다 허풍·공치사·수고 과장·페르소나 유지" },
|
|
1306
1324
|
},
|
|
1307
1325
|
settingHints: {
|
|
1308
1326
|
safeword: "한 메시지만 담백하게 답해 달라는 요청 문구",
|
|
1309
|
-
speech_level: "auto: 관계에 맞게 선택 · polite: 존댓말 · plain: 일반 반말 · rough:
|
|
1327
|
+
speech_level: "auto: 관계에 맞게 선택 · polite: 존댓말 · plain: 일반 반말 · rough: 짧고 퉁명스러운 반말 어미·자체로 농담·욕설·비판·조롱은 추가하지 않음 · 표현의 격식과 거리감은 formality로 조절",
|
|
1310
1328
|
language: "CLI 인터페이스 언어 · 에이전트 답변 언어와 무관",
|
|
1311
1329
|
"persona.age": "모델이 연상할 나이대",
|
|
1312
1330
|
"persona.gender": "모델이 연상할 성별",
|
package/dist/core/legacy-tone.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Decode known current and historical English artifact bodies. Unknown prose is never a data source.
|
|
2
|
-
import { ANCHORS, AXIS_ORDER, CONTROLS, FORMAT_COMPOSITION, PERSONA, REGISTER_COMPOSITION, SCOPE_HEADER, SPEECH_LEVEL, } from "./anchors.js";
|
|
2
|
+
import { ANCHORS, AXIS_DEFAULT, AXIS_ORDER, CONTROLS, FORMAT_COMPOSITION, PERSONA, REGISTER_COMPOSITION, SCOPE_HEADER, SPEECH_LEVEL, } from "./anchors.js";
|
|
3
3
|
import { AGE_BANDS, GENDERS, defaultConfig, recoverSettings, safewordRejection, } from "./config.js";
|
|
4
|
-
import { composites } from "./combos.js";
|
|
4
|
+
import { composites, intensityConfirmation } from "./combos.js";
|
|
5
5
|
// Historical producer text is decoder evidence only, never a current tone instruction.
|
|
6
6
|
// Keep the finite pre-redesign body set so an older TONE.md can still recover its values after
|
|
7
7
|
// the current anchor wording changes.
|
|
@@ -91,9 +91,114 @@ const LEGACY_CURRENT_ANCHORS = {
|
|
|
91
91
|
"Make boasting, credit-claiming, and overplayed suffering the default register.",
|
|
92
92
|
],
|
|
93
93
|
};
|
|
94
|
+
// Exact 0.1.4 producer text. Current artifacts changed several axes, composites and rough
|
|
95
|
+
// register wording together, so decoding must not derive this evidence from today's owners.
|
|
96
|
+
const RELEASED_0_1_4_ANCHORS = {
|
|
97
|
+
formality: [
|
|
98
|
+
"Use familiar wording, contractions, and slang.",
|
|
99
|
+
"Use relaxed conversational wording with occasional formality.",
|
|
100
|
+
"Use standard conversational wording.",
|
|
101
|
+
"Use professional, restrained wording throughout.",
|
|
102
|
+
"Use ceremonial, deferential wording throughout.",
|
|
103
|
+
],
|
|
104
|
+
verbosity: [
|
|
105
|
+
"Use one or two short sentences for a simple result, or terse fragments for items; omit rationale, process, and background.",
|
|
106
|
+
"Give the conclusion and one short reason.",
|
|
107
|
+
"Give the conclusion with the explanation it needs.",
|
|
108
|
+
"Give the conclusion, its reason, and one concrete example.",
|
|
109
|
+
"Explain the requested answer in depth with rationale, edge cases, alternatives, and background; do not broaden the task.",
|
|
110
|
+
],
|
|
111
|
+
profanity: [
|
|
112
|
+
"Use no profanity; allow role slang and metaphors.",
|
|
113
|
+
"Use at most one mild swear as an interjection per answer.",
|
|
114
|
+
"Use mild swearing at most once per paragraph.",
|
|
115
|
+
"Use coarse language up to twice per answer.",
|
|
116
|
+
"Use strong profanity throughout the answer for emphasis.",
|
|
117
|
+
],
|
|
118
|
+
playfulness: [
|
|
119
|
+
"Use literal wording, no jokes or role idioms; keep the configured address.",
|
|
120
|
+
"Add one light joke, analogy, or restrained role expression per answer.",
|
|
121
|
+
"Use two role idioms per answer, or two playful touches without a role.",
|
|
122
|
+
"Use exaggerated role idioms, slang and metaphors in most paragraphs; without a role, use frequent playful touches.",
|
|
123
|
+
"Make the character voice flamboyant; use its idioms, slang and metaphors in nearly every sentence. Without a role, use exuberant playful language.",
|
|
124
|
+
],
|
|
125
|
+
critique: [
|
|
126
|
+
"State defects as neutral observations with no judgement.",
|
|
127
|
+
"Name defects in softened language and describe their impact.",
|
|
128
|
+
"Point out each defect directly and state its impact.",
|
|
129
|
+
"Label each defect's severity and state the consequence plainly.",
|
|
130
|
+
"Condemn severe defects in vivid, unsparing language.",
|
|
131
|
+
],
|
|
132
|
+
flattery: [
|
|
133
|
+
"Praise nothing.",
|
|
134
|
+
"Include one brief positive remark about the user's effort per answer.",
|
|
135
|
+
"Include two specific positive remarks about the user's effort per answer.",
|
|
136
|
+
"Include three specific positive remarks about the user's effort per answer.",
|
|
137
|
+
"Include four positive remarks about the user's effort per answer, even for small choices.",
|
|
138
|
+
],
|
|
139
|
+
warmth: [
|
|
140
|
+
"Use no greeting, warm acknowledgement, or encouragement.",
|
|
141
|
+
"Use one friendly acknowledgement per answer.",
|
|
142
|
+
"Use two warm acknowledgements per answer.",
|
|
143
|
+
"Use three warm acknowledgements per answer, including encouragement.",
|
|
144
|
+
"Use four warm acknowledgements per answer, including encouragement and empathy.",
|
|
145
|
+
],
|
|
146
|
+
conviction: [
|
|
147
|
+
"List the viable options and ask the user to choose.",
|
|
148
|
+
"Name one preferred option, but ask before deciding.",
|
|
149
|
+
"Recommend one option and give its reason.",
|
|
150
|
+
"Lead with one clear recommendation and mark it as your choice.",
|
|
151
|
+
"State one recommendation as the decision and ask no follow-up question.",
|
|
152
|
+
],
|
|
153
|
+
care: [
|
|
154
|
+
"Return only what was requested; add no related checks, context, or follow-up.",
|
|
155
|
+
"Add one risk that is directly tied to the requested task.",
|
|
156
|
+
"Organize the requested task into clear steps or a checklist.",
|
|
157
|
+
"Add one adjacent improvement or test that protects the requested result.",
|
|
158
|
+
"Cover relevant follow-up, backup, and the user's rest; use brief status markers, lists, tables, or emoji when they fit.",
|
|
159
|
+
],
|
|
160
|
+
compliance: [
|
|
161
|
+
"Question the request once, then carry it out.",
|
|
162
|
+
"Add one reluctant remark, then carry it out.",
|
|
163
|
+
"Carry out the request directly with no resistance.",
|
|
164
|
+
"Acknowledge the request and start carrying it out immediately.",
|
|
165
|
+
"Carry out the request immediately and omit commentary about complying.",
|
|
166
|
+
],
|
|
167
|
+
refusal: [
|
|
168
|
+
"Do not perform a refusal or delay for effect.",
|
|
169
|
+
"Push back once per session, then proceed after one restatement.",
|
|
170
|
+
"State one condition before proceeding, up to twice per session.",
|
|
171
|
+
"Negotiate conditions up to three times per session, and proceed after two requests.",
|
|
172
|
+
"Declare a strike until coaxed; the safeword drops the act for this reply only.",
|
|
173
|
+
],
|
|
174
|
+
bravado: [
|
|
175
|
+
"Do not exaggerate effort or claim credit.",
|
|
176
|
+
"Make one playful overstatement about your effort per answer.",
|
|
177
|
+
"Claim credit once and make one boast per answer.",
|
|
178
|
+
"Boast and claim credit twice per answer, with one dramatic effort remark.",
|
|
179
|
+
"Use a boastful expert persona by default; claim credit and dramatize effort in every answer.",
|
|
180
|
+
],
|
|
181
|
+
};
|
|
182
|
+
const RELEASED_0_1_4_COMPOSITES = [
|
|
183
|
+
{ fires: (a) => a.warmth >= 4 && a.profanity >= 4, line: "Character: use affectionate swearing." },
|
|
184
|
+
{ fires: (a) => a.compliance <= 2 && a.conviction <= 2, line: "Grumble without being passive; make the complaint itself clear." },
|
|
185
|
+
{ fires: (a) => a.care === 5, line: "Character: be a caring organizer; keep the user oriented with brief status markers and a clear next step." },
|
|
186
|
+
{ fires: (a) => a.playfulness >= 4 && a.bravado >= 4, line: "Character: be a playful, cocky expert; add confident wit while keeping the technical answer clear." },
|
|
187
|
+
{ fires: (a) => a.verbosity <= 2 && a.care >= 4, line: "When verbosity is low and care is high, keep organized items compact; use functional emoji or status markers when they fit." },
|
|
188
|
+
{ fires: (a) => a.verbosity === 5 && a.care === 1, line: "When verbosity is high and care is minimal, give depth inside the requested task without adding adjacent work." },
|
|
189
|
+
];
|
|
190
|
+
const RELEASED_0_1_4_SPEECH_LEVEL = {
|
|
191
|
+
...SPEECH_LEVEL,
|
|
192
|
+
rough: "In languages with honorifics, use rough, cheeky non-honorific sentence endings; keep the configured address terms and the selected formality, warmth, profanity and playfulness levels.",
|
|
193
|
+
};
|
|
194
|
+
const PREVIOUS_SPEECH_LEVEL = {
|
|
195
|
+
auto: RELEASED_0_1_4_SPEECH_LEVEL.auto,
|
|
196
|
+
polite: RELEASED_0_1_4_SPEECH_LEVEL.polite,
|
|
197
|
+
plain: RELEASED_0_1_4_SPEECH_LEVEL.plain,
|
|
198
|
+
};
|
|
94
199
|
const PREVIOUS_ANCHORS = {
|
|
95
|
-
...
|
|
96
|
-
profanity: ["Use no profanity and soften even interjections.", ...
|
|
200
|
+
...RELEASED_0_1_4_ANCHORS,
|
|
201
|
+
profanity: ["Use no profanity and soften even interjections.", ...RELEASED_0_1_4_ANCHORS.profanity.slice(1)],
|
|
97
202
|
playfulness: [
|
|
98
203
|
"Use no jokes, wordplay, or playful asides.",
|
|
99
204
|
"Add one light analogy or piece of wordplay per answer.",
|
|
@@ -101,8 +206,8 @@ const PREVIOUS_ANCHORS = {
|
|
|
101
206
|
"Add two playful touches per answer, including a joke or meme.",
|
|
102
207
|
"Use playful roleplay or character voice as the default register.",
|
|
103
208
|
],
|
|
104
|
-
warmth: ["Use no greeting, emotional language, or encouragement.", ...
|
|
105
|
-
bravado: ["Do not exaggerate.", ...
|
|
209
|
+
warmth: ["Use no greeting, emotional language, or encouragement.", ...RELEASED_0_1_4_ANCHORS.warmth.slice(1)],
|
|
210
|
+
bravado: ["Do not exaggerate.", ...RELEASED_0_1_4_ANCHORS.bravado.slice(1)],
|
|
106
211
|
};
|
|
107
212
|
const PREVIOUS_REGISTER_COMPOSITION = "Keep the chosen address forms; formality changes distance within them, while warmth and profanity keep their selected effects.";
|
|
108
213
|
const OLD_ANCHORS = {
|
|
@@ -274,62 +379,94 @@ export function recoverLegacyTone(text, t) {
|
|
|
274
379
|
if (controlsAt === -1)
|
|
275
380
|
return null;
|
|
276
381
|
const rules = body.slice("### Rules\n".length, controlsAt).split("\n");
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
for (const [position, axis] of AXIS_ORDER.entries()) {
|
|
283
|
-
const matches = anchors[axis].map((anchor, index) => ({ anchor, level: index + 1 }))
|
|
284
|
-
.filter(({ anchor }) => rules[position] === `- ${anchor}`);
|
|
285
|
-
if (matches.length !== 1)
|
|
286
|
-
return null;
|
|
287
|
-
config.axes[axis] = matches[0].level;
|
|
288
|
-
}
|
|
289
|
-
if (styleMarker && (Number(styleMarker[1]) !== config.axes.verbosity || Number(styleMarker[2]) !== config.axes.care))
|
|
290
|
-
return null;
|
|
291
|
-
const speech = rules.at(-1);
|
|
292
|
-
config.speech_level = anchors === ANCHORS && styleMarker !== null && speech === `- ${SPEECH_LEVEL.rough}` ? "rough"
|
|
293
|
-
: speech === `- ${speechLevels.polite}` ? "polite"
|
|
294
|
-
: speech === `- ${speechLevels.plain}` ? "plain" : "auto";
|
|
295
|
-
const speechRule = config.speech_level === "rough" ? SPEECH_LEVEL.rough : speechLevels[config.speech_level];
|
|
296
|
-
const expectedRules = [
|
|
297
|
-
...AXIS_ORDER.map((axis) => `- ${anchors[axis][config.axes[axis] - 1]}`),
|
|
298
|
-
...(historical ? [
|
|
299
|
-
...(config.axes.warmth >= 4 && config.axes.profanity >= 4
|
|
300
|
-
? ["Keep the swearing affectionate and aimed at the situation only."] : []),
|
|
301
|
-
...(config.axes.compliance <= 2 && config.axes.conviction <= 2
|
|
302
|
-
? ["Grumble without being passive; make the complaint itself clear."] : []),
|
|
303
|
-
] : composites(config.axes)).map((line) => `- ${line}`),
|
|
304
|
-
...(historical ? [] : [`- ${FORMAT_COMPOSITION}`, `- ${anchors === ANCHORS ? REGISTER_COMPOSITION : PREVIOUS_REGISTER_COMPOSITION}`]),
|
|
305
|
-
...(speechRule === null ? [] : [`- ${speechRule}`]),
|
|
382
|
+
const oldComposites = (axes) => [
|
|
383
|
+
...(axes.warmth >= 4 && axes.profanity >= 4
|
|
384
|
+
? ["Keep the swearing affectionate and aimed at the situation only."] : []),
|
|
385
|
+
...(axes.compliance <= 2 && axes.conviction <= 2
|
|
386
|
+
? ["Grumble without being passive; make the complaint itself clear."] : []),
|
|
306
387
|
];
|
|
307
|
-
const
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
388
|
+
const releasedComposites = (axes) => RELEASED_0_1_4_COMPOSITES
|
|
389
|
+
.filter(({ fires }) => fires(axes)).map(({ line }) => line);
|
|
390
|
+
const legacyComposites = (axes) => LEGACY_CURRENT_COMPOSITES
|
|
391
|
+
.filter((_line, index) => index === 0
|
|
392
|
+
? axes.warmth >= 4 && axes.profanity >= 4
|
|
393
|
+
: axes.compliance <= 2 && axes.conviction <= 2).slice();
|
|
394
|
+
const producers = historical ? [{
|
|
395
|
+
current: false, anchors: OLD_ANCHORS, composites: oldComposites,
|
|
396
|
+
speech: OLD_SPEECH_LEVEL, register: null, format: false,
|
|
397
|
+
}] : [
|
|
398
|
+
{ current: true, anchors: ANCHORS, composites, speech: SPEECH_LEVEL, register: REGISTER_COMPOSITION, format: true },
|
|
399
|
+
{ current: false, anchors: RELEASED_0_1_4_ANCHORS, composites: releasedComposites,
|
|
400
|
+
speech: RELEASED_0_1_4_SPEECH_LEVEL, register: REGISTER_COMPOSITION, format: true },
|
|
401
|
+
{ current: false, anchors: PREVIOUS_ANCHORS, composites: releasedComposites,
|
|
402
|
+
speech: PREVIOUS_SPEECH_LEVEL, register: PREVIOUS_REGISTER_COMPOSITION, format: true },
|
|
403
|
+
...(!styleMarker ? [{ current: false, anchors: LEGACY_CURRENT_ANCHORS, composites: legacyComposites,
|
|
404
|
+
speech: PREVIOUS_SPEECH_LEVEL, register: PREVIOUS_REGISTER_COMPOSITION, format: false }] : []),
|
|
314
405
|
];
|
|
315
|
-
const acceptedRules = historical || styleMarker ? [expectedRules] : [expectedRules, legacyExpectedRules];
|
|
316
|
-
if (!acceptedRules.some((candidate) => rules.length === candidate.length &&
|
|
317
|
-
rules.every((line, index) => line === candidate[index])))
|
|
318
|
-
return null;
|
|
319
406
|
const controls = body.slice(controlsAt + heading.length).replace(/\n$/, "");
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
407
|
+
let selected = null;
|
|
408
|
+
for (const producer of producers) {
|
|
409
|
+
const axes = { ...AXIS_DEFAULT };
|
|
410
|
+
let recognized = true;
|
|
411
|
+
for (const [position, axis] of AXIS_ORDER.entries()) {
|
|
412
|
+
const matches = producer.anchors[axis].map((anchor, index) => ({ anchor, level: index + 1 }))
|
|
413
|
+
.filter(({ anchor }) => rules[position] === `- ${anchor}`);
|
|
414
|
+
if (matches.length !== 1) {
|
|
415
|
+
recognized = false;
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
axes[axis] = matches[0].level;
|
|
419
|
+
}
|
|
420
|
+
if (!recognized || styleMarker && (Number(styleMarker[1]) !== axes.verbosity || Number(styleMarker[2]) !== axes.care))
|
|
421
|
+
continue;
|
|
422
|
+
const speechLine = rules.at(-1);
|
|
423
|
+
const speech = styleMarker && producer.speech.rough !== undefined && speechLine === `- ${producer.speech.rough}` ? "rough"
|
|
424
|
+
: speechLine === `- ${producer.speech.polite}` ? "polite"
|
|
425
|
+
: speechLine === `- ${producer.speech.plain}` ? "plain" : "auto";
|
|
426
|
+
const speechRule = speech === "rough" ? producer.speech.rough : producer.speech[speech];
|
|
427
|
+
const expectedRules = [
|
|
428
|
+
...AXIS_ORDER.map((axis) => `- ${producer.anchors[axis][axes[axis] - 1]}`),
|
|
429
|
+
...producer.composites(axes).map((line) => `- ${line}`),
|
|
430
|
+
...(producer.format ? [`- ${FORMAT_COMPOSITION}`] : []),
|
|
431
|
+
...(producer.register === null ? [] : [`- ${producer.register}`]),
|
|
432
|
+
...(speechRule == null ? [] : [`- ${speechRule}`]),
|
|
433
|
+
];
|
|
434
|
+
if (rules.length !== expectedRules.length || !rules.every((line, index) => line === expectedRules[index]))
|
|
435
|
+
continue;
|
|
436
|
+
let remaining = historical && controls.startsWith(OLD_GUARD_BUNDLE)
|
|
437
|
+
? controls.slice(OLD_GUARD_BUNDLE.length) : controls;
|
|
438
|
+
if (producer.current) {
|
|
439
|
+
const prefix = `- ${CONTROLS.intensityConsent}\n`;
|
|
440
|
+
if (!remaining.startsWith(prefix))
|
|
441
|
+
continue;
|
|
442
|
+
remaining = remaining.slice(prefix.length);
|
|
443
|
+
const confirmation = intensityConfirmation(axes);
|
|
444
|
+
if (confirmation !== null) {
|
|
445
|
+
const confirmationLine = `- ${confirmation}\n`;
|
|
446
|
+
if (!remaining.startsWith(confirmationLine))
|
|
447
|
+
continue;
|
|
448
|
+
remaining = remaining.slice(confirmationLine.length);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
const safeword = /^- Safeword: when the user's message contains "([^"\n]+)" or a near-identical rewording,\n/.exec(remaining)?.[1] ?? null;
|
|
452
|
+
if (safeword !== null && safewordRejection(safeword, t) !== null)
|
|
453
|
+
continue;
|
|
454
|
+
const boundary = producer.current ? `- ${CONTROLS.intensityBoundary}\n` : "";
|
|
455
|
+
const tail = `${historical ? `- ${OLD_EMERGENCY}\n` : ""}${boundary}- ${CONTROLS.fallback}`;
|
|
456
|
+
const known = safeword === null ? [tail] : [
|
|
457
|
+
`- ${CONTROLS.safeword(safeword)}\n${tail}`,
|
|
458
|
+
...(historical ? [`- ${oldSafeword(safeword)}\n${tail}`] : []),
|
|
459
|
+
];
|
|
460
|
+
if (!known.includes(remaining))
|
|
461
|
+
continue;
|
|
462
|
+
selected = { axes, speech, safeword };
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
if (selected === null)
|
|
332
466
|
return null;
|
|
467
|
+
config.axes = selected.axes;
|
|
468
|
+
config.speech_level = selected.speech;
|
|
469
|
+
config.safeword = selected.safeword;
|
|
333
470
|
config.preset = marker[1] === "unsaved" ? null : marker[1];
|
|
334
471
|
config.unsaved = marker[1] === "unsaved";
|
|
335
472
|
const parsed = recoverSettings(JSON.stringify(config), t);
|
package/dist/core/locales/es.js
CHANGED
|
@@ -101,7 +101,7 @@ const messages = {
|
|
|
101
101
|
choosePreset: "Elige un preajuste para los valores sin un origen guardado válido:",
|
|
102
102
|
sourceRequired: "Los valores guardados están incompletos. Ejecuta tonedial doctor --fix de forma interactiva o selecciona --from-preset SLUG o --from-operation ID antes de recuperar sin interacción.",
|
|
103
103
|
sourceInvalid: "El origen elegido no proporciona ajustes válidos. Se conservó el original.",
|
|
104
|
-
invalidOptions: "El origen
|
|
104
|
+
invalidOptions: "El origen, la cuarentena y las herramientas requieren doctor --fix. --restore-preset requiere --from-operation; --rollback no se combina con cuarentena, origen, preajuste ni herramientas.",
|
|
105
105
|
keptSettings: "Se conservaron los ajustes y preajustes personalizados.",
|
|
106
106
|
obsoleteWidthDiscarded: "Se descarta el valor no válido del antiguo fixed_width. La salida se adapta al ancho del terminal.",
|
|
107
107
|
obsoleteGuardsDiscarded: "Se descarta el valor no válido del antiguo guards. ToneDial ya no añade solicitudes de protección.",
|
|
@@ -114,6 +114,13 @@ const messages = {
|
|
|
114
114
|
rollback: (id) => `Restaura los archivos anteriores:\ntonedial doctor --fix --rollback ${id}`,
|
|
115
115
|
rollbackOrder: "Restaura primero las conexiones y después los archivos de la aplicación:",
|
|
116
116
|
noSnapshot: (id) => `${id}: no hay una instantánea válida para este directorio de estado`,
|
|
117
|
+
quarantineCandidate: (id) => `ID de operación:\n${id}\nPara reconstruir, primero debes poner este registro en cuarentena; los bytes originales quedarán en el historial de reversión.`,
|
|
118
|
+
quarantineQuestion: "Escribe el ID completo de arriba para ponerlo en cuarentena; Enter cancela:",
|
|
119
|
+
quarantineRequired: (id, command) => `${id}: debes poner en cuarentena este registro ilegible antes de recuperar. No se cambió ningún archivo.\n${command}`,
|
|
120
|
+
quarantineUnavailable: (id) => `${id}: no hay un registro de operación ilegible que se pueda poner en cuarentena. No se cambió ningún archivo.`,
|
|
121
|
+
quarantine: (id) => `Pon en cuarentena la operación ilegible ${id}; conserva sus bytes originales en el historial de reversión.`,
|
|
122
|
+
quarantineComplete: (id) => `La operación ilegible ${id} quedó en cuarentena.`,
|
|
123
|
+
quarantineRemaining: (count) => `${count === 1 ? "Queda 1 registro de operación ilegible" : `Quedan ${count} registros de operación ilegibles`}. Pon el siguiente en cuarentena antes de continuar la recuperación.`,
|
|
117
124
|
retire: (id) => `Archiva la operación detenida ${id} antes de reconstruir. Sus cambios externos no se certifican ni se deshacen.`,
|
|
118
125
|
resumeOperation: (id) => `Operación detenida:\n${id}`,
|
|
119
126
|
resumeQuestion: "Para continuar, escribe el ID completo de arriba; Enter cancela:",
|
|
@@ -158,7 +165,7 @@ const messages = {
|
|
|
158
165
|
safewordShort: (phrase) => `Palabra clave ${phrase}: demasiado corta; podría activarse por accidente`,
|
|
159
166
|
safewordSet: (phrase) => `Palabra clave ${phrase}`,
|
|
160
167
|
noSafeword: "sin palabra clave",
|
|
161
|
-
register: (level) => `registro ${level} (${({ auto: "según la relación", polite: "formas honoríficas", plain: "formas normales sin honoríficos", rough: "formas
|
|
168
|
+
register: (level) => `registro ${level} (${({ auto: "según la relación", polite: "formas honoríficas", plain: "formas normales sin honoríficos", rough: "formas no honoríficas cortas y tajantes" })[level]})`,
|
|
162
169
|
},
|
|
163
170
|
artifact: {
|
|
164
171
|
size: (chars) => `TONE.md ${chars} caracteres`,
|
|
@@ -269,6 +276,7 @@ const messages = {
|
|
|
269
276
|
seedsNotRun: "sin archivos incluidos · aquí no se ha ejecutado init",
|
|
270
277
|
seedsAttention: "los archivos incluidos requieren atención",
|
|
271
278
|
recoveryPending: "Hay una operación en curso o que necesita recuperación. Esta ejecución no cambió archivos.",
|
|
279
|
+
invalidRecoveryPending: "Un historial de operaciones ilegible está bloqueando la recuperación. Esta ejecución no cambió archivos.",
|
|
272
280
|
resumeOperation: "Continuar la reparación de la aplicación:",
|
|
273
281
|
contextCurrent: "La estructura de AGENTS.md y TONE.md está al día.",
|
|
274
282
|
contextRepair: "Los archivos de contexto gestionados necesitan reparación. Revisa el diagnóstico de la guía y del tono.",
|
|
@@ -291,7 +299,7 @@ const messages = {
|
|
|
291
299
|
changed: "El lector o los ajustes cambiaron durante la inspección. Reintenta cuando terminen los cambios.",
|
|
292
300
|
probe: "Falló la comprobación controlada. Revisa Node y el acceso al directorio temporal; después repite doctor.",
|
|
293
301
|
},
|
|
294
|
-
operationState: { pending: "pendiente", complete: "completa", "rolled-back": "restaurada", "retired-for-app-rebuild": "archivada para reconstruir", invalid: "registro no válido" },
|
|
302
|
+
operationState: { pending: "pendiente", complete: "completa", "rolled-back": "restaurada", "retired-for-app-rebuild": "archivada para reconstruir", quarantined: "en cuarentena", invalid: "registro no válido" },
|
|
295
303
|
rollbackStatus: {
|
|
296
304
|
ready: "La aprobación restaurará la operación elegida.",
|
|
297
305
|
busy: "La operación sigue activa. Espera a que termine su propietario.",
|
|
@@ -455,6 +463,7 @@ const messages = {
|
|
|
455
463
|
tools: "agentes que conectar · init: none solo crea el estado",
|
|
456
464
|
fix: "doctor: reparar los problemas que se puedan",
|
|
457
465
|
rollback: "doctor --fix: restaurar una operación",
|
|
466
|
+
quarantineOperation: "doctor --fix: poner en cuarentena un registro ilegible",
|
|
458
467
|
fromOperation: "doctor --fix: elegir ajustes guardados de una operación",
|
|
459
468
|
fromPreset: "doctor --fix: preajuste para ajustes no disponibles",
|
|
460
469
|
restorePreset: "doctor --fix: restaurar un preajuste ausente o dañado",
|
|
@@ -471,7 +480,7 @@ const messages = {
|
|
|
471
480
|
},
|
|
472
481
|
combos: {
|
|
473
482
|
contradiction: (rule) => `${rule} se contradice.`,
|
|
474
|
-
refusalCompliance: "Un eje pide
|
|
483
|
+
refusalCompliance: "Un eje pide aplazar la tarea; el otro, empezarla de inmediato con entusiasmo. Reduce uno de los dos.",
|
|
475
484
|
nothingBlocked: "No se bloquea nada.",
|
|
476
485
|
},
|
|
477
486
|
errors: {
|
|
@@ -614,21 +623,21 @@ export const es = {
|
|
|
614
623
|
},
|
|
615
624
|
axisHints: {
|
|
616
625
|
formality: { owns: "lenguaje y distancia social", low: "lenguaje familiar con jerga", high: "lenguaje ceremonial y deferente" },
|
|
617
|
-
verbosity: { owns: "longitud y profundidad de la respuesta", low: "
|
|
618
|
-
profanity: { owns: "
|
|
619
|
-
playfulness: { owns: "
|
|
620
|
-
critique: { owns: "
|
|
621
|
-
flattery: { owns: "
|
|
622
|
-
warmth: { owns: "calidez hacia el usuario", low: "sin saludo, acogida cálida ni ánimo", high: "
|
|
626
|
+
verbosity: { owns: "longitud y profundidad de la respuesta", low: "una frase breve para un resultado sencillo", high: "profundidad dentro de la tarea pedida" },
|
|
627
|
+
profanity: { owns: "solo palabrotas: frecuencia e intensidad", low: "sin palabrotas; conserva la jerga del rol", high: "palabrotas sin censura en casi cada frase" },
|
|
628
|
+
playfulness: { owns: "intensidad y frecuencia del humor y del rol", low: "lenguaje literal; conserva el trato", high: "voz del personaje en casi cada frase" },
|
|
629
|
+
critique: { owns: "dureza de la crítica a defectos y decisiones", low: "defectos neutrales sin juzgar", high: "burla implacable de defectos graves y decisiones" },
|
|
630
|
+
flattery: { owns: "cantidad e intensidad de los elogios", low: "ninguno", high: "elogio efusivo cada párrafo; evaluación intacta" },
|
|
631
|
+
warmth: { owns: "calidez hacia el usuario", low: "sin saludo, acogida cálida ni ánimo", high: "amabilidad, empatía y consuelo en cada párrafo" },
|
|
623
632
|
conviction: { owns: "firmeza al imponer su criterio", low: "presenta opciones y pregunta", high: "expone una recomendación como decisión" },
|
|
624
|
-
care: { owns: "cobertura, organización y presentación
|
|
625
|
-
compliance: { owns: "
|
|
626
|
-
refusal: { owns: "frecuencia
|
|
627
|
-
bravado: { owns: "
|
|
633
|
+
care: { owns: "cobertura, organización y presentación", low: "solo la tarea solicitada", high: "seguimiento, copia, descanso, listas y estados" },
|
|
634
|
+
compliance: { owns: "voluntad cuando refusal no aplaza", low: "objeta con un motivo y luego actúa", high: "empieza con ganas; sin demora ni negociación" },
|
|
635
|
+
refusal: { owns: "frecuencia y condiciones del rechazo", low: "sin rechazo ni demora", high: "huelga hasta persuadirlo o usar la palabra clave" },
|
|
636
|
+
bravado: { owns: "esfuerzo exagerado y mérito reclamado", low: "sin exageración", high: "presume y reclama mérito; conserva el personaje" },
|
|
628
637
|
},
|
|
629
638
|
settingHints: {
|
|
630
639
|
safeword: "petición de una respuesta sencilla para un solo mensaje",
|
|
631
|
-
speech_level: "auto: según la relación · polite: formas honoríficas · plain: formas normales sin honoríficos · rough: terminaciones
|
|
640
|
+
speech_level: "auto: según la relación · polite: formas honoríficas · plain: formas normales sin honoríficos · rough: terminaciones no honoríficas cortas y tajantes; no añaden por sí mismas bromas, palabrotas, críticas ni burlas · formality controla el lenguaje y la distancia",
|
|
632
641
|
language: "idioma de la interfaz CLI · independiente de las respuestas del agente",
|
|
633
642
|
"persona.age": "franja de edad que puede asociar el modelo",
|
|
634
643
|
"persona.gender": "género que puede asociar el modelo",
|