(
configPath: string,
options: {
historianModel: string;
historianThinkingLevel?: string;
dreamerEnabled: boolean;
dreamerModel?: string;
/** Per-task schedule overrides (Dreamer v2); undefined keeps schema defaults. */
dreamerTasks?: Record<string, { schedule: string }>;
sidekickEnabled: boolean;
sidekickModel?: string;
embedding: EmbeddingChoice;
},
)
| 129 | } |
| 130 | |
| 131 | export function writeMagicContextConfig( |
| 132 | configPath: string, |
| 133 | options: { |
| 134 | historianModel: string; |
| 135 | historianThinkingLevel?: string; |
| 136 | dreamerEnabled: boolean; |
| 137 | dreamerModel?: string; |
| 138 | /** Per-task schedule overrides (Dreamer v2); undefined keeps schema defaults. */ |
| 139 | dreamerTasks?: Record<string, { schedule: string }>; |
| 140 | sidekickEnabled: boolean; |
| 141 | sidekickModel?: string; |
| 142 | embedding: EmbeddingChoice; |
| 143 | }, |
| 144 | ): void { |
| 145 | ensureDir(dirname(configPath)); |
| 146 | const config: Record<string, unknown> = existsSync(configPath) |
| 147 | ? (readJsonc(configPath) ?? {}) |
| 148 | : {}; |
| 149 | |
| 150 | if (!config.$schema) { |
| 151 | config.$schema = |
| 152 | "https://raw.githubusercontent.com/cortexkit/magic-context/master/assets/magic-context.schema.json"; |
| 153 | } |
| 154 | |
| 155 | // The Pi model picker yields Pi-native provider ids (openai-codex/..., |
| 156 | // google-antigravity/...). The shared config is canonical (OpenCode) form so |
| 157 | // OpenCode can read the same file; normalize before writing. |
| 158 | config.historian = compactObject({ |
| 159 | ...((config.historian as Record<string, unknown> | undefined) ?? {}), |
| 160 | model: piModelRefToCanonical(options.historianModel), |
| 161 | thinking_level: options.historianThinkingLevel, |
| 162 | }); |
| 163 | const dreamer = { |
| 164 | ...((config.dreamer as Record<string, unknown> | undefined) ?? {}), |
| 165 | model: options.dreamerModel ? piModelRefToCanonical(options.dreamerModel) : undefined, |
| 166 | disable: options.dreamerEnabled ? undefined : true, |
| 167 | enabled: undefined, |
| 168 | // Dreamer v2 per-task schedules — only set when the user declined the |
| 169 | // recommended defaults; otherwise leave unset so schema defaults apply. |
| 170 | tasks: options.dreamerEnabled ? options.dreamerTasks : undefined, |
| 171 | }; |
| 172 | config.dreamer = compactObject(dreamer); |
| 173 | |
| 174 | const sidekick = { |
| 175 | ...((config.sidekick as Record<string, unknown> | undefined) ?? {}), |
| 176 | model: |
| 177 | options.sidekickEnabled && options.sidekickModel |
| 178 | ? piModelRefToCanonical(options.sidekickModel) |
| 179 | : undefined, |
| 180 | disable: options.sidekickEnabled ? undefined : true, |
| 181 | enabled: undefined, |
| 182 | }; |
| 183 | config.sidekick = compactObject(sidekick); |
| 184 | |
| 185 | config.embedding = { |
| 186 | ...((config.embedding as Record<string, unknown> | undefined) ?? {}), |
| 187 | ...options.embedding, |
| 188 | }; |
no test coverage detected