@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.
- package/CHANGELOG.md +80 -0
- package/README.md +42 -5
- package/bin/cli.js +618 -38
- package/dist/server/auth/admin.js +32 -0
- package/dist/server/auth/admin.js.map +1 -0
- package/dist/server/broker/kiwoom/_helpers/symbol-code.js +21 -0
- package/dist/server/broker/kiwoom/_helpers/symbol-code.js.map +1 -0
- package/dist/server/broker/kiwoom/client.js +23 -4
- package/dist/server/broker/kiwoom/client.js.map +1 -1
- package/dist/server/broker/kiwoom/endpoints/account.js +14 -6
- package/dist/server/broker/kiwoom/endpoints/account.js.map +1 -1
- package/dist/server/broker/kiwoom/endpoints/quote.js +99 -13
- package/dist/server/broker/kiwoom/endpoints/quote.js.map +1 -1
- package/dist/server/broker/kiwoom/index.js +1 -1
- package/dist/server/broker/kiwoom/index.js.map +1 -1
- package/dist/server/broker/kiwoom/order-tracker.js +13 -0
- package/dist/server/broker/kiwoom/order-tracker.js.map +1 -1
- package/dist/server/broker/kiwoom/price-feed.js +13 -0
- package/dist/server/broker/kiwoom/price-feed.js.map +1 -1
- package/dist/server/broker/kiwoom/ws/endpoints/condition.js +3 -2
- package/dist/server/broker/kiwoom/ws/endpoints/condition.js.map +1 -1
- package/dist/server/calendar/kst-marker.js +68 -0
- package/dist/server/calendar/kst-marker.js.map +1 -0
- package/dist/server/config.js +370 -72
- package/dist/server/config.js.map +1 -1
- package/dist/server/db/sqlite.js +53 -29
- package/dist/server/db/sqlite.js.map +1 -1
- package/dist/server/diary/writer.js +151 -46
- package/dist/server/diary/writer.js.map +1 -1
- package/dist/server/index.js +166 -11
- package/dist/server/index.js.map +1 -1
- package/dist/server/jobs/universe-sync.js +48 -11
- package/dist/server/jobs/universe-sync.js.map +1 -1
- package/dist/server/jobs/watchdog.js +4 -0
- package/dist/server/jobs/watchdog.js.map +1 -1
- package/dist/server/journal/telemetry.js +11 -0
- package/dist/server/journal/telemetry.js.map +1 -1
- package/dist/server/journal/trade-journal.js +42 -16
- package/dist/server/journal/trade-journal.js.map +1 -1
- package/dist/server/llm/context-builder.js +9 -5
- package/dist/server/llm/context-builder.js.map +1 -1
- package/dist/server/personas/loader.js +46 -16
- package/dist/server/personas/loader.js.map +1 -1
- package/dist/server/personas/persona-agent.js +93 -21
- package/dist/server/personas/persona-agent.js.map +1 -1
- package/dist/server/personas/persona-state.js +198 -19
- package/dist/server/personas/persona-state.js.map +1 -1
- package/dist/server/personas/runner.js +29 -0
- package/dist/server/personas/runner.js.map +1 -1
- package/dist/server/personas/schema.js +13 -0
- package/dist/server/personas/schema.js.map +1 -1
- package/dist/server/personas/wake-plan.js +4 -67
- package/dist/server/personas/wake-plan.js.map +1 -1
- package/dist/server/readiness.js +70 -0
- package/dist/server/readiness.js.map +1 -1
- package/dist/server/routes.js +300 -13
- package/dist/server/routes.js.map +1 -1
- package/dist/server/screener/engine.js +110 -1
- package/dist/server/screener/engine.js.map +1 -1
- package/dist/server/screener/indicators.js +63 -0
- package/dist/server/screener/indicators.js.map +1 -0
- package/dist/server/server-sync.js +387 -126
- package/dist/server/server-sync.js.map +1 -1
- package/dist/server/share/postgres-publish.js +139 -0
- package/dist/server/share/postgres-publish.js.map +1 -0
- package/dist/server/share/prepare-state.js +50 -0
- package/dist/server/share/prepare-state.js.map +1 -0
- package/dist/server/share/prepare.js +61 -0
- package/dist/server/share/prepare.js.map +1 -0
- package/dist/server/share/publish-cron.js +96 -0
- package/dist/server/share/publish-cron.js.map +1 -0
- package/dist/server/share/snapshot.js +81 -0
- package/dist/server/share/snapshot.js.map +1 -0
- package/dist/server/watchers/condition-watcher.js +57 -16
- package/dist/server/watchers/condition-watcher.js.map +1 -1
- package/dist/web/assets/index-B1C-UX9W.js +88 -0
- package/dist/web/assets/index-N7Xwheka.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +4 -5
- package/dist/web/assets/index-62SMpbaf.js +0 -79
- package/dist/web/assets/index-BPLQR0wt.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trade-journal.js","sourceRoot":"","sources":["../../../src-server/journal/trade-journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"trade-journal.js","sourceRoot":"","sources":["../../../src-server/journal/trade-journal.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import fs from "node:fs";
|
|
23
23
|
import path from "node:path";
|
|
24
|
-
import
|
|
24
|
+
import { ensureUserDir, getCurrentUserId } from "../config.js";
|
|
25
25
|
import { getHoldings, getMarketIndex } from "../broker/kiwoom/index.js";
|
|
26
26
|
import { getConditionWatcher } from "../watchers/condition-watcher.js";
|
|
27
27
|
import { getOrderTracker } from "../broker/kiwoom/order-tracker.js";
|
|
@@ -30,15 +30,19 @@ import { readEvents } from "../journal/trade-journal.js";
|
|
|
30
30
|
* Layer 3 patches 디렉토리 (Coach 가 출력한 patch 파일 모음)
|
|
31
31
|
*
|
|
32
32
|
* 구조:
|
|
33
|
-
* ~/.mulsok-traders/layer3-patches/<personaSlug>/<yyyy-mm-dd>-<idx>.md
|
|
33
|
+
* ~/.mulsok-traders/u/<userId>/layer3-patches/<personaSlug>/<yyyy-mm-dd>-<idx>.md
|
|
34
34
|
*
|
|
35
35
|
* Coach 가 patch 를 발행 (P15+ executor) → 사용자가 승인 → 이 디렉토리에 markdown 파일로 저장.
|
|
36
36
|
* buildLayer3Patches() 가 자동 reload 해서 LLM context 에 주입.
|
|
37
|
+
*
|
|
38
|
+
* user 별 격리: token 교체 시 다른 user 의 patch 가 새 user 컨텍스트에 섞이지 않도록.
|
|
37
39
|
*/
|
|
38
|
-
|
|
39
|
-
/** 활성 patch 모음 · markdown 합쳐서 반환 */
|
|
40
|
+
/** 활성 patch 모음 · markdown 합쳐서 반환. user_id 미설정 시 빈 문자열. */
|
|
40
41
|
export function loadActivePatches(personaSlug) {
|
|
41
|
-
const
|
|
42
|
+
const userId = getCurrentUserId();
|
|
43
|
+
if (!userId)
|
|
44
|
+
return "";
|
|
45
|
+
const personaDir = path.join(ensureUserDir(userId, "layer3-patches"), personaSlug);
|
|
42
46
|
if (!fs.existsSync(personaDir))
|
|
43
47
|
return "";
|
|
44
48
|
const files = fs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../../src-server/llm/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../../src-server/llm/context-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,15 +14,20 @@
|
|
|
14
14
|
* 60초 (빈번한 스크리닝 호출 고려 · Supabase 부담 경감)
|
|
15
15
|
*/
|
|
16
16
|
import fs from "node:fs";
|
|
17
|
-
import os from "node:os";
|
|
18
17
|
import path from "node:path";
|
|
19
18
|
import matter from "gray-matter";
|
|
20
19
|
import { fetchPersonaBundle } from "../bundle.js";
|
|
21
|
-
import { SERVER_BASE_URL, loadConfig } from "../config.js";
|
|
20
|
+
import { SERVER_BASE_URL, loadConfig, ensureUserDir, getCurrentUserId } from "../config.js";
|
|
22
21
|
import { PersonaFrontmatterSchema, } from "./schema.js";
|
|
23
22
|
const CACHE = new Map();
|
|
24
23
|
const CACHE_TTL_MS = 60_000;
|
|
25
|
-
|
|
24
|
+
/** user_id 가 있을 때만 override dir 반환. 없으면 null (override 검색 skip). */
|
|
25
|
+
function getOverrideDir() {
|
|
26
|
+
const userId = getCurrentUserId();
|
|
27
|
+
if (!userId)
|
|
28
|
+
return null;
|
|
29
|
+
return ensureUserDir(userId, "personas");
|
|
30
|
+
}
|
|
26
31
|
/**
|
|
27
32
|
* 페르소나 slug 로 정의 확보.
|
|
28
33
|
*
|
|
@@ -70,8 +75,10 @@ async function loadPersonaFresh(slug) {
|
|
|
70
75
|
catch {
|
|
71
76
|
// Supabase 실패는 조용히 override 로 fallback
|
|
72
77
|
}
|
|
73
|
-
/* 2. 로컬 override */
|
|
74
|
-
const
|
|
78
|
+
/* 2. 로컬 override (frontmatter + body 둘 다 가능) */
|
|
79
|
+
const override = readLocalOverride(slug);
|
|
80
|
+
const overrideFm = override?.frontmatter ?? null;
|
|
81
|
+
const overrideBody = override?.body ?? "";
|
|
75
82
|
if (!supabaseFm && !overrideFm) {
|
|
76
83
|
// Supabase body 는 있지만 frontmatter 없고 override 도 없음 → 페르소나 스크리너 쓸 수 없음
|
|
77
84
|
if (supabaseBody) {
|
|
@@ -99,36 +106,56 @@ async function loadPersonaFresh(slug) {
|
|
|
99
106
|
: overrideFm
|
|
100
107
|
? "local-override"
|
|
101
108
|
: "supabase";
|
|
109
|
+
// body 결정: supabase body 우선 → 없으면 override body (Phase 5e-D2 신규)
|
|
110
|
+
// 단테처럼 Supabase 미등록 페르소나도 .md override 만으로 cycle 실행 가능.
|
|
111
|
+
const promptBody = supabaseBody || overrideBody;
|
|
102
112
|
return {
|
|
103
113
|
slug,
|
|
104
114
|
frontmatter: merged,
|
|
105
|
-
promptBody
|
|
115
|
+
promptBody,
|
|
106
116
|
source,
|
|
107
117
|
rawBody,
|
|
108
118
|
hashOk,
|
|
109
119
|
version,
|
|
110
120
|
};
|
|
111
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* 로컬 override 파일 읽기 — frontmatter 와 body (있으면) 둘 다 반환.
|
|
124
|
+
*
|
|
125
|
+
* Phase 5e-D2 (2026-05-09) 확장:
|
|
126
|
+
* .md 파일은 frontmatter + body 둘 다 추출 → Supabase 미등록 페르소나도
|
|
127
|
+
* local override 만으로 cycle 실행 가능 (단테 v0.4 첫 도입 사례).
|
|
128
|
+
* .yaml/.yml 은 frontmatter 만 (body 컨셉 없음).
|
|
129
|
+
*/
|
|
112
130
|
function readLocalOverride(slug) {
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
131
|
+
const dir = getOverrideDir();
|
|
132
|
+
if (!dir)
|
|
133
|
+
return null;
|
|
134
|
+
const yamlPath = path.join(dir, `${slug}.yaml`);
|
|
135
|
+
const ymlPath = path.join(dir, `${slug}.yml`);
|
|
136
|
+
const mdPath = path.join(dir, `${slug}.md`);
|
|
116
137
|
const candidates = [yamlPath, ymlPath, mdPath];
|
|
117
138
|
for (const p of candidates) {
|
|
118
139
|
if (!fs.existsSync(p))
|
|
119
140
|
continue;
|
|
120
141
|
try {
|
|
121
142
|
const raw = fs.readFileSync(p, "utf8");
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
143
|
+
// .md: parseMarkdownWithFrontmatter 가 이미 schema 검증 완료 → 그대로 반환
|
|
144
|
+
if (p.endsWith(".md")) {
|
|
145
|
+
const parsed = parseMarkdownWithFrontmatter(raw);
|
|
146
|
+
if (!parsed)
|
|
147
|
+
continue;
|
|
148
|
+
return { frontmatter: parsed.frontmatter, body: parsed.body };
|
|
149
|
+
}
|
|
150
|
+
// .yaml/.yml: raw object 검증 필요
|
|
151
|
+
const fmRaw = parseYamlAsFrontmatter(raw);
|
|
152
|
+
if (!fmRaw)
|
|
126
153
|
continue;
|
|
127
|
-
const res = PersonaFrontmatterSchema.safeParse({ persona: slug, version: "override", ...
|
|
154
|
+
const res = PersonaFrontmatterSchema.safeParse({ persona: slug, version: "override", ...fmRaw });
|
|
128
155
|
if (!res.success) {
|
|
129
156
|
throw new Error(`Override frontmatter validation 실패 · ${slug}: ${formatZodError(res.error)}`);
|
|
130
157
|
}
|
|
131
|
-
return res.data;
|
|
158
|
+
return { frontmatter: res.data, body: "" };
|
|
132
159
|
}
|
|
133
160
|
catch (e) {
|
|
134
161
|
console.warn(`[personas] override 로드 실패 (${p}): ${String(e)}`);
|
|
@@ -161,5 +188,8 @@ function formatZodError(err) {
|
|
|
161
188
|
.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`)
|
|
162
189
|
.join(" · ");
|
|
163
190
|
}
|
|
164
|
-
|
|
191
|
+
/** 외부 (e.g. routes.ts) 에서 현재 user 의 override dir 경로 조회 — 없으면 null. */
|
|
192
|
+
export function getPersonaOverrideDir() {
|
|
193
|
+
return getOverrideDir();
|
|
194
|
+
}
|
|
165
195
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src-server/personas/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src-server/personas/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ import { checkLlmCallSafety } from "../safety.js";
|
|
|
29
29
|
import { fetchCommonBundle, fetchPersonaBundle, assembleFullPrompt } from "../bundle.js";
|
|
30
30
|
import { SERVER_BASE_URL } from "../config.js";
|
|
31
31
|
import { loadPersona } from "./loader.js";
|
|
32
|
-
import { loadState, personaDir } from "./persona-state.js";
|
|
32
|
+
import { loadState, personaDir, extractStateUpdate, applyStateUpdate } from "./persona-state.js";
|
|
33
33
|
import { logDecision } from "../journal/trade-journal.js";
|
|
34
34
|
const TIMEOUT_SEC = (() => {
|
|
35
35
|
const env = process.env.CLAUDE_CLI_TIMEOUT_SEC;
|
|
@@ -50,6 +50,11 @@ export async function executePersonaCycle(slug, triggeredBy = { kind: "manual" }
|
|
|
50
50
|
}
|
|
51
51
|
// 2. config + provider
|
|
52
52
|
const cfg = loadConfig();
|
|
53
|
+
// user 미인증 가드 — user-scoped state.json / strategy.md 접근 불가
|
|
54
|
+
// (정상 흐름에선 인증 후 cycle 호출이라 여기까지 안 옴)
|
|
55
|
+
if (!cfg.auth?.userId) {
|
|
56
|
+
return failResult(slug, triggeredBy, startedAt, t0, "config", "user_id 미설정 — 디바이스 토큰 등록 + server 인증 후 cycle 호출 가능");
|
|
57
|
+
}
|
|
53
58
|
if (cfg.llm.provider !== "claude-cli") {
|
|
54
59
|
return failResult(slug, triggeredBy, startedAt, t0, "config", `agent cycle 은 LLM provider = "claude-cli" 만 지원 (현재 ${cfg.llm.provider}). config 변경 후 재시도.`);
|
|
55
60
|
}
|
|
@@ -61,13 +66,33 @@ export async function executePersonaCycle(slug, triggeredBy = { kind: "manual" }
|
|
|
61
66
|
return failResult(slug, triggeredBy, startedAt, t0, "persona", `persona '${slug}' 미존재`);
|
|
62
67
|
}
|
|
63
68
|
// 4. Layer 1+2 prompt
|
|
69
|
+
// Layer 1 (common) 은 Supabase 단일 진실 — 항상 fetch.
|
|
70
|
+
// Layer 2 (persona) 는 Supabase 우선 · 실패 시 local override body 로 fallback
|
|
71
|
+
// → dante 처럼 Supabase 미등록 페르소나도 .md override 만으로 cycle 가능
|
|
72
|
+
// (Phase 5e-D2 — ADR-009 정합 유지: 등록된 페르소나는 server SSoT 우선).
|
|
64
73
|
let systemPrompt;
|
|
65
74
|
try {
|
|
66
75
|
const common = await fetchCommonBundle(SERVER_BASE_URL);
|
|
67
|
-
|
|
76
|
+
let layer2Body = "";
|
|
77
|
+
let layer2Source = "supabase";
|
|
78
|
+
try {
|
|
79
|
+
const personaB = await fetchPersonaBundle(SERVER_BASE_URL, slug, cfg.auth?.deviceToken);
|
|
80
|
+
layer2Body = personaB.bundle.body;
|
|
81
|
+
}
|
|
82
|
+
catch (supabaseErr) {
|
|
83
|
+
if (persona.promptBody) {
|
|
84
|
+
layer2Body = persona.promptBody;
|
|
85
|
+
layer2Source = "local-override";
|
|
86
|
+
console.log(`[persona-agent] ${slug} · Supabase persona bundle 미존재 → local override body 사용 (${persona.promptBody.length} chars)`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
return failResult(slug, triggeredBy, startedAt, t0, "bundle", `Layer 2 prompt 조립 실패: Supabase fetch 실패 (${String(supabaseErr)}) + local override body 도 비어있음`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
void layer2Source; // 추후 logging 용 reserved
|
|
68
93
|
systemPrompt = assembleFullPrompt({
|
|
69
94
|
layer1: common.bundle.body,
|
|
70
|
-
layer2:
|
|
95
|
+
layer2: layer2Body,
|
|
71
96
|
layer3Header: agentInstructionLayer3(slug, triggeredBy),
|
|
72
97
|
});
|
|
73
98
|
}
|
|
@@ -78,7 +103,7 @@ export async function executePersonaCycle(slug, triggeredBy = { kind: "manual" }
|
|
|
78
103
|
const projectRoot = process.env.MULSOK_PROJECT_ROOT ?? process.cwd();
|
|
79
104
|
const personaWorkDir = personaDir(slug);
|
|
80
105
|
const port = process.env.CLIENT_PORT ?? "8787";
|
|
81
|
-
const userPrompt = buildAgentUserPrompt(slug, triggeredBy, port);
|
|
106
|
+
const userPrompt = buildAgentUserPrompt(slug, triggeredBy, port, personaWorkDir);
|
|
82
107
|
const args = [
|
|
83
108
|
"--dangerously-skip-permissions",
|
|
84
109
|
"--add-dir", projectRoot,
|
|
@@ -97,6 +122,19 @@ export async function executePersonaCycle(slug, triggeredBy = { kind: "manual" }
|
|
|
97
122
|
return failResult(slug, triggeredBy, startedAt, t0, "agent", `claude-cli 실행 실패: ${String(e)}`);
|
|
98
123
|
}
|
|
99
124
|
const summary = extractAssistantText(stdout);
|
|
125
|
+
// 5-b. <state_update> 블록 적용 — agent 가 raw Write 로 state.json 직접 갱신하던
|
|
126
|
+
// 흐름을 폐기 (2026-05-08 trailing-comma 사고). 응답에서 블록 추출 → zod 검증 →
|
|
127
|
+
// saveState 만 사용해 직렬화. 블록 없거나 검증 실패 시 state.json 변경 없음.
|
|
128
|
+
const extracted = extractStateUpdate(summary);
|
|
129
|
+
if (extracted.ok) {
|
|
130
|
+
const applied = applyStateUpdate(slug, extracted.payload);
|
|
131
|
+
if (!applied.ok) {
|
|
132
|
+
console.warn(`[persona-agent] ${slug} state_update 적용 실패: ${applied.reason}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.warn(`[persona-agent] ${slug} state_update 미적용: ${extracted.reason}`);
|
|
137
|
+
}
|
|
100
138
|
// 6. journal cycle 기록
|
|
101
139
|
try {
|
|
102
140
|
logDecision({
|
|
@@ -157,23 +195,24 @@ function agentInstructionLayer3(slug, triggeredBy) {
|
|
|
157
195
|
|
|
158
196
|
## 당신의 메모리
|
|
159
197
|
|
|
160
|
-
- 자기 전용 폴더:
|
|
198
|
+
- 자기 전용 폴더: (--add-dir 로 전달된 work directory)
|
|
161
199
|
- \`state.json\` — watchlist · positions · stats · nextRunAt
|
|
162
200
|
- \`strategy.md\` — 자유 형식 전략 노트 (시장 판단 · 학습 등)
|
|
163
201
|
|
|
164
202
|
## 자율성 원칙
|
|
165
203
|
|
|
166
204
|
- 정기 cron 은 없습니다. 다음 사이클 시각은 당신이 \`state.json.nextRunAt\` (ISO8601) 으로 직접 결정.
|
|
167
|
-
-
|
|
168
|
-
-
|
|
205
|
+
- 시세 조건 watcher 등록 (\`POST /api/watchers\`) 은 「추가 트리거」 로만 사용 — \`nextRunAt\` 을 대체하지 않습니다.
|
|
206
|
+
- **\`nextRunAt\` 은 반드시 잡아야 합니다 (\`null\` 금지).** watcher 만 등록하고 nextRunAt 을 비우면, watcher 가 발화 안 할 시 영원히 잠들어 시장 변화 follow-up 이 끊깁니다. 장 마감 후라면 \`다음거래일T08:50:00+09:00\` 이 기본값.
|
|
207
|
+
- watchdog 는 \`nextRunAt\` 누락을 결함으로 간주해 「잠들음」 alert 을 띄웁니다.
|
|
169
208
|
`;
|
|
170
209
|
}
|
|
171
|
-
function buildAgentUserPrompt(slug, triggeredBy, port) {
|
|
210
|
+
function buildAgentUserPrompt(slug, triggeredBy, port, personaWorkDir) {
|
|
172
211
|
return `다음 작업을 순서대로 수행하세요. 각 단계마다 도구를 직접 사용하세요.
|
|
173
212
|
|
|
174
213
|
# 1. 메모리 read
|
|
175
|
-
- \`Read\` 도구로
|
|
176
|
-
- \`Read\` 도구로
|
|
214
|
+
- \`Read\` 도구로 \`${personaWorkDir}/state.json\` 읽기
|
|
215
|
+
- \`Read\` 도구로 \`${personaWorkDir}/strategy.md\` 읽기
|
|
177
216
|
|
|
178
217
|
# 2. 시장 컨텍스트 조회 (필요한 만큼만 — 토큰 절약)
|
|
179
218
|
|
|
@@ -275,19 +314,16 @@ state.json 의 watchlist + 현재 시장 + 보유 + 활성 watcher 를 종합:
|
|
|
275
314
|
-d '{"personaSlug":"${slug}","watchers":[{"intent":"...","condition":{...},"wakeAction":"...","maxWaitHours":N}]}'
|
|
276
315
|
\`\`\`
|
|
277
316
|
|
|
278
|
-
# 7. 메모리 갱신
|
|
317
|
+
# 7. 메모리 갱신
|
|
279
318
|
|
|
280
|
-
- \`Write
|
|
281
|
-
|
|
282
|
-
- positions 동기 (주문 후)
|
|
283
|
-
- stats 갱신 (매도 후 손익)
|
|
284
|
-
- **\`nextRunAt\` 설정** (ISO8601 · 한국 영업일 고려) — 또는 watcher 만 등록했으면 \`null\`
|
|
285
|
-
- \`Edit\` 도구로 \`~/.mulsok-traders/personas/${slug}/strategy.md\` 갱신
|
|
319
|
+
- **\`state.json\` 은 Write/Edit 도구로 직접 쓰지 마세요.** 시스템이 응답 끝의 \`<state_update>\` 블록 (8단계) 을 읽고 zod 검증 후 안전하게 직렬화합니다. 직접 쓰면 trailing comma 등 손상 위험.
|
|
320
|
+
- \`Edit\` 도구로 \`${personaWorkDir}/strategy.md\` 갱신 (자유 형식 마크다운 — 직접 편집 OK)
|
|
286
321
|
- 「현재 시장 판단」 섹션 갱신
|
|
287
322
|
- 학습 노트 추가 (있으면)
|
|
288
|
-
- \`lastRunAt\` 도 같이 현재 시각으로 갱신
|
|
289
323
|
|
|
290
|
-
## ⚠ state
|
|
324
|
+
## ⚠ state 항목 필드명 (UI 가 이 명명으로 읽음)
|
|
325
|
+
|
|
326
|
+
watchlist[] 항목:
|
|
291
327
|
|
|
292
328
|
\`\`\`json
|
|
293
329
|
{
|
|
@@ -306,11 +342,47 @@ state.json 의 watchlist + 현재 시장 + 보유 + 활성 watcher 를 종합:
|
|
|
306
342
|
추가 메타 (score · stars · watcherIds 등) 는 자유 필드로 보존. 다만 위 9개 키는 정확히 사용.
|
|
307
343
|
**symbolCode/symbolName/note/entryTriggerKrw 같은 별칭 사용 금지** (UI 표시 안 됨).
|
|
308
344
|
|
|
309
|
-
# 8. 마지막 응답
|
|
345
|
+
# 8. 마지막 응답 (필수 형식)
|
|
310
346
|
|
|
311
|
-
|
|
347
|
+
응답은 두 부분으로 구성:
|
|
348
|
+
|
|
349
|
+
## 8-A. 요약 단락 (사용자에게 보일 텍스트)
|
|
350
|
+
|
|
351
|
+
수행한 작업을 한 단락으로. 예:
|
|
312
352
|
- "watchlist 의 한화솔루션 트리거 도달 안 함 (현재가 51,000원 vs 트리거 48,650원). 매수 보류. 신규 발굴 결과 동아엘텍 (088130) 패턴3 후보로 watchlist 추가. 다음 사이클은 내일 09:30 KST 예약."
|
|
313
353
|
|
|
354
|
+
## 8-B. \`<state_update>\` 블록 (필수)
|
|
355
|
+
|
|
356
|
+
요약 단락 다음에 **반드시** 다음 형식의 블록을 출력. 시스템이 추출 → zod 검증 → state.json 으로 직렬화합니다.
|
|
357
|
+
|
|
358
|
+
\`\`\`
|
|
359
|
+
<state_update>
|
|
360
|
+
{
|
|
361
|
+
"watchlist": [ ...전체 watchlist... ],
|
|
362
|
+
"positions": [ ...전체 positions... ],
|
|
363
|
+
"stats": { "totalTrades": N, "winCount": N, "lossCount": N, "realizedPnlKrw": N },
|
|
364
|
+
"lastRunAt": "2026-05-08T11:30:00+09:00",
|
|
365
|
+
"nextRunAt": "2026-05-09T08:50:00+09:00"
|
|
366
|
+
}
|
|
367
|
+
</state_update>
|
|
368
|
+
\`\`\`
|
|
369
|
+
|
|
370
|
+
규칙:
|
|
371
|
+
- **포함한 키만 갱신**됩니다. 변경 안 한 키는 빼세요 (기존 값 유지). 전체 redump 불필요.
|
|
372
|
+
- watchlist · positions 는 **전체 배열을 통째로** 보내세요 (부분 추가/삭제 X · 머지 안 함).
|
|
373
|
+
- watchlist 항목 / position 에 **추가 메타 (\`score\`, \`watcherIds\`, \`splitTier\`, \`stopPriceKrw\`, \`target1PriceKrw\`, \`target2PriceKrw\`, \`clientOrderId\`, \`brokerOrderNo\`, \`pattern\`, \`stars\` 등) 는 자유롭게 포함하세요.** zod 가 보존합니다. 특히 \`watcherIds\` 는 손절·익절 watcher 와의 link 라 누락하면 다음 사이클에서 추적 불가.
|
|
374
|
+
- **\`nextRunAt\` 은 반드시 잡으세요 (\`null\` 금지).** watcher 만 등록하고 \`nextRunAt\` 을 비워두면 watcher 가 발화 안 할 시 영원히 잠듭니다 (대표적 결함). watcher 모드여도 fallback 시각을 잡으세요.
|
|
375
|
+
- **\`nextRunAt\` 은 KST 마커를 사용하세요. 직접 ISO8601 작성 금지.** 직접 날짜 계산하면 토/일/공휴일 검증 실수가 잦습니다 (실제 회귀: LLM 이 \"내일\" 을 +1일 ISO 로 만들어 토요일 등록). 시스템이 KST 마커를 정규화하면서 거래일 검증 + 비거래일이면 다음 거래일로 자동 보정합니다.
|
|
376
|
+
- 지원 KST 마커:
|
|
377
|
+
- \`다음거래일T08:50:00+09:00\` — KRX 휴장일 + 주말 모두 skip 후 첫 거래일 08:50 KST. **장 마감 후 / 장외 / 주말 호출 시 가장 안전한 기본값.**
|
|
378
|
+
- \`오늘T15:25:00+09:00\` — 오늘 KST 15:25 (장 종료 직전 watcher 정리·다음 사이클 준비 시)
|
|
379
|
+
- \`오늘T15:35:00+09:00\` — 오늘 KST 15:35 (장 마감 직후 정리)
|
|
380
|
+
- \`내일T08:50:00+09:00\` — 단순 +1일 (휴장일 무관). 거래일 보장 X 이므로 비추.
|
|
381
|
+
- \`다음월요일T08:50:00+09:00\` — 다음 월요일 KST 08:50.
|
|
382
|
+
- 시스템이 비거래일을 감지하면 다음 거래일로 보정하되 시각 부분 (HH:MM:SS) 은 그대로. 즉 \"내일T08:50\" 이 토요일이어도 자동으로 월요일 08:50 으로 변환됩니다.
|
|
383
|
+
- JSON 은 표준 (trailing comma · 주석 X). 검증 실패 시 state.json 변경 안 됨.
|
|
384
|
+
- \`slug\` / \`version\` 은 시스템이 강제하므로 보내도 무시됩니다.
|
|
385
|
+
|
|
314
386
|
이제 시작하세요.`;
|
|
315
387
|
}
|
|
316
388
|
/* ================================================================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persona-agent.js","sourceRoot":"","sources":["../../../src-server/personas/persona-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"persona-agent.js","sourceRoot":"","sources":["../../../src-server/personas/persona-agent.ts"],"names":[],"mappings":"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"}
|