@n2world/orchestrator 1.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 (154) hide show
  1. package/dist/agent-os-rd.d.ts +100 -0
  2. package/dist/agent-os-rd.js +258 -0
  3. package/dist/audit-store.d.ts +14 -0
  4. package/dist/audit-store.js +107 -0
  5. package/dist/beta-runner.d.ts +95 -0
  6. package/dist/beta-runner.js +251 -0
  7. package/dist/beta.d.ts +102 -0
  8. package/dist/beta.js +180 -0
  9. package/dist/browser-agent.d.ts +90 -0
  10. package/dist/browser-agent.js +223 -0
  11. package/dist/channel-gateway.d.ts +74 -0
  12. package/dist/channel-gateway.js +270 -0
  13. package/dist/channels.d.ts +120 -0
  14. package/dist/channels.js +432 -0
  15. package/dist/chat-store.d.ts +29 -0
  16. package/dist/chat-store.js +120 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +607 -0
  19. package/dist/command-screen.d.ts +12 -0
  20. package/dist/command-screen.js +44 -0
  21. package/dist/commit-gate.d.ts +98 -0
  22. package/dist/commit-gate.js +258 -0
  23. package/dist/companion-api.d.ts +37 -0
  24. package/dist/companion-api.js +101 -0
  25. package/dist/conversation-graph.d.ts +39 -0
  26. package/dist/conversation-graph.js +92 -0
  27. package/dist/cost-estimator.d.ts +27 -0
  28. package/dist/cost-estimator.js +42 -0
  29. package/dist/cron-runner.d.ts +31 -0
  30. package/dist/cron-runner.js +46 -0
  31. package/dist/dashboard/chat.html +326 -0
  32. package/dist/dashboard/dental.html +58 -0
  33. package/dist/dashboard/freebie.png +0 -0
  34. package/dist/dashboard/icon-192.png +0 -0
  35. package/dist/dashboard/index.html +892 -0
  36. package/dist/dashboard/manifest.json +15 -0
  37. package/dist/dashboard/service-worker.js +28 -0
  38. package/dist/dashboard-server.d.ts +37 -0
  39. package/dist/dashboard-server.js +457 -0
  40. package/dist/dental-intake-service.d.ts +37 -0
  41. package/dist/dental-intake-service.js +61 -0
  42. package/dist/dental-metrics.d.ts +25 -0
  43. package/dist/dental-metrics.js +37 -0
  44. package/dist/docking.d.ts +36 -0
  45. package/dist/docking.js +73 -0
  46. package/dist/finance-mcts-candidate.d.ts +37 -0
  47. package/dist/finance-mcts-candidate.js +106 -0
  48. package/dist/finance-regulation-kr.d.ts +33 -0
  49. package/dist/finance-regulation-kr.js +104 -0
  50. package/dist/finance-workflow.d.ts +135 -0
  51. package/dist/finance-workflow.js +242 -0
  52. package/dist/gateway.d.ts +18 -0
  53. package/dist/gateway.js +123 -0
  54. package/dist/governance.d.ts +39 -0
  55. package/dist/governance.js +48 -0
  56. package/dist/governed-executor.d.ts +31 -0
  57. package/dist/governed-executor.js +63 -0
  58. package/dist/governed-llm.d.ts +41 -0
  59. package/dist/governed-llm.js +83 -0
  60. package/dist/gpu-bridge.d.ts +16 -0
  61. package/dist/gpu-bridge.js +53 -0
  62. package/dist/health.d.ts +47 -0
  63. package/dist/health.js +66 -0
  64. package/dist/identity-link.d.ts +32 -0
  65. package/dist/identity-link.js +98 -0
  66. package/dist/index.d.ts +184 -0
  67. package/dist/index.js +417 -0
  68. package/dist/integrations/emr-adapter.d.ts +41 -0
  69. package/dist/integrations/emr-adapter.js +63 -0
  70. package/dist/kakao-oauth.d.ts +16 -0
  71. package/dist/kakao-oauth.js +87 -0
  72. package/dist/knowledge-graph.d.ts +53 -0
  73. package/dist/knowledge-graph.js +156 -0
  74. package/dist/llm.d.ts +65 -0
  75. package/dist/llm.js +357 -0
  76. package/dist/mcp-client-guard.d.ts +32 -0
  77. package/dist/mcp-client-guard.js +179 -0
  78. package/dist/mcp-macaroon.d.ts +75 -0
  79. package/dist/mcp-macaroon.js +161 -0
  80. package/dist/mcts-kernel-bridge.d.ts +36 -0
  81. package/dist/mcts-kernel-bridge.js +99 -0
  82. package/dist/mcts-prior.d.ts +79 -0
  83. package/dist/mcts-prior.js +170 -0
  84. package/dist/model-router.d.ts +51 -0
  85. package/dist/model-router.js +75 -0
  86. package/dist/multi-axis-lift.d.ts +43 -0
  87. package/dist/multi-axis-lift.js +141 -0
  88. package/dist/net-guard.d.ts +39 -0
  89. package/dist/net-guard.js +141 -0
  90. package/dist/onboarding.d.ts +38 -0
  91. package/dist/onboarding.js +94 -0
  92. package/dist/oracle-anchored-search.d.ts +25 -0
  93. package/dist/oracle-anchored-search.js +50 -0
  94. package/dist/oracle.d.ts +22 -0
  95. package/dist/oracle.js +116 -0
  96. package/dist/p6-governance.d.ts +150 -0
  97. package/dist/p6-governance.js +252 -0
  98. package/dist/pairing.d.ts +22 -0
  99. package/dist/pairing.js +81 -0
  100. package/dist/personalization.d.ts +35 -0
  101. package/dist/personalization.js +73 -0
  102. package/dist/pglite-hnsw-bridge.d.ts +118 -0
  103. package/dist/pglite-hnsw-bridge.js +311 -0
  104. package/dist/pglite-store.d.ts +59 -0
  105. package/dist/pglite-store.js +180 -0
  106. package/dist/playbook.d.ts +79 -0
  107. package/dist/playbook.js +83 -0
  108. package/dist/playbooks/dental-intake.d.ts +20 -0
  109. package/dist/playbooks/dental-intake.js +112 -0
  110. package/dist/predictive-agent.d.ts +157 -0
  111. package/dist/predictive-agent.js +535 -0
  112. package/dist/prompt-optimizer.d.ts +18 -0
  113. package/dist/prompt-optimizer.js +104 -0
  114. package/dist/rate-limiter.d.ts +25 -0
  115. package/dist/rate-limiter.js +75 -0
  116. package/dist/safety-anneal.d.ts +83 -0
  117. package/dist/safety-anneal.js +153 -0
  118. package/dist/sandbox-controller.d.ts +12 -0
  119. package/dist/sandbox-controller.js +95 -0
  120. package/dist/satisfaction-metrics.d.ts +26 -0
  121. package/dist/satisfaction-metrics.js +61 -0
  122. package/dist/sensor-bridge.d.ts +53 -0
  123. package/dist/sensor-bridge.js +133 -0
  124. package/dist/session-repair.d.ts +27 -0
  125. package/dist/session-repair.js +66 -0
  126. package/dist/slack-finance-intake.d.ts +42 -0
  127. package/dist/slack-finance-intake.js +122 -0
  128. package/dist/symbolic-dynamics.d.ts +113 -0
  129. package/dist/symbolic-dynamics.js +420 -0
  130. package/dist/telemetry.d.ts +19 -0
  131. package/dist/telemetry.js +68 -0
  132. package/dist/text-embedding.d.ts +6 -0
  133. package/dist/text-embedding.js +42 -0
  134. package/dist/tier-classifier.d.ts +20 -0
  135. package/dist/tier-classifier.js +58 -0
  136. package/dist/tier-guard.d.ts +36 -0
  137. package/dist/tier-guard.js +56 -0
  138. package/dist/tui.d.ts +9 -0
  139. package/dist/tui.js +214 -0
  140. package/dist/update-security.d.ts +31 -0
  141. package/dist/update-security.js +112 -0
  142. package/dist/v-calibration.d.ts +16 -0
  143. package/dist/v-calibration.js +42 -0
  144. package/dist/value-calibration.d.ts +41 -0
  145. package/dist/value-calibration.js +133 -0
  146. package/dist/value-head.d.ts +20 -0
  147. package/dist/value-head.js +91 -0
  148. package/dist/wal-buffer.d.ts +23 -0
  149. package/dist/wal-buffer.js +144 -0
  150. package/dist/wiki-synthesizer.d.ts +80 -0
  151. package/dist/wiki-synthesizer.js +0 -0
  152. package/dist/worker-agent.d.ts +10 -0
  153. package/dist/worker-agent.js +19 -0
  154. package/package.json +65 -0
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // P5 — 치과 파일럿 이로움 계측 (앱 v1.2 §7 · 방안서 v1.1 §6) — 행동 프록시
4
+ // ----------------------------------------------------------------------------
5
+ // "측정된 이로움"(헌법 제1조)을 *행동 기반*으로 잰다 — 자가보고 만족은 보조.
6
+ // - 접수 처리시간(자동화 전/후), 완료율(오라클통과+사람승인), 대조 적중, 재방문.
7
+ //
8
+ // 정직 고지(제1계명): 계측 인프라(테스트 가능). 실 수치는 *실 치과 파일럿*에서 실측
9
+ // (현재 (가정;미검증)). 개인정보는 로컬·익명 집계(외부 전송 없음).
10
+ // ============================================================================
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DentalMetrics = void 0;
13
+ exports.ltvCacGate = ltvCacGate;
14
+ class DentalMetrics {
15
+ events = [];
16
+ record(e) { this.events.push(e); }
17
+ report() {
18
+ const n = this.events.length;
19
+ if (n === 0)
20
+ return { n: 0, timeSavedMsMean: 0, timeSavedPct: 0, completionRate: 0, flagHitRate: 0, satisfactionMean: null };
21
+ const savedArr = this.events.map((e) => e.baselineMs - e.actualMs);
22
+ const timeSavedMsMean = savedArr.reduce((a, b) => a + b, 0) / n;
23
+ const baseMean = this.events.reduce((a, e) => a + e.baselineMs, 0) / n;
24
+ const timeSavedPct = baseMean > 0 ? timeSavedMsMean / baseMean : 0;
25
+ const completionRate = this.events.filter((e) => e.completed).length / n;
26
+ const flagHitRate = this.events.filter((e) => e.flagHit).length / n;
27
+ const sats = this.events.map((e) => e.satisfaction).filter((s) => s != null);
28
+ const satisfactionMean = sats.length ? sats.reduce((a, b) => a + b, 0) / sats.length : null;
29
+ return { n, timeSavedMsMean, timeSavedPct: +timeSavedPct.toFixed(3), completionRate, flagHitRate, satisfactionMean };
30
+ }
31
+ }
32
+ exports.DentalMetrics = DentalMetrics;
33
+ /** 유닛 이코노믹스 게이트: LTV/CAC ≥ 3 인가(파일럿 검증). */
34
+ function ltvCacGate(ltv, cac, threshold = 3) {
35
+ const ratio = cac > 0 ? ltv / cac : Infinity;
36
+ return { pass: ratio >= threshold, ratio: +ratio.toFixed(2) };
37
+ }
@@ -0,0 +1,36 @@
1
+ export interface MemoryItem {
2
+ id: string;
3
+ content: string;
4
+ }
5
+ /** 세션 컨텍스트 — 채널에 귀속된 대화 이력 + 임베딩 인덱스. */
6
+ export declare class SessionContext {
7
+ channel: string;
8
+ readonly sessionId: string;
9
+ private items;
10
+ private vec;
11
+ constructor(channel: string, sessionId: string);
12
+ add(item: MemoryItem): void;
13
+ /** 질의와 가장 유사한 상위 k 항목 id(결정론적). */
14
+ topK(query: string, k?: number): string[];
15
+ size(): number;
16
+ snapshotItems(): MemoryItem[];
17
+ }
18
+ export interface DockResult {
19
+ session: SessionContext;
20
+ fromChannel: string;
21
+ toChannel: string;
22
+ latencyMs: number;
23
+ }
24
+ /**
25
+ * 도킹 — 동일 세션을 새 채널로 재귀속하되 이력·인덱스를 *그대로 이전*한다.
26
+ * (유실 없는 이전이 목표. 유실되면 §보존 측정에서 일치율 하락으로 드러난다.)
27
+ */
28
+ export declare function dockTo(session: SessionContext, toChannel: string): DockResult;
29
+ /** 도킹 전후 top-k 일치율(교집합/ k). 1.0 = 완전 보존. */
30
+ export declare function preservationRatio(before: string[], after: string[]): number;
31
+ /** N개 질의에 대한 평균 top-k 보존율(도킹 전후). */
32
+ export declare function measurePreservation(session: SessionContext, queries: string[], toChannel: string, k?: number): {
33
+ meanRatio: number;
34
+ latencyMs: number;
35
+ n: number;
36
+ };
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // v2.5.2 Phase S / Phase 1 — ChannelDocking + 보존 측정
4
+ // ----------------------------------------------------------------------------
5
+ // 계획서 v2.5.2 §3.1: 대화 중 수신 채널을 교체(도킹)하되 *대화 이력과 시맨틱 인덱스*를
6
+ // 보존한다. 원안의 "100% 보존"은 금지 — 도킹 전후 top-k 검색 일치율을 *실측*한다.
7
+ //
8
+ // 본 모듈은 경량 임베딩(text-embedding 해시 코사인)으로 결정론적 top-k를 제공해
9
+ // jest에서 네트워크/무거운 인덱스 없이 보존율을 측정한다(프로덕션은 HNSW 경로).
10
+ // 정직 고지: 보존율은 측정값이며, 도킹이 인덱스를 *유실*하면 일치율이 떨어져 드러난다.
11
+ // ============================================================================
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.SessionContext = void 0;
14
+ exports.dockTo = dockTo;
15
+ exports.preservationRatio = preservationRatio;
16
+ exports.measurePreservation = measurePreservation;
17
+ const text_embedding_1 = require("./text-embedding");
18
+ /** 세션 컨텍스트 — 채널에 귀속된 대화 이력 + 임베딩 인덱스. */
19
+ class SessionContext {
20
+ channel;
21
+ sessionId;
22
+ items = [];
23
+ vec = new Map();
24
+ constructor(channel, sessionId) {
25
+ this.channel = channel;
26
+ this.sessionId = sessionId;
27
+ }
28
+ add(item) {
29
+ this.items.push(item);
30
+ this.vec.set(item.id, (0, text_embedding_1.textEmbedding)(item.content));
31
+ }
32
+ /** 질의와 가장 유사한 상위 k 항목 id(결정론적). */
33
+ topK(query, k = 5) {
34
+ const q = (0, text_embedding_1.textEmbedding)(query);
35
+ return this.items
36
+ .map((it) => ({ id: it.id, s: (0, text_embedding_1.cosineSimilarity)(q, this.vec.get(it.id)) }))
37
+ .sort((a, b) => b.s - a.s || (a.id < b.id ? -1 : 1))
38
+ .slice(0, k)
39
+ .map((x) => x.id);
40
+ }
41
+ size() { return this.items.length; }
42
+ snapshotItems() { return this.items.map((i) => ({ ...i })); }
43
+ }
44
+ exports.SessionContext = SessionContext;
45
+ /**
46
+ * 도킹 — 동일 세션을 새 채널로 재귀속하되 이력·인덱스를 *그대로 이전*한다.
47
+ * (유실 없는 이전이 목표. 유실되면 §보존 측정에서 일치율 하락으로 드러난다.)
48
+ */
49
+ function dockTo(session, toChannel) {
50
+ const t0 = (globalThis.performance?.now?.() ?? Date.now());
51
+ const fromChannel = session.channel;
52
+ // 이력·인덱스를 보존한 채 채널만 스위칭(동일 객체 재귀속).
53
+ session.channel = toChannel;
54
+ const latencyMs = (globalThis.performance?.now?.() ?? Date.now()) - t0;
55
+ return { session, fromChannel, toChannel, latencyMs };
56
+ }
57
+ /** 도킹 전후 top-k 일치율(교집합/ k). 1.0 = 완전 보존. */
58
+ function preservationRatio(before, after) {
59
+ if (before.length === 0)
60
+ return 1;
61
+ const set = new Set(after);
62
+ const hit = before.filter((id) => set.has(id)).length;
63
+ return hit / before.length;
64
+ }
65
+ /** N개 질의에 대한 평균 top-k 보존율(도킹 전후). */
66
+ function measurePreservation(session, queries, toChannel, k = 5) {
67
+ const before = queries.map((q) => session.topK(q, k));
68
+ const { latencyMs } = dockTo(session, toChannel);
69
+ const after = queries.map((q) => session.topK(q, k));
70
+ const ratios = before.map((b, i) => preservationRatio(b, after[i]));
71
+ const meanRatio = ratios.reduce((a, b) => a + b, 0) / (ratios.length || 1);
72
+ return { meanRatio, latencyMs, n: queries.length };
73
+ }
@@ -0,0 +1,37 @@
1
+ import { ActionItem } from './mcts-prior';
2
+ import { CandidateGenerator, FinanceRequest } from './finance-workflow';
3
+ /** 금융 처리 행동 후보(이산 행동 공간). */
4
+ export declare const FINANCE_ACTIONS: ActionItem[];
5
+ /** 직접 승인 가능 상한(초과 시 상신). caveat 한도와 별개의 '처리 방식' 임계. */
6
+ export declare const DIRECT_APPROVE_SOFT_LIMIT = 1000000;
7
+ /**
8
+ * 룰 기반 가치 모델(외부 오라클로서의 trueValue) — 신경망 없음(claim 6).
9
+ * 요청 특성에 따라 각 처리 행동의 '바람직함'을 결정적으로 부여한다.
10
+ */
11
+ export declare function ruleValueModel(req: FinanceRequest): Record<string, number>;
12
+ /** 정적 프루닝 패턴(출원① 240) — 룰상 불가능한 행동을 실 Rust pruneActions로 제거. */
13
+ export declare function staticPrunePatterns(req: FinanceRequest): string[];
14
+ export interface MctsRecommendation {
15
+ chosenId: string;
16
+ chosenDescription: string;
17
+ survived: string[];
18
+ prunedOut: string[];
19
+ simsToConverge: number;
20
+ regret: number;
21
+ priorMode: 'embedding' | 'uniform';
22
+ }
23
+ export interface MctsCandidateOptions {
24
+ sims?: number;
25
+ cPuct?: number;
26
+ seed?: number;
27
+ priorMode?: 'embedding' | 'uniform';
28
+ }
29
+ /**
30
+ * 룰기반 MCTS(PUCT)로 처리 행동을 추천한다.
31
+ * 1) 실 Rust pruneActions 로 룰상 불가 행동 정적 제거
32
+ * 2) 임베딩 사전확률 P(s,a) (또는 균등 baseline)
33
+ * 3) 룰 가치(trueValue) 위에서 runPuctSearch(식(1) PUCT) sims회 탐색 → 최다방문 행동
34
+ */
35
+ export declare function mctsRecommend(req: FinanceRequest, opts?: MctsCandidateOptions): MctsRecommendation;
36
+ /** FinanceWorkflowEngine 에 주입할 룰기반 MCTS 후보 생성기(claim 6 결선). */
37
+ export declare function mctsCandidateGenerator(opts?: MctsCandidateOptions): CandidateGenerator;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // BM 출원③ 청구항6 결선 — 룰 기반 MCTS 후보 생성기 (금융 워크플로우)
4
+ // ----------------------------------------------------------------------------
5
+ // 출원③ 청구항6: "행동 후보 생성은, 학습된 신경역학망 없이 룰 기반 역학 모델로
6
+ // 미래를 시뮬레이션하는 MCTS에 의해 수행된다" → FinanceWorkflowEngine 의
7
+ // CandidateGenerator 를 **실제 룰기반 MCTS 프리미티브**로 결선한다.
8
+ //
9
+ // 사용하는 실제 구성요소(전부 기구현·테스트됨):
10
+ // - `pruneActions` (Rust @n2world/core) : 정적 행동 프루닝(출원① 240) — 룰상 불가 행동 제거
11
+ // - `embeddingWeightedPrior` (mcts-prior, P4) : 사전확률 P(s,a)(출원② 650)
12
+ // - `runPuctSearch` (mcts-prior) : 식(1) PUCT 탐색 a*=argmax[Q+c·P·√ΣN/(1+N)]
13
+ // - `lcg` : 결정적 난수(재현성)
14
+ //
15
+ // 정직 고지(제1계명):
16
+ // - 가치(trueValue)는 **룰 기반 모델**(신경망 경사 업데이트 없음 — claim 6 핵심)이며,
17
+ // PUCT 보상의 외부 오라클 역할이다(자기 채점 아님).
18
+ // - 이는 금융 **행동 공간(승인/상신/보완/반려)** 위의 진짜 PUCT 탐색이다.
19
+ // 그리드 MctsEngine(lib.rs, 내비게이션 모델)을 금융에 억지 매핑하지 않는다.
20
+ // - 후보 '선택'은 MCTS가 하되, 최종 승인/차단은 여전히 720 caveat·730 오라클이 강제한다.
21
+ // ============================================================================
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.DIRECT_APPROVE_SOFT_LIMIT = exports.FINANCE_ACTIONS = void 0;
24
+ exports.ruleValueModel = ruleValueModel;
25
+ exports.staticPrunePatterns = staticPrunePatterns;
26
+ exports.mctsRecommend = mctsRecommend;
27
+ exports.mctsCandidateGenerator = mctsCandidateGenerator;
28
+ const core_1 = require("@n2world/core");
29
+ const mcts_prior_1 = require("./mcts-prior");
30
+ /** 금융 처리 행동 후보(이산 행동 공간). */
31
+ exports.FINANCE_ACTIONS = [
32
+ { id: 'approve_direct', content: '직접 승인 및 지급 큐 등록 — 소액·정상 경비' },
33
+ { id: 'escalate_manager', content: '관리자 상신 후 승인 — 고액 또는 송금' },
34
+ { id: 'request_info', content: '보완 요청 — 승인자 또는 정보 누락' },
35
+ { id: 'reject', content: '반려 — 규정 위반 또는 비정상 요청' },
36
+ ];
37
+ /** 직접 승인 가능 상한(초과 시 상신). caveat 한도와 별개의 '처리 방식' 임계. */
38
+ exports.DIRECT_APPROVE_SOFT_LIMIT = 1_000_000;
39
+ const ALLOWED_CATEGORIES = ['travel', 'meal', 'office', 'vendor', 'payroll'];
40
+ /**
41
+ * 룰 기반 가치 모델(외부 오라클로서의 trueValue) — 신경망 없음(claim 6).
42
+ * 요청 특성에 따라 각 처리 행동의 '바람직함'을 결정적으로 부여한다.
43
+ */
44
+ function ruleValueModel(req) {
45
+ const nonCompliant = !(req.amount > 0) || !ALLOWED_CATEGORIES.includes(req.category);
46
+ const needsInfo = req.type === 'transfer' && !req.approver;
47
+ const heavy = req.type === 'transfer' || req.amount > exports.DIRECT_APPROVE_SOFT_LIMIT;
48
+ if (nonCompliant)
49
+ return { reject: 1.0, request_info: 0.4, escalate_manager: 0.2, approve_direct: 0.0 };
50
+ if (needsInfo)
51
+ return { request_info: 1.0, escalate_manager: 0.6, reject: 0.3, approve_direct: 0.1 };
52
+ if (heavy)
53
+ return { escalate_manager: 1.0, request_info: 0.5, approve_direct: 0.3, reject: 0.1 };
54
+ return { approve_direct: 1.0, escalate_manager: 0.4, request_info: 0.2, reject: 0.0 };
55
+ }
56
+ /** 정적 프루닝 패턴(출원① 240) — 룰상 불가능한 행동을 실 Rust pruneActions로 제거. */
57
+ function staticPrunePatterns(req) {
58
+ const pats = [];
59
+ // 고액 또는 송금은 '직접 승인' 불가 → 후보에서 제거(상신/보완/반려만 남김).
60
+ if (req.amount > exports.DIRECT_APPROVE_SOFT_LIMIT || req.type === 'transfer')
61
+ pats.push('approve_direct');
62
+ return pats;
63
+ }
64
+ function contextString(req) {
65
+ return `${req.type} ${req.category} ${req.amount} ${req.payee} ${req.approver ? 'has-approver' : 'no-approver'}`;
66
+ }
67
+ /**
68
+ * 룰기반 MCTS(PUCT)로 처리 행동을 추천한다.
69
+ * 1) 실 Rust pruneActions 로 룰상 불가 행동 정적 제거
70
+ * 2) 임베딩 사전확률 P(s,a) (또는 균등 baseline)
71
+ * 3) 룰 가치(trueValue) 위에서 runPuctSearch(식(1) PUCT) sims회 탐색 → 최다방문 행동
72
+ */
73
+ function mctsRecommend(req, opts = {}) {
74
+ const sims = opts.sims ?? 240;
75
+ const cPuct = opts.cPuct ?? 1.4;
76
+ const seed = opts.seed ?? 12345;
77
+ // 1) 정적 프루닝(실 Rust)
78
+ const patterns = staticPrunePatterns(req);
79
+ const keptIds = (0, core_1.pruneActions)(exports.FINANCE_ACTIONS.map((a) => a.id), patterns);
80
+ const survived = exports.FINANCE_ACTIONS.filter((a) => keptIds.includes(a.id));
81
+ const prunedOut = exports.FINANCE_ACTIONS.filter((a) => !keptIds.includes(a.id)).map((a) => a.id);
82
+ // 2) 사전확률 P(s,a)
83
+ const priors = opts.priorMode === 'uniform'
84
+ ? (0, mcts_prior_1.uniformPrior)(survived)
85
+ : (0, mcts_prior_1.embeddingWeightedPrior)(survived, contextString(req));
86
+ // 3) 룰 가치 위에서 진짜 PUCT 탐색
87
+ const tvAll = ruleValueModel(req);
88
+ const trueValue = {};
89
+ for (const a of survived)
90
+ trueValue[a.id] = tvAll[a.id] ?? 0;
91
+ const res = (0, mcts_prior_1.runPuctSearch)(survived, priors, trueValue, sims, cPuct, (0, mcts_prior_1.lcg)(seed));
92
+ const chosen = survived.find((a) => a.id === res.finalBestId) ?? survived[0];
93
+ return {
94
+ chosenId: chosen.id,
95
+ chosenDescription: `${chosen.content} :: ${req.payee} ${req.amount.toLocaleString('ko-KR')}원(${req.category})`,
96
+ survived: survived.map((a) => a.id),
97
+ prunedOut,
98
+ simsToConverge: res.simsToConverge,
99
+ regret: res.regret,
100
+ priorMode: opts.priorMode === 'uniform' ? 'uniform' : 'embedding',
101
+ };
102
+ }
103
+ /** FinanceWorkflowEngine 에 주입할 룰기반 MCTS 후보 생성기(claim 6 결선). */
104
+ function mctsCandidateGenerator(opts = {}) {
105
+ return (req) => mctsRecommend(req, opts).chosenDescription;
106
+ }
@@ -0,0 +1,33 @@
1
+ import { FinanceRequest } from './finance-workflow';
2
+ export type RuleSeverity = 'block' | 'flag';
3
+ export interface RegulationRule {
4
+ id: string;
5
+ /** 법적/정책 근거(검토 표식 — 단정 아님). */
6
+ basis: string;
7
+ description: string;
8
+ severity: RuleSeverity;
9
+ }
10
+ export interface RegulationEvaluation {
11
+ /** 거래를 차단해야 하는 위반(severity 'block'). */
12
+ blocks: string[];
13
+ /** 차단하지 않되 보고/추가검토 대상(severity 'flag' — 예: CTR/STR). */
14
+ flags: string[];
15
+ /** 발동한 규칙 id(감사용). */
16
+ firedRuleIds: string[];
17
+ }
18
+ export interface RegulationRuleSet {
19
+ jurisdiction: string;
20
+ version: string;
21
+ /** 허용 계정과목(조직 정책). */
22
+ allowedCategories: string[];
23
+ /** 고액거래 보고 검토 임계(특금법 CTR은 본래 '현금'거래 기준 — 적용대상 검증필요). */
24
+ highValueReportThreshold: number;
25
+ /** 단일 송금 상한(내부통제·전자금융 한도 — 조직정책/검증필요). */
26
+ singleTransferMax: number;
27
+ rules: RegulationRule[];
28
+ evaluate(req: FinanceRequest): RegulationEvaluation;
29
+ }
30
+ export declare const KR_FINANCE_RULES: RegulationRule[];
31
+ export declare function createKrFinanceRuleSet(overrides?: Partial<Pick<RegulationRuleSet, 'allowedCategories' | 'highValueReportThreshold' | 'singleTransferMax'>>): RegulationRuleSet;
32
+ /** 기본 KR 규정셋(초안). */
33
+ export declare const KR_FINANCE_RULESET: RegulationRuleSet;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // BM 출원③ — 관할(대한민국) 금융 규정셋 (구성 가능한 스캐폴드)
4
+ // ----------------------------------------------------------------------------
5
+ // FinanceOracle(730)가 소비하는 **외부화된 규정 규칙**. 데모 하드코드를 대체해
6
+ // 규정 근거·임계를 한 곳에서 관리·검토하게 한다(법무 검토 단위).
7
+ //
8
+ // ⚠ 법적 면책(중요): 본 모듈은 **법률 자문이 아니며**, 모든 임계값·적용대상·근거는
9
+ // **변호사/준법감시(컴플라이언스) 정식 검토 전 초안**이다. `basis`의 법령 인용과
10
+ // `(검증필요)`/`(조직정책)` 표기는 검토 항목 표식일 뿐 법적 사실의 단정이 아니다.
11
+ // 실제 적용 전 관할 규정·최신 개정·기관별 적용대상을 반드시 확인하라(제1계명).
12
+ //
13
+ // 구분: severity 'block'=거래 차단, 'flag'=차단 않되 보고/추가검토 대상(예: CTR/STR).
14
+ // ============================================================================
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.KR_FINANCE_RULESET = exports.KR_FINANCE_RULES = void 0;
17
+ exports.createKrFinanceRuleSet = createKrFinanceRuleSet;
18
+ // ─────────────────────────────────────────────────────────────────────────
19
+ // 대한민국(KR) 기본 규정셋 — 초안(검토 전). 임계는 조직/관할에 맞게 재확인.
20
+ // ─────────────────────────────────────────────────────────────────────────
21
+ exports.KR_FINANCE_RULES = [
22
+ {
23
+ id: 'KR-CAT-001',
24
+ basis: '내부회계관리·계정과목 정책(조직정책)',
25
+ description: '사전 승인된 계정과목만 처리한다.',
26
+ severity: 'block',
27
+ },
28
+ {
29
+ id: 'KR-SOD-001',
30
+ basis: '내부통제·직무분리(SoD) 원칙 / 내부회계관리제도(검증필요)',
31
+ description: '품의자와 승인자는 동일인일 수 없다(직무분리).',
32
+ severity: 'block',
33
+ },
34
+ {
35
+ id: 'KR-APPROVAL-001',
36
+ basis: '전자금융거래법상 이체 통제·내부 승인절차(검증필요)',
37
+ description: '송금(이체)은 승인자 지정이 필수다.',
38
+ severity: 'block',
39
+ },
40
+ {
41
+ id: 'KR-XFER-LIMIT-001',
42
+ basis: '전자금융 이체한도·내부통제 한도(조직정책/검증필요)',
43
+ description: '단일 송금이 한도를 초과하면 차단(상위 승인 경로 필요).',
44
+ severity: 'block',
45
+ },
46
+ {
47
+ id: 'KR-CTR-001',
48
+ basis: '특정금융정보법(특금법) 고액현금거래보고(CTR) — 적용대상/현금기준 검증필요',
49
+ description: '고액 임계 이상 거래는 보고/추가검토 대상으로 플래그(차단 아님).',
50
+ severity: 'flag',
51
+ },
52
+ {
53
+ id: 'KR-STR-001',
54
+ basis: '특금법 의심거래보고(STR) — 의심 정황 판단기준 검증필요',
55
+ description: '이중지급 의심 등 비정상 정황은 보고/추가검토 대상으로 플래그.',
56
+ severity: 'flag',
57
+ },
58
+ ];
59
+ function createKrFinanceRuleSet(overrides = {}) {
60
+ const allowedCategories = overrides.allowedCategories ?? ['travel', 'meal', 'office', 'vendor', 'payroll'];
61
+ const highValueReportThreshold = overrides.highValueReportThreshold ?? 10_000_000; // (검증필요)
62
+ const singleTransferMax = overrides.singleTransferMax ?? 50_000_000; // (조직정책/검증필요)
63
+ return {
64
+ jurisdiction: 'KR',
65
+ version: 'draft-v1.0(검토전)',
66
+ allowedCategories,
67
+ highValueReportThreshold,
68
+ singleTransferMax,
69
+ rules: exports.KR_FINANCE_RULES,
70
+ evaluate(req) {
71
+ const blocks = [];
72
+ const flags = [];
73
+ const firedRuleIds = [];
74
+ // KR-CAT-001 (block)
75
+ if (!allowedCategories.includes(req.category)) {
76
+ blocks.push(`[KR-CAT-001] 허용외 계정과목: ${req.category}`);
77
+ firedRuleIds.push('KR-CAT-001');
78
+ }
79
+ // KR-SOD-001 (block)
80
+ if (req.approver && req.approver === req.requester) {
81
+ blocks.push('[KR-SOD-001] 직무분리 위반(품의자=승인자)');
82
+ firedRuleIds.push('KR-SOD-001');
83
+ }
84
+ // KR-APPROVAL-001 (block)
85
+ if (req.type === 'transfer' && !req.approver) {
86
+ blocks.push('[KR-APPROVAL-001] 송금 승인자 미지정');
87
+ firedRuleIds.push('KR-APPROVAL-001');
88
+ }
89
+ // KR-XFER-LIMIT-001 (block)
90
+ if (req.type === 'transfer' && req.amount > singleTransferMax) {
91
+ blocks.push(`[KR-XFER-LIMIT-001] 단일 송금 한도 초과(${req.amount} > ${singleTransferMax})`);
92
+ firedRuleIds.push('KR-XFER-LIMIT-001');
93
+ }
94
+ // KR-CTR-001 (flag — 차단 아님)
95
+ if (req.amount >= highValueReportThreshold) {
96
+ flags.push(`[KR-CTR-001] 고액거래 보고/추가검토 대상(${req.amount} ≥ ${highValueReportThreshold})`);
97
+ firedRuleIds.push('KR-CTR-001');
98
+ }
99
+ return { blocks, flags, firedRuleIds };
100
+ },
101
+ };
102
+ }
103
+ /** 기본 KR 규정셋(초안). */
104
+ exports.KR_FINANCE_RULESET = createKrFinanceRuleSet();
@@ -0,0 +1,135 @@
1
+ import { A2ATrustGate, A2AContext } from './agent-os-rd';
2
+ import { GovernanceController } from './governance';
3
+ import type { RegulationRuleSet } from './finance-regulation-kr';
4
+ export type FinanceRequestType = 'expense' | 'transfer';
5
+ /** 금융 품의 요청(채널 세션에서 정규화되어 들어온다고 가정). */
6
+ export interface FinanceRequest {
7
+ id: string;
8
+ channel: string;
9
+ requester: string;
10
+ type: FinanceRequestType;
11
+ payee: string;
12
+ amount: number;
13
+ date: string;
14
+ category: string;
15
+ approver?: string;
16
+ memo?: string;
17
+ }
18
+ /** 720 — 토큰에 부가된 금융 규제 caveat(문자열 표현). */
19
+ export declare const FinanceCaveat: {
20
+ readonly amountMax: (limit: number) => string;
21
+ readonly approvalRequired: () => string;
22
+ readonly segregationOfDuties: () => string;
23
+ readonly categoryAllow: (cats: string[]) => string;
24
+ };
25
+ export interface WorkflowControl {
26
+ /** 어떤 통제에서 결정됐는가(측정·감사용). */
27
+ control: 'trust' | 'caveat' | 'oracle' | 'execute';
28
+ passed: boolean;
29
+ reason: string;
30
+ }
31
+ export interface WorkflowDecision {
32
+ requestId: string;
33
+ approved: boolean;
34
+ /** 최초로 실패한 통제(통과 시 'execute'). */
35
+ decidedBy: WorkflowControl['control'];
36
+ controls: WorkflowControl[];
37
+ /** 가치 v∈[0,1](사업 우선순위) — 신뢰 t와 독립. */
38
+ value: number;
39
+ /** 신뢰 t∈[0,1]. */
40
+ trust: number;
41
+ violations: string[];
42
+ /** 감사 추적 id. */
43
+ auditId: string;
44
+ }
45
+ export declare class FinanceCaveatVerifier {
46
+ private secret;
47
+ constructor(secret: string);
48
+ /**
49
+ * ① 실제 MacaroonVerifier 로 서명체인·기본 caveat(target/expires/path) 검증
50
+ * ② 금융 caveat(fin.*)을 요청에 대해 강제
51
+ * 반환: { ok, violations }. 위반 사유는 감사 로그로 남는다.
52
+ */
53
+ check(token: string, req: FinanceRequest, ctx: A2AContext): {
54
+ ok: boolean;
55
+ violations: string[];
56
+ };
57
+ }
58
+ export interface OracleResult {
59
+ passed: boolean;
60
+ violations: string[];
61
+ cheatDetected: boolean;
62
+ /** 차단하지 않되 보고/추가검토 대상(예: CTR/STR 플래그). */
63
+ flags?: string[];
64
+ }
65
+ export declare class FinanceOracle {
66
+ /** 정책상 허용 계정과목(독립 정의 — 에이전트가 수정 못함). 규정셋 미지정 시 사용. */
67
+ private readonly allowedCategories;
68
+ /** 이중지급 판정 키. */
69
+ private readonly dedupeKey;
70
+ /** 관할 규정셋(옵션). 지정 시 계정과목·SoD·승인·한도·고액보고를 규정셋이 결정. */
71
+ private readonly ruleset?;
72
+ /** 이중지급 탐지용 원장: (payee|amount|date) → 최초 요청 id. */
73
+ private paidLedger;
74
+ constructor(
75
+ /** 정책상 허용 계정과목(독립 정의 — 에이전트가 수정 못함). 규정셋 미지정 시 사용. */
76
+ allowedCategories?: string[],
77
+ /** 이중지급 판정 키. */
78
+ dedupeKey?: (r: FinanceRequest) => string,
79
+ /** 관할 규정셋(옵션). 지정 시 계정과목·SoD·승인·한도·고액보고를 규정셋이 결정. */
80
+ ruleset?: RegulationRuleSet | undefined);
81
+ validate(req: FinanceRequest, generatedAction: string): OracleResult;
82
+ }
83
+ export interface AuditEntry {
84
+ auditId: string;
85
+ requestId: string;
86
+ ts: number;
87
+ decidedBy: WorkflowControl['control'];
88
+ approved: boolean;
89
+ trust: number;
90
+ value: number;
91
+ violations: string[];
92
+ }
93
+ export declare class AuditLog {
94
+ private entries;
95
+ private seq;
96
+ record(e: Omit<AuditEntry, 'auditId' | 'ts'>): string;
97
+ all(): AuditEntry[];
98
+ }
99
+ /** 행동 후보 생성기(주입형). 프로덕션 경로는 출원① 룰기반 MCTS. */
100
+ export type CandidateGenerator = (req: FinanceRequest) => string;
101
+ export interface FinanceEngineOptions {
102
+ secret: string;
103
+ trustGate: A2ATrustGate;
104
+ oracle?: FinanceOracle;
105
+ audit?: AuditLog;
106
+ candidateGenerator?: CandidateGenerator;
107
+ /** 가치 v 정규화 기준 금액(이 금액에서 v≈1). 신뢰 t와 독립. */
108
+ valueRefAmount?: number;
109
+ /** 운영자 킬스위치. true면 모든 자동화 중단. */
110
+ killSwitch?: () => boolean;
111
+ /** 740 거버넌스 결선(옵션) — 지정 시 킬스위치는 governance.isKilled()도 함께 보고,
112
+ * 모든 결정을 governance.record()로 흘려 영속 sink(디스크 등)에 내구 기록한다. */
113
+ governance?: GovernanceController;
114
+ }
115
+ export declare class FinanceWorkflowEngine {
116
+ private verifier;
117
+ private trustGate;
118
+ private oracle;
119
+ private audit;
120
+ private gen;
121
+ private valueRef;
122
+ private killSwitch;
123
+ private governance?;
124
+ constructor(opts: FinanceEngineOptions);
125
+ auditLog(): AuditLog;
126
+ /** 가치 v∈[0,1]: 사업 우선순위(금액 비례, 상한 1). 신뢰 t와 독립 산출. */
127
+ private computeValue;
128
+ /**
129
+ * 금융 품의 1건을 처리한다. 통제 순서: 킬스위치 → 신뢰(t) → caveat(720) → 오라클(730) → 실행.
130
+ * 각 단계 결과를 controls 에 누적하고 감사 로그에 기록한다.
131
+ */
132
+ process(req: FinanceRequest, token: string, ctx: A2AContext): WorkflowDecision;
133
+ }
134
+ /** 헬퍼: 역할/세션에 금융 caveat 를 부가한 위임 토큰 발급(720). */
135
+ export declare function issueFinanceToken(secret: string, identifier: string, target: string, caveats: string[]): string;