@mulsok/traders-client 0.1.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 (119) hide show
  1. package/README.md +103 -0
  2. package/bin/cli.js +160 -0
  3. package/bin/postinstall.js +57 -0
  4. package/bin/preuninstall.js +36 -0
  5. package/dist/server/broker/kiwoom/cache.js +86 -0
  6. package/dist/server/broker/kiwoom/cache.js.map +1 -0
  7. package/dist/server/broker/kiwoom/client.js +256 -0
  8. package/dist/server/broker/kiwoom/client.js.map +1 -0
  9. package/dist/server/broker/kiwoom/endpoints/_helpers.js +61 -0
  10. package/dist/server/broker/kiwoom/endpoints/_helpers.js.map +1 -0
  11. package/dist/server/broker/kiwoom/endpoints/account.js +448 -0
  12. package/dist/server/broker/kiwoom/endpoints/account.js.map +1 -0
  13. package/dist/server/broker/kiwoom/endpoints/detail.js +118 -0
  14. package/dist/server/broker/kiwoom/endpoints/detail.js.map +1 -0
  15. package/dist/server/broker/kiwoom/endpoints/investor.js +139 -0
  16. package/dist/server/broker/kiwoom/endpoints/investor.js.map +1 -0
  17. package/dist/server/broker/kiwoom/endpoints/order.js +134 -0
  18. package/dist/server/broker/kiwoom/endpoints/order.js.map +1 -0
  19. package/dist/server/broker/kiwoom/endpoints/quote.js +165 -0
  20. package/dist/server/broker/kiwoom/endpoints/quote.js.map +1 -0
  21. package/dist/server/broker/kiwoom/endpoints/ranking.js +180 -0
  22. package/dist/server/broker/kiwoom/endpoints/ranking.js.map +1 -0
  23. package/dist/server/broker/kiwoom/endpoints/sector.js +135 -0
  24. package/dist/server/broker/kiwoom/endpoints/sector.js.map +1 -0
  25. package/dist/server/broker/kiwoom/endpoints/theme.js +104 -0
  26. package/dist/server/broker/kiwoom/endpoints/theme.js.map +1 -0
  27. package/dist/server/broker/kiwoom/endpoints/universe.js +119 -0
  28. package/dist/server/broker/kiwoom/endpoints/universe.js.map +1 -0
  29. package/dist/server/broker/kiwoom/index.js +59 -0
  30. package/dist/server/broker/kiwoom/index.js.map +1 -0
  31. package/dist/server/broker/kiwoom/order-tracker.js +353 -0
  32. package/dist/server/broker/kiwoom/order-tracker.js.map +1 -0
  33. package/dist/server/broker/kiwoom/price-feed.js +119 -0
  34. package/dist/server/broker/kiwoom/price-feed.js.map +1 -0
  35. package/dist/server/broker/kiwoom/rate-limiter.js +97 -0
  36. package/dist/server/broker/kiwoom/rate-limiter.js.map +1 -0
  37. package/dist/server/broker/kiwoom/types.js +13 -0
  38. package/dist/server/broker/kiwoom/types.js.map +1 -0
  39. package/dist/server/broker/kiwoom/ws/client.js +370 -0
  40. package/dist/server/broker/kiwoom/ws/client.js.map +1 -0
  41. package/dist/server/broker/kiwoom/ws/endpoints/condition.js +146 -0
  42. package/dist/server/broker/kiwoom/ws/endpoints/condition.js.map +1 -0
  43. package/dist/server/broker/kiwoom/ws/realtime-bus.js +42 -0
  44. package/dist/server/broker/kiwoom/ws/realtime-bus.js.map +1 -0
  45. package/dist/server/broker/kiwoom/ws/types.js +19 -0
  46. package/dist/server/broker/kiwoom/ws/types.js.map +1 -0
  47. package/dist/server/broker/news.js +34 -0
  48. package/dist/server/broker/news.js.map +1 -0
  49. package/dist/server/bundle.js +43 -0
  50. package/dist/server/bundle.js.map +1 -0
  51. package/dist/server/calendar/krx-holidays.js +162 -0
  52. package/dist/server/calendar/krx-holidays.js.map +1 -0
  53. package/dist/server/config.js +263 -0
  54. package/dist/server/config.js.map +1 -0
  55. package/dist/server/db/sqlite.js +252 -0
  56. package/dist/server/db/sqlite.js.map +1 -0
  57. package/dist/server/diary/writer.js +266 -0
  58. package/dist/server/diary/writer.js.map +1 -0
  59. package/dist/server/index.js +316 -0
  60. package/dist/server/index.js.map +1 -0
  61. package/dist/server/jobs/universe-sync.js +132 -0
  62. package/dist/server/jobs/universe-sync.js.map +1 -0
  63. package/dist/server/jobs/watchdog.js +87 -0
  64. package/dist/server/jobs/watchdog.js.map +1 -0
  65. package/dist/server/journal/pnl-stats.js +108 -0
  66. package/dist/server/journal/pnl-stats.js.map +1 -0
  67. package/dist/server/journal/telemetry.js +174 -0
  68. package/dist/server/journal/telemetry.js.map +1 -0
  69. package/dist/server/journal/trade-journal.js +239 -0
  70. package/dist/server/journal/trade-journal.js.map +1 -0
  71. package/dist/server/llm/anthropic.js +98 -0
  72. package/dist/server/llm/anthropic.js.map +1 -0
  73. package/dist/server/llm/claude-cli.js +204 -0
  74. package/dist/server/llm/claude-cli.js.map +1 -0
  75. package/dist/server/llm/context-builder.js +229 -0
  76. package/dist/server/llm/context-builder.js.map +1 -0
  77. package/dist/server/llm/gemini.js +86 -0
  78. package/dist/server/llm/gemini.js.map +1 -0
  79. package/dist/server/llm/index.js +36 -0
  80. package/dist/server/llm/index.js.map +1 -0
  81. package/dist/server/llm/openai.js +87 -0
  82. package/dist/server/llm/openai.js.map +1 -0
  83. package/dist/server/personas/executor.js +318 -0
  84. package/dist/server/personas/executor.js.map +1 -0
  85. package/dist/server/personas/loader.js +165 -0
  86. package/dist/server/personas/loader.js.map +1 -0
  87. package/dist/server/personas/persona-agent.js +386 -0
  88. package/dist/server/personas/persona-agent.js.map +1 -0
  89. package/dist/server/personas/persona-state.js +170 -0
  90. package/dist/server/personas/persona-state.js.map +1 -0
  91. package/dist/server/personas/runner.js +162 -0
  92. package/dist/server/personas/runner.js.map +1 -0
  93. package/dist/server/personas/schema.js +123 -0
  94. package/dist/server/personas/schema.js.map +1 -0
  95. package/dist/server/personas/wake-plan.js +313 -0
  96. package/dist/server/personas/wake-plan.js.map +1 -0
  97. package/dist/server/readiness.js +414 -0
  98. package/dist/server/readiness.js.map +1 -0
  99. package/dist/server/routes.js +1216 -0
  100. package/dist/server/routes.js.map +1 -0
  101. package/dist/server/safety.js +153 -0
  102. package/dist/server/safety.js.map +1 -0
  103. package/dist/server/screener/engine.js +856 -0
  104. package/dist/server/screener/engine.js.map +1 -0
  105. package/dist/server/server-sync.js +427 -0
  106. package/dist/server/server-sync.js.map +1 -0
  107. package/dist/server/signing.js +39 -0
  108. package/dist/server/signing.js.map +1 -0
  109. package/dist/server/watchers/condition-watcher.js +519 -0
  110. package/dist/server/watchers/condition-watcher.js.map +1 -0
  111. package/dist/server/watchers/types.js +16 -0
  112. package/dist/server/watchers/types.js.map +1 -0
  113. package/dist/web/assets/index-62SMpbaf.js +79 -0
  114. package/dist/web/assets/index-BPLQR0wt.css +1 -0
  115. package/dist/web/index.html +14 -0
  116. package/package.json +93 -0
  117. package/scripts/com.mulsok.traders.client.plist.template +58 -0
  118. package/scripts/install-daemon.sh +156 -0
  119. package/scripts/uninstall-daemon.sh +62 -0
@@ -0,0 +1,414 @@
1
+ /**
2
+ * P14a-iii · Readiness Check — 재설계.
3
+ *
4
+ * 거래 준비 = (로컬 설정 OK) + (서버와 end-to-end 번들 동기 OK).
5
+ *
6
+ * 5 blocking 항목:
7
+ * 1. 서버 연결 (ping)
8
+ * 2. 장치 인증 (Bearer mtd_...)
9
+ * 3. Layer 1 Common Prompt active 발행
10
+ * 4. 프롬프트 번들 동기 — Common + N 구독 Persona · 각각 HMAC hash 검증
11
+ * 5. LLM Provider (로컬 테스트)
12
+ *
13
+ * 2 non-blocking 항목:
14
+ * 6. Persona 구독 (subscriptions 정보 표시용)
15
+ * 7. 증권사 API (차후)
16
+ */
17
+ import { loadConfig, SERVER_BASE_URL } from "./config.js";
18
+ import { createLlmProvider } from "./llm/index.js";
19
+ import { fetchCommonBundle, fetchPersonaBundle } from "./bundle.js";
20
+ import { getAccessToken, getDeposit, kiwoomHostLabel } from "./broker/kiwoom/index.js";
21
+ export async function runReadinessCheck() {
22
+ const cfg = loadConfig();
23
+ const items = [];
24
+ const deviceToken = cfg.auth?.deviceToken;
25
+ const hasToken = !!deviceToken && deviceToken.startsWith("mtd_");
26
+ const serverUrl = SERVER_BASE_URL.replace(/\/$/, "") + "/api/client/ping";
27
+ let ping = null;
28
+ let pingOk = false;
29
+ // 1. 서버 ping
30
+ try {
31
+ const headers = { "cache-control": "no-cache" };
32
+ if (hasToken)
33
+ headers["authorization"] = `Bearer ${deviceToken}`;
34
+ const res = await fetch(serverUrl, { headers });
35
+ if (!res.ok) {
36
+ items.push({
37
+ id: "server",
38
+ label: "mulsok-traders 서버 연결",
39
+ status: "fail",
40
+ detail: `HTTP ${res.status}`,
41
+ blocking: true,
42
+ });
43
+ }
44
+ else {
45
+ ping = (await res.json());
46
+ pingOk = true;
47
+ items.push({
48
+ id: "server",
49
+ label: "mulsok-traders 서버 연결",
50
+ status: "ok",
51
+ detail: `${ping.service} · ${ping.server_time?.slice(0, 19).replace("T", " ")}`,
52
+ blocking: true,
53
+ });
54
+ }
55
+ }
56
+ catch (e) {
57
+ items.push({
58
+ id: "server",
59
+ label: "mulsok-traders 서버 연결",
60
+ status: "fail",
61
+ detail: `연결 실패: ${String(e)}`,
62
+ blocking: true,
63
+ });
64
+ }
65
+ // 2. 장치 인증
66
+ if (!pingOk) {
67
+ items.push({
68
+ id: "device-auth",
69
+ label: "장치 인증",
70
+ status: "skip",
71
+ detail: "서버 연결 실패로 확인 불가",
72
+ blocking: true,
73
+ });
74
+ }
75
+ else if (!hasToken) {
76
+ items.push({
77
+ id: "device-auth",
78
+ label: "장치 인증",
79
+ status: "fail",
80
+ detail: "Device token 미설정 · 설정 탭에서 입력",
81
+ blocking: true,
82
+ });
83
+ }
84
+ else if (!ping?.authenticated) {
85
+ items.push({
86
+ id: "device-auth",
87
+ label: "장치 인증",
88
+ status: "fail",
89
+ detail: "토큰이 유효하지 않음 · revoke 됐거나 잘못 입력",
90
+ blocking: true,
91
+ });
92
+ }
93
+ else {
94
+ items.push({
95
+ id: "device-auth",
96
+ label: "장치 인증",
97
+ status: "ok",
98
+ detail: `${ping.device_label ?? "장치"}${ping.user_email ? " · " + ping.user_email : ""}`,
99
+ blocking: true,
100
+ });
101
+ }
102
+ // 3. Layer 1 Common Prompt 활성 여부 (서버 상태)
103
+ if (!pingOk) {
104
+ items.push({
105
+ id: "common-prompt",
106
+ label: "Layer 1 Common Prompt",
107
+ status: "skip",
108
+ detail: "서버 연결 실패로 확인 불가",
109
+ blocking: true,
110
+ });
111
+ }
112
+ else {
113
+ const commonReady = !!ping?.common_ready;
114
+ items.push({
115
+ id: "common-prompt",
116
+ label: "Layer 1 Common Prompt",
117
+ status: commonReady ? "ok" : "fail",
118
+ detail: ping?.common_version
119
+ ? `버전 ${ping.common_version} 활성`
120
+ : "active 버전 없음 · admin 에서 publish 필요",
121
+ blocking: true,
122
+ });
123
+ }
124
+ // 4. 프롬프트 번들 동기 · Common + 구독 Persona 전부
125
+ const subscriptions = ping?.subscriptions ?? [];
126
+ if (!pingOk) {
127
+ items.push({
128
+ id: "bundle-sync",
129
+ label: "프롬프트 번들 동기",
130
+ status: "skip",
131
+ detail: "서버 연결 실패로 확인 불가",
132
+ blocking: true,
133
+ });
134
+ }
135
+ else if (!ping?.common_ready) {
136
+ items.push({
137
+ id: "bundle-sync",
138
+ label: "프롬프트 번들 동기",
139
+ status: "skip",
140
+ detail: "Common active 미발행 · 수신 불가",
141
+ blocking: true,
142
+ });
143
+ }
144
+ else if (!ping?.authenticated && subscriptions.length === 0) {
145
+ // 인증 안 된 상태에서는 Common 만 확인 가능
146
+ try {
147
+ const common = await fetchCommonBundle(SERVER_BASE_URL);
148
+ items.push({
149
+ id: "bundle-sync",
150
+ label: "프롬프트 번들 동기",
151
+ status: common.hash_ok ? "ok" : "fail",
152
+ detail: common.hash_ok
153
+ ? `Common ${common.bundle.version} · ${common.bundle.body.length.toLocaleString()}자 · hash ✓ (persona 는 인증 후)`
154
+ : "Common hash 불일치 · 무결성 위험",
155
+ blocking: true,
156
+ });
157
+ }
158
+ catch (e) {
159
+ items.push({
160
+ id: "bundle-sync",
161
+ label: "프롬프트 번들 동기",
162
+ status: "fail",
163
+ detail: `Common 수신 실패: ${String(e)}`,
164
+ blocking: true,
165
+ });
166
+ }
167
+ }
168
+ else {
169
+ // 인증 된 상태: Common + 모든 구독 persona 수신 + hash 검증
170
+ const errors = [];
171
+ let commonBytes = 0;
172
+ let commonVer = "";
173
+ try {
174
+ const common = await fetchCommonBundle(SERVER_BASE_URL);
175
+ if (!common.hash_ok)
176
+ errors.push("Common hash 불일치");
177
+ commonBytes = common.bundle.body.length;
178
+ commonVer = common.bundle.version;
179
+ }
180
+ catch (e) {
181
+ errors.push(`Common: ${String(e).slice(0, 80)}`);
182
+ }
183
+ let personaOk = 0;
184
+ const personaErrs = [];
185
+ for (const sub of subscriptions) {
186
+ try {
187
+ const pb = await fetchPersonaBundle(SERVER_BASE_URL, sub.persona_slug, deviceToken);
188
+ if (pb.hash_ok) {
189
+ personaOk++;
190
+ }
191
+ else {
192
+ personaErrs.push(`${sub.persona_slug} hash 불일치`);
193
+ }
194
+ }
195
+ catch (e) {
196
+ personaErrs.push(`${sub.persona_slug}: ${String(e).slice(0, 60)}`);
197
+ }
198
+ }
199
+ const hasErrors = errors.length > 0 || personaErrs.length > 0;
200
+ const nSub = subscriptions.length;
201
+ let detail;
202
+ if (nSub === 0) {
203
+ detail = errors.length
204
+ ? errors.join(" · ")
205
+ : `Common ${commonVer} · ${commonBytes.toLocaleString()}자 · hash ✓ (구독 페르소나 없음)`;
206
+ }
207
+ else {
208
+ detail = hasErrors
209
+ ? [...errors, ...personaErrs].join(" · ")
210
+ : `Common ${commonVer} + 페르소나 ${personaOk}/${nSub} · 모두 hash ✓`;
211
+ }
212
+ items.push({
213
+ id: "bundle-sync",
214
+ label: "프롬프트 번들 동기",
215
+ status: hasErrors ? "fail" : "ok",
216
+ detail,
217
+ blocking: true,
218
+ });
219
+ }
220
+ // 5. LLM Provider 로컬 테스트
221
+ if (cfg.llm.provider === "none") {
222
+ items.push({
223
+ id: "llm",
224
+ label: "LLM Provider",
225
+ status: "fail",
226
+ detail: "설정 탭에서 provider 선택 필요",
227
+ blocking: true,
228
+ });
229
+ }
230
+ else {
231
+ const prov = createLlmProvider(cfg);
232
+ if (!prov) {
233
+ items.push({
234
+ id: "llm",
235
+ label: "LLM Provider",
236
+ status: "fail",
237
+ detail: "provider 생성 실패 (키 누락?)",
238
+ blocking: true,
239
+ });
240
+ }
241
+ else {
242
+ try {
243
+ const testRes = await prov.test();
244
+ items.push({
245
+ id: "llm",
246
+ label: `LLM Provider · ${cfg.llm.provider}`,
247
+ status: testRes.ok ? "ok" : "fail",
248
+ detail: testRes.detail ??
249
+ testRes.error ??
250
+ (testRes.model ? `model ${testRes.model}` : "(no detail)"),
251
+ blocking: true,
252
+ });
253
+ }
254
+ catch (e) {
255
+ items.push({
256
+ id: "llm",
257
+ label: `LLM Provider · ${cfg.llm.provider}`,
258
+ status: "fail",
259
+ detail: `테스트 실패: ${String(e)}`,
260
+ blocking: true,
261
+ });
262
+ }
263
+ }
264
+ }
265
+ // 6. Persona 구독 상황 (non-blocking · 정보성)
266
+ if (!ping?.authenticated) {
267
+ items.push({
268
+ id: "persona-subs",
269
+ label: "Persona 구독",
270
+ status: "skip",
271
+ detail: "장치 인증 후 확인 가능",
272
+ blocking: false,
273
+ });
274
+ }
275
+ else if (subscriptions.length === 0) {
276
+ items.push({
277
+ id: "persona-subs",
278
+ label: "Persona 구독",
279
+ status: "todo",
280
+ detail: "구독한 페르소나 없음 · 웹에서 트레이더 구독 후 거래 시작 가능",
281
+ blocking: false,
282
+ });
283
+ }
284
+ else {
285
+ items.push({
286
+ id: "persona-subs",
287
+ label: "Persona 구독",
288
+ status: "ok",
289
+ detail: subscriptions.map((s) => `${s.persona_name} (v${s.prompt_version})`).join(" · "),
290
+ blocking: false,
291
+ });
292
+ }
293
+ // 7. 증권사 API · kind 에 따라 분기.
294
+ if (cfg.broker.kind === "none") {
295
+ items.push({
296
+ id: "broker",
297
+ label: "증권사 API 연동",
298
+ status: "todo",
299
+ detail: "미선택 · 자동 주문 실행은 차후 · 설정 탭에서 키움/KIS 선택 시 활성",
300
+ blocking: false,
301
+ });
302
+ }
303
+ else if (cfg.broker.kind === "kiwoom") {
304
+ const hostLabel = kiwoomHostLabel(cfg.broker.isDemo);
305
+ if (!cfg.broker.appKey || !cfg.broker.appSecret) {
306
+ items.push({
307
+ id: "broker",
308
+ label: `증권사 · 키움 ${cfg.broker.isDemo ? "모의" : "실전"}`,
309
+ status: "fail",
310
+ detail: "AppKey / SecretKey 미입력",
311
+ blocking: true,
312
+ });
313
+ }
314
+ else {
315
+ try {
316
+ // 1) OAuth2 토큰 (실패 시 즉시 fail)
317
+ const tokenRes = await getAccessToken({
318
+ appKey: cfg.broker.appKey,
319
+ secretKey: cfg.broker.appSecret,
320
+ isDemo: cfg.broker.isDemo,
321
+ });
322
+ if (!tokenRes.ok) {
323
+ items.push({
324
+ id: "broker",
325
+ label: `증권사 · 키움 ${cfg.broker.isDemo ? "모의" : "실전"}`,
326
+ status: "fail",
327
+ detail: tokenRes.error.returnMsg
328
+ ? `${tokenRes.error.message} · ${tokenRes.error.returnMsg}`
329
+ : tokenRes.error.message,
330
+ blocking: true,
331
+ });
332
+ }
333
+ else {
334
+ // 2) 예수금 조회까지 검증 (인증 + 호출 권한 확인)
335
+ const depositRes = await getDeposit();
336
+ if (!depositRes.ok) {
337
+ items.push({
338
+ id: "broker",
339
+ label: `증권사 · 키움 ${cfg.broker.isDemo ? "모의" : "실전"}`,
340
+ status: "fail",
341
+ detail: `토큰 OK · 예수금 조회 실패: ${depositRes.error.message}${depositRes.error.returnMsg ? " · " + depositRes.error.returnMsg : ""}`,
342
+ blocking: true,
343
+ });
344
+ }
345
+ else {
346
+ const d = depositRes.data;
347
+ items.push({
348
+ id: "broker",
349
+ label: `증권사 · 키움 ${cfg.broker.isDemo ? "모의" : "실전"}`,
350
+ status: "ok",
351
+ detail: `${hostLabel} · 토큰 OK · 예수금 ${d.totalDepositKrw.toLocaleString()}원 (가용 ${d.availableKrw.toLocaleString()}원)`,
352
+ blocking: true,
353
+ });
354
+ }
355
+ }
356
+ }
357
+ catch (e) {
358
+ items.push({
359
+ id: "broker",
360
+ label: `증권사 · 키움 ${cfg.broker.isDemo ? "모의" : "실전"}`,
361
+ status: "fail",
362
+ detail: `검증 예외: ${String(e)}`,
363
+ blocking: true,
364
+ });
365
+ }
366
+ }
367
+ }
368
+ else if (cfg.broker.kind === "kis") {
369
+ // KIS · 아직 미구현 · 필드만 노출
370
+ items.push({
371
+ id: "broker",
372
+ label: "증권사 · 한국투자증권",
373
+ status: "todo",
374
+ detail: "KIS OAuth2 검증 미구현 · 차후 Phase",
375
+ blocking: false,
376
+ });
377
+ }
378
+ const blocking = items.filter((i) => i.blocking);
379
+ const okCount = blocking.filter((i) => i.status === "ok").length;
380
+ const report = {
381
+ ready: okCount === blocking.length,
382
+ score: { ok: okCount, total_blocking: blocking.length },
383
+ items,
384
+ checked_at: new Date().toISOString(),
385
+ };
386
+ // 인증된 경우 readiness snapshot 을 서버에 전달 (대시보드 표시) · best-effort
387
+ if (ping?.authenticated && hasToken) {
388
+ try {
389
+ await fetch(serverUrl, {
390
+ headers: {
391
+ "cache-control": "no-cache",
392
+ "authorization": `Bearer ${deviceToken}`,
393
+ "x-readiness": JSON.stringify({
394
+ ready: report.ready,
395
+ score: report.score,
396
+ items: report.items.map((i) => ({
397
+ id: i.id,
398
+ label: i.label,
399
+ status: i.status,
400
+ blocking: i.blocking,
401
+ detail: i.detail,
402
+ })),
403
+ checked_at: report.checked_at,
404
+ }),
405
+ },
406
+ });
407
+ }
408
+ catch {
409
+ // 대시보드 동기 실패는 결과에 영향 없음
410
+ }
411
+ }
412
+ return report;
413
+ }
414
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src-server/readiness.ts"],"names":[],"mappings":"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"}