@mulsok/traders-client 0.1.0 → 0.2.1

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 (81) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +42 -5
  3. package/bin/cli.js +618 -38
  4. package/dist/server/auth/admin.js +32 -0
  5. package/dist/server/auth/admin.js.map +1 -0
  6. package/dist/server/broker/kiwoom/_helpers/symbol-code.js +21 -0
  7. package/dist/server/broker/kiwoom/_helpers/symbol-code.js.map +1 -0
  8. package/dist/server/broker/kiwoom/client.js +23 -4
  9. package/dist/server/broker/kiwoom/client.js.map +1 -1
  10. package/dist/server/broker/kiwoom/endpoints/account.js +14 -6
  11. package/dist/server/broker/kiwoom/endpoints/account.js.map +1 -1
  12. package/dist/server/broker/kiwoom/endpoints/quote.js +99 -13
  13. package/dist/server/broker/kiwoom/endpoints/quote.js.map +1 -1
  14. package/dist/server/broker/kiwoom/index.js +1 -1
  15. package/dist/server/broker/kiwoom/index.js.map +1 -1
  16. package/dist/server/broker/kiwoom/order-tracker.js +13 -0
  17. package/dist/server/broker/kiwoom/order-tracker.js.map +1 -1
  18. package/dist/server/broker/kiwoom/price-feed.js +13 -0
  19. package/dist/server/broker/kiwoom/price-feed.js.map +1 -1
  20. package/dist/server/broker/kiwoom/ws/endpoints/condition.js +3 -2
  21. package/dist/server/broker/kiwoom/ws/endpoints/condition.js.map +1 -1
  22. package/dist/server/calendar/kst-marker.js +68 -0
  23. package/dist/server/calendar/kst-marker.js.map +1 -0
  24. package/dist/server/config.js +370 -72
  25. package/dist/server/config.js.map +1 -1
  26. package/dist/server/db/sqlite.js +53 -29
  27. package/dist/server/db/sqlite.js.map +1 -1
  28. package/dist/server/diary/writer.js +151 -46
  29. package/dist/server/diary/writer.js.map +1 -1
  30. package/dist/server/index.js +166 -11
  31. package/dist/server/index.js.map +1 -1
  32. package/dist/server/jobs/universe-sync.js +48 -11
  33. package/dist/server/jobs/universe-sync.js.map +1 -1
  34. package/dist/server/jobs/watchdog.js +4 -0
  35. package/dist/server/jobs/watchdog.js.map +1 -1
  36. package/dist/server/journal/telemetry.js +11 -0
  37. package/dist/server/journal/telemetry.js.map +1 -1
  38. package/dist/server/journal/trade-journal.js +42 -16
  39. package/dist/server/journal/trade-journal.js.map +1 -1
  40. package/dist/server/llm/context-builder.js +9 -5
  41. package/dist/server/llm/context-builder.js.map +1 -1
  42. package/dist/server/personas/loader.js +46 -16
  43. package/dist/server/personas/loader.js.map +1 -1
  44. package/dist/server/personas/persona-agent.js +93 -21
  45. package/dist/server/personas/persona-agent.js.map +1 -1
  46. package/dist/server/personas/persona-state.js +198 -19
  47. package/dist/server/personas/persona-state.js.map +1 -1
  48. package/dist/server/personas/runner.js +29 -0
  49. package/dist/server/personas/runner.js.map +1 -1
  50. package/dist/server/personas/schema.js +13 -0
  51. package/dist/server/personas/schema.js.map +1 -1
  52. package/dist/server/personas/wake-plan.js +4 -67
  53. package/dist/server/personas/wake-plan.js.map +1 -1
  54. package/dist/server/readiness.js +70 -0
  55. package/dist/server/readiness.js.map +1 -1
  56. package/dist/server/routes.js +300 -13
  57. package/dist/server/routes.js.map +1 -1
  58. package/dist/server/screener/engine.js +110 -1
  59. package/dist/server/screener/engine.js.map +1 -1
  60. package/dist/server/screener/indicators.js +63 -0
  61. package/dist/server/screener/indicators.js.map +1 -0
  62. package/dist/server/server-sync.js +387 -126
  63. package/dist/server/server-sync.js.map +1 -1
  64. package/dist/server/share/postgres-publish.js +139 -0
  65. package/dist/server/share/postgres-publish.js.map +1 -0
  66. package/dist/server/share/prepare-state.js +50 -0
  67. package/dist/server/share/prepare-state.js.map +1 -0
  68. package/dist/server/share/prepare.js +61 -0
  69. package/dist/server/share/prepare.js.map +1 -0
  70. package/dist/server/share/publish-cron.js +96 -0
  71. package/dist/server/share/publish-cron.js.map +1 -0
  72. package/dist/server/share/snapshot.js +81 -0
  73. package/dist/server/share/snapshot.js.map +1 -0
  74. package/dist/server/watchers/condition-watcher.js +57 -16
  75. package/dist/server/watchers/condition-watcher.js.map +1 -1
  76. package/dist/web/assets/index-B1C-UX9W.js +88 -0
  77. package/dist/web/assets/index-N7Xwheka.css +1 -0
  78. package/dist/web/index.html +2 -2
  79. package/package.json +4 -5
  80. package/dist/web/assets/index-62SMpbaf.js +0 -79
  81. package/dist/web/assets/index-BPLQR0wt.css +0 -1
@@ -1,13 +1,40 @@
1
1
  /**
2
- * Client Config · 로컬 JSON 파일 저장.
2
+ * Client Config · v2 schema · user-scoped settings.
3
+ *
4
+ * 식별 모델 (2026-05-08 v2):
5
+ * - auth.deviceToken = 가변 자격증명 (revoke / 재발급 가능)
6
+ * - auth.userId = 불변 identity (server 가 token 으로 식별 후 응답)
7
+ * - users[<userId>] = user 별 영속 설정 (llm · broker · subscriptions ·
8
+ * allocations). user 가 token 을 다른 사람 것으로 교체해도 자기 슬롯은
9
+ * 보존되어 재로그인 시 복원.
10
+ * - halted = 글로벌 (process 단위 emergency stop)
11
+ *
12
+ * UX :
13
+ * 1. 토큰 미입력 → 「로그인 안 됨」 상태. 다른 설정 불가.
14
+ * 2. 토큰 입력 + server 인증 성공 → user 식별 → users[<userId>] 슬롯 활성
15
+ * 3. AI 모델 / 증권사 / etc. 설정은 활성 user 슬롯에 저장
16
+ * 4. 토큰 교체 → 다른 user 의 슬롯 활성 (이전 user 데이터 보존)
17
+ *
18
+ * v1 → v2 마이그레이션:
19
+ * - 기존 v1 의 top-level llm/broker/subscriptions/allocations 가 발견되면
20
+ * auth.userId 가 있으면 그 user 의 슬롯으로 이동, 없으면 폐기.
21
+ *
3
22
  * MVP · OS Keychain 은 향후 Tauri 포장 시 교체 (현재는 ~/.mulsok-traders/config.json).
4
23
  */
5
24
  import fs from "node:fs";
6
25
  import path from "node:path";
7
26
  import os from "node:os";
8
27
  import { z } from "zod";
9
- const CONFIG_DIR = path.join(os.homedir(), ".mulsok-traders");
10
- const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
28
+ /**
29
+ * 경로 계산은 lazy — process.env.HOME 변경 후에도 정확히 반영.
30
+ * (test 환경에서 TMP_HOME 사용 시 모듈 로드 시점 캐싱 회피)
31
+ */
32
+ function getConfigDir() {
33
+ return path.join(os.homedir(), ".mulsok-traders");
34
+ }
35
+ function getConfigFile() {
36
+ return path.join(getConfigDir(), "config.json");
37
+ }
11
38
  /**
12
39
  * Server Base URL · 내장 상수.
13
40
  * 프로덕션: mulsok-traders.vercel.app (기본)
@@ -21,82 +48,182 @@ export const LlmProviderKind = z.enum([
21
48
  "anthropic",
22
49
  "claude-cli",
23
50
  ]);
24
- export const ClientConfigSchema = z.object({
25
- version: z.literal(1).default(1),
26
- llm: z.object({
27
- provider: LlmProviderKind.default("none"),
28
- apiKey: z.string().optional(), // gemini / openai / anthropic 용
29
- model: z.string().optional(), // 예: gemini-2.5-flash, gpt-4o-mini, claude-sonnet-4-5, sonnet
30
- claudeCli: z.object({
31
- binaryPath: z.string().optional(), // 기본: `claude` (PATH 에서 찾음)
32
- model: z.string().default("sonnet"), // sonnet / opus / haiku
33
- }).optional(),
34
- }).default({ provider: "none" }),
35
- broker: z.object({
36
- kind: z.enum(["none", "kiwoom", "kis"]).default("none"),
37
- appKey: z.string().optional(), // 키움 AppKey · KIS APP_KEY
38
- appSecret: z.string().optional(), // 키움 SecretKey · KIS APP_SECRET
39
- isDemo: z.boolean().default(true), // 모의투자 · 실전 토글 · 기본 안전
40
- // 계좌번호: 주문 실행 단계에서 키움 API 가 자동 감지 예정 (사용자 입력 불필요)
41
- }).default({ kind: "none", isDemo: true }),
51
+ /* ─────────── Sub-schemas (user-scoped) ─────────── */
52
+ const LlmSchema = z.object({
53
+ provider: LlmProviderKind.default("none"),
54
+ apiKey: z.string().optional(),
55
+ model: z.string().optional(),
56
+ claudeCli: z.object({
57
+ binaryPath: z.string().optional(),
58
+ model: z.string().default("sonnet"),
59
+ }).optional(),
60
+ });
61
+ const BrokerSchema = z.object({
62
+ kind: z.enum(["none", "kiwoom", "kis"]).default("none"),
63
+ appKey: z.string().optional(),
64
+ appSecret: z.string().optional(),
65
+ isDemo: z.boolean().default(true),
66
+ });
67
+ /**
68
+ * UserSettingsSchema · user 별 영속 저장.
69
+ *
70
+ * 한 mac 에서 여러 user 가 토큰을 갈아끼며 사용해도 각자 자기 설정 보존.
71
+ * 같은 user 는 token 재발급해도 자기 슬롯의 설정 그대로.
72
+ */
73
+ const UserSettingsSchema = z.object({
74
+ llm: LlmSchema.default({ provider: "none" }),
75
+ broker: BrokerSchema.default({ kind: "none", isDemo: true }),
76
+ /** 구독한 페르소나 슬러그 목록 — server SSoT (`/api/client/ping`) 캐시 */
77
+ subscriptions: z.array(z.string()).default([]),
78
+ /** 페르소나별 배정 자본 (KRW) — 사용자 수동 입력 */
79
+ allocations: z.record(z.string(), z.number().nonnegative()).default({}),
80
+ });
81
+ /* ─────────── Disk schema (v2) ─────────── */
82
+ const StoredConfigSchemaV2 = z.object({
83
+ version: z.literal(2).default(2),
42
84
  auth: z.object({
43
85
  deviceToken: z.string().optional(), // mtd_... · 웹 대시보드에서 발급
86
+ userId: z.string().optional(), // server 가 token 으로 식별 한 UUID
87
+ userEmail: z.string().optional(), // 표시용
44
88
  }).default({}),
45
- // 구독한 페르소나 슬러그 목록 (SaaS 구독 모델 · ADR-001).
46
- // server SSoT (`/api/client/ping` 응답) 의 캐시 (사용자 임의 추가 X).
89
+ /** user_id 영속 설정 슬롯. 토큰 교체 자동 격리. */
90
+ users: z.record(z.string(), UserSettingsSchema).default({}),
91
+ /** 글로벌 emergency stop (사용자 무관 process 단위) */
92
+ halted: z.boolean().default(false),
93
+ });
94
+ /* ─────────── Runtime (flat) shape ─────────── */
95
+ /**
96
+ * ClientConfig · 런타임에서 외부 callsite 가 보는 형태.
97
+ *
98
+ * 활성 user 의 settings (llm/broker/subscriptions/allocations) 이 inline 으로
99
+ * top-level 에 노출됨 — 기존 v1 callsite 가 변경 없이 작동하도록 호환 유지.
100
+ *
101
+ * 활성 user 가 없으면 (auth.userId 미설정) → default 값 노출.
102
+ */
103
+ export const ClientConfigSchema = z.object({
104
+ version: z.literal(2).default(2),
105
+ auth: z.object({
106
+ deviceToken: z.string().optional(),
107
+ userId: z.string().optional(),
108
+ userEmail: z.string().optional(),
109
+ }).default({}),
110
+ llm: LlmSchema.default({ provider: "none" }),
111
+ broker: BrokerSchema.default({ kind: "none", isDemo: true }),
47
112
  subscriptions: z.array(z.string()).default([]),
48
- /**
49
- * 페르소나별 배정 자본 (KRW · taeeun-life allocatedCapital 컨셉)
50
- * 페르소나는 자기 받은 자본 안에서만 운용. 초과 주문 차단 (SPEC-26).
51
- * 향후 server `/api/me/instances.allocated_capital_krw` 동기화 예정.
52
- * 사용자 설정 탭에서 manual 입력 가능.
53
- */
54
113
  allocations: z.record(z.string(), z.number().nonnegative()).default({}),
55
- /**
56
- * 응급 정지 상태 (SPEC-26 Emergency Stop).
57
- * true 시 모든 주문·LLM 호출 차단. 사용자가 UI 토글로 해제.
58
- */
59
114
  halted: z.boolean().default(false),
60
115
  });
61
116
  export const DEFAULT_CONFIG = ClientConfigSchema.parse({});
62
117
  function ensureDir() {
63
- if (!fs.existsSync(CONFIG_DIR)) {
64
- fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
118
+ if (!fs.existsSync(getConfigDir())) {
119
+ fs.mkdirSync(getConfigDir(), { recursive: true, mode: 0o700 });
65
120
  }
66
121
  }
67
- /** 로컬 config 로드 · file env override → default 우선순위 */
68
- export function loadConfig() {
69
- let fromFile = DEFAULT_CONFIG;
122
+ /* ─────────── 마이그레이션 v1v2 ─────────── */
123
+ /**
124
+ * disk 에서 읽은 raw JSON 을 v2 stored shape 로 마이그레이션.
125
+ *
126
+ * v1 (top-level llm/broker/subscriptions/allocations) 이면:
127
+ * - auth.userId 가 있으면 그 user 의 슬롯으로 이동
128
+ * - 없으면 폐기 (누구의 것인지 모름)
129
+ *
130
+ * v2 면 그대로 반환.
131
+ */
132
+ function migrateToV2(raw) {
133
+ if (typeof raw !== "object" || raw === null)
134
+ return raw;
135
+ const r = raw;
136
+ const ver = r.version;
137
+ if (ver === 2)
138
+ return raw;
139
+ // v1 (또는 version 누락 = 초기 v1)
140
+ const auth = (r.auth ?? {});
141
+ const userId = auth.userId;
142
+ const users = {};
143
+ if (userId) {
144
+ // v1 의 top-level settings 를 user 의 슬롯으로 이동
145
+ users[userId] = {
146
+ llm: r.llm,
147
+ broker: r.broker,
148
+ subscriptions: r.subscriptions ?? [],
149
+ allocations: r.allocations ?? {},
150
+ };
151
+ console.warn(`[config] v1 → v2 마이그레이션 · user ${userId} 의 settings 이동`);
152
+ }
153
+ else if (r.llm || r.broker || r.subscriptions || r.allocations) {
154
+ console.warn("[config] v1 → v2 마이그레이션 · auth.userId 없음 → top-level llm/broker/subscriptions/allocations 폐기 (누구의 것인지 모름)");
155
+ }
156
+ return {
157
+ version: 2,
158
+ auth,
159
+ users,
160
+ halted: r.halted ?? false,
161
+ };
162
+ }
163
+ /* ─────────── load / save (flat 인터페이스) ─────────── */
164
+ /**
165
+ * 파일에서 stored config 읽기. v1 이면 v2 로 마이그레이션 (메모리에서만 ·
166
+ * 다음 saveConfig 호출 시 disk 에도 v2 로 기록됨).
167
+ */
168
+ function readStoredConfig() {
169
+ if (!fs.existsSync(getConfigFile())) {
170
+ return StoredConfigSchemaV2.parse({});
171
+ }
70
172
  try {
71
- if (fs.existsSync(CONFIG_FILE)) {
72
- const raw = fs.readFileSync(CONFIG_FILE, "utf-8");
73
- const parsed = ClientConfigSchema.safeParse(JSON.parse(raw));
74
- if (parsed.success) {
75
- fromFile = parsed.data;
76
- }
77
- else {
78
- console.warn("[config] invalid format · default 사용:", parsed.error.issues);
79
- }
80
- }
173
+ const raw = JSON.parse(fs.readFileSync(getConfigFile(), "utf-8"));
174
+ const migrated = migrateToV2(raw);
175
+ const parsed = StoredConfigSchemaV2.safeParse(migrated);
176
+ if (parsed.success)
177
+ return parsed.data;
178
+ console.warn("[config] invalid format · default:", parsed.error.issues);
81
179
  }
82
180
  catch (e) {
83
181
  console.warn("[config] load 실패 · default:", e);
84
182
  }
85
- // env override — webui 안 쓰는 사용자 (CI/CD · 자동 배포 · 비밀 관리자) 시나리오 지원
86
- return mergeFromEnv(fromFile);
183
+ return StoredConfigSchemaV2.parse({});
87
184
  }
88
185
  /**
89
- * 환경 변수로 config override.
186
+ * 활성 user settings 반환. user 미설정이면 default.
187
+ */
188
+ function getActiveUserSettings(stored) {
189
+ const userId = stored.auth?.userId;
190
+ if (userId && stored.users[userId]) {
191
+ return stored.users[userId];
192
+ }
193
+ return UserSettingsSchema.parse({});
194
+ }
195
+ /**
196
+ * Stored (nested) → Runtime (flat) 변환.
197
+ * 활성 user 의 settings 가 top-level 로 inline.
198
+ */
199
+ function flattenForRuntime(stored) {
200
+ const userSettings = getActiveUserSettings(stored);
201
+ return {
202
+ version: 2,
203
+ auth: stored.auth,
204
+ llm: userSettings.llm,
205
+ broker: userSettings.broker,
206
+ subscriptions: userSettings.subscriptions,
207
+ allocations: userSettings.allocations,
208
+ halted: stored.halted,
209
+ };
210
+ }
211
+ /** 로컬 config 로드 · file → env override → default 우선순위 */
212
+ export function loadConfig() {
213
+ const stored = readStoredConfig();
214
+ const flat = flattenForRuntime(stored);
215
+ return mergeFromEnv(flat);
216
+ }
217
+ /**
218
+ * 환경 변수로 config override. 활성 user 의 settings 에 덮어씀.
90
219
  *
91
- * 우선순위: env > file > default
220
+ * 우선순위: env > stored > default
92
221
  * 지원 키:
93
222
  * MULSOK_BROKER_KIND · APPKEY · APPSECRET · DEMO
94
223
  * MULSOK_LLM_PROVIDER · APIKEY · MODEL
95
224
  * MULSOK_DEVICE_TOKEN
96
225
  * MULSOK_HALTED
97
- * MULSOK_ALLOCATION_<SLUG>=<KRW> (예: MULSOK_ALLOCATION_NEOUL=1000000)
98
- *
99
- * 빈 문자열 / undefined / 잘못된 enum 은 무시 (file 값 보존).
226
+ * MULSOK_ALLOCATION_<SLUG>=<KRW>
100
227
  */
101
228
  export function mergeFromEnv(cfg) {
102
229
  const env = process.env;
@@ -128,7 +255,6 @@ export function mergeFromEnv(cfg) {
128
255
  if (env.MULSOK_HALTED != null && env.MULSOK_HALTED !== "") {
129
256
  halted = env.MULSOK_HALTED === "true";
130
257
  }
131
- // allocations: MULSOK_ALLOCATION_<SLUG>=<KRW>
132
258
  const allocations = { ...cfg.allocations };
133
259
  for (const [k, v] of Object.entries(env)) {
134
260
  if (!k.startsWith("MULSOK_ALLOCATION_") || !v)
@@ -147,13 +273,71 @@ export function mergeFromEnv(cfg) {
147
273
  allocations,
148
274
  };
149
275
  }
150
- /** config 저장 · 0600 권한 */
276
+ /**
277
+ * config 저장 · 0600 권한.
278
+ *
279
+ * Runtime (flat) ClientConfig 받아서 v2 stored (nested users map) 에 저장.
280
+ *
281
+ * Settings 쓰기 규칙 (user 격리 핵심):
282
+ * - prev/new userId 동일 (정상 업데이트) 또는 첫 로그인 (prev 미설정) →
283
+ * flat sections 을 users[<userId>] 슬롯에 기록
284
+ * - userId 가 다른 user 로 전환 (prev=A, new=B) → settings 는 쓰지 않음.
285
+ * (caller 의 flat sections 이 prev user 것일 가능성 — 의도치 않은 leak
286
+ * 방지). 새 user 의 settings 를 명시적으로 갱신하려면 별도 saveConfig
287
+ * 호출 (auth 가 이미 새 userId 로 stored 에 반영된 후).
288
+ * - userId 없음 (logout 또는 미인증) → settings 무시
289
+ *
290
+ * 다른 user 들의 슬롯은 항상 보존.
291
+ */
151
292
  export function saveConfig(cfg) {
152
293
  ensureDir();
153
- const validated = ClientConfigSchema.parse(cfg);
154
- fs.writeFileSync(CONFIG_FILE, JSON.stringify(validated, null, 2), { mode: 0o600 });
155
- return validated;
294
+ // 기존 stored 읽어서 다른 user 들의 슬롯 보존 + prev userId 확인
295
+ const stored = readStoredConfig();
296
+ const prevUserId = stored.auth?.userId;
297
+ stored.auth = {
298
+ deviceToken: cfg.auth?.deviceToken,
299
+ userId: cfg.auth?.userId,
300
+ userEmail: cfg.auth?.userEmail,
301
+ };
302
+ stored.halted = cfg.halted;
303
+ const newUserId = cfg.auth?.userId;
304
+ // Settings 쓰기 조건 (격리 핵심): newUserId === prevUserId 인 경우만.
305
+ //
306
+ // 그 외 모든 경우 (first login · 재로그인 · user 전환 · logout) 는 settings
307
+ // 무시. 이유: caller 의 flat sections 가 「어느 user 컨텍스트에서 만들어진
308
+ // 것인지」 saveConfig 가 알 수 없어서, 잘못된 user 의 slot 에 leak 위험.
309
+ //
310
+ // Caller 가 첫 로그인 / user 전환 후 새 user 의 settings 를 갱신하려면
311
+ // 명시적 2-step 필요:
312
+ // 1) saveConfig({...cfg, auth: { userId: newId }}) ← auth 만 업데이트
313
+ // 2) const fresh = loadConfig(); ← 새 user 컨텍스트 로드
314
+ // saveConfig({...fresh, subscriptions: [...]}) ← 이제 prev === new, 쓰기 OK
315
+ const writeSettings = !!newUserId && newUserId === prevUserId;
316
+ if (writeSettings && newUserId) {
317
+ stored.users[newUserId] = UserSettingsSchema.parse({
318
+ llm: cfg.llm,
319
+ broker: cfg.broker,
320
+ subscriptions: cfg.subscriptions,
321
+ allocations: cfg.allocations,
322
+ });
323
+ }
324
+ const validated = StoredConfigSchemaV2.parse(stored);
325
+ fs.writeFileSync(getConfigFile(), JSON.stringify(validated, null, 2), { mode: 0o600 });
326
+ return flattenForRuntime(validated);
327
+ }
328
+ /**
329
+ * 특정 user 의 슬롯을 명시적으로 삭제 (DELETE 류 endpoint 에서 호출).
330
+ * 다른 user 들의 슬롯은 보존.
331
+ */
332
+ export function deleteUserSettings(userId) {
333
+ ensureDir();
334
+ const stored = readStoredConfig();
335
+ if (stored.users[userId]) {
336
+ delete stored.users[userId];
337
+ fs.writeFileSync(getConfigFile(), JSON.stringify(StoredConfigSchemaV2.parse(stored), null, 2), { mode: 0o600 });
338
+ }
156
339
  }
340
+ /* ─────────── 마스킹 + patch ─────────── */
157
341
  /** API key 마스킹 · GET /api/config 응답 시 사용 */
158
342
  export function maskedConfig(cfg) {
159
343
  const mask = (s) => {
@@ -183,25 +367,19 @@ export function maskedConfig(cfg) {
183
367
  /**
184
368
  * maskedConfig 가 만든 마스킹 형태 (`***` 또는 `xxxxxx...yyyy`) 인지 감지.
185
369
  * UI 가 GET 응답을 그대로 POST 로 다시 보내는 실수를 백엔드에서 차단하기 위함.
186
- * 정상 비밀값(키움 AppKey, deviceToken 등)은 `...` 를 포함하지 않거나, 길이/형태가 다름.
187
370
  */
188
371
  export function isMaskedSecret(s) {
189
372
  if (typeof s !== "string")
190
373
  return false;
191
374
  if (s === "***")
192
375
  return true;
193
- // maskedConfig: head(6) + "..." + tail(4) = 정확히 13자
194
376
  return s.length === 13 && s.slice(6, 9) === "...";
195
377
  }
196
378
  /**
197
379
  * POST /api/config partial merge.
198
380
  *
199
- * 규칙:
200
- * - 비밀값(llm.apiKey · auth.deviceToken · broker.appKey/appSecret): 빈문자열·미포함·**마스킹 sentinel** 기존 유지
201
- * - 공개값(provider · model · broker.kind · isDemo): 명시 시 교체
202
- * - patch 에 없는 최상위 섹션(subscriptions/allocations/halted/llm/broker/auth): **기존 유지** (default 로 리셋 X)
203
- *
204
- * 결함 회귀 차단: 한 섹션 저장이 다른 섹션을 덮어쓰지 않도록 모든 최상위 필드를 명시적 보존.
381
+ * Flat ClientConfig 형태로 작동 — saveConfig 가 자동으로 활성 user 슬롯에
382
+ * 라우팅. 활성 user 없으면 settings 부분은 저장 됨 (UX 가드).
205
383
  */
206
384
  export function mergeConfigPatch(existing, patch) {
207
385
  const preserveSecret = (incoming, current) => {
@@ -209,7 +387,6 @@ export function mergeConfigPatch(existing, patch) {
209
387
  return incoming;
210
388
  return current;
211
389
  };
212
- // patch 에 섹션이 명시 안 되면 기존 그대로 — default 로 리셋 X
213
390
  const has = (k) => Object.prototype.hasOwnProperty.call(patch, k);
214
391
  const mergedLlm = (() => {
215
392
  if (!has("llm"))
@@ -241,14 +418,19 @@ export function mergeConfigPatch(existing, patch) {
241
418
  const p = (patch.auth ?? {});
242
419
  return {
243
420
  deviceToken: preserveSecret(p.deviceToken, existing.auth?.deviceToken),
421
+ userId: typeof p.userId === "string" || p.userId === undefined
422
+ ? p.userId ?? existing.auth?.userId
423
+ : existing.auth?.userId,
424
+ userEmail: typeof p.userEmail === "string" || p.userEmail === undefined
425
+ ? p.userEmail ?? existing.auth?.userEmail
426
+ : existing.auth?.userEmail,
244
427
  };
245
428
  })();
246
429
  const merged = {
247
- version: 1,
430
+ version: 2,
248
431
  llm: mergedLlm,
249
432
  broker: mergedBroker,
250
433
  auth: mergedAuth,
251
- // 누락 시 기존 유지 (default 리셋 차단)
252
434
  subscriptions: has("subscriptions")
253
435
  ? patch.subscriptions
254
436
  : existing.subscriptions,
@@ -259,5 +441,121 @@ export function mergeConfigPatch(existing, patch) {
259
441
  };
260
442
  return ClientConfigSchema.parse(merged);
261
443
  }
262
- export const CONFIG_PATHS = { dir: CONFIG_DIR, file: CONFIG_FILE };
444
+ export const CONFIG_PATHS = {
445
+ get dir() { return getConfigDir(); },
446
+ get file() { return getConfigFile(); },
447
+ };
448
+ /* ─────────── User-scoped filesystem layout ─────────── */
449
+ //
450
+ // 식별 모델: server 의 auth.users(id) 가 user identity SSoT.
451
+ //
452
+ // 경로:
453
+ // ~/.mulsok-traders/
454
+ // config.json ← v2 (auth + users<userId> + halted)
455
+ // market.db ← 글로벌 (universe + daily_candles · user 무관)
456
+ // krx-holidays.json ← 글로벌 (시장 캘린더)
457
+ // logs/ ← 글로벌 (process stdout)
458
+ // u/<userId>/ ← user-scoped 데이터 root
459
+ // personas/<slug>/{state.json, strategy.md}
460
+ // diary/<date>-<slug>.md
461
+ // trade-journal/<yyyy-mm>.jsonl
462
+ // layer3-patches/<slug>/...
463
+ function getUserRootDir() { return path.join(getConfigDir(), "u"); }
464
+ /** 현재 인증된 user_id 반환. 없으면 null. */
465
+ export function getCurrentUserId() {
466
+ return loadConfig().auth?.userId ?? null;
467
+ }
468
+ /** 현재 인증된 user_id 반환. 없으면 throw — write 작업에서 사용. */
469
+ export function requireUserId() {
470
+ const u = getCurrentUserId();
471
+ if (!u) {
472
+ throw new Error("user_id 미설정 — 클라이언트가 server 인증을 받기 전에 user-scoped " +
473
+ "작업이 호출됨. 먼저 device token 을 등록 후 ping 응답으로 user_id " +
474
+ "를 받아 config.auth.userId 에 저장되어야 함.");
475
+ }
476
+ return u;
477
+ }
478
+ /** user 의 LOCAL data root 디렉터리 경로. */
479
+ export function userDir(userId) {
480
+ return path.join(getUserRootDir(), userId);
481
+ }
482
+ /** user-scoped 하위 경로. */
483
+ export function userPath(userId, ...parts) {
484
+ return path.join(userDir(userId), ...parts);
485
+ }
486
+ /** user-scoped 디렉터리 보장 (없으면 생성, 0700). */
487
+ export function ensureUserDir(userId, ...parts) {
488
+ const p = userPath(userId, ...parts);
489
+ if (!fs.existsSync(p)) {
490
+ fs.mkdirSync(p, { recursive: true, mode: 0o700 });
491
+ }
492
+ return p;
493
+ }
494
+ /**
495
+ * 특정 user 의 LOCAL data 전체 삭제 (fs).
496
+ * v2 schema 에선 user 변경 자체로 인한 wipe 는 불필요 (각 user 가 자기
497
+ * namespace 보유). 사용자 명시 「로컬 초기화」 시 호출.
498
+ */
499
+ export function resetUserScopedLocalData(userId) {
500
+ const removed = [];
501
+ const dir = userDir(userId);
502
+ try {
503
+ if (fs.existsSync(dir)) {
504
+ fs.rmSync(dir, { recursive: true, force: true });
505
+ removed.push(`u/${userId}/`);
506
+ }
507
+ }
508
+ catch (e) {
509
+ console.warn(`[config] resetUserScopedLocalData ${dir} 삭제 실패:`, e);
510
+ }
511
+ return { removed };
512
+ }
513
+ /**
514
+ * 모든 user 의 LOCAL data + 글로벌 user-data 삭제 (POST /api/local/reset).
515
+ * 글로벌 market.db 는 보존.
516
+ */
517
+ export function resetAllLocalData() {
518
+ const removed = [];
519
+ try {
520
+ if (fs.existsSync(getUserRootDir())) {
521
+ fs.rmSync(getUserRootDir(), { recursive: true, force: true });
522
+ removed.push("u/");
523
+ }
524
+ }
525
+ catch (e) {
526
+ console.warn(`[config] resetAllLocalData u/ 삭제 실패:`, e);
527
+ }
528
+ for (const t of ["personas", "diary", "trade-journal", "layer3-patches", "watchers.db"]) {
529
+ const p = path.join(getConfigDir(), t);
530
+ try {
531
+ if (fs.existsSync(p)) {
532
+ fs.rmSync(p, { recursive: true, force: true });
533
+ removed.push(`legacy/${t}`);
534
+ }
535
+ }
536
+ catch (e) {
537
+ console.warn(`[config] resetAllLocalData legacy ${t} 삭제 실패:`, e);
538
+ }
539
+ }
540
+ return { removed };
541
+ }
542
+ /**
543
+ * 이전 user 무관 평면 구조 데이터 잔재 정리 (개발 중 backup 불필요).
544
+ */
545
+ export function purgeLegacyGlobalData() {
546
+ const removed = [];
547
+ for (const t of ["personas", "diary", "trade-journal", "layer3-patches", "watchers.db"]) {
548
+ const p = path.join(getConfigDir(), t);
549
+ try {
550
+ if (fs.existsSync(p)) {
551
+ fs.rmSync(p, { recursive: true, force: true });
552
+ removed.push(t);
553
+ }
554
+ }
555
+ catch (e) {
556
+ console.warn(`[config] purgeLegacyGlobalData ${t} 삭제 실패:`, e);
557
+ }
558
+ }
559
+ return { removed };
560
+ }
263
561
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src-server/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src-server/config.ts"],"names":[],"mappings":"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"}