@curie-agent/core 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +179 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/channel-router.js +1 -1
  4. package/dist/src/channel-router.js.map +1 -1
  5. package/dist/src/context.d.ts +11 -0
  6. package/dist/src/context.d.ts.map +1 -0
  7. package/dist/src/context.js +80 -0
  8. package/dist/src/context.js.map +1 -0
  9. package/dist/src/cron-manager.d.ts +27 -8
  10. package/dist/src/cron-manager.d.ts.map +1 -1
  11. package/dist/src/cron-manager.js +121 -33
  12. package/dist/src/cron-manager.js.map +1 -1
  13. package/dist/src/event-bus.d.ts +71 -0
  14. package/dist/src/event-bus.d.ts.map +1 -1
  15. package/dist/src/event-bus.js.map +1 -1
  16. package/dist/src/heartbeat-delivery.d.ts +2 -0
  17. package/dist/src/heartbeat-delivery.d.ts.map +1 -1
  18. package/dist/src/heartbeat-delivery.js +20 -3
  19. package/dist/src/heartbeat-delivery.js.map +1 -1
  20. package/dist/src/heartbeat-executor.d.ts +36 -2
  21. package/dist/src/heartbeat-executor.d.ts.map +1 -1
  22. package/dist/src/heartbeat-executor.js +32 -40
  23. package/dist/src/heartbeat-executor.js.map +1 -1
  24. package/dist/src/identity-files.d.ts +29 -0
  25. package/dist/src/identity-files.d.ts.map +1 -0
  26. package/dist/src/identity-files.js +59 -0
  27. package/dist/src/identity-files.js.map +1 -0
  28. package/dist/src/index.d.ts +19 -4
  29. package/dist/src/index.d.ts.map +1 -1
  30. package/dist/src/index.js +13 -2
  31. package/dist/src/index.js.map +1 -1
  32. package/dist/src/pricing.d.ts +29 -0
  33. package/dist/src/pricing.d.ts.map +1 -0
  34. package/dist/src/pricing.js +85 -0
  35. package/dist/src/pricing.js.map +1 -0
  36. package/dist/src/safety/command-guard.d.ts.map +1 -1
  37. package/dist/src/safety/command-guard.js +35 -1
  38. package/dist/src/safety/command-guard.js.map +1 -1
  39. package/dist/src/safety/path-guard.d.ts +7 -3
  40. package/dist/src/safety/path-guard.d.ts.map +1 -1
  41. package/dist/src/safety/path-guard.js +14 -5
  42. package/dist/src/safety/path-guard.js.map +1 -1
  43. package/dist/src/safety/snapshot.js +1 -1
  44. package/dist/src/safety/snapshot.js.map +1 -1
  45. package/dist/src/session-store.d.ts +3 -1
  46. package/dist/src/session-store.d.ts.map +1 -1
  47. package/dist/src/session-store.js +24 -1
  48. package/dist/src/session-store.js.map +1 -1
  49. package/dist/src/settings.d.ts +98 -1
  50. package/dist/src/settings.d.ts.map +1 -1
  51. package/dist/src/settings.js +363 -83
  52. package/dist/src/settings.js.map +1 -1
  53. package/dist/src/shell-detect.d.ts +12 -0
  54. package/dist/src/shell-detect.d.ts.map +1 -0
  55. package/dist/src/shell-detect.js +31 -0
  56. package/dist/src/shell-detect.js.map +1 -0
  57. package/dist/src/subagent-executor.d.ts +68 -0
  58. package/dist/src/subagent-executor.d.ts.map +1 -0
  59. package/dist/src/subagent-executor.js +289 -0
  60. package/dist/src/subagent-executor.js.map +1 -0
  61. package/dist/src/task-executor.d.ts +31 -0
  62. package/dist/src/task-executor.d.ts.map +1 -0
  63. package/dist/src/task-executor.js +91 -0
  64. package/dist/src/task-executor.js.map +1 -0
  65. package/dist/src/task-manager.d.ts +83 -0
  66. package/dist/src/task-manager.d.ts.map +1 -0
  67. package/dist/src/task-manager.js +308 -0
  68. package/dist/src/task-manager.js.map +1 -0
  69. package/dist/src/task-migration.d.ts +10 -0
  70. package/dist/src/task-migration.d.ts.map +1 -0
  71. package/dist/src/task-migration.js +144 -0
  72. package/dist/src/task-migration.js.map +1 -0
  73. package/dist/src/task-summary.d.ts +7 -0
  74. package/dist/src/task-summary.d.ts.map +1 -0
  75. package/dist/src/task-summary.js +34 -0
  76. package/dist/src/task-summary.js.map +1 -0
  77. package/dist/src/template-utils.d.ts +16 -0
  78. package/dist/src/template-utils.d.ts.map +1 -0
  79. package/dist/src/template-utils.js +72 -0
  80. package/dist/src/template-utils.js.map +1 -0
  81. package/dist/src/token-monitor.d.ts +50 -0
  82. package/dist/src/token-monitor.d.ts.map +1 -0
  83. package/dist/src/token-monitor.js +119 -0
  84. package/dist/src/token-monitor.js.map +1 -0
  85. package/dist/src/turn-loop.d.ts +10 -1
  86. package/dist/src/turn-loop.d.ts.map +1 -1
  87. package/dist/src/turn-loop.js +152 -23
  88. package/dist/src/turn-loop.js.map +1 -1
  89. package/dist/src/unified-task.d.ts +76 -0
  90. package/dist/src/unified-task.d.ts.map +1 -0
  91. package/dist/src/unified-task.js +196 -0
  92. package/dist/src/unified-task.js.map +1 -0
  93. package/package.json +16 -11
  94. package/templates/AGENTS.md +53 -0
  95. package/templates/HEARTBEAT.md +37 -0
  96. package/templates/MEMORY.md +29 -0
  97. package/templates/SOUL.md +28 -0
  98. package/templates/TOOLS.md +29 -0
  99. package/templates/USER.md +35 -0
  100. package/templates/WIKI.md +146 -0
  101. package/templates/settings.json +90 -0
  102. package/templates/skills/deep-research/SKILL.md +273 -0
  103. package/templates/skills/deep-research/references/report-structure.md +149 -0
  104. package/templates/skills/deep-research/references/topic-guides.md +151 -0
  105. package/templates/skills/planning/SKILL.md +222 -0
  106. package/templates/skills/planning/references/business.md +82 -0
  107. package/templates/skills/planning/references/creative.md +111 -0
  108. package/templates/skills/planning/references/events.md +109 -0
  109. package/templates/skills/planning/references/personal.md +107 -0
  110. package/templates/skills/planning/references/templates.md +279 -0
  111. package/templates/skills/wiki/SKILL.md +70 -0
@@ -1,6 +1,21 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import { join } from 'node:path';
4
+ // ── Default settings (nested format) ────────────────────────────────────────
5
+ function makeDefaultProviders() {
6
+ const p = {};
7
+ for (const name of ['anthropic', 'openai', 'openrouter', 'google', 'ollama', 'local']) {
8
+ p[name] = { api_key: '', url: '', model: '', model_cost: '', model_context_window: 131072 };
9
+ }
10
+ return {
11
+ anthropic: { ...p.anthropic, url: 'https://api.anthropic.com', model: 'claude-sonnet-4-6', model_context_window: 200000 },
12
+ openai: { ...p.openai, url: 'https://api.openai.com', model: 'gpt-4o' },
13
+ openrouter: { ...p.openrouter, url: 'https://openrouter.ai/api/v1', model: 'anthropic/claude-sonnet-4-6', model_context_window: 200000 },
14
+ google: { ...p.google, model: 'gemini-2.5-pro' },
15
+ ollama: { ...p.ollama, url: 'http://localhost:11434/v1', model: 'llama3' },
16
+ local: { ...p.local, model: 'custom' },
17
+ };
18
+ }
4
19
  export const DEFAULT_SETTINGS = {
5
20
  model: 'claude-sonnet-4-6',
6
21
  effort: 'auto',
@@ -8,24 +23,21 @@ export const DEFAULT_SETTINGS = {
8
23
  theme: 'nord',
9
24
  statusline: true,
10
25
  debug: false,
11
- BRAVE_SEARCH_API_KEY: '',
12
- TELEGRAM_BOT_TOKEN: '',
13
- TELEGRAM_USER_ID: '',
14
- TELEGRAM_CHAT_ID: '',
15
- TELEGRAM_ALLOW_GROUPS: false,
16
- CHANNEL_TAB_ACTIVE: 'main',
17
- TOOLS_PER_CALL: 10,
18
- WEBSEARCH_PER_CALL: 5,
19
- HEARTBEAT: 'off',
20
- HEARTBEAT_INTRADAY: '',
21
- HEARTBEAT_DAILY: '6:00',
22
- HEARTBEAT_WEEKLY: 'monday@6:00',
23
- HEARTBEAT_MONTHLY: '1@6:00',
24
- SAFETY_PATH_GUARD: 'on',
25
- SAFETY_PATH_ALLOWLIST: '',
26
- SAFETY_COMMAND_GUARD: 'on',
27
- SAFETY_SNAPSHOTS: 'on',
26
+ current_provider: 'anthropic',
27
+ providers: makeDefaultProviders(),
28
+ channels: { bot_token: '', user_id: '', chat_id: '', allow_groups: false, tab_active: 'main' },
29
+ tools_per_call: 10,
30
+ websearch_per_call: 5,
31
+ brave_search_api_key: '',
32
+ heartbeat: { schedule: 'off', mode: 'yolo', intraday: '', daily: '6:00', weekly: 'monday@6:00', monthly: '1@6:00', dreaming: '2:00' },
33
+ mcp_servers: {},
34
+ safety: { path_guard: 'on', path_allowlist: '', command_guard: 'on', snapshots: 'on' },
35
+ auto_compact: { enabled: 'on', threshold: 75, warn_threshold: 60, forced_threshold: 85 },
36
+ pricing_tier_warn: 'on',
37
+ wiki: { path: '', autoLint: 'off' },
38
+ web_ip: '',
28
39
  };
40
+ // ── Migration helpers ───────────────────────────────────────────────────────
29
41
  function migrateMode(raw) {
30
42
  if (typeof raw !== 'string')
31
43
  return DEFAULT_SETTINGS.mode;
@@ -34,14 +46,197 @@ function migrateMode(raw) {
34
46
  case 'edit':
35
47
  case 'auto':
36
48
  case 'yolo': return raw;
37
- case 'auto-edit': return 'edit';
38
- case 'manual': return 'auto';
39
- case 'full-auto': return 'yolo';
40
49
  default: return DEFAULT_SETTINGS.mode;
41
50
  }
42
51
  }
52
+ /** Case-insensitive pick: find first non-empty string value matching any of the candidate keys. */
53
+ function pickString(parsed, ...keys) {
54
+ const normalize = (s) => s.replace(/[_-]/g, '').toLowerCase();
55
+ const targets = new Set(keys.map(normalize));
56
+ for (const key of keys) {
57
+ const direct = parsed[key];
58
+ if (typeof direct === 'string' && direct.length > 0)
59
+ return direct;
60
+ }
61
+ for (const [k, v] of Object.entries(parsed)) {
62
+ if (typeof v !== 'string' || v.length === 0)
63
+ continue;
64
+ if (targets.has(normalize(k)))
65
+ return v;
66
+ }
67
+ return undefined;
68
+ }
69
+ function pickNumber(parsed, ...keys) {
70
+ const normalize = (s) => s.replace(/[_-]/g, '').toLowerCase();
71
+ const targets = new Set(keys.map(normalize));
72
+ for (const key of keys) {
73
+ const direct = parsed[key];
74
+ if (typeof direct === 'number')
75
+ return direct;
76
+ }
77
+ for (const [k, v] of Object.entries(parsed)) {
78
+ if (typeof v !== 'number')
79
+ continue;
80
+ if (targets.has(normalize(k)))
81
+ return v;
82
+ }
83
+ return undefined;
84
+ }
85
+ function pickBool(parsed, ...keys) {
86
+ const normalize = (s) => s.replace(/[_-]/g, '').toLowerCase();
87
+ const targets = new Set(keys.map(normalize));
88
+ for (const key of keys) {
89
+ const direct = parsed[key];
90
+ if (typeof direct === 'boolean')
91
+ return direct;
92
+ }
93
+ for (const [k, v] of Object.entries(parsed)) {
94
+ if (typeof v !== 'boolean')
95
+ continue;
96
+ if (targets.has(normalize(k)))
97
+ return v;
98
+ }
99
+ return undefined;
100
+ }
101
+ /** Detect whether raw JSON is legacy flat format (no `providers` object, but has flat provider keys). */
102
+ export function isLegacyFlatFormat(raw) {
103
+ const hasNested = 'providers' in raw && typeof raw.providers === 'object' && raw.providers !== null;
104
+ if (hasNested)
105
+ return false;
106
+ const flatMarkerKeys = [
107
+ 'MODEL_API_KEY', 'OPENAI_API_KEY', 'ANTHROPIC_API_KEY', 'OPENROUTER_API_KEY',
108
+ 'GOOGLE_API_KEY', 'MODEL_URL', 'ANTHROPIC_URL', 'OPENAI_URL', 'OPENROUTER_URL', 'GOOGLE_URL',
109
+ 'MODEL_PROVIDER',
110
+ ];
111
+ const normalize = (s) => s.replace(/[_-]/g, '').toLowerCase();
112
+ const markerTargets = new Set(flatMarkerKeys.map(normalize));
113
+ return Object.keys(raw).some(k => markerTargets.has(normalize(k)));
114
+ }
115
+ /** Migrate flat settings JSON to nested format. */
116
+ export function migrateFlatToNested(parsed) {
117
+ const modelProvider = (pickString(parsed, 'MODEL_PROVIDER') || 'anthropic').toLowerCase();
118
+ // Resolve which provider MODEL_API_KEY/MODEL_URL belonged to
119
+ const resolvedProvider = ['ollama', 'local'].includes(modelProvider)
120
+ ? modelProvider
121
+ : modelProvider || 'anthropic';
122
+ // Build provider configs from flat keys
123
+ const anthropicKey = pickString(parsed, 'ANTHROPIC_API_KEY', 'MODEL_API_KEY') || '';
124
+ const anthropicUrl = pickString(parsed, 'ANTHROPIC_URL', 'MODEL_URL') || 'https://api.anthropic.com';
125
+ const openaiKey = pickString(parsed, 'OPENAI_API_KEY', 'MODEL_API_KEY') || '';
126
+ const openaiUrl = pickString(parsed, 'OPENAI_URL', 'MODEL_URL') || 'https://api.openai.com';
127
+ const orKey = pickString(parsed, 'OPENROUTER_API_KEY', 'MODEL_API_KEY') || '';
128
+ const orUrl = pickString(parsed, 'OPENROUTER_URL', 'MODEL_URL') || 'https://openrouter.ai/api/v1';
129
+ const googleKey = pickString(parsed, 'GOOGLE_API_KEY', 'MODEL_API_KEY') || '';
130
+ const googleUrl = pickString(parsed, 'GOOGLE_URL', 'MODEL_URL') || '';
131
+ const ollamaKey = pickString(parsed, 'MODEL_API_KEY') || '';
132
+ const ollamaUrl = pickString(parsed, 'MODEL_URL') || 'http://localhost:11434/v1';
133
+ const localKey = pickString(parsed, 'MODEL_API_KEY') || '';
134
+ const localUrl = pickString(parsed, 'MODEL_URL') || '';
135
+ const providers = {
136
+ anthropic: { api_key: anthropicKey, url: anthropicUrl, model: DEFAULT_SETTINGS.providers.anthropic.model, model_cost: '', model_context_window: 200000 },
137
+ openai: { api_key: openaiKey, url: openaiUrl, model: DEFAULT_SETTINGS.providers.openai.model, model_cost: '', model_context_window: 131072 },
138
+ openrouter: { api_key: orKey, url: orUrl, model: DEFAULT_SETTINGS.providers.openrouter.model, model_cost: '', model_context_window: 200000 },
139
+ google: { api_key: googleKey, url: googleUrl, model: DEFAULT_SETTINGS.providers.google.model, model_cost: '', model_context_window: 131072 },
140
+ ollama: { api_key: ollamaKey, url: ollamaUrl, model: DEFAULT_SETTINGS.providers.ollama.model, model_cost: '', model_context_window: 131072 },
141
+ local: { api_key: localKey, url: localUrl, model: DEFAULT_SETTINGS.providers.local.model, model_cost: '', model_context_window: 131072 },
142
+ };
143
+ // Preserve flat model into the active provider's model
144
+ const flatModel = pickString(parsed, 'model') || DEFAULT_SETTINGS.model;
145
+ // Preserve flat model_cost / model_context_window into current provider
146
+ const flatModelCost = pickString(parsed, 'MODEL_COST', 'model_cost');
147
+ const flatModelCtxWindow = pickNumber(parsed, 'MODEL_CONTEXT_WINDOW', 'model_context_window');
148
+ const rp = providers[resolvedProvider];
149
+ rp.model = flatModel;
150
+ if (flatModelCost)
151
+ rp.model_cost = flatModelCost;
152
+ if (flatModelCtxWindow && flatModelCtxWindow > 0)
153
+ rp.model_context_window = flatModelCtxWindow;
154
+ const telegramBot = pickString(parsed, 'TELEGRAM_BOT_TOKEN', 'telegram_bot_token') || '';
155
+ const telegramUser = pickString(parsed, 'TELEGRAM_USER_ID', 'telegram_user_id') || '';
156
+ const telegramChat = pickString(parsed, 'TELEGRAM_CHAT_ID', 'telegram_chat_id') || '';
157
+ const telegramGroups = pickBool(parsed, 'TELEGRAM_ALLOW_GROUPS', 'telegram_allow_groups') ?? false;
158
+ const channelTab = pickString(parsed, 'CHANNEL_TAB_ACTIVE', 'channel_tab_active') || DEFAULT_SETTINGS.channels.tab_active;
159
+ const mcpServers = parsed.MCP_SERVERS || parsed.mcp_servers || {};
160
+ const safetyPathGuard = (pickString(parsed, 'SAFETY_PATH_GUARD', 'safety_path_guard') || 'on');
161
+ const safetyPathAllow = parsed.SAFETY_PATH_ALLOWLIST ?? parsed.safety_path_allowlist ?? '';
162
+ const safetyCmdGuard = (pickString(parsed, 'SAFETY_COMMAND_GUARD', 'safety_command_guard') || 'on');
163
+ const safetySnaps = (pickString(parsed, 'SAFETY_SNAPSHOTS', 'safety_snapshots') || 'on');
164
+ const acEnabled = (pickString(parsed, 'AUTO_COMPACT', 'auto_compact') || 'on');
165
+ const acThreshold = (pickNumber(parsed, 'AUTO_COMPACT_THRESHOLD', 'auto_compact_threshold') ?? 75);
166
+ const acWarnThreshold = (pickNumber(parsed, 'AUTO_COMPACT_WARN_THRESHOLD', 'auto_compact_warn_threshold') ?? 60);
167
+ const acForcedThreshold = (pickNumber(parsed, 'AUTO_COMPACT_FORCED_THRESHOLD', 'auto_compact_forced_threshold') ?? 85);
168
+ return {
169
+ model: flatModel,
170
+ effort: pickString(parsed, 'effort') || DEFAULT_SETTINGS.effort,
171
+ mode: migrateMode(parsed.mode),
172
+ theme: (pickString(parsed, 'theme') || DEFAULT_SETTINGS.theme),
173
+ statusline: pickBool(parsed, 'statusline') ?? DEFAULT_SETTINGS.statusline,
174
+ debug: pickBool(parsed, 'debug') ?? DEFAULT_SETTINGS.debug,
175
+ current_provider: resolvedProvider,
176
+ providers,
177
+ channels: { bot_token: telegramBot, user_id: telegramUser, chat_id: telegramChat, allow_groups: telegramGroups, tab_active: channelTab },
178
+ tools_per_call: (typeof pickNumber(parsed, 'TOOLS_PER_CALL', 'tools_per_call') === 'number' && pickNumber(parsed, 'TOOLS_PER_CALL', 'tools_per_call') > 0)
179
+ ? pickNumber(parsed, 'TOOLS_PER_CALL', 'tools_per_call') : DEFAULT_SETTINGS.tools_per_call,
180
+ websearch_per_call: (typeof pickNumber(parsed, 'WEBSEARCH_PER_CALL', 'websearch_per_call') === 'number' && pickNumber(parsed, 'WEBSEARCH_PER_CALL', 'websearch_per_call') > 0)
181
+ ? pickNumber(parsed, 'WEBSEARCH_PER_CALL', 'websearch_per_call') : DEFAULT_SETTINGS.websearch_per_call,
182
+ brave_search_api_key: pickString(parsed, 'BRAVE_SEARCH_API_KEY', 'brave_search_api_key', 'BRAVE_API_KEY') || '',
183
+ heartbeat: {
184
+ schedule: (pickString(parsed, 'HEARTBEAT', 'heartbeat') || 'off'),
185
+ mode: migrateMode(pickString(parsed, 'HEARTBEAT_MODE', 'heartbeat_mode', 'heartbeat.mode')) || 'yolo',
186
+ intraday: pickString(parsed, 'HEARTBEAT_INTRADAY', 'HEARTBEAT_TIMES', 'HEARTBEAT_HOURLY', 'heartbeat_intraday', 'heartbeat_times') || DEFAULT_SETTINGS.heartbeat.intraday,
187
+ daily: pickString(parsed, 'HEARTBEAT_DAILY', 'heartbeat_daily') || DEFAULT_SETTINGS.heartbeat.daily,
188
+ weekly: pickString(parsed, 'HEARTBEAT_WEEKLY', 'heartbeat_weekly') || DEFAULT_SETTINGS.heartbeat.weekly,
189
+ monthly: pickString(parsed, 'HEARTBEAT_MONTHLY', 'heartbeat_monthly') || DEFAULT_SETTINGS.heartbeat.monthly,
190
+ dreaming: pickString(parsed, 'HEARTBEAT_DREAMING', 'heartbeat_dreaming') || DEFAULT_SETTINGS.heartbeat.dreaming,
191
+ },
192
+ mcp_servers: mcpServers,
193
+ safety: {
194
+ path_guard: safetyPathGuard,
195
+ path_allowlist: safetyPathAllow,
196
+ command_guard: safetyCmdGuard,
197
+ snapshots: safetySnaps,
198
+ },
199
+ auto_compact: {
200
+ enabled: acEnabled,
201
+ threshold: acThreshold,
202
+ warn_threshold: acWarnThreshold,
203
+ forced_threshold: acForcedThreshold,
204
+ },
205
+ pricing_tier_warn: (pickString(parsed, 'PRICING_TIER_WARN', 'pricing_tier_warn') || 'on'),
206
+ wiki: { path: '', autoLint: 'off' },
207
+ web_ip: pickString(parsed, 'web_ip', 'WEB_IP') || '',
208
+ };
209
+ }
210
+ /** Serialize settings to JSON, stripping legacy flat keys. */
211
+ export function stripLegacyKeys(s) {
212
+ const legacy = new Set([
213
+ 'MODEL_PROVIDER', 'MODEL_URL', 'MODEL_API_KEY',
214
+ 'OPENAI_API_KEY', 'OPENAI_URL', 'ANTHROPIC_API_KEY', 'ANTHROPIC_URL',
215
+ 'OPENROUTER_API_KEY', 'OPENROUTER_URL', 'GOOGLE_API_KEY', 'GOOGLE_URL',
216
+ 'TELEGRAM_BOT_TOKEN', 'TELEGRAM_USER_ID', 'TELEGRAM_CHAT_ID', 'TELEGRAM_ALLOW_GROUPS',
217
+ 'CHANNEL_TAB_ACTIVE', 'MCP_SERVERS',
218
+ 'TOOLS_PER_CALL', 'WEBSEARCH_PER_CALL',
219
+ 'HEARTBEAT', 'HEARTBEAT_INTRADAY', 'HEARTBEAT_DAILY', 'HEARTBEAT_WEEKLY',
220
+ 'HEARTBEAT_MONTHLY', 'HEARTBEAT_DREAMING',
221
+ 'MODEL_COST', 'MODEL_CONTEXT_WINDOW',
222
+ 'SAFETY_PATH_GUARD', 'SAFETY_PATH_ALLOWLIST', 'SAFETY_COMMAND_GUARD', 'SAFETY_SNAPSHOTS',
223
+ 'AUTO_COMPACT', 'AUTO_COMPACT_THRESHOLD', 'AUTO_COMPACT_WARN_THRESHOLD', 'AUTO_COMPACT_FORCED_THRESHOLD',
224
+ 'PRICING_TIER_WARN',
225
+ ]);
226
+ const result = {};
227
+ for (const [k, v] of Object.entries(s)) {
228
+ if (legacy.has(k))
229
+ continue;
230
+ if (v === undefined)
231
+ continue;
232
+ result[k] = v;
233
+ }
234
+ return result;
235
+ }
236
+ // ── Constants ───────────────────────────────────────────────────────────────
43
237
  const CONFIG_DIR = join(homedir(), '.curie-agent');
44
- const SETTINGS_FILE = join(CONFIG_DIR, 'settings.json');
238
+ const SETTINGS_FILE = join(homedir(), '.curie-settings.json');
239
+ // ── SettingsManager ─────────────────────────────────────────────────────────
45
240
  export class SettingsManager {
46
241
  settings;
47
242
  constructor() {
@@ -54,80 +249,31 @@ export class SettingsManager {
54
249
  const raw = readFileSync(SETTINGS_FILE, 'utf-8');
55
250
  const parsed = JSON.parse(raw);
56
251
  if (parsed && typeof parsed === 'object') {
57
- // Accept MODEL_URL / MODEL_API_KEY regardless of casing (users
58
- // commonly write model_url, ModelUrl, MODEL_API, etc.).
59
- const pick = (...keys) => {
60
- for (const key of keys) {
61
- const direct = parsed[key];
62
- if (typeof direct === 'string' && direct.length > 0)
63
- return direct;
64
- }
65
- const normalize = (s) => s.replace(/[_-]/g, '').toLowerCase();
66
- const targets = keys.map(normalize);
67
- for (const [k, v] of Object.entries(parsed)) {
68
- if (typeof v !== 'string' || v.length === 0)
69
- continue;
70
- if (targets.includes(normalize(k)))
71
- return v;
72
- }
73
- return undefined;
74
- };
75
- const merged = {
76
- model: parsed.model ?? DEFAULT_SETTINGS.model,
77
- effort: parsed.effort ?? DEFAULT_SETTINGS.effort,
78
- mode: migrateMode(parsed.mode),
79
- theme: parsed.theme ?? DEFAULT_SETTINGS.theme,
80
- statusline: parsed.statusline ?? DEFAULT_SETTINGS.statusline,
81
- debug: parsed.debug ?? DEFAULT_SETTINGS.debug,
82
- BRAVE_SEARCH_API_KEY: pick('BRAVE_SEARCH_API_KEY', 'brave_search_api_key', 'braveSearchApiKey', 'BRAVE_API_KEY'),
83
- MODEL_URL: pick('MODEL_URL', 'model_url', 'modelUrl', 'MODEL_BASE_URL', 'baseUrl'),
84
- MODEL_API_KEY: pick('MODEL_API_KEY', 'model_api_key', 'MODEL_API', 'model_api', 'modelApiKey', 'apiKey', 'API_KEY'),
85
- MODEL_PROVIDER: pick('MODEL_PROVIDER', 'model_provider', 'modelProvider'),
86
- OPENAI_API_KEY: pick('OPENAI_API_KEY', 'openai_api_key', 'openaiApiKey'),
87
- OPENAI_URL: pick('OPENAI_URL', 'openai_url', 'openaiBaseUrl', 'OPENAI_BASE_URL', 'openai_base_url'),
88
- ANTHROPIC_API_KEY: pick('ANTHROPIC_API_KEY', 'anthropic_api_key', 'anthropicApiKey'),
89
- ANTHROPIC_URL: pick('ANTHROPIC_URL', 'anthropic_url', 'anthropicUrl'),
90
- OPENROUTER_API_KEY: pick('OPENROUTER_API_KEY', 'openrouter_api_key', 'openrouterApiKey'),
91
- OPENROUTER_URL: pick('OPENROUTER_URL', 'openrouter_url', 'openrouterUrl'),
92
- GOOGLE_API_KEY: pick('GOOGLE_API_KEY', 'google_api_key', 'googleApiKey'),
93
- GOOGLE_URL: pick('GOOGLE_URL', 'google_url', 'googleBaseUrl'),
94
- TELEGRAM_BOT_TOKEN: pick('TELEGRAM_BOT_TOKEN', 'telegram_bot_token', 'telegramBotToken'),
95
- TELEGRAM_USER_ID: pick('TELEGRAM_USER_ID', 'telegram_user_id', 'telegramUserId'),
96
- TELEGRAM_CHAT_ID: pick('TELEGRAM_CHAT_ID', 'telegram_chat_id', 'telegramChatId'),
97
- TELEGRAM_ALLOW_GROUPS: parsed.TELEGRAM_ALLOW_GROUPS ?? false,
98
- CHANNEL_TAB_ACTIVE: parsed.CHANNEL_TAB_ACTIVE ?? 'main',
99
- MCP_SERVERS: parsed.MCP_SERVERS ?? parsed.mcp_servers,
100
- TOOLS_PER_CALL: (typeof parsed.TOOLS_PER_CALL === 'number' && parsed.TOOLS_PER_CALL > 0)
101
- ? parsed.TOOLS_PER_CALL : DEFAULT_SETTINGS.TOOLS_PER_CALL,
102
- WEBSEARCH_PER_CALL: (typeof parsed.WEBSEARCH_PER_CALL === 'number' && parsed.WEBSEARCH_PER_CALL > 0)
103
- ? parsed.WEBSEARCH_PER_CALL : DEFAULT_SETTINGS.WEBSEARCH_PER_CALL,
104
- HEARTBEAT: parsed.HEARTBEAT ?? DEFAULT_SETTINGS.HEARTBEAT,
105
- HEARTBEAT_INTRADAY: parsed.HEARTBEAT_INTRADAY ?? parsed.HEARTBEAT_TIMES ?? parsed.HEARTBEAT_HOURLY ?? DEFAULT_SETTINGS.HEARTBEAT_INTRADAY,
106
- HEARTBEAT_DAILY: parsed.HEARTBEAT_DAILY ?? DEFAULT_SETTINGS.HEARTBEAT_DAILY,
107
- HEARTBEAT_WEEKLY: parsed.HEARTBEAT_WEEKLY ?? DEFAULT_SETTINGS.HEARTBEAT_WEEKLY,
108
- HEARTBEAT_MONTHLY: parsed.HEARTBEAT_MONTHLY ?? DEFAULT_SETTINGS.HEARTBEAT_MONTHLY,
109
- MODEL_COST: parsed.MODEL_COST ?? parsed.model_cost,
110
- MODEL_CONTEXT_WINDOW: (typeof parsed.MODEL_CONTEXT_WINDOW === 'number' && parsed.MODEL_CONTEXT_WINDOW > 0)
111
- ? parsed.MODEL_CONTEXT_WINDOW : undefined,
112
- SAFETY_PATH_GUARD: parsed.SAFETY_PATH_GUARD ?? DEFAULT_SETTINGS.SAFETY_PATH_GUARD,
113
- SAFETY_PATH_ALLOWLIST: parsed.SAFETY_PATH_ALLOWLIST ?? '',
114
- SAFETY_COMMAND_GUARD: parsed.SAFETY_COMMAND_GUARD ?? DEFAULT_SETTINGS.SAFETY_COMMAND_GUARD,
115
- SAFETY_SNAPSHOTS: parsed.SAFETY_SNAPSHOTS ?? DEFAULT_SETTINGS.SAFETY_SNAPSHOTS,
116
- };
117
- this.settings = merged;
252
+ if (isLegacyFlatFormat(parsed)) {
253
+ this.settings = migrateFlatToNested(parsed);
254
+ this.save();
255
+ }
256
+ else {
257
+ this.settings = parseNestedSettings(parsed);
258
+ }
118
259
  }
119
260
  }
120
261
  catch {
121
262
  // ignore parse errors, use defaults
122
263
  }
123
264
  }
265
+ // Sync top-level model to the active provider's value.
266
+ const prov = this.settings.providers[this.settings.current_provider];
267
+ if (prov) {
268
+ this.settings.model = prov.model;
269
+ }
124
270
  return this.settings;
125
271
  }
126
272
  save() {
127
273
  if (!existsSync(CONFIG_DIR)) {
128
274
  mkdirSync(CONFIG_DIR, { recursive: true });
129
275
  }
130
- writeFileSync(SETTINGS_FILE, JSON.stringify(this.settings, null, 2) + '\n');
276
+ writeFileSync(SETTINGS_FILE, JSON.stringify(stripLegacyKeys(this.settings), null, 2) + '\n');
131
277
  }
132
278
  update(partial) {
133
279
  this.settings = { ...this.settings, ...partial };
@@ -137,5 +283,139 @@ export class SettingsManager {
137
283
  get() {
138
284
  return { ...this.settings };
139
285
  }
286
+ /** Get the currently active model name from provider config. */
287
+ getActiveModel() {
288
+ const p = this.settings.providers[this.settings.current_provider];
289
+ return p?.model || DEFAULT_SETTINGS.model;
290
+ }
291
+ /** Get the currently active provider name. */
292
+ getCurrentProvider() {
293
+ return this.settings.current_provider;
294
+ }
295
+ getProviderKey(provider, key) {
296
+ const name = provider || this.settings.current_provider;
297
+ const p = this.settings.providers[name];
298
+ if (!p)
299
+ return '';
300
+ return p[key] ?? '';
301
+ }
302
+ /** Set a specific property on a provider's config. */
303
+ setProviderKey(provider, key, value) {
304
+ const name = provider || this.settings.current_provider;
305
+ const existing = this.settings.providers[name] || {};
306
+ this.settings.providers = {
307
+ ...this.settings.providers,
308
+ [name]: { ...existing, [key]: value },
309
+ };
310
+ this.save();
311
+ return this.settings;
312
+ }
313
+ /** Set the current provider and sync model to its value. */
314
+ setCurrentProvider(name) {
315
+ this.settings.current_provider = name;
316
+ const prov = this.settings.providers[name];
317
+ if (prov) {
318
+ this.settings.model = prov.model;
319
+ }
320
+ this.save();
321
+ return this.settings;
322
+ }
323
+ /** Get the active provider's model cost string. */
324
+ getModelCost() {
325
+ const p = this.settings.providers[this.settings.current_provider];
326
+ return p?.model_cost || '';
327
+ }
328
+ /** Get the active provider's context window size. */
329
+ getModelContextWindow() {
330
+ const p = this.settings.providers[this.settings.current_provider];
331
+ return p?.model_context_window || 131072;
332
+ }
333
+ }
334
+ /** Parse a nested-format settings JSON into CurieSettings (lightweight, no migration needed). */
335
+ export function parseNestedSettings(parsed) {
336
+ const getString = (keys) => pickString(parsed, ...keys) || '';
337
+ const getNumber = (keys) => pickNumber(parsed, ...keys);
338
+ const getBool = (keys) => pickBool(parsed, ...keys);
339
+ const providers = { ...DEFAULT_SETTINGS.providers };
340
+ const provKeys = ['anthropic', 'openai', 'openrouter', 'google', 'ollama', 'local'];
341
+ const rawProviders = parsed.providers;
342
+ if (rawProviders) {
343
+ for (const name of provKeys) {
344
+ const raw = rawProviders[name];
345
+ if (raw && typeof raw === 'object') {
346
+ providers[name] = {
347
+ api_key: getString([`providers.${name}.api_key`]) || raw.api_key || '',
348
+ url: getString([`providers.${name}.url`]) || raw.url || '',
349
+ model: getString([`providers.${name}.model`]) || raw.model || (DEFAULT_SETTINGS.providers[name].model),
350
+ model_cost: raw.model_cost || '',
351
+ model_context_window: typeof raw.model_context_window === 'number' ? raw.model_context_window : (DEFAULT_SETTINGS.providers[name].model_context_window),
352
+ max_output_tokens: typeof raw.max_output_tokens === 'number' ? raw.max_output_tokens : undefined,
353
+ provider_order: Array.isArray(raw.provider_order) ? raw.provider_order : undefined,
354
+ };
355
+ }
356
+ }
357
+ }
358
+ const rawChannels = parsed.channels;
359
+ const channelsConfig = {
360
+ bot_token: getString(['channels.bot_token', 'CHANNEL_TAB_ACTIVE']) || rawChannels?.bot_token || '',
361
+ user_id: getString(['channels.user_id']) || rawChannels?.user_id || '',
362
+ chat_id: getString(['channels.chat_id']) || rawChannels?.chat_id || '',
363
+ allow_groups: getBool(['channels.allow_groups', 'TELEGRAM_ALLOW_GROUPS']) ?? rawChannels?.allow_groups ?? false,
364
+ tab_active: getString(['channels.tab_active']) || rawChannels?.tab_active || DEFAULT_SETTINGS.channels.tab_active,
365
+ };
366
+ const rawHeartbeat = parsed.heartbeat;
367
+ const heartbeatConfig = {
368
+ schedule: (getString(['heartbeat.schedule', 'HEARTBEAT']) || rawHeartbeat?.schedule || 'off'),
369
+ mode: migrateMode(getString(['heartbeat.mode']) || rawHeartbeat?.mode) || 'yolo',
370
+ intraday: getString(['heartbeat.intraday', 'HEARTBEAT_INTRADAY', 'HEARTBEAT_TIMES', 'HEARTBEAT_HOURLY']) || rawHeartbeat?.intraday || DEFAULT_SETTINGS.heartbeat.intraday,
371
+ daily: getString(['heartbeat.daily', 'HEARTBEAT_DAILY']) || rawHeartbeat?.daily || DEFAULT_SETTINGS.heartbeat.daily,
372
+ weekly: getString(['heartbeat.weekly', 'HEARTBEAT_WEEKLY']) || rawHeartbeat?.weekly || DEFAULT_SETTINGS.heartbeat.weekly,
373
+ monthly: getString(['heartbeat.monthly', 'HEARTBEAT_MONTHLY']) || rawHeartbeat?.monthly || DEFAULT_SETTINGS.heartbeat.monthly,
374
+ dreaming: getString(['heartbeat.dreaming', 'HEARTBEAT_DREAMING']) || rawHeartbeat?.dreaming || DEFAULT_SETTINGS.heartbeat.dreaming,
375
+ };
376
+ const rawSafety = parsed.safety;
377
+ const safetyConfig = {
378
+ path_guard: (getString(['safety.path_guard', 'SAFETY_PATH_GUARD']) || rawSafety?.path_guard || 'on'),
379
+ path_allowlist: rawSafety?.path_allowlist ?? getString(['safety.path_allowlist', 'SAFETY_PATH_ALLOWLIST']) ?? '',
380
+ command_guard: (getString(['safety.command_guard', 'SAFETY_COMMAND_GUARD']) || rawSafety?.command_guard || 'on'),
381
+ snapshots: (getString(['safety.snapshots', 'SAFETY_SNAPSHOTS']) || rawSafety?.snapshots || 'on'),
382
+ };
383
+ const rawAutoComp = parsed.auto_compact;
384
+ const autoCompactConfig = {
385
+ enabled: (getString(['auto_compact.enabled', 'AUTO_COMPACT']) || rawAutoComp?.enabled || 'on'),
386
+ threshold: getNumber(['auto_compact.threshold', 'AUTO_COMPACT_THRESHOLD']) ?? rawAutoComp?.threshold ?? DEFAULT_SETTINGS.auto_compact.threshold,
387
+ warn_threshold: getNumber(['auto_compact.warn_threshold', 'AUTO_COMPACT_WARN_THRESHOLD']) ?? rawAutoComp?.warn_threshold ?? DEFAULT_SETTINGS.auto_compact.warn_threshold,
388
+ forced_threshold: getNumber(['auto_compact.forced_threshold', 'AUTO_COMPACT_FORCED_THRESHOLD']) ?? rawAutoComp?.forced_threshold ?? DEFAULT_SETTINGS.auto_compact.forced_threshold,
389
+ };
390
+ return {
391
+ model: getString(['model']) || DEFAULT_SETTINGS.model,
392
+ effort: (getString(['effort']) || DEFAULT_SETTINGS.effort),
393
+ mode: migrateMode(parsed.mode),
394
+ theme: getString(['theme']) || DEFAULT_SETTINGS.theme,
395
+ statusline: getBool(['statusline']) ?? DEFAULT_SETTINGS.statusline,
396
+ debug: getBool(['debug']) ?? DEFAULT_SETTINGS.debug,
397
+ current_provider: getString(['current_provider']) || DEFAULT_SETTINGS.current_provider,
398
+ providers,
399
+ channels: channelsConfig,
400
+ tools_per_call: (typeof getNumber(['tools_per_call', 'TOOLS_PER_CALL']) === 'number' && getNumber(['tools_per_call', 'TOOLS_PER_CALL']) > 0)
401
+ ? getNumber(['tools_per_call', 'TOOLS_PER_CALL']) : DEFAULT_SETTINGS.tools_per_call,
402
+ websearch_per_call: (typeof getNumber(['websearch_per_call', 'WEBSEARCH_PER_CALL']) === 'number' && getNumber(['websearch_per_call', 'WEBSEARCH_PER_CALL']) > 0)
403
+ ? getNumber(['websearch_per_call', 'WEBSEARCH_PER_CALL']) : DEFAULT_SETTINGS.websearch_per_call,
404
+ brave_search_api_key: getString(['brave_search_api_key', 'BRAVE_SEARCH_API_KEY', 'BRAVE_API_KEY']),
405
+ heartbeat: heartbeatConfig,
406
+ mcp_servers: (parsed.mcp_servers || parsed.MCP_SERVERS) || {},
407
+ safety: safetyConfig,
408
+ auto_compact: autoCompactConfig,
409
+ pricing_tier_warn: (getString(['pricing_tier_warn', 'PRICING_TIER_WARN']) || 'on'),
410
+ wiki: (() => {
411
+ const rawWiki = parsed.wiki;
412
+ return {
413
+ path: rawWiki?.path || '',
414
+ autoLint: (rawWiki?.autoLint || 'off'),
415
+ };
416
+ })(),
417
+ web_ip: getString(['web_ip', 'WEB_IP']) || '',
418
+ daemon_token: getString(['daemon_token']),
419
+ };
140
420
  }
141
421
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAsJjC,+EAA+E;AAE/E,SAAS,oBAAoB;IAC3B,MAAM,CAAC,GAAyB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,EAAE,CAAC;QAC/F,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC9F,CAAC;IACD,OAAO;QACL,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC,SAAU,EAAE,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,EAAE;QAC1H,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,MAAO,EAAE,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,QAAQ,EAAE;QACxE,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC,UAAW,EAAE,GAAG,EAAE,8BAA8B,EAAE,KAAK,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,MAAM,EAAE;QACzI,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,MAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE;QACjD,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,MAAO,EAAE,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC3E,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;KACzB,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAkB;IAC7C,KAAK,EAAE,mBAAmB;IAC1B,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,KAAK;IACZ,gBAAgB,EAAE,WAAW;IAC7B,SAAS,EAAE,oBAAoB,EAAE;IACjC,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE;IAC9F,cAAc,EAAE,EAAE;IAClB,kBAAkB,EAAE,CAAC;IACrB,oBAAoB,EAAE,EAAE;IACxB,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE;IACrI,WAAW,EAAE,EAAE;IACf,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;IACtF,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;IACxF,iBAAiB,EAAE,IAAI;IACvB,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnC,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,+EAA+E;AAE/E,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC;IAC1D,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC;QAAC,KAAK,MAAM,CAAC;QAAC,KAAK,MAAM,CAAC;QAAC,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC;QAC/D,OAAO,CAAC,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC;IACxC,CAAC;AACH,CAAC;AAED,mGAAmG;AACnG,SAAS,UAAU,CAAC,MAA+B,EAAE,GAAG,IAAc;IACpE,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;IACrE,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACtD,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,MAA+B,EAAE,GAAG,IAAc;IACpE,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;IAChD,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,MAA+B,EAAE,GAAG,IAAc;IAClE,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,OAAO,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;IACjD,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,KAAK,SAAS;YAAE,SAAS;QACrC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,kBAAkB,CAAC,GAA4B;IAC7D,MAAM,SAAS,GAAG,WAAW,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;IACpG,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,cAAc,GAAG;QACrB,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB;QAC5E,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY;QAC5F,gBAAgB;KACjB,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,mBAAmB,CAAC,MAA+B;IACjE,MAAM,aAAa,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;IAE1F,6DAA6D;IAC7D,MAAM,gBAAgB,GAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrF,CAAC,CAAC,aAAkC;QACpC,CAAC,CAAE,aAAmC,IAAI,WAAW,CAAC;IAExD,wCAAwC;IACxC,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IACpF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,IAAI,2BAA2B,CAAC;IAErG,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,IAAI,wBAAwB,CAAC;IAE5F,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,CAAC,IAAI,8BAA8B,CAAC;IAElG,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;IAEtE,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,2BAA2B,CAAC;IAEjF,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;IAEvD,MAAM,SAAS,GAAgB;QAC7B,SAAS,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;QACxJ,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;QAC5I,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;QAC5I,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;QAC5I,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;QAC5I,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;KACzI,CAAC;IAEF,uDAAuD;IACvD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC;IAExE,wEAAwE;IACxE,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IACrE,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,EAAE,sBAAsB,EAAE,sBAAsB,CAAC,CAAC;IAE9F,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAE,CAAC;IACxC,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC;IACrB,IAAI,aAAa;QAAE,EAAE,CAAC,UAAU,GAAG,aAAa,CAAC;IACjD,IAAI,kBAAkB,IAAI,kBAAkB,GAAG,CAAC;QAAE,EAAE,CAAC,oBAAoB,GAAG,kBAAkB,CAAC;IAE/F,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,IAAI,EAAE,CAAC;IACzF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;IACtF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;IACtF,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,IAAI,KAAK,CAAC;IACnG,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC;IAE1H,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;IAElE,MAAM,eAAe,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,IAAI,IAAI,CAAiB,CAAC;IAC/G,MAAM,eAAe,GAAG,MAAM,CAAC,qBAAqB,IAAI,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAC3F,MAAM,cAAc,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,sBAAsB,EAAE,sBAAsB,CAAC,IAAI,IAAI,CAAiB,CAAC;IACpH,MAAM,WAAW,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,IAAI,IAAI,CAAiB,CAAC;IAEzG,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,IAAI,IAAI,CAAiB,CAAC;IAC/F,MAAM,WAAW,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,wBAAwB,EAAE,wBAAwB,CAAC,IAAI,EAAE,CAAC,CAAC;IACnG,MAAM,eAAe,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,6BAA6B,EAAE,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC;IACjH,MAAM,iBAAiB,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,+BAA+B,EAAE,+BAA+B,CAAC,IAAI,EAAE,CAAC,CAAC;IAEvH,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,MAAM,EAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAA6B,IAAI,gBAAgB,CAAC,MAAM;QAC5F,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,KAAK,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAW;QACxE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,gBAAgB,CAAC,UAAU;QACzE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,gBAAgB,CAAC,KAAK;QAC1D,gBAAgB,EAAE,gBAA0B;QAC5C,SAAS;QACT,QAAQ,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE;QACxI,cAAc,EAAE,CAAC,OAAO,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,CAAE,GAAG,CAAC,CAAC;YACzJ,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,CAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,cAAc;QAC7F,kBAAkB,EAAE,CAAC,OAAO,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,CAAE,GAAG,CAAC,CAAC;YAC7K,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,CAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,kBAAkB;QACzG,oBAAoB,EAAE,UAAU,CAAC,MAAM,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,eAAe,CAAC,IAAI,EAAE;QAC/G,SAAS,EAAE;YACT,QAAQ,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,KAAK,CAAiB;YACjF,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,IAAI,MAAM;YACrG,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,QAAQ;YACzK,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,KAAK;YACnG,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,MAAM;YACvG,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,OAAO;YAC3G,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,IAAI,gBAAgB,CAAC,SAAS,CAAC,QAAQ;SAChH;QACD,WAAW,EAAE,UAAqC;QAClD,MAAM,EAAE;YACN,UAAU,EAAE,eAAe;YAC3B,cAAc,EAAE,eAAe;YAC/B,aAAa,EAAE,cAAc;YAC7B,SAAS,EAAE,WAAW;SACvB;QACD,YAAY,EAAE;YACZ,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,WAAW;YACtB,cAAc,EAAE,eAAe;YAC/B,gBAAgB,EAAE,iBAAiB;SACpC;QACD,iBAAiB,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,IAAI,IAAI,CAAiB;QACzG,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;QACnC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;KACrD,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAAC,CAAgB;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;QACrB,gBAAgB,EAAE,WAAW,EAAE,eAAe;QAC9C,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe;QACpE,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY;QACtE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,uBAAuB;QACrF,oBAAoB,EAAE,aAAa;QACnC,gBAAgB,EAAE,oBAAoB;QACtC,WAAW,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB;QACxE,mBAAmB,EAAE,oBAAoB;QACzC,YAAY,EAAE,sBAAsB;QACpC,mBAAmB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,kBAAkB;QACxF,cAAc,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,+BAA+B;QACxG,mBAAmB;KACpB,CAAC,CAAC;IACH,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AACnD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;AAE9D,+EAA+E;AAE/E,MAAM,OAAO,eAAe;IAClB,QAAQ,CAAgB;IAEhC;QACE,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI;QACF,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;QACxC,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmC,CAAC;gBACjE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACzC,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC/B,IAAI,CAAC,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;wBAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;oBAC9C,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;QACH,CAAC;QACD,uDAAuD;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAqC,CAAC,CAAC;QAC1F,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,CAAC,OAA+B;QACpC,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,GAAG;QACD,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,gEAAgE;IAChE,cAAc;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAqC,CAAC,CAAC;QACvF,OAAO,CAAC,EAAE,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC;IAC5C,CAAC;IAED,8CAA8C;IAC9C,kBAAkB;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IACxC,CAAC;IAQD,cAAc,CAAC,QAAgB,EAAE,GAAW;QAC1C,MAAM,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACxD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAyB,CAAC,CAAC;QAC7D,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAClB,OAAS,CAAwC,CAAC,GAAG,CAAqB,IAAI,EAAE,CAAC;IACnF,CAAC;IAED,sDAAsD;IACtD,cAAc,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAc;QAC1D,MAAM,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAyB,CAAC,IAAI,EAAoB,CAAC;QAC5F,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG;YACxB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS;YAC1B,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAoB;SACxD,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,4DAA4D;IAC5D,kBAAkB,CAAC,IAAY;QAC7B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAyB,CAAC,CAAC;QAChE,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,mDAAmD;IACnD,YAAY;QACV,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAqC,CAAC,CAAC;QACvF,OAAO,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,qDAAqD;IACrD,qBAAqB;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAqC,CAAC,CAAC;QACvF,OAAO,CAAC,EAAE,oBAAoB,IAAI,MAAM,CAAC;IAC3C,CAAC;CACF;AAED,iGAAiG;AACjG,MAAM,UAAU,mBAAmB,CAAC,MAA+B;IACjE,MAAM,SAAS,GAAG,CAAC,IAAc,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACxE,MAAM,SAAS,GAAG,CAAC,IAAc,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAE9D,MAAM,SAAS,GAAgB,EAAE,GAAG,gBAAgB,CAAC,SAAS,EAAE,CAAC;IACjE,MAAM,QAAQ,GAA0B,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE3G,MAAM,YAAY,GAAG,MAAM,CAAC,SAAoF,CAAC;IACjH,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACnC,SAAS,CAAC,IAAI,CAAC,GAAG;oBAChB,OAAO,EAAE,SAAS,CAAC,CAAC,aAAa,IAAI,UAAU,CAAC,CAAC,IAAK,GAAG,CAAC,OAAkB,IAAI,EAAE;oBAClF,GAAG,EAAE,SAAS,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,CAAC,IAAK,GAAG,CAAC,GAAc,IAAI,EAAE;oBACtE,KAAK,EAAE,SAAS,CAAC,CAAC,aAAa,IAAI,QAAQ,CAAC,CAAC,IAAK,GAAG,CAAC,KAAgB,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAc,CAAE,CAAC,KAAK,CAAC;oBAC7H,UAAU,EAAG,GAAG,CAAC,UAAqB,IAAI,EAAE;oBAC5C,oBAAoB,EAAE,OAAO,GAAG,CAAC,oBAAoB,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAc,CAAE,CAAC,oBAAoB,CAAC;oBAClK,iBAAiB,EAAE,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;oBAChG,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;iBACnF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAA6E,CAAC;IACzG,MAAM,cAAc,GAAmB;QACrC,SAAS,EAAE,SAAS,CAAC,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,IAAK,WAAW,EAAE,SAAoB,IAAI,EAAE;QAC9G,OAAO,EAAE,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAK,WAAW,EAAE,OAAkB,IAAI,EAAE;QAClF,OAAO,EAAE,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAK,WAAW,EAAE,OAAkB,IAAI,EAAE;QAClF,YAAY,EAAE,OAAO,CAAC,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAC,IAAK,WAAW,EAAE,YAAwB,IAAI,KAAK;QAC5H,UAAU,EAAE,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,IAAK,WAAW,EAAE,UAAqB,IAAI,gBAAgB,CAAC,QAAQ,CAAC,UAAU;KAC9H,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,SAA2D,CAAC;IACxF,MAAM,eAAe,GAAoB;QACvC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,IAAK,YAAY,EAAE,QAAmB,IAAI,KAAK,CAAiB;QACzH,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,YAAY,EAAE,IAAI,CAAC,IAAI,MAAM;QAChF,QAAQ,EAAE,SAAS,CAAC,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,IAAK,YAAY,EAAE,QAAmB,IAAI,gBAAgB,CAAC,SAAS,CAAC,QAAQ;QACrL,KAAK,EAAE,SAAS,CAAC,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,IAAK,YAAY,EAAE,KAAgB,IAAI,gBAAgB,CAAC,SAAS,CAAC,KAAK;QAC/H,MAAM,EAAE,SAAS,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,IAAK,YAAY,EAAE,MAAiB,IAAI,gBAAgB,CAAC,SAAS,CAAC,MAAM;QACpI,OAAO,EAAE,SAAS,CAAC,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,IAAK,YAAY,EAAE,OAAkB,IAAI,gBAAgB,CAAC,SAAS,CAAC,OAAO;QACzI,QAAQ,EAAE,SAAS,CAAC,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,IAAK,YAAY,EAAE,QAAmB,IAAI,gBAAgB,CAAC,SAAS,CAAC,QAAQ;KAC/I,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAyD,CAAC;IACnF,MAAM,YAAY,GAAiB;QACjC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,IAAK,SAAS,EAAE,UAAqB,IAAI,IAAI,CAAiB;QAChI,cAAc,EAAE,SAAS,EAAE,cAAc,IAAI,SAAS,CAAC,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAC,IAAI,EAAE;QAChH,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,CAAC,IAAK,SAAS,EAAE,aAAwB,IAAI,IAAI,CAAiB;QAC5I,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,IAAK,SAAS,EAAE,SAAoB,IAAI,IAAI,CAAiB;KAC7H,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,YAAuE,CAAC;IACnG,MAAM,iBAAiB,GAAsB;QAC3C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAC,IAAK,WAAW,EAAE,OAAkB,IAAI,IAAI,CAAiB;QAC1H,SAAS,EAAE,SAAS,CAAC,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,IAAK,WAAW,EAAE,SAAoB,IAAI,gBAAgB,CAAC,YAAY,CAAC,SAAS;QAC3J,cAAc,EAAE,SAAS,CAAC,CAAC,6BAA6B,EAAE,6BAA6B,CAAC,CAAC,IAAK,WAAW,EAAE,cAAyB,IAAI,gBAAgB,CAAC,YAAY,CAAC,cAAc;QACpL,gBAAgB,EAAE,SAAS,CAAC,CAAC,+BAA+B,EAAE,+BAA+B,CAAC,CAAC,IAAK,WAAW,EAAE,gBAA2B,IAAI,gBAAgB,CAAC,YAAY,CAAC,gBAAgB;KAC/L,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,gBAAgB,CAAC,KAAK;QACrD,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAA4B;QACrF,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,KAAK,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,gBAAgB,CAAC,KAAK;QACrD,UAAU,EAAE,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,gBAAgB,CAAC,UAAU;QAClE,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,gBAAgB,CAAC,KAAK;QACnD,gBAAgB,EAAE,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,gBAAgB,CAAC,gBAAgB;QACtF,SAAS;QACT,QAAQ,EAAE,cAAc;QACxB,cAAc,EAAE,CAAC,OAAO,SAAS,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,KAAK,QAAQ,IAAI,SAAS,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAE,GAAG,CAAC,CAAC;YAC3I,CAAC,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,cAAc;QACtF,kBAAkB,EAAE,CAAC,OAAO,SAAS,CAAC,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,KAAK,QAAQ,IAAI,SAAS,CAAC,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAE,GAAG,CAAC,CAAC;YAC/J,CAAC,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,kBAAkB;QAClG,oBAAoB,EAAE,SAAS,CAAC,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,eAAe,CAAC,CAAC;QAClG,SAAS,EAAE,eAAe;QAC1B,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAA4B,IAAI,EAAE;QACxF,MAAM,EAAE,YAAY;QACpB,YAAY,EAAE,iBAAiB;QAC/B,iBAAiB,EAAE,CAAC,SAAS,CAAC,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,IAAI,IAAI,CAAiB;QAClG,IAAI,EAAE,CAAC,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,MAAM,CAAC,IAA2C,CAAC;YACnE,OAAO;gBACL,IAAI,EAAG,OAAO,EAAE,IAAe,IAAI,EAAE;gBACrC,QAAQ,EAAE,CAAE,OAAO,EAAE,QAAmB,IAAI,KAAK,CAAiB;aACnE,CAAC;QACJ,CAAC,CAAC,EAAE;QACJ,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE;QAC7C,YAAY,EAAE,SAAS,CAAC,CAAC,cAAc,CAAC,CAAC;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type WindowsShell = 'pwsh' | 'powershell' | 'cmd';
2
+ /**
3
+ * Detect the best available Windows shell by probing PATH.
4
+ * Prefers pwsh (PowerShell 7+) over powershell (5.x) over cmd.exe.
5
+ * Result is cached for the process lifetime.
6
+ *
7
+ * Returns 'cmd' on non-Windows (caller should branch on platform).
8
+ */
9
+ export declare function detectWindowsShell(): WindowsShell;
10
+ /** Reset the cached shell (testing or forced re-detection). */
11
+ export declare function resetWindowsShellCache(): void;
12
+ //# sourceMappingURL=shell-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-detect.d.ts","sourceRoot":"","sources":["../../src/shell-detect.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,KAAK,CAAC;AAIzD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAYjD;AAED,+DAA+D;AAC/D,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -0,0 +1,31 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { platform } from 'node:os';
3
+ let _cached;
4
+ /**
5
+ * Detect the best available Windows shell by probing PATH.
6
+ * Prefers pwsh (PowerShell 7+) over powershell (5.x) over cmd.exe.
7
+ * Result is cached for the process lifetime.
8
+ *
9
+ * Returns 'cmd' on non-Windows (caller should branch on platform).
10
+ */
11
+ export function detectWindowsShell() {
12
+ if (platform() !== 'win32')
13
+ return 'cmd';
14
+ if (_cached !== undefined)
15
+ return _cached;
16
+ for (const name of ['pwsh', 'powershell']) {
17
+ try {
18
+ execSync(`where ${name}.exe`, { stdio: 'ignore', timeout: 2000 });
19
+ _cached = name;
20
+ return name;
21
+ }
22
+ catch { }
23
+ }
24
+ _cached = 'cmd';
25
+ return 'cmd';
26
+ }
27
+ /** Reset the cached shell (testing or forced re-detection). */
28
+ export function resetWindowsShellCache() {
29
+ _cached = undefined;
30
+ }
31
+ //# sourceMappingURL=shell-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-detect.js","sourceRoot":"","sources":["../../src/shell-detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAInC,IAAI,OAAiC,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,QAAQ,EAAE,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,CAAU,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,QAAQ,CAAC,SAAS,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,KAAK,CAAC;IAChB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,sBAAsB;IACpC,OAAO,GAAG,SAAS,CAAC;AACtB,CAAC"}