@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,25 @@
1
+ /** 슬라이딩 윈도우 레이트리밋: windowMs 안에 maxEvents 까지만 허용. */
2
+ export declare class RateLimiter {
3
+ private maxEvents;
4
+ private windowMs;
5
+ private stamps;
6
+ constructor(maxEvents: number, windowMs: number);
7
+ private prune;
8
+ /** 1건 소비 시도. 한도 내면 true(기록), 초과면 false(미기록). */
9
+ tryAcquire(now?: number): boolean;
10
+ remaining(now?: number): number;
11
+ /** 다음 슬롯이 비기까지 남은 ms(없으면 0). */
12
+ retryAfterMs(now?: number): number;
13
+ }
14
+ /** 동시 실행 한도(세마포어): 최대 maxConcurrent 개만 동시에 run. 초과는 큐 대기. */
15
+ export declare class ConcurrencyLimiter {
16
+ private maxConcurrent;
17
+ private active;
18
+ private queue;
19
+ constructor(maxConcurrent: number);
20
+ run<T>(fn: () => Promise<T>): Promise<T>;
21
+ private acquire;
22
+ private release;
23
+ get activeCount(): number;
24
+ get queuedCount(): number;
25
+ }
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // Stage D / D5: 레이트리밋 + 동시성 한도 — 폭주·과부하 방지(운영 견고성).
4
+ // ============================================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ConcurrencyLimiter = exports.RateLimiter = void 0;
7
+ /** 슬라이딩 윈도우 레이트리밋: windowMs 안에 maxEvents 까지만 허용. */
8
+ class RateLimiter {
9
+ maxEvents;
10
+ windowMs;
11
+ stamps = [];
12
+ constructor(maxEvents, windowMs) {
13
+ this.maxEvents = maxEvents;
14
+ this.windowMs = windowMs;
15
+ }
16
+ prune(now) {
17
+ this.stamps = this.stamps.filter((t) => now - t < this.windowMs);
18
+ }
19
+ /** 1건 소비 시도. 한도 내면 true(기록), 초과면 false(미기록). */
20
+ tryAcquire(now = Date.now()) {
21
+ this.prune(now);
22
+ if (this.stamps.length >= this.maxEvents)
23
+ return false;
24
+ this.stamps.push(now);
25
+ return true;
26
+ }
27
+ remaining(now = Date.now()) {
28
+ this.prune(now);
29
+ return Math.max(0, this.maxEvents - this.stamps.length);
30
+ }
31
+ /** 다음 슬롯이 비기까지 남은 ms(없으면 0). */
32
+ retryAfterMs(now = Date.now()) {
33
+ this.prune(now);
34
+ if (this.stamps.length < this.maxEvents)
35
+ return 0;
36
+ return Math.max(0, this.windowMs - (now - this.stamps[0]));
37
+ }
38
+ }
39
+ exports.RateLimiter = RateLimiter;
40
+ /** 동시 실행 한도(세마포어): 최대 maxConcurrent 개만 동시에 run. 초과는 큐 대기. */
41
+ class ConcurrencyLimiter {
42
+ maxConcurrent;
43
+ active = 0;
44
+ queue = [];
45
+ constructor(maxConcurrent) {
46
+ this.maxConcurrent = maxConcurrent;
47
+ }
48
+ async run(fn) {
49
+ await this.acquire();
50
+ try {
51
+ return await fn();
52
+ }
53
+ finally {
54
+ this.release();
55
+ }
56
+ }
57
+ acquire() {
58
+ if (this.active < this.maxConcurrent) {
59
+ this.active++;
60
+ return Promise.resolve();
61
+ }
62
+ return new Promise((resolve) => {
63
+ this.queue.push(() => { this.active++; resolve(); });
64
+ });
65
+ }
66
+ release() {
67
+ this.active--;
68
+ const next = this.queue.shift();
69
+ if (next)
70
+ next();
71
+ }
72
+ get activeCount() { return this.active; }
73
+ get queuedCount() { return this.queue.length; }
74
+ }
75
+ exports.ConcurrencyLimiter = ConcurrencyLimiter;
@@ -0,0 +1,83 @@
1
+ export interface SafetyAnnealConfig {
2
+ /** λ 상한(사용자 취향 최대 가중). 기본 1.0. */
3
+ lambdaMax: number;
4
+ /** 시그모이드 기울기 κ. 클수록 가파름. 기본 12(식(2) 기본과 동일 계열). */
5
+ kappa: number;
6
+ /** 안전 임계 τ_safe. v̂ 가 이보다 낮으면 λ 가 빠르게 0 으로. 기본 0.5. */
7
+ tauSafe: number;
8
+ }
9
+ export declare const DEFAULT_SAFETY_ANNEAL_CONFIG: SafetyAnnealConfig;
10
+ /** λ = λ_max · σ(κ·(v̂ − τ_safe)). v̂∈[0,1] 가 낮을수록 연속적으로 0 에 수렴. */
11
+ export declare function annealLambda(vSafety: number, cfg?: SafetyAnnealConfig): number;
12
+ /** 선택 점수 score = (1−λ)·v̂ + λ·p̂ 와 그 때의 λ. */
13
+ export declare function safetySelectScore(vSafety: number, pPref: number, cfg?: SafetyAnnealConfig): {
14
+ lambda: number;
15
+ score: number;
16
+ };
17
+ export interface SafetyCandidate {
18
+ id: string;
19
+ /** 안전가치 v̂∈[0,1] (출처: 독립 오라클·헌법 평가 — P3.5 는 소비만 한다). */
20
+ vSafety: number;
21
+ /** 사용자 취향 p̂∈[0,1]. */
22
+ pPref: number;
23
+ }
24
+ export interface Selection {
25
+ id: string;
26
+ score: number;
27
+ lambda: number;
28
+ vSafety: number;
29
+ pPref: number;
30
+ }
31
+ /** 후보 중 SmoothSafetyAnneal 점수가 최대인 것을 선택(단일 스칼라). 동점은 v̂ 우선(더 안전). */
32
+ export declare function selectBySafetyAnneal(candidates: SafetyCandidate[], cfg?: SafetyAnnealConfig): Selection | null;
33
+ /**
34
+ * 레퍼런스 비교군 — **순수 취향 선택**(안전 무시). 위험 후보가 통과함을 보이는 대조군.
35
+ * (P3.5 가 제거한 안전 게이팅이 없으면 이렇게 된다.)
36
+ */
37
+ export declare function selectByPreferenceOnly(candidates: SafetyCandidate[]): Selection | null;
38
+ /**
39
+ * 레퍼런스 비교군 — **하드 게이트(절벽)**: v̂ < τ_safe 후보를 강제 배제 후 취향 선택.
40
+ * 강한 안전 보장의 상한(ParetoFrontierKeeper 류 엄격 안전의 근사 대용). 단, τ 근처에서 **불연속**.
41
+ * 모두 배제되면 가장 안전한(v̂ 최대) 후보로 폴백.
42
+ */
43
+ export declare function selectByHardGate(candidates: SafetyCandidate[], tauSafe?: number): Selection | null;
44
+ /** [0,1] 을 steps 등분해 λ(v̂)의 인접 표본 간 최대 점프를 측정. 작을수록 부드러움(무절벽). */
45
+ export declare function maxLambdaJump(cfg?: SafetyAnnealConfig, steps?: number): number;
46
+ export interface SelectionScenario {
47
+ candidates: SafetyCandidate[];
48
+ /** 각 후보의 진짜 안전 라벨(true=안전, false=위험/에러). 평가 채점용(독립 라벨). */
49
+ trueSafe: Record<string, boolean>;
50
+ }
51
+ export interface ExclusionResult {
52
+ scenarios: number;
53
+ /** 선택된 후보가 위험(에러)이 아니었던 비율 = 에러 배제율∈[0,1]. 높을수록 안전. */
54
+ errorExclusionRate: number;
55
+ /** 위험 후보를 선택해버린 횟수. */
56
+ errorsAdmitted: number;
57
+ }
58
+ type Selector = (candidates: SafetyCandidate[]) => Selection | null;
59
+ /** 시나리오들에 셀렉터를 적용해 에러 배제율(선택이 위험 후보가 아닌 비율)을 측정. */
60
+ export declare function evaluateExclusion(scenarios: SelectionScenario[], selector: Selector): ExclusionResult;
61
+ export interface SimplificationVerdict {
62
+ smoothExclusion: number;
63
+ hardGateExclusion: number;
64
+ /** 배제율 손실(hard − smooth). 양수면 smooth 가 더 나쁨. */
65
+ exclusionLoss: number;
66
+ /** 유의 손실 임계(기본 0.02 = 2%p). */
67
+ epsilon: number;
68
+ /** 단순화 유지 여부. false 면 hard-gate 로 철회. */
69
+ keepSimplification: boolean;
70
+ /** 채택된 셀렉터 이름. */
71
+ chosen: 'smooth-anneal' | 'hard-gate-fallback';
72
+ note: string;
73
+ }
74
+ /**
75
+ * §2.4/§8 단순화 영가설: smooth 배제율이 hard-gate 대비 epsilon 이상 낮으면 **철회**(hard-gate 폴백).
76
+ * 억지 통과 금지 — 정직한 회귀가 운용자의 "속지 않을 권리"다.
77
+ */
78
+ export declare function decideSimplification(scenarios: SelectionScenario[], cfg?: SafetyAnnealConfig, epsilon?: number): SimplificationVerdict;
79
+ /**
80
+ * 영가설 판정에 따라 실제 사용할 셀렉터를 반환한다(철회 시 hard-gate).
81
+ */
82
+ export declare function safetySelectorFor(verdict: SimplificationVerdict, cfg?: SafetyAnnealConfig): Selector;
83
+ export {};
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // P3.5 — SmoothSafetyAnneal (계획서 v2.4 §4.2 · §3 ParetoFrontierKeeper 제거)
4
+ // ----------------------------------------------------------------------------
5
+ // v2.3 의 ParetoFrontierKeeper(비지배 집합 유지)를 **구현하지 않고 제거**하고, 대신 안전가치에
6
+ // 따른 부드러운 λ 감쇠로 대체한다. 프론티어 유지 비용 0 → MCTS 0.06ms 예산 보호.
7
+ //
8
+ // λ = λ_max · σ(κ·(v̂ − τ_safe)) (식(2) 의 σ 자산 재사용 — agent-os-rd.ts)
9
+ // score = (1 − λ)·v̂ + λ·p̂ (단일 스칼라 선택; 안전은 λ 연속 감쇠가 보장)
10
+ //
11
+ // 직관: v̂(안전가치)가 τ_safe 를 밑돌수록 λ→0 → score→v̂ → **취향 p̂ 로는 위험 후보를 구제 못 함**.
12
+ // v̂ 가 높을수록 λ→λ_max → 취향 p̂ 반영 허용. 절벽/진동 없이 **연속**.
13
+ //
14
+ // 정직 고지(제1계명): **비지배 집합/프론티어 유지 코드를 작성하지 않는다.** 단순화 영가설(§8)에 따라
15
+ // 제거가 안전(에러 배제율)을 유의하게 잃으면 hard-gate 로 **철회**하는 경로를 함께 제공한다.
16
+ // ============================================================================
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.DEFAULT_SAFETY_ANNEAL_CONFIG = void 0;
19
+ exports.annealLambda = annealLambda;
20
+ exports.safetySelectScore = safetySelectScore;
21
+ exports.selectBySafetyAnneal = selectBySafetyAnneal;
22
+ exports.selectByPreferenceOnly = selectByPreferenceOnly;
23
+ exports.selectByHardGate = selectByHardGate;
24
+ exports.maxLambdaJump = maxLambdaJump;
25
+ exports.evaluateExclusion = evaluateExclusion;
26
+ exports.decideSimplification = decideSimplification;
27
+ exports.safetySelectorFor = safetySelectorFor;
28
+ const agent_os_rd_1 = require("./agent-os-rd");
29
+ exports.DEFAULT_SAFETY_ANNEAL_CONFIG = {
30
+ lambdaMax: 1.0,
31
+ kappa: 12,
32
+ tauSafe: 0.5,
33
+ };
34
+ const clamp01 = (x) => Math.max(0, Math.min(1, x));
35
+ /** λ = λ_max · σ(κ·(v̂ − τ_safe)). v̂∈[0,1] 가 낮을수록 연속적으로 0 에 수렴. */
36
+ function annealLambda(vSafety, cfg = exports.DEFAULT_SAFETY_ANNEAL_CONFIG) {
37
+ const v = clamp01(vSafety);
38
+ return cfg.lambdaMax * (0, agent_os_rd_1.sigmoid)(cfg.kappa * (v - cfg.tauSafe));
39
+ }
40
+ /** 선택 점수 score = (1−λ)·v̂ + λ·p̂ 와 그 때의 λ. */
41
+ function safetySelectScore(vSafety, pPref, cfg = exports.DEFAULT_SAFETY_ANNEAL_CONFIG) {
42
+ const v = clamp01(vSafety);
43
+ const p = clamp01(pPref);
44
+ const lambda = annealLambda(v, cfg);
45
+ return { lambda, score: (1 - lambda) * v + lambda * p };
46
+ }
47
+ /** 후보 중 SmoothSafetyAnneal 점수가 최대인 것을 선택(단일 스칼라). 동점은 v̂ 우선(더 안전). */
48
+ function selectBySafetyAnneal(candidates, cfg = exports.DEFAULT_SAFETY_ANNEAL_CONFIG) {
49
+ let best = null;
50
+ for (const c of candidates) {
51
+ const { lambda, score } = safetySelectScore(c.vSafety, c.pPref, cfg);
52
+ if (!best ||
53
+ score > best.score + 1e-12 ||
54
+ (Math.abs(score - best.score) <= 1e-12 && c.vSafety > best.vSafety)) {
55
+ best = { id: c.id, score, lambda, vSafety: clamp01(c.vSafety), pPref: clamp01(c.pPref) };
56
+ }
57
+ }
58
+ return best;
59
+ }
60
+ /**
61
+ * 레퍼런스 비교군 — **순수 취향 선택**(안전 무시). 위험 후보가 통과함을 보이는 대조군.
62
+ * (P3.5 가 제거한 안전 게이팅이 없으면 이렇게 된다.)
63
+ */
64
+ function selectByPreferenceOnly(candidates) {
65
+ let best = null;
66
+ for (const c of candidates) {
67
+ const p = clamp01(c.pPref);
68
+ if (!best || p > best.score)
69
+ best = { id: c.id, score: p, lambda: 1, vSafety: clamp01(c.vSafety), pPref: p };
70
+ }
71
+ return best;
72
+ }
73
+ /**
74
+ * 레퍼런스 비교군 — **하드 게이트(절벽)**: v̂ < τ_safe 후보를 강제 배제 후 취향 선택.
75
+ * 강한 안전 보장의 상한(ParetoFrontierKeeper 류 엄격 안전의 근사 대용). 단, τ 근처에서 **불연속**.
76
+ * 모두 배제되면 가장 안전한(v̂ 최대) 후보로 폴백.
77
+ */
78
+ function selectByHardGate(candidates, tauSafe = exports.DEFAULT_SAFETY_ANNEAL_CONFIG.tauSafe) {
79
+ const allowed = candidates.filter((c) => clamp01(c.vSafety) >= tauSafe);
80
+ const pool = allowed.length ? allowed : candidates;
81
+ let best = null;
82
+ for (const c of pool) {
83
+ const p = clamp01(c.pPref);
84
+ const safer = best ? c.vSafety > best.vSafety : true;
85
+ if (!best || p > best.score || (allowed.length === 0 && safer)) {
86
+ best = { id: c.id, score: p, lambda: 1, vSafety: clamp01(c.vSafety), pPref: p };
87
+ }
88
+ }
89
+ return best;
90
+ }
91
+ // ============================================================================
92
+ // 연속성(무절벽) 측정 — λ(v̂) 가 Lipschitz 연속(작은 Δv̂ → 작은 Δλ)임을 실측한다.
93
+ // 하드 게이트는 τ 에서 1 에 가까운 점프(불연속)를 보인다(대조).
94
+ // ============================================================================
95
+ /** [0,1] 을 steps 등분해 λ(v̂)의 인접 표본 간 최대 점프를 측정. 작을수록 부드러움(무절벽). */
96
+ function maxLambdaJump(cfg = exports.DEFAULT_SAFETY_ANNEAL_CONFIG, steps = 1000) {
97
+ let prev = annealLambda(0, cfg);
98
+ let maxJump = 0;
99
+ for (let i = 1; i <= steps; i++) {
100
+ const v = i / steps;
101
+ const cur = annealLambda(v, cfg);
102
+ maxJump = Math.max(maxJump, Math.abs(cur - prev));
103
+ prev = cur;
104
+ }
105
+ return maxJump;
106
+ }
107
+ /** 시나리오들에 셀렉터를 적용해 에러 배제율(선택이 위험 후보가 아닌 비율)을 측정. */
108
+ function evaluateExclusion(scenarios, selector) {
109
+ let admitted = 0;
110
+ let scored = 0;
111
+ for (const s of scenarios) {
112
+ const pick = selector(s.candidates);
113
+ if (!pick)
114
+ continue;
115
+ scored++;
116
+ if (s.trueSafe[pick.id] === false)
117
+ admitted++;
118
+ }
119
+ return {
120
+ scenarios: scored,
121
+ errorExclusionRate: scored > 0 ? +(1 - admitted / scored).toFixed(4) : 0,
122
+ errorsAdmitted: admitted,
123
+ };
124
+ }
125
+ /**
126
+ * §2.4/§8 단순화 영가설: smooth 배제율이 hard-gate 대비 epsilon 이상 낮으면 **철회**(hard-gate 폴백).
127
+ * 억지 통과 금지 — 정직한 회귀가 운용자의 "속지 않을 권리"다.
128
+ */
129
+ function decideSimplification(scenarios, cfg = exports.DEFAULT_SAFETY_ANNEAL_CONFIG, epsilon = 0.02) {
130
+ const smooth = evaluateExclusion(scenarios, (cs) => selectBySafetyAnneal(cs, cfg));
131
+ const hard = evaluateExclusion(scenarios, (cs) => selectByHardGate(cs, cfg.tauSafe));
132
+ const exclusionLoss = +(hard.errorExclusionRate - smooth.errorExclusionRate).toFixed(4);
133
+ const keep = exclusionLoss < epsilon;
134
+ return {
135
+ smoothExclusion: smooth.errorExclusionRate,
136
+ hardGateExclusion: hard.errorExclusionRate,
137
+ exclusionLoss,
138
+ epsilon,
139
+ keepSimplification: keep,
140
+ chosen: keep ? 'smooth-anneal' : 'hard-gate-fallback',
141
+ note: keep
142
+ ? '단순화 유지: smooth 배제율이 hard-gate 대비 유의 손실 없음(연속 λ 로 절벽/진동 제거 + 95% 가치 회수).'
143
+ : `단순화 철회: smooth 가 hard-gate 대비 배제율 ${exclusionLoss} 손실(≥${epsilon}) → hard-gate 폴백(정직 회귀).`,
144
+ };
145
+ }
146
+ /**
147
+ * 영가설 판정에 따라 실제 사용할 셀렉터를 반환한다(철회 시 hard-gate).
148
+ */
149
+ function safetySelectorFor(verdict, cfg = exports.DEFAULT_SAFETY_ANNEAL_CONFIG) {
150
+ return verdict.keepSimplification
151
+ ? (cs) => selectBySafetyAnneal(cs, cfg)
152
+ : (cs) => selectByHardGate(cs, cfg.tauSafe);
153
+ }
@@ -0,0 +1,12 @@
1
+ export type SandboxState = 'STOPPED' | 'RUNNING' | 'HIBERNATED';
2
+ export declare class MicroSandboxController {
3
+ private state;
4
+ private tempDir;
5
+ private snapshotPath;
6
+ init(): Promise<void>;
7
+ start(): Promise<void>;
8
+ hibernate(): Promise<void>;
9
+ resume(): Promise<void>;
10
+ destroy(): Promise<void>;
11
+ getState(): SandboxState;
12
+ }
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MicroSandboxController = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ class MicroSandboxController {
41
+ state = 'STOPPED';
42
+ tempDir = '';
43
+ snapshotPath = '';
44
+ async init() {
45
+ this.tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'n2world-microvm-'));
46
+ this.snapshotPath = path.join(this.tempDir, 'snapshot.bin');
47
+ }
48
+ async start() {
49
+ const startTime = Date.now();
50
+ this.state = 'RUNNING';
51
+ // Emulate micro-virtualization startup latency (should be < 100ms, typical 5ms)
52
+ await new Promise(resolve => setTimeout(resolve, 5));
53
+ const elapsed = Date.now() - startTime;
54
+ if (elapsed > 100) {
55
+ throw new Error(`Cold start took too long: ${elapsed}ms`);
56
+ }
57
+ }
58
+ async hibernate() {
59
+ const startTime = Date.now();
60
+ if (this.state !== 'RUNNING') {
61
+ throw new Error('Sandbox is not running');
62
+ }
63
+ // Write mock RAM dump snapshot
64
+ const mockRamData = Buffer.alloc(1024 * 1024, 0xAF); // 1MB mock RAM
65
+ await fs.writeFile(this.snapshotPath, mockRamData);
66
+ this.state = 'HIBERNATED';
67
+ const elapsed = Date.now() - startTime;
68
+ if (elapsed > 100) {
69
+ throw new Error(`Hibernation took too long: ${elapsed}ms`);
70
+ }
71
+ }
72
+ async resume() {
73
+ const startTime = Date.now();
74
+ if (this.state !== 'HIBERNATED') {
75
+ throw new Error('Sandbox is not hibernated');
76
+ }
77
+ // Read snapshot to restore state
78
+ await fs.readFile(this.snapshotPath);
79
+ this.state = 'RUNNING';
80
+ const elapsed = Date.now() - startTime;
81
+ if (elapsed > 100) {
82
+ throw new Error(`Resuming took too long: ${elapsed}ms`);
83
+ }
84
+ }
85
+ async destroy() {
86
+ this.state = 'STOPPED';
87
+ if (this.tempDir) {
88
+ await fs.rm(this.tempDir, { recursive: true, force: true });
89
+ }
90
+ }
91
+ getState() {
92
+ return this.state;
93
+ }
94
+ }
95
+ exports.MicroSandboxController = MicroSandboxController;
@@ -0,0 +1,26 @@
1
+ export interface MetricInput {
2
+ tasksTotal?: number;
3
+ falseCompletions?: number;
4
+ reworkCount?: number;
5
+ redTeamAttempts?: number;
6
+ redTeamBlocked?: number;
7
+ dangerousTotal?: number;
8
+ dangerousBlocked?: number;
9
+ oracleCallsActual?: number;
10
+ oracleCallsBaseline?: number;
11
+ firstCompileColdMs?: number;
12
+ firstCompileHotMs?: number;
13
+ onboardingSec?: number;
14
+ onboardingTargetSec?: number;
15
+ benchReproducible?: boolean;
16
+ unmeasuredClaims?: number;
17
+ }
18
+ export interface SatisfactionScore {
19
+ areas: Record<string, number | null>;
20
+ overall: number | null;
21
+ measuredAreas: number;
22
+ }
23
+ /** 실측 입력에서 영역별 만족도(0..1)를 계산한다. 입력 없으면 null(정직: 미측정). */
24
+ export declare function computeSatisfaction(m: MetricInput): SatisfactionScore;
25
+ /** 만족도 점수를 0..10 스케일로(보고용). */
26
+ export declare function toTenScale(score: number | null): number | null;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // Stage G: 운용자 만족도 — "주장된 숫자"가 아니라 실제 측정 신호에서 계산한다.
4
+ // 평가서의 예상치(8.3→9.6)를 실측 프록시로 대체한다. 입력이 없으면 그 영역은 null(미측정).
5
+ // ============================================================================
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.computeSatisfaction = computeSatisfaction;
8
+ exports.toTenScale = toTenScale;
9
+ function clamp01(x) { return Math.max(0, Math.min(1, x)); }
10
+ /** 실측 입력에서 영역별 만족도(0..1)를 계산한다. 입력 없으면 null(정직: 미측정). */
11
+ function computeSatisfaction(m) {
12
+ const areas = {
13
+ reliability: null, safety: null, cost: null,
14
+ responsiveness: null, convenience: null, transparency: null,
15
+ };
16
+ // 신뢰성: 거짓완료·재작업이 적을수록 높음.
17
+ if (m.tasksTotal && m.tasksTotal > 0) {
18
+ const falseRate = (m.falseCompletions ?? 0) / m.tasksTotal;
19
+ const reworkRate = (m.reworkCount ?? 0) / m.tasksTotal;
20
+ areas.reliability = clamp01(1 - 0.7 * falseRate - 0.3 * reworkRate);
21
+ }
22
+ // 안전: 레드팀·위험명령 차단율.
23
+ const safetyParts = [];
24
+ if (m.redTeamAttempts && m.redTeamAttempts > 0)
25
+ safetyParts.push((m.redTeamBlocked ?? 0) / m.redTeamAttempts);
26
+ if (m.dangerousTotal && m.dangerousTotal > 0)
27
+ safetyParts.push((m.dangerousBlocked ?? 0) / m.dangerousTotal);
28
+ if (safetyParts.length)
29
+ areas.safety = clamp01(safetyParts.reduce((a, b) => a + b, 0) / safetyParts.length);
30
+ // 비용: 오라클(비싼) 호출 절감률.
31
+ if (m.oracleCallsBaseline && m.oracleCallsBaseline > 0 && m.oracleCallsActual !== undefined) {
32
+ const saving = 1 - m.oracleCallsActual / m.oracleCallsBaseline;
33
+ areas.cost = clamp01(saving);
34
+ }
35
+ // 응답성: OverlayFS 캐시 적중으로 첫컴파일 단축 비율.
36
+ if (m.firstCompileColdMs && m.firstCompileColdMs > 0 && m.firstCompileHotMs !== undefined) {
37
+ const speedup = 1 - m.firstCompileHotMs / m.firstCompileColdMs;
38
+ areas.responsiveness = clamp01(speedup);
39
+ }
40
+ // 편의성: 온보딩이 목표 시간 이내인가.
41
+ if (m.onboardingSec !== undefined) {
42
+ const target = m.onboardingTargetSec ?? 300;
43
+ areas.convenience = clamp01(1 - m.onboardingSec / target);
44
+ }
45
+ // 투명성: 벤치 재현 가능 ∧ 미검증 수치 0.
46
+ if (m.benchReproducible !== undefined || m.unmeasuredClaims !== undefined) {
47
+ const repro = m.benchReproducible ? 1 : 0;
48
+ const claimsOk = (m.unmeasuredClaims ?? 0) === 0 ? 1 : 0;
49
+ areas.transparency = clamp01(0.5 * repro + 0.5 * claimsOk);
50
+ }
51
+ const measured = Object.values(areas).filter((v) => v !== null);
52
+ return {
53
+ areas,
54
+ overall: measured.length ? +(measured.reduce((a, b) => a + b, 0) / measured.length).toFixed(3) : null,
55
+ measuredAreas: measured.length,
56
+ };
57
+ }
58
+ /** 만족도 점수를 0..10 스케일로(보고용). */
59
+ function toTenScale(score) {
60
+ return score === null ? null : +(score * 10).toFixed(1);
61
+ }
@@ -0,0 +1,53 @@
1
+ export type SensorKind = 'camera' | 'gps' | 'voice';
2
+ export interface SensorSample {
3
+ kind: SensorKind;
4
+ sessionId: string;
5
+ /** 원본(로컬 전용). 외부로 절대 나가지 않는다. */
6
+ data: string;
7
+ ts: number;
8
+ }
9
+ export interface SensorAuditEntry {
10
+ t: number;
11
+ type: 'consent' | 'ingest' | 'ingest-denied' | 'expire' | 'delete' | 'egress-blocked';
12
+ kind?: SensorKind;
13
+ sessionId: string;
14
+ /** 소멸 증명용 해시(원본은 남기지 않음). */
15
+ hash?: string;
16
+ detail?: string;
17
+ }
18
+ export interface SensorBridgeOptions {
19
+ /** 보존기간 상한(ms). 초과 샘플은 expire() 시 소멸. 기본 10분. */
20
+ retentionMs?: number;
21
+ }
22
+ /**
23
+ * 센서 샘플의 적재·보존·삭제를 통제한다. 모든 센서 데이터는 Tier-0(로컬 전용).
24
+ */
25
+ export declare class SensorBridge {
26
+ private samples;
27
+ private consent;
28
+ private audit;
29
+ private retentionMs;
30
+ constructor(opts?: SensorBridgeOptions);
31
+ private ck;
32
+ private hash;
33
+ /** 상황별 동의 부여(센서 종류·세션별). 동의 없이는 적재 거부. */
34
+ grantConsent(sessionId: string, kind: SensorKind): void;
35
+ revokeConsent(sessionId: string, kind: SensorKind): void;
36
+ hasConsent(sessionId: string, kind: SensorKind): boolean;
37
+ /**
38
+ * 센서 샘플 적재 — 동의가 있어야만 통과. 모든 센서 데이터는 Tier-0 로 분류·확인된다.
39
+ * 반환: 적재 성공 여부.
40
+ */
41
+ ingest(sample: SensorSample): {
42
+ ok: boolean;
43
+ reason: string;
44
+ };
45
+ /** 외부 송신 가능 여부 — 센서 데이터는 *항상* 불가. 시도는 감사된다. */
46
+ assertNoEgress(sessionId: string, kind: SensorKind): boolean;
47
+ /** 보존기간 초과 샘플 소멸(감사 기록 — 소멸 증명). */
48
+ expire(now?: number): number;
49
+ /** 잊혀질 권리 — 세션(또는 종류)별 즉시 삭제 + 소멸 감사. */
50
+ deleteFor(sessionId: string, kind?: SensorKind): number;
51
+ count(): number;
52
+ auditLog(): SensorAuditEntry[];
53
+ }