@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,83 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // 플레이북 런타임 (보편화 MVP — 비개발자가 "고르는" 가치 단위의 실행 엔진)
4
+ // ----------------------------------------------------------------------------
5
+ // 방안서 v1.1 §8 1순위: 플레이북이 *행동 표준·Tier·라우팅·예외처리* 를 지배한다.
6
+ // 본 런타임은 도메인 무관 재사용 엔진이며, Tier별 하이브리드 라우팅을 강제한다:
7
+ // - PII/민감 단계 → 로컬(Tier-0, 외부 0/N)
8
+ // - 비민감 단계 → 빠른 경로(외부 허용)
9
+ // 대조(cross-check)는 *에이전트가 만들지 않은* 독립 규칙으로 검증한다(자기채점 금지).
10
+ // 임상 등 고위험 범위는 사람 확인(human-in-loop)을 강제한다(liability 게이트).
11
+ //
12
+ // 정직 고지(제1계명): LLM 단계는 GovernedAgent(주입형)로 라우팅 — 키/ollama 없으면
13
+ // 정직 보류. 대조·검증은 결정론적 규칙(실동작). 가짜 완료 없음.
14
+ // ============================================================================
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.PlaybookRuntime = void 0;
17
+ class PlaybookRuntime {
18
+ gov;
19
+ constructor(gov) {
20
+ this.gov = gov;
21
+ }
22
+ /** 입력 레코드에 PII/민감 필드가 채워져 있으면 전체 Tier-0. */
23
+ overallTier(pb, record) {
24
+ const hasSensitive = pb.fields.some((f) => (f.tier === 'pii' || f.tier === 'sensitive') && record[f.key] != null && String(record[f.key]).trim() !== '');
25
+ return hasSensitive ? 0 : 2;
26
+ }
27
+ async run(pb, record, store, opts = {}) {
28
+ const t0 = Number((globalThis.performance?.now?.() ?? Date.now()));
29
+ const phasesRun = [];
30
+ const flags = [];
31
+ const steps = [];
32
+ let llmCalls = 0;
33
+ let blockedExternalForPii = true; // 위반 시 false 로 떨어뜨린다
34
+ // ── Phase 1: 필수 필드 검증 ──
35
+ phasesRun.push('validate');
36
+ const missingFields = pb.fields.filter((f) => f.required && (record[f.key] == null || String(record[f.key]).trim() === '')).map((f) => f.key);
37
+ const overallTier = this.overallTier(pb, record);
38
+ // ── Phase 2: 대조(cross-check) — 독립 규칙 ──
39
+ phasesRun.push('crosscheck');
40
+ for (const rule of pb.crossChecks) {
41
+ const r = rule.check({ record, store });
42
+ if (r)
43
+ flags.push({ id: rule.id, flag: r.flag, severity: r.severity });
44
+ }
45
+ // ── Phase 3: liability 게이트(임상 등 → 사람 확인) ──
46
+ phasesRun.push('liability');
47
+ const humanInLoopRequired = !!(pb.clinicalScope && pb.needsHumanReview?.(record));
48
+ // ── Phase 4: LLM 단계(요약/안내) — Tier 하이브리드 라우팅 ──
49
+ const hasBlock = flags.some((f) => f.severity === 'block') || missingFields.length > 0;
50
+ if (!hasBlock && this.gov) {
51
+ phasesRun.push('generate');
52
+ for (const step of pb.llmSteps) {
53
+ const prompt = step.prompt(record);
54
+ // pii 단계는 baseline 없이(텍스트의 PII가 Tier-0 유발). public 단계는 baselineTier=2(빠른 경로).
55
+ const res = await this.gov.respond([{ role: 'user', content: prompt }], {
56
+ consent: opts.consent,
57
+ baselineTier: step.tier === 'public' ? 2 : 0,
58
+ });
59
+ llmCalls += 1;
60
+ steps.push({ id: step.id, tier: res.tier, provider: res.provider, text: res.text });
61
+ // 불변식: pii 단계는 절대 external 이면 안 된다.
62
+ if (step.tier !== 'public' && res.provider === 'external')
63
+ blockedExternalForPii = false;
64
+ }
65
+ }
66
+ // 합격분만 원장 기록(대조 차단 없을 때 — 집행됨으로 간주)
67
+ if (!hasBlock)
68
+ store.add(record);
69
+ const ms = Number((globalThis.performance?.now?.() ?? Date.now())) - t0;
70
+ return {
71
+ ok: !hasBlock,
72
+ overallTier,
73
+ missingFields,
74
+ flags,
75
+ steps,
76
+ humanInLoopRequired,
77
+ blockedExternalForPii,
78
+ phasesRun,
79
+ metrics: { ms, llmCalls },
80
+ };
81
+ }
82
+ }
83
+ exports.PlaybookRuntime = PlaybookRuntime;
@@ -0,0 +1,20 @@
1
+ import { Playbook, RecordStore } from '../playbook';
2
+ export interface DentalIntake {
3
+ name: string;
4
+ dob: string;
5
+ phone: string;
6
+ insuranceId?: string;
7
+ appointmentDate?: string;
8
+ provider?: string;
9
+ chiefComplaint?: string;
10
+ }
11
+ /** 환자 원장(대조용). 동일 (이름|생년|전화) = 기존 환자. 로컬 전용. */
12
+ export declare class PatientRecordStore implements RecordStore<DentalIntake> {
13
+ private recs;
14
+ private key;
15
+ private seen;
16
+ add(r: DentalIntake): void;
17
+ findDuplicate(r: DentalIntake): DentalIntake | null;
18
+ count(): number;
19
+ }
20
+ export declare const dentalIntakePlaybook: Playbook<DentalIntake>;
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // 치과 접수·대조 플레이북 (보편화 MVP 비치헤드 — 방안서 v1.1 §2)
4
+ // ----------------------------------------------------------------------------
5
+ // 환자 접수 정보(PII=Tier-0)를 받아 ① 필수필드 검증 ② 대조(중복·보험·예약 정합)
6
+ // ③ 임상 여부 판정(사람 확인 강제) ④ (비차단 시) 직원용 요약(PII→로컬) + 환자 안내문
7
+ // (비민감→빠른 경로)을 생성한다. 데이터 거버넌스는 코어 TierGuard 가 강제.
8
+ //
9
+ // liability(제1계명·안전): 임상 판단(진단·처방)은 *기본 차단/사람 확인*. 본 플레이북은
10
+ // 접수·행정·대조 등 **비임상** 만 자동 처리한다.
11
+ // ============================================================================
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.dentalIntakePlaybook = exports.PatientRecordStore = void 0;
47
+ const crypto = __importStar(require("crypto"));
48
+ /** 환자 원장(대조용). 동일 (이름|생년|전화) = 기존 환자. 로컬 전용. */
49
+ class PatientRecordStore {
50
+ recs = [];
51
+ key(r) {
52
+ return crypto.createHash('sha256').update(`${r.name}|${r.dob}|${r.phone}`).digest('hex');
53
+ }
54
+ seen = new Set();
55
+ add(r) { this.recs.push(r); this.seen.add(this.key(r)); }
56
+ findDuplicate(r) {
57
+ return this.seen.has(this.key(r)) ? (this.recs.find((x) => this.key(x) === this.key(r)) ?? null) : null;
58
+ }
59
+ count() { return this.recs.length; }
60
+ }
61
+ exports.PatientRecordStore = PatientRecordStore;
62
+ // 임상 주호소 키워드(있으면 치과의 확인 필요 — liability). 비임상 접수만 자동화.
63
+ const CLINICAL_TERMS = /(통증|아파|시려|붓|출혈|발치|신경|충치|교정|임플란트|마취|처방)/;
64
+ const crossChecks = [
65
+ {
66
+ id: 'DUP-PATIENT',
67
+ check: ({ record, store }) => store.findDuplicate(record)
68
+ ? { flag: '기존 환자(중복 접수 가능) — 기록 대조 필요', severity: 'warn' }
69
+ : null,
70
+ },
71
+ {
72
+ id: 'INSURANCE-MISSING',
73
+ check: ({ record }) => !record.insuranceId
74
+ ? { flag: '보험 정보 미입력 — 수납 전 확인', severity: 'warn' }
75
+ : null,
76
+ },
77
+ {
78
+ id: 'APPT-PROVIDER-MISMATCH',
79
+ check: ({ record }) => (record.appointmentDate && !record.provider)
80
+ ? { flag: '예약일은 있으나 담당의 미지정', severity: 'warn' }
81
+ : null,
82
+ },
83
+ ];
84
+ exports.dentalIntakePlaybook = {
85
+ id: 'dental-intake-v1',
86
+ name: '치과 접수·대조 비서',
87
+ domain: 'dental',
88
+ clinicalScope: true, // 임상 가능성 → liability 게이트
89
+ fields: [
90
+ { key: 'name', label: '이름', required: true, tier: 'pii' },
91
+ { key: 'dob', label: '생년월일', required: true, tier: 'pii' },
92
+ { key: 'phone', label: '연락처', required: true, tier: 'pii' },
93
+ { key: 'insuranceId', label: '보험번호', required: false, tier: 'sensitive' },
94
+ { key: 'appointmentDate', label: '예약일', required: false, tier: 'public' },
95
+ { key: 'provider', label: '담당의', required: false, tier: 'public' },
96
+ { key: 'chiefComplaint', label: '주호소', required: false, tier: 'sensitive' },
97
+ ],
98
+ crossChecks,
99
+ needsHumanReview: (r) => !!(r.chiefComplaint && CLINICAL_TERMS.test(r.chiefComplaint)),
100
+ llmSteps: [
101
+ {
102
+ id: 'staff-summary',
103
+ tier: 'pii', // 환자 PII 포함 → 로컬 강제(Tier-0)
104
+ prompt: (r) => `다음 치과 접수 정보를 직원용으로 3줄 요약(비임상·행정만): 이름 ${r.name}, 생년 ${r.dob}, 연락처 ${r.phone}, 보험 ${r.insuranceId ?? '없음'}, 예약 ${r.appointmentDate ?? '미정'}/${r.provider ?? '미정'}.`,
105
+ },
106
+ {
107
+ id: 'patient-notice',
108
+ tier: 'public', // PII 미포함 일반 안내 → 빠른 경로 허용
109
+ prompt: () => '치과 예약 확정 안내문을 정중한 한 문장으로 작성(개인정보 미포함, 일반 템플릿).',
110
+ },
111
+ ],
112
+ };
@@ -0,0 +1,157 @@
1
+ import { WarmTypeChecker } from './symbolic-dynamics';
2
+ export interface Candidate {
3
+ id: string;
4
+ description: string;
5
+ kind: 'edit' | 'command';
6
+ file?: string;
7
+ content?: string;
8
+ command?: string;
9
+ }
10
+ export interface PredictiveResult {
11
+ success: boolean;
12
+ committed: Candidate | null;
13
+ pruned: string[];
14
+ simulated: {
15
+ id: string;
16
+ oraclePass: boolean;
17
+ }[];
18
+ oracleCalls: number;
19
+ order: string[];
20
+ ranked: boolean;
21
+ gfastApplied?: boolean;
22
+ }
23
+ export declare class PredictiveAgent {
24
+ private workspaceDir;
25
+ private testCommand;
26
+ private dangerousPatterns;
27
+ /** 관련성 신호 모드: 'token'=토큰 집합 겹침(기본), 'embedding'=해시 임베딩 코사인(graded). */
28
+ private relevanceMode;
29
+ /** 오라클(testCommand) 실행 타임아웃(ms). 무거운 실테스트 스위트 도메인에서 상향. */
30
+ private oracleTimeoutMs;
31
+ /** 적응 게이팅 임계 θ: 오라클/필터 비용비 ≥ θ 일 때만 g_fast(§4g 크로스오버 ≈2.3×). */
32
+ private autoThreshold;
33
+ /** 세션 비용 추정 캐시(calibrate 로 채움). auto 모드 게이팅 근거. */
34
+ private costEstimate?;
35
+ constructor(workspaceDir: string, testCommand: string, dangerousPatterns?: string[], opts?: {
36
+ relevanceMode?: 'token' | 'embedding';
37
+ oracleTimeoutMs?: number;
38
+ autoThreshold?: number;
39
+ });
40
+ /** g_fast 구문 타당성: JS 편집이면 `node --check`로 컴파일 가능성 추정(그리드월드 대체). */
41
+ private isInfeasibleEdit;
42
+ /** 1단계 g_fast 게이트: 위험 명령 + 비타당 편집을 가지치기. */
43
+ private prune;
44
+ private applyTo;
45
+ /** 2단계: 워크스페이스 복사본에 후보 적용 후 오라클(테스트) 실행 → 통과 여부. */
46
+ private simulateAndVerify;
47
+ /**
48
+ * 적응 게이팅 캘리브레이션 — 대표 후보 1개로 **오라클 단가**와 (워밍업 제외) **후보당 필터 단가**를
49
+ * 실측해 `ratio = oracleMs/filterMs` 를 캐시한다. `run({ gfast:'auto' })` 가 이 ratio 로 g_fast/baseline 을
50
+ * 자동 선택(§4g 크로스오버 임계 θ). 정직: 필터 단가는 amortize 후(2번째 필터) 후보당 비용을 반영한다.
51
+ * 편집·컴파일판정불가 표본이면 필터 측정 불가 → ratio 미설정(auto 는 보수적으로 baseline).
52
+ */
53
+ calibrate(sample: Candidate, opts?: {
54
+ sharedChecker?: WarmTypeChecker;
55
+ }): Promise<{
56
+ oracleMs: number;
57
+ filterMs?: number;
58
+ ratio?: number;
59
+ }>;
60
+ /** 현재 워크스페이스에서 테스트(오라클)가 통과하는지. */
61
+ oraclePasses(): Promise<boolean>;
62
+ /**
63
+ * 오라클 "부분 점수"∈[0,1]: 테스트 출력의 `SCORE:x/y` 를 파싱(멀티파일 부분 진척용).
64
+ * 없으면 종료 코드로 1.0/0.0. 멀티스텝 탐색의 가치 신호.
65
+ */
66
+ oracleScore(dir?: string): Promise<number>;
67
+ /** 후보를 복사본에 적용 후 오라클 부분 점수 측정(실제 워크스페이스 보존). */
68
+ private simulateScore;
69
+ /**
70
+ * g_fast 가치 추정(오라클 없이, 값싸게). 후보의 "유망도"∈[0,1] — 목표/오류 컨텍스트와의
71
+ * 텍스트 관련성 + 종류 편향. 정직: 이는 정답성이 아니라 우선순위 신호다(진실은 오라클이 판정).
72
+ */
73
+ gfastValue(c: Candidate, context: string): number;
74
+ /**
75
+ * G3 — g_fast 기호 경로 정렬: 컴파일러(ρ)로 후보를 사전 평가해
76
+ * (a) **비컴파일 후보를 오라클 전에 제외**(건전: 컴파일 실패 ⟹ 그 후보 임포트 테스트 실패),
77
+ * (b) 결정 불가(δ=0: 명령·비JS) 후보는 그대로 유지(오라클 위임),
78
+ * (c) 생존 후보를 ρ 내림차순 → gfastValue 순으로 정렬.
79
+ * 비싼 테스트 오라클 대신 값싼 컴파일만 추가로 돈다.
80
+ */
81
+ private gfastRank;
82
+ /**
83
+ * G3c — 웜(증분) g_fast 정렬: in-process TypeScript Language Service 로 후보 내용을
84
+ * *증분* 타입체크(프로세스 spawn·scratch 복사·콜드 시작 없음). 첫 후보만 프로그램 빌드(웜업).
85
+ * 비컴파일 후보를 오라클 전에 제외하고 ρ 로 정렬. 필터 비용을 콜드 tsc 대비 크게 낮춘다.
86
+ */
87
+ private gfastRankWarm;
88
+ /**
89
+ * G3d — 프로젝트-시드(교차파일) 웜 정렬. 워크스페이스 전체를 한 번 시드한 뒤, 각 후보 편집이
90
+ * *프로젝트에 새 타입오차를 도입하는지*(import한 다른 파일을 깨는 경우 포함) 증분 검사해 제외.
91
+ * 단일 파일 격리 체크(G3c)가 못 잡는 교차파일 오류를 잡는다. spawn 없음(in-process).
92
+ */
93
+ private gfastRankProject;
94
+ /**
95
+ * 예측 실행: 가지치기 → (가치순 정렬) → 복사본 오라클 검증을 유망 순서로 → 검증된 첫 수 커밋.
96
+ * 7-0b 게이팅: 값싼 g_fast로 순서를 정하고 비싼 오라클은 유망 순서로 호출, 첫 통과 시 조기 종료.
97
+ * opts.rank=false 면 랭킹 없이(원래 순서) 비교 측정 가능.
98
+ */
99
+ run(candidates: Candidate[], opts?: {
100
+ goal?: string;
101
+ rank?: boolean;
102
+ gfast?: boolean | 'auto';
103
+ gfastWarm?: boolean;
104
+ gfastProject?: boolean;
105
+ sharedChecker?: WarmTypeChecker;
106
+ }): Promise<PredictiveResult>;
107
+ /**
108
+ * 멀티스텝 예측 실행(멀티파일·다단계). 한 단계가 다른 단계의 실패를 드러내는 SWE형 과제용.
109
+ * 트리 탐색(베스트퍼스트): g_fast=사전확률로 후보를 정렬하고, 오라클 부분점수=가치로 평가해
110
+ * 점수를 가장 크게 올리는 "검증된 편집"만 커밋하며 모든 테스트 통과까지 진행한다.
111
+ * (정직: 풀 확률적 MCTS 롤아웃이 아니라 g_fast 사전확률+오라클 가치의 베스트퍼스트 트리 탐색.)
112
+ */
113
+ solveMultiStep(generate: StepCandidateGenerator, goal: string, opts?: {
114
+ maxSteps?: number;
115
+ }): Promise<MultiStepResult>;
116
+ }
117
+ export interface MultiStepResult {
118
+ success: boolean;
119
+ finalScore: number;
120
+ steps: {
121
+ committed: string;
122
+ scoreBefore: number;
123
+ scoreAfter: number;
124
+ }[];
125
+ pruned: string[];
126
+ oracleCalls: number;
127
+ }
128
+ export type StepCandidateGenerator = (workspaceDir: string, goal: string, testOutput: string) => Promise<Candidate[]>;
129
+ /**
130
+ * 후보 생성기. 생성 방식을 예측 실행과 분리한다.
131
+ * - 테스트/CI: 결정적 후보 집합(LLM·네트워크 불필요).
132
+ * - 생산: LLM에 "이 목표를 위한 후보 편집 N개를 구조화 JSON으로" 요청해 파싱(별도 구현).
133
+ */
134
+ export type CandidateGenerator = (workspaceDir: string, goal: string) => Promise<Candidate[]>;
135
+ /**
136
+ * LLM 출력 → 구조화 후보. 잡설/코드펜스를 견디고, 유효하지 않은 항목은 버린다(정직).
137
+ * 형식: {"candidates":[{id,description,kind,file,content|command}]} 또는 후보 배열.
138
+ */
139
+ export declare function parseCandidates(llmOutput: string, defaultFile?: string): Candidate[];
140
+ export declare function buildCandidatePrompt(goal: string, targetFile: string, fileContent: string, testOutput: string, n: number): string;
141
+ export interface LlmGenOptions {
142
+ targetFile: string;
143
+ testCommand: string;
144
+ numCandidates?: number;
145
+ /** 주입형 LLM 호출(테스트는 모의, 생산은 llmComplete). 미지정 시 llmComplete 사용(키 필요). */
146
+ complete?: (prompt: string, system?: string) => Promise<string>;
147
+ }
148
+ /**
149
+ * LLM 기반 후보 생성기(생산 경로). 파일·테스트출력을 모아 프롬프트를 만들고 LLM 호출 후 파싱.
150
+ * `complete` 주입으로 LLM 없이도(모의) 전체 경로를 결정적으로 검증할 수 있다.
151
+ */
152
+ export declare function makeLlmCandidateGenerator(opts: LlmGenOptions): CandidateGenerator;
153
+ /**
154
+ * Stage A 오케스트레이션: 후보 생성 → 예측 실행(가지치기→검증→검증된 첫 수 커밋).
155
+ * 후보 생성기를 주입받으므로 LLM/결정적 어느 쪽이든 동일 경로를 탄다.
156
+ */
157
+ export declare function runPredictiveTask(workspaceDir: string, goal: string, testCommand: string, generate: CandidateGenerator, dangerousPatterns?: string[]): Promise<PredictiveResult>;