@sayknow-cli/coding-agent 0.3.1 → 0.3.2
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/bin/skc.js +4 -0
- package/dist/types/cli/mcp-cli.d.ts +25 -0
- package/dist/types/cli/plugin-cli.d.ts +2 -0
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/mcp.d.ts +70 -0
- package/dist/types/commands/plugin.d.ts +6 -0
- package/dist/types/commands/session.d.ts +6 -0
- package/dist/types/config/keybindings.d.ts +2 -2
- package/dist/types/config/model-profile-activation.d.ts +8 -1
- package/dist/types/config/settings-schema.d.ts +1 -59
- package/dist/types/deep-interview/plaintext-gate-guard.d.ts +11 -0
- package/dist/types/extensibility/skc-plugins/compiler.d.ts +19 -0
- package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +29 -0
- package/dist/types/extensibility/skc-plugins/index.d.ts +9 -0
- package/dist/types/extensibility/skc-plugins/injection.d.ts +9 -0
- package/dist/types/extensibility/skc-plugins/installer.d.ts +13 -0
- package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +26 -0
- package/dist/types/extensibility/skc-plugins/observability.d.ts +27 -0
- package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +16 -0
- package/dist/types/extensibility/skc-plugins/registry.d.ts +32 -0
- package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +64 -0
- package/dist/types/extensibility/skc-plugins/session-validation.d.ts +42 -0
- package/dist/types/extensibility/skc-plugins/types.d.ts +158 -2
- package/dist/types/extensibility/skc-plugins/validation.d.ts +8 -1
- package/dist/types/i18n/messages/en.d.ts +0 -1
- package/dist/types/main.d.ts +2 -0
- package/dist/types/modes/components/custom-editor.d.ts +1 -1
- package/dist/types/modes/components/model-selector.d.ts +8 -0
- package/dist/types/modes/components/settings-defs.d.ts +0 -1
- package/dist/types/modes/components/status-line/git-utils.d.ts +6 -0
- package/dist/types/modes/theme/defaults/index.d.ts +99 -0
- package/dist/types/modes/theme/theme.d.ts +1 -1
- package/dist/types/notifications/html-format.d.ts +11 -0
- package/dist/types/notifications/index.d.ts +149 -1
- package/dist/types/notifications/lifecycle-commands.d.ts +60 -0
- package/dist/types/notifications/lifecycle-control-runtime.d.ts +98 -0
- package/dist/types/notifications/lifecycle-orchestrator.d.ts +144 -0
- package/dist/types/notifications/operator-runtime.d.ts +52 -0
- package/dist/types/notifications/rate-limit-pool.d.ts +2 -0
- package/dist/types/notifications/recent-activity.d.ts +35 -0
- package/dist/types/notifications/telegram-daemon.d.ts +114 -16
- package/dist/types/notifications/telegram-reference.d.ts +3 -1
- package/dist/types/notifications/topic-registry.d.ts +12 -9
- package/dist/types/runtime-mcp/types.d.ts +7 -0
- package/dist/types/sdk.d.ts +2 -0
- package/dist/types/session/agent-session.d.ts +14 -4
- package/dist/types/session/blob-store.d.ts +25 -0
- package/dist/types/session/session-manager.d.ts +57 -0
- package/dist/types/skc-runtime/launch-tmux.d.ts +1 -0
- package/dist/types/skc-runtime/psmux-detect.d.ts +78 -0
- package/dist/types/skc-runtime/team-runtime.d.ts +2 -0
- package/dist/types/skc-runtime/tmux-common.d.ts +30 -2
- package/dist/types/skc-runtime/tmux-sessions.d.ts +18 -0
- package/dist/types/slash-commands/helpers/fast-status-report.d.ts +6 -0
- package/dist/types/system-prompt.d.ts +2 -0
- package/dist/types/task/executor.d.ts +9 -1
- package/dist/types/tools/composer-bash-policy.d.ts +14 -0
- package/dist/types/tools/index.d.ts +3 -1
- package/dist/types/utils/changelog.d.ts +1 -0
- package/dist/types/web/insane/url-guard.d.ts +6 -3
- package/dist/types/web/scrapers/types.d.ts +5 -0
- package/dist/types/web/scrapers/utils.d.ts +7 -1
- package/package.json +11 -9
- package/scripts/g004-tmux-smoke.ts +100 -0
- package/scripts/g005-daemon-smoke.ts +180 -0
- package/scripts/g011-daemon-path-smoke.ts +153 -0
- package/src/cli/fast-help.ts +29 -1
- package/src/cli/mcp-cli.ts +272 -0
- package/src/cli/plugin-cli.ts +66 -3
- package/src/cli.ts +30 -12
- package/src/commands/mcp.ts +117 -0
- package/src/commands/plugin.ts +4 -0
- package/src/commands/session.ts +18 -0
- package/src/config/keybindings.ts +2 -2
- package/src/config/model-profile-activation.ts +55 -7
- package/src/config/settings-schema.ts +8 -93
- package/src/deep-interview/plaintext-gate-guard.ts +94 -0
- package/src/defaults/skc/extensions/grok-cli-vendor/biome.json +1 -1
- package/src/defaults/skc/skills/deep-interview/SKILL.md +7 -6
- package/src/defaults/skc/skills/team/SKILL.md +5 -3
- package/src/defaults/skc/skills/ultragoal/SKILL.md +41 -13
- package/src/export/html/index.ts +2 -2
- package/src/extensibility/extensions/runner.ts +1 -0
- package/src/extensibility/skc-plugins/compiler.ts +351 -0
- package/src/extensibility/skc-plugins/constrained-hooks.ts +170 -0
- package/src/extensibility/skc-plugins/index.ts +9 -0
- package/src/extensibility/skc-plugins/injection.ts +109 -0
- package/src/extensibility/skc-plugins/installer.ts +434 -0
- package/src/extensibility/skc-plugins/loader.ts +3 -1
- package/src/extensibility/skc-plugins/mcp-policy.ts +239 -0
- package/src/extensibility/skc-plugins/observability.ts +84 -0
- package/src/extensibility/skc-plugins/paths.ts +1 -1
- package/src/extensibility/skc-plugins/prompt-appendix.ts +109 -0
- package/src/extensibility/skc-plugins/registry.ts +180 -0
- package/src/extensibility/skc-plugins/runtime-adapters.ts +234 -0
- package/src/extensibility/skc-plugins/schema.ts +250 -20
- package/src/extensibility/skc-plugins/session-validation.ts +147 -0
- package/src/extensibility/skc-plugins/types.ts +199 -3
- package/src/extensibility/skc-plugins/validation.ts +80 -0
- package/src/extensibility/skills.ts +15 -0
- package/src/hooks/skill-state.ts +57 -0
- package/src/i18n/messages/de.ts +0 -1
- package/src/i18n/messages/en.ts +0 -1
- package/src/i18n/messages/es.ts +0 -1
- package/src/i18n/messages/fr.ts +0 -1
- package/src/i18n/messages/ja.ts +0 -1
- package/src/i18n/messages/ko.ts +0 -1
- package/src/i18n/messages/zh.ts +0 -1
- package/src/internal-urls/docs-index.generated.ts +12 -8
- package/src/main.ts +14 -3
- package/src/modes/bridge/bridge-mode.ts +11 -0
- package/src/modes/components/assistant-message.ts +49 -1
- package/src/modes/components/custom-editor.ts +2 -0
- package/src/modes/components/footer.ts +2 -3
- package/src/modes/components/hook-editor.ts +1 -1
- package/src/modes/components/hook-selector.ts +67 -43
- package/src/modes/components/model-selector.ts +56 -11
- package/src/modes/components/settings-defs.ts +1 -2
- package/src/modes/components/settings-selector.ts +2 -7
- package/src/modes/components/status-line/git-utils.ts +25 -0
- package/src/modes/components/status-line.ts +10 -11
- package/src/modes/components/welcome.ts +2 -3
- package/src/modes/controllers/extension-ui-controller.ts +0 -27
- package/src/modes/controllers/selector-controller.ts +53 -11
- package/src/modes/interactive-mode.ts +4 -1
- package/src/modes/shared/agent-wire/scopes.ts +1 -1
- package/src/modes/theme/defaults/gruvbox-dark.json +99 -0
- package/src/modes/theme/defaults/index.ts +2 -0
- package/src/modes/theme/theme.ts +0 -4
- package/src/modes/utils/hotkeys-markdown.ts +1 -1
- package/src/notifications/html-format.ts +38 -0
- package/src/notifications/index.ts +242 -12
- package/src/notifications/lifecycle-commands.ts +238 -0
- package/src/notifications/lifecycle-control-runtime.ts +405 -0
- package/src/notifications/lifecycle-orchestrator.ts +358 -0
- package/src/notifications/operator-runtime.ts +171 -0
- package/src/notifications/rate-limit-pool.ts +19 -0
- package/src/notifications/recent-activity.ts +132 -0
- package/src/notifications/telegram-daemon.ts +778 -257
- package/src/notifications/telegram-reference.ts +25 -7
- package/src/notifications/topic-registry.ts +23 -9
- package/src/prompts/agents/executor.md +2 -2
- package/src/runtime-mcp/transports/stdio.ts +38 -4
- package/src/runtime-mcp/types.ts +7 -0
- package/src/sdk.ts +157 -10
- package/src/session/agent-session.ts +166 -74
- package/src/session/blob-store.ts +196 -8
- package/src/session/session-manager.ts +762 -12
- package/src/skc-runtime/launch-tmux.ts +68 -19
- package/src/skc-runtime/psmux-detect.ts +239 -0
- package/src/skc-runtime/team-runtime.ts +56 -23
- package/src/skc-runtime/tmux-common.ts +88 -4
- package/src/skc-runtime/tmux-sessions.ts +111 -9
- package/src/skc-runtime/ultragoal-guard.ts +25 -8
- package/src/skc-runtime/ultragoal-runtime.ts +75 -15
- package/src/slash-commands/builtin-registry.ts +23 -3
- package/src/slash-commands/helpers/fast-status-report.ts +13 -3
- package/src/slash-commands/helpers/parse.ts +2 -1
- package/src/system-prompt.ts +9 -0
- package/src/task/executor.ts +31 -7
- package/src/task/index.ts +2 -0
- package/src/tools/ask.ts +5 -1
- package/src/tools/bash.ts +9 -0
- package/src/tools/composer-bash-policy.ts +96 -0
- package/src/tools/fetch.ts +18 -2
- package/src/tools/index.ts +3 -1
- package/src/utils/changelog.ts +8 -0
- package/src/web/insane/url-guard.ts +18 -14
- package/src/web/scrapers/types.ts +143 -45
- package/src/web/scrapers/utils.ts +70 -19
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { isKnownWorkflowState } from "../../skc-runtime/workflow-manifest";
|
|
2
2
|
import type { CanonicalSkcWorkflowSkill } from "../../skill-state/active-state";
|
|
3
|
+
import { assertMcpInstallPolicy } from "./mcp-policy";
|
|
3
4
|
import {
|
|
4
5
|
type LoadedSubskillBinding,
|
|
6
|
+
type NormalizedSkcPluginBundle,
|
|
5
7
|
SKC_AGENT_SUBSKILL_PHASES,
|
|
6
8
|
SKC_SUBSKILL_PARENT_AGENTS,
|
|
7
9
|
SKC_SUBSKILL_PARENT_SKILLS,
|
|
8
10
|
SkcPluginLoadError,
|
|
11
|
+
type SkcPluginRegistryEntry,
|
|
9
12
|
type SkcSubskillParentAgent,
|
|
10
13
|
type SubskillFrontmatter,
|
|
11
14
|
} from "./types";
|
|
@@ -74,3 +77,80 @@ export function buildParentPhaseSet(bindings: readonly LoadedSubskillBinding[]):
|
|
|
74
77
|
}
|
|
75
78
|
return new Set(seen.keys());
|
|
76
79
|
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Hard install-time collision + security validation for a compiled bundle
|
|
83
|
+
* against the effective installed registry (other plugins in the target scope
|
|
84
|
+
* universe). Collisions are hard errors; the registry is the collision
|
|
85
|
+
* authority, never capability first-wins.
|
|
86
|
+
*/
|
|
87
|
+
export function validateInstallPlan(
|
|
88
|
+
bundle: NormalizedSkcPluginBundle,
|
|
89
|
+
effectiveEntries: readonly SkcPluginRegistryEntry[],
|
|
90
|
+
): void {
|
|
91
|
+
const others = effectiveEntries.filter(e => e.name !== bundle.name);
|
|
92
|
+
|
|
93
|
+
const toolNames = new Set<string>();
|
|
94
|
+
const hookKeys = new Set<string>();
|
|
95
|
+
const mcpNames = new Set<string>();
|
|
96
|
+
const appendixIds = new Set<string>();
|
|
97
|
+
const subskillArgs = new Set<string>();
|
|
98
|
+
const parentPhases = new Set<string>();
|
|
99
|
+
for (const e of others) {
|
|
100
|
+
for (const t of e.surfaces.tools) toolNames.add(t.name);
|
|
101
|
+
for (const h of e.surfaces.hooks) hookKeys.add(h.extensionId);
|
|
102
|
+
for (const m of e.surfaces.mcps) mcpNames.add(m.name);
|
|
103
|
+
for (const a of e.surfaces.systemAppendices) appendixIds.add(a.extensionId);
|
|
104
|
+
for (const a of e.surfaces.agentAppendices) appendixIds.add(a.extensionId);
|
|
105
|
+
for (const s of e.surfaces.subskills) {
|
|
106
|
+
subskillArgs.add(`${s.parent}\u0000${s.activationArg}`);
|
|
107
|
+
parentPhases.add(`${s.parent}\u0000${s.phase}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Check candidate surfaces against the effective registry AND against each
|
|
112
|
+
// other (intra-bundle duplicates are also hard errors).
|
|
113
|
+
for (const t of bundle.surfaces.tools) {
|
|
114
|
+
if (toolNames.has(t.name)) {
|
|
115
|
+
throw new SkcPluginLoadError("duplicate_tool", `SKC plugin tool name collides: ${t.name}`);
|
|
116
|
+
}
|
|
117
|
+
toolNames.add(t.name);
|
|
118
|
+
}
|
|
119
|
+
for (const h of bundle.surfaces.hooks) {
|
|
120
|
+
if (hookKeys.has(h.extensionId)) {
|
|
121
|
+
throw new SkcPluginLoadError("duplicate_hook", `SKC plugin hook collides: ${h.extensionId}`);
|
|
122
|
+
}
|
|
123
|
+
hookKeys.add(h.extensionId);
|
|
124
|
+
}
|
|
125
|
+
for (const m of bundle.surfaces.mcps) {
|
|
126
|
+
if (mcpNames.has(m.name)) {
|
|
127
|
+
throw new SkcPluginLoadError("duplicate_mcp", `SKC plugin MCP name collides: ${m.name}`);
|
|
128
|
+
}
|
|
129
|
+
mcpNames.add(m.name);
|
|
130
|
+
assertMcpInstallPolicy(m.config, { pluginRoot: bundle.root });
|
|
131
|
+
}
|
|
132
|
+
for (const a of [...bundle.surfaces.systemAppendices, ...bundle.surfaces.agentAppendices]) {
|
|
133
|
+
if (appendixIds.has(a.extensionId)) {
|
|
134
|
+
throw new SkcPluginLoadError("duplicate_appendix", `SKC plugin appendix collides: ${a.extensionId}`);
|
|
135
|
+
}
|
|
136
|
+
appendixIds.add(a.extensionId);
|
|
137
|
+
}
|
|
138
|
+
for (const s of bundle.surfaces.subskills) {
|
|
139
|
+
const argKey = `${s.parent}\u0000${s.activationArg}`;
|
|
140
|
+
const phaseKey = `${s.parent}\u0000${s.phase}`;
|
|
141
|
+
if (subskillArgs.has(argKey)) {
|
|
142
|
+
throw new SkcPluginLoadError(
|
|
143
|
+
"duplicate_arg",
|
|
144
|
+
`SKC plugin subskill activation_arg collides for ${s.parent}: ${s.activationArg}`,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
if (parentPhases.has(phaseKey)) {
|
|
148
|
+
throw new SkcPluginLoadError(
|
|
149
|
+
"duplicate_parent_phase",
|
|
150
|
+
`SKC plugin subskill parent/phase collides: ${s.parent}/${s.phase}`,
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
subskillArgs.add(argKey);
|
|
154
|
+
parentPhases.add(phaseKey);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -10,6 +10,7 @@ import type { SkillPromptDetails } from "../session/messages";
|
|
|
10
10
|
import { expandTilde } from "../tools/path-utils";
|
|
11
11
|
import type { LoadedSubskillActivation } from "./skc-plugins";
|
|
12
12
|
import { buildSubskillInjection } from "./skc-plugins/injection";
|
|
13
|
+
import { renderSkillAdvertisement } from "./skc-plugins/runtime-adapters";
|
|
13
14
|
export interface Skill {
|
|
14
15
|
name: string;
|
|
15
16
|
description: string;
|
|
@@ -415,6 +416,20 @@ export async function buildSkillPromptMessage(
|
|
|
415
416
|
} else if (context.subskillActivation) {
|
|
416
417
|
details.subskillActivation = context.subskillActivation;
|
|
417
418
|
}
|
|
419
|
+
// Tier-1 advertisement: metadata-only list of installed sub-skills bound to
|
|
420
|
+
// this parent skill, so the agent can choose one contextually.
|
|
421
|
+
if (context.cwd) {
|
|
422
|
+
try {
|
|
423
|
+
const advert = await renderSkillAdvertisement({
|
|
424
|
+
cwd: context.cwd,
|
|
425
|
+
skillName: skill.name,
|
|
426
|
+
phase: context.currentPhase,
|
|
427
|
+
});
|
|
428
|
+
if (advert) message += `\n\n${advert}`;
|
|
429
|
+
} catch {
|
|
430
|
+
// Advertisement is best-effort; never block skill prompt construction.
|
|
431
|
+
}
|
|
432
|
+
}
|
|
418
433
|
}
|
|
419
434
|
return {
|
|
420
435
|
message,
|
package/src/hooks/skill-state.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { logger } from "@sayknow-cli/utils";
|
|
4
4
|
import type { SkillDiscoverySettings } from "../config/skill-settings-defaults";
|
|
5
|
+
import { detectDeepInterviewPlaintextAskLeak } from "../deep-interview/plaintext-gate-guard";
|
|
5
6
|
import { buildSessionContext, loadEntriesFromFile, type SessionEntry } from "../session/session-manager";
|
|
6
7
|
import { activeSnapshotPath, modeStatePath as sessionModeStatePath } from "../skc-runtime/session-layout";
|
|
7
8
|
import { resolveSkcSessionForRead } from "../skc-runtime/session-resolution";
|
|
@@ -675,6 +676,52 @@ async function readCurrentGoalObjectiveFromSessionFile(sessionFile: string | und
|
|
|
675
676
|
return typeof objective === "string" && objective.trim().length > 0 ? objective.trim() : null;
|
|
676
677
|
}
|
|
677
678
|
|
|
679
|
+
async function readLatestAssistantTextFromSessionFile(sessionFile: string | undefined): Promise<string | null> {
|
|
680
|
+
const trimmed = sessionFile?.trim();
|
|
681
|
+
if (!trimmed) return null;
|
|
682
|
+
let entries: SessionEntry[];
|
|
683
|
+
try {
|
|
684
|
+
entries = (await loadEntriesFromFile(trimmed)).filter((entry): entry is SessionEntry => entry.type !== "session");
|
|
685
|
+
} catch {
|
|
686
|
+
return null;
|
|
687
|
+
}
|
|
688
|
+
if (entries.length === 0) return null;
|
|
689
|
+
const context = buildSessionContext(entries);
|
|
690
|
+
for (let index = context.messages.length - 1; index >= 0; index--) {
|
|
691
|
+
const message = context.messages[index];
|
|
692
|
+
if (message?.role !== "assistant") continue;
|
|
693
|
+
const text = message.content
|
|
694
|
+
.filter(block => block.type === "text")
|
|
695
|
+
.map(block => block.text)
|
|
696
|
+
.join("");
|
|
697
|
+
const trimmedText = text.trim();
|
|
698
|
+
return trimmedText.length > 0 ? trimmedText : null;
|
|
699
|
+
}
|
|
700
|
+
return null;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
async function shouldRescueDeepInterviewPlaintextAskLeak(
|
|
704
|
+
skill: SkcWorkflowSkill,
|
|
705
|
+
state: ModeState | null,
|
|
706
|
+
cwd: string,
|
|
707
|
+
sessionFile: string | undefined,
|
|
708
|
+
): Promise<boolean> {
|
|
709
|
+
if (skill !== "deep-interview") return false;
|
|
710
|
+
if (state?.active !== true) return false;
|
|
711
|
+
const phase = String(state.current_phase ?? "")
|
|
712
|
+
.trim()
|
|
713
|
+
.toLowerCase();
|
|
714
|
+
if (DEEP_INTERVIEW_ABORT_PHASES.has(phase)) return false;
|
|
715
|
+
if (await deepInterviewSpecCrystallized(state, cwd)) return false;
|
|
716
|
+
const latestAssistantText = await readLatestAssistantTextFromSessionFile(sessionFile);
|
|
717
|
+
if (!latestAssistantText) return false;
|
|
718
|
+
return detectDeepInterviewPlaintextAskLeak(latestAssistantText) !== null;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
function buildDeepInterviewPlaintextAskLeakMessage(statePath: string): string {
|
|
722
|
+
return `SKC deep-interview emitted a Deep Interview question/options block as plain text (${statePath}). It must not wait for a prose answer. Continue immediately by calling the ask tool with the Restate gate question and options: Yes, crystallize; Adjust wording; Missing scope; plus free text/custom input.`;
|
|
723
|
+
}
|
|
724
|
+
|
|
678
725
|
export async function buildActiveUltragoalPromptContext(input: UserPromptSubmitStateInput): Promise<string | null> {
|
|
679
726
|
const resolvedSessionId = await resolveBoundarySessionId(input.cwd, input.sessionId);
|
|
680
727
|
const visibleModeState = await readVisibleModeState(input.cwd, "ultragoal", resolvedSessionId, input.stateDir);
|
|
@@ -756,6 +803,16 @@ export async function buildSkillStopOutput(input: StopHookInput): Promise<Record
|
|
|
756
803
|
systemMessage: recoveryMessage,
|
|
757
804
|
};
|
|
758
805
|
}
|
|
806
|
+
if (await shouldRescueDeepInterviewPlaintextAskLeak(entry.skill, modeState, input.cwd, input.sessionFile)) {
|
|
807
|
+
const statePath = modeStatePath(input.cwd, entry.skill, resolvedSessionId);
|
|
808
|
+
const rescueMessage = buildDeepInterviewPlaintextAskLeakMessage(statePath);
|
|
809
|
+
return {
|
|
810
|
+
decision: "block",
|
|
811
|
+
reason: rescueMessage,
|
|
812
|
+
stopReason: "skc_skill_deep_interview_plaintext_ask_leak",
|
|
813
|
+
systemMessage: rescueMessage,
|
|
814
|
+
};
|
|
815
|
+
}
|
|
759
816
|
if (modeStateReleasesStop(modeState, handoffRequired)) {
|
|
760
817
|
// A mode-state that claims it releases the Stop block must agree with
|
|
761
818
|
// authoritative durable state. If a stale/incoherent mode-state would
|
package/src/i18n/messages/de.ts
CHANGED
|
@@ -30,7 +30,6 @@ export const de: Partial<Record<MsgKey, string>> = {
|
|
|
30
30
|
"settings.tab.appearance": "Darstellung",
|
|
31
31
|
"settings.tab.model": "Modell",
|
|
32
32
|
"settings.tab.interaction": "Interaktion",
|
|
33
|
-
"settings.tab.notifications": "Benachrichtigungen",
|
|
34
33
|
"settings.tab.context": "Kontext",
|
|
35
34
|
"settings.tab.memory": "Speicher",
|
|
36
35
|
"settings.tab.editing": "Bearbeitung",
|
package/src/i18n/messages/en.ts
CHANGED
|
@@ -37,7 +37,6 @@ export const en = {
|
|
|
37
37
|
"settings.tab.appearance": "Appearance",
|
|
38
38
|
"settings.tab.model": "Model",
|
|
39
39
|
"settings.tab.interaction": "Interaction",
|
|
40
|
-
"settings.tab.notifications": "Notifications",
|
|
41
40
|
"settings.tab.context": "Context",
|
|
42
41
|
"settings.tab.memory": "Memory",
|
|
43
42
|
"settings.tab.editing": "Editing",
|
package/src/i18n/messages/es.ts
CHANGED
|
@@ -30,7 +30,6 @@ export const es: Partial<Record<MsgKey, string>> = {
|
|
|
30
30
|
"settings.tab.appearance": "Apariencia",
|
|
31
31
|
"settings.tab.model": "Modelo",
|
|
32
32
|
"settings.tab.interaction": "Interacción",
|
|
33
|
-
"settings.tab.notifications": "Notificaciones",
|
|
34
33
|
"settings.tab.context": "Contexto",
|
|
35
34
|
"settings.tab.memory": "Memoria",
|
|
36
35
|
"settings.tab.editing": "Edición",
|
package/src/i18n/messages/fr.ts
CHANGED
|
@@ -30,7 +30,6 @@ export const fr: Partial<Record<MsgKey, string>> = {
|
|
|
30
30
|
"settings.tab.appearance": "Apparence",
|
|
31
31
|
"settings.tab.model": "Modèle",
|
|
32
32
|
"settings.tab.interaction": "Interaction",
|
|
33
|
-
"settings.tab.notifications": "Notifications",
|
|
34
33
|
"settings.tab.context": "Contexte",
|
|
35
34
|
"settings.tab.memory": "Mémoire",
|
|
36
35
|
"settings.tab.editing": "Édition",
|
package/src/i18n/messages/ja.ts
CHANGED
|
@@ -28,7 +28,6 @@ export const ja: Partial<Record<MsgKey, string>> = {
|
|
|
28
28
|
"settings.tab.appearance": "外観",
|
|
29
29
|
"settings.tab.model": "モデル",
|
|
30
30
|
"settings.tab.interaction": "操作",
|
|
31
|
-
"settings.tab.notifications": "通知",
|
|
32
31
|
"settings.tab.context": "コンテキスト",
|
|
33
32
|
"settings.tab.memory": "メモリ",
|
|
34
33
|
"settings.tab.editing": "編集",
|
package/src/i18n/messages/ko.ts
CHANGED
|
@@ -28,7 +28,6 @@ export const ko: Partial<Record<MsgKey, string>> = {
|
|
|
28
28
|
"settings.tab.appearance": "외관",
|
|
29
29
|
"settings.tab.model": "모델",
|
|
30
30
|
"settings.tab.interaction": "상호작용",
|
|
31
|
-
"settings.tab.notifications": "알림",
|
|
32
31
|
"settings.tab.context": "컨텍스트",
|
|
33
32
|
"settings.tab.memory": "메모리",
|
|
34
33
|
"settings.tab.editing": "편집",
|
package/src/i18n/messages/zh.ts
CHANGED
|
@@ -28,7 +28,6 @@ export const zh: Partial<Record<MsgKey, string>> = {
|
|
|
28
28
|
"settings.tab.appearance": "外观",
|
|
29
29
|
"settings.tab.model": "模型",
|
|
30
30
|
"settings.tab.interaction": "交互",
|
|
31
|
-
"settings.tab.notifications": "通知",
|
|
32
31
|
"settings.tab.context": "上下文",
|
|
33
32
|
"settings.tab.memory": "记忆",
|
|
34
33
|
"settings.tab.editing": "编辑",
|