/** 자극을 실을지 말지 — 그리고 왜. 부르는 쪽은 이 답만 보고 움직인다. */ export type StimulusPlan = /** 실어라 — 검사를 통과한 선언. */ { action: 'load'; scenario: any; } /** * 싣지 않는다 — 그 이유. * · `none` — 원본이 자극을 선언하지 않았다(정상: 정적 구조만 반영하는 트윈) * · `mirror` — 미러다. 외부 실물이 진실인 트윈에 우리가 자극을 만들면 그것은 현실이 아니다 * · `no-engine` — 이 런타임에 시나리오 엔진이 없다(관측 구동 커널) * · `invalid` — 선언이 커널 규약을 어긴다. **싣지 않고 말한다**(다음 틱에서 터지게 두지 않는다) */ | { action: 'skip'; reason: 'none' | 'observed' | 'no-engine' | 'invalid'; detail?: string; }; /** * 저장된 자극 선언을 읽어 **실을지 판정한다** — 커널 검사기를 그대로 쓴다(규칙을 두 벌로 만들지 않는다). * * `validate` 는 커널의 `validateScenario` 를 넘긴다(호스트가 커널 타입에 묶이지 않게 함수로 받는다). * 검사기가 없으면 **싣지 않는다**: 검사할 수 없는 선언을 태우는 것이 가장 비싼 선택이다(서버가 내려간 * 이력이 있다). */ export declare function planStimulus(config: any, runtime: { hasScenarioEngine: boolean; mode?: 'sim' | 'live'; }, validate?: (scenario: any) => { ok: boolean; errorCode?: string; errorParams?: any; } | { ok: false; errorCode: string; }): StimulusPlan; /** * 선언을 원본 설정에 얹는다(순수) — **기존 설정을 지우지 않는다.** * * 어댑터 설정에는 접속 정보가 함께 산다. 자극을 넣으면서 그 옆을 덮으면 다음 재동기가 원본을 못 찾는다. */ export declare function withStimulus(config: any, scenario: any): any;