oh-my-codex 0.18.6 → 0.18.7

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 (278) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +56 -7
  4. package/dist/agents/__tests__/definitions.test.js +11 -0
  5. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  6. package/dist/agents/__tests__/native-config.test.js +14 -5
  7. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  8. package/dist/agents/definitions.d.ts +2 -0
  9. package/dist/agents/definitions.d.ts.map +1 -1
  10. package/dist/agents/definitions.js +4 -1
  11. package/dist/agents/definitions.js.map +1 -1
  12. package/dist/agents/native-config.js +2 -2
  13. package/dist/agents/native-config.js.map +1 -1
  14. package/dist/autopilot/__tests__/fsm.test.d.ts +2 -0
  15. package/dist/autopilot/__tests__/fsm.test.d.ts.map +1 -0
  16. package/dist/autopilot/__tests__/fsm.test.js +75 -0
  17. package/dist/autopilot/__tests__/fsm.test.js.map +1 -0
  18. package/dist/autopilot/__tests__/ralplan-gate.test.d.ts +2 -0
  19. package/dist/autopilot/__tests__/ralplan-gate.test.d.ts.map +1 -0
  20. package/dist/autopilot/__tests__/ralplan-gate.test.js +79 -0
  21. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -0
  22. package/dist/autopilot/deep-interview-gate.d.ts +18 -0
  23. package/dist/autopilot/deep-interview-gate.d.ts.map +1 -0
  24. package/dist/autopilot/deep-interview-gate.js +256 -0
  25. package/dist/autopilot/deep-interview-gate.js.map +1 -0
  26. package/dist/autopilot/fsm.d.ts +13 -0
  27. package/dist/autopilot/fsm.d.ts.map +1 -0
  28. package/dist/autopilot/fsm.js +70 -0
  29. package/dist/autopilot/fsm.js.map +1 -0
  30. package/dist/autopilot/ralplan-gate.d.ts +17 -0
  31. package/dist/autopilot/ralplan-gate.d.ts.map +1 -0
  32. package/dist/autopilot/ralplan-gate.js +61 -0
  33. package/dist/autopilot/ralplan-gate.js.map +1 -0
  34. package/dist/cli/__tests__/index.test.js +24 -4
  35. package/dist/cli/__tests__/index.test.js.map +1 -1
  36. package/dist/cli/__tests__/launch-fallback.test.js +175 -6
  37. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  38. package/dist/cli/__tests__/question.test.js +100 -0
  39. package/dist/cli/__tests__/question.test.js.map +1 -1
  40. package/dist/cli/__tests__/setup-refresh.test.js +18 -0
  41. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  42. package/dist/cli/__tests__/team.test.js +2 -2
  43. package/dist/cli/__tests__/team.test.js.map +1 -1
  44. package/dist/cli/index.d.ts +3 -1
  45. package/dist/cli/index.d.ts.map +1 -1
  46. package/dist/cli/index.js +191 -36
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/cli/question.d.ts.map +1 -1
  49. package/dist/cli/question.js +36 -5
  50. package/dist/cli/question.js.map +1 -1
  51. package/dist/config/__tests__/deep-interview.test.js +7 -6
  52. package/dist/config/__tests__/deep-interview.test.js.map +1 -1
  53. package/dist/config/deep-interview.d.ts.map +1 -1
  54. package/dist/config/deep-interview.js +14 -4
  55. package/dist/config/deep-interview.js.map +1 -1
  56. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +8 -0
  57. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  58. package/dist/hooks/__tests__/deep-interview-contract.test.js +10 -0
  59. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  60. package/dist/hooks/__tests__/keyword-detector.test.js +649 -11
  61. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  62. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +63 -0
  63. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  64. package/dist/hooks/__tests__/session.test.js +25 -0
  65. package/dist/hooks/__tests__/session.test.js.map +1 -1
  66. package/dist/hooks/deep-interview-config-instruction.js +1 -1
  67. package/dist/hooks/deep-interview-config-instruction.js.map +1 -1
  68. package/dist/hooks/keyword-detector.d.ts +1 -0
  69. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  70. package/dist/hooks/keyword-detector.js +171 -21
  71. package/dist/hooks/keyword-detector.js.map +1 -1
  72. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  73. package/dist/hooks/keyword-registry.js +1 -0
  74. package/dist/hooks/keyword-registry.js.map +1 -1
  75. package/dist/hooks/session.d.ts +2 -0
  76. package/dist/hooks/session.d.ts.map +1 -1
  77. package/dist/hooks/session.js +13 -5
  78. package/dist/hooks/session.js.map +1 -1
  79. package/dist/hud/__tests__/authority.test.js +35 -0
  80. package/dist/hud/__tests__/authority.test.js.map +1 -1
  81. package/dist/hud/__tests__/index.test.js +168 -2
  82. package/dist/hud/__tests__/index.test.js.map +1 -1
  83. package/dist/hud/__tests__/reconcile.test.js +67 -13
  84. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  85. package/dist/hud/__tests__/state.test.js +80 -0
  86. package/dist/hud/__tests__/state.test.js.map +1 -1
  87. package/dist/hud/__tests__/tmux.test.js +134 -1
  88. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  89. package/dist/hud/authority.d.ts.map +1 -1
  90. package/dist/hud/authority.js +13 -2
  91. package/dist/hud/authority.js.map +1 -1
  92. package/dist/hud/index.d.ts +17 -0
  93. package/dist/hud/index.d.ts.map +1 -1
  94. package/dist/hud/index.js +64 -10
  95. package/dist/hud/index.js.map +1 -1
  96. package/dist/hud/reconcile.js +1 -1
  97. package/dist/hud/reconcile.js.map +1 -1
  98. package/dist/hud/state.d.ts.map +1 -1
  99. package/dist/hud/state.js +16 -1
  100. package/dist/hud/state.js.map +1 -1
  101. package/dist/hud/tmux.d.ts +2 -0
  102. package/dist/hud/tmux.d.ts.map +1 -1
  103. package/dist/hud/tmux.js +39 -2
  104. package/dist/hud/tmux.js.map +1 -1
  105. package/dist/mcp/__tests__/hermes-bridge.test.js +203 -7
  106. package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -1
  107. package/dist/mcp/__tests__/state-server.test.js +13 -1
  108. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  109. package/dist/mcp/hermes-bridge.d.ts +12 -2
  110. package/dist/mcp/hermes-bridge.d.ts.map +1 -1
  111. package/dist/mcp/hermes-bridge.js +83 -9
  112. package/dist/mcp/hermes-bridge.js.map +1 -1
  113. package/dist/modes/__tests__/base-autoresearch-contract.test.js +7 -1
  114. package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -1
  115. package/dist/pipeline/__tests__/stages.test.js +130 -0
  116. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  117. package/dist/pipeline/orchestrator.js +1 -1
  118. package/dist/pipeline/orchestrator.js.map +1 -1
  119. package/dist/pipeline/stages/ralplan.d.ts +1 -0
  120. package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
  121. package/dist/pipeline/stages/ralplan.js +14 -5
  122. package/dist/pipeline/stages/ralplan.js.map +1 -1
  123. package/dist/question/__tests__/deep-interview.test.js +160 -2
  124. package/dist/question/__tests__/deep-interview.test.js.map +1 -1
  125. package/dist/question/__tests__/policy.test.js +63 -3
  126. package/dist/question/__tests__/policy.test.js.map +1 -1
  127. package/dist/question/__tests__/renderer.test.js +191 -2
  128. package/dist/question/__tests__/renderer.test.js.map +1 -1
  129. package/dist/question/__tests__/state.test.js +94 -3
  130. package/dist/question/__tests__/state.test.js.map +1 -1
  131. package/dist/question/__tests__/ui.test.js +4 -0
  132. package/dist/question/__tests__/ui.test.js.map +1 -1
  133. package/dist/question/autopilot-wait.d.ts +12 -2
  134. package/dist/question/autopilot-wait.d.ts.map +1 -1
  135. package/dist/question/autopilot-wait.js +158 -47
  136. package/dist/question/autopilot-wait.js.map +1 -1
  137. package/dist/question/deep-interview.d.ts.map +1 -1
  138. package/dist/question/deep-interview.js +22 -6
  139. package/dist/question/deep-interview.js.map +1 -1
  140. package/dist/question/policy.d.ts.map +1 -1
  141. package/dist/question/policy.js +2 -5
  142. package/dist/question/policy.js.map +1 -1
  143. package/dist/question/renderer.d.ts +12 -0
  144. package/dist/question/renderer.d.ts.map +1 -1
  145. package/dist/question/renderer.js +87 -3
  146. package/dist/question/renderer.js.map +1 -1
  147. package/dist/question/state.d.ts +8 -1
  148. package/dist/question/state.d.ts.map +1 -1
  149. package/dist/question/state.js +54 -14
  150. package/dist/question/state.js.map +1 -1
  151. package/dist/question/types.d.ts +1 -1
  152. package/dist/question/types.d.ts.map +1 -1
  153. package/dist/question/ui.d.ts +1 -0
  154. package/dist/question/ui.d.ts.map +1 -1
  155. package/dist/question/ui.js +1 -0
  156. package/dist/question/ui.js.map +1 -1
  157. package/dist/ralplan/__tests__/runtime.test.js +191 -0
  158. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  159. package/dist/ralplan/consensus-gate.d.ts +9 -1
  160. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  161. package/dist/ralplan/consensus-gate.js +84 -2
  162. package/dist/ralplan/consensus-gate.js.map +1 -1
  163. package/dist/ralplan/runtime.d.ts +9 -0
  164. package/dist/ralplan/runtime.d.ts.map +1 -1
  165. package/dist/ralplan/runtime.js +32 -11
  166. package/dist/ralplan/runtime.js.map +1 -1
  167. package/dist/scripts/__tests__/codex-native-hook.test.js +1487 -34
  168. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  169. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  170. package/dist/scripts/codex-native-hook.js +356 -38
  171. package/dist/scripts/codex-native-hook.js.map +1 -1
  172. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  173. package/dist/scripts/codex-native-pre-post.js +79 -1
  174. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  175. package/dist/scripts/hook-payload-guard.d.ts +9 -0
  176. package/dist/scripts/hook-payload-guard.d.ts.map +1 -0
  177. package/dist/scripts/hook-payload-guard.js +111 -0
  178. package/dist/scripts/hook-payload-guard.js.map +1 -0
  179. package/dist/scripts/notify-fallback-watcher.js +8 -1
  180. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  181. package/dist/scripts/notify-hook/__tests__/payload-guard.test.d.ts +2 -0
  182. package/dist/scripts/notify-hook/__tests__/payload-guard.test.d.ts.map +1 -0
  183. package/dist/scripts/notify-hook/__tests__/payload-guard.test.js +39 -0
  184. package/dist/scripts/notify-hook/__tests__/payload-guard.test.js.map +1 -0
  185. package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
  186. package/dist/scripts/notify-hook/team-worker-stop.js +234 -86
  187. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
  188. package/dist/scripts/notify-hook.js +11 -2
  189. package/dist/scripts/notify-hook.js.map +1 -1
  190. package/dist/state/__tests__/operations.test.js +1012 -1
  191. package/dist/state/__tests__/operations.test.js.map +1 -1
  192. package/dist/state/__tests__/skill-active.test.js +59 -1
  193. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  194. package/dist/state/__tests__/workflow-transition.test.js +73 -7
  195. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  196. package/dist/state/operations.d.ts.map +1 -1
  197. package/dist/state/operations.js +102 -0
  198. package/dist/state/operations.js.map +1 -1
  199. package/dist/state/skill-active.d.ts.map +1 -1
  200. package/dist/state/skill-active.js +33 -3
  201. package/dist/state/skill-active.js.map +1 -1
  202. package/dist/state/workflow-transition-reconcile.d.ts +6 -0
  203. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  204. package/dist/state/workflow-transition-reconcile.js +28 -1
  205. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  206. package/dist/state/workflow-transition.d.ts.map +1 -1
  207. package/dist/state/workflow-transition.js +10 -3
  208. package/dist/state/workflow-transition.js.map +1 -1
  209. package/dist/subagents/__tests__/tracker.test.js +139 -0
  210. package/dist/subagents/__tests__/tracker.test.js.map +1 -1
  211. package/dist/subagents/tracker.d.ts +3 -0
  212. package/dist/subagents/tracker.d.ts.map +1 -1
  213. package/dist/subagents/tracker.js +41 -4
  214. package/dist/subagents/tracker.js.map +1 -1
  215. package/dist/team/__tests__/coordination-protocol.test.d.ts +2 -0
  216. package/dist/team/__tests__/coordination-protocol.test.d.ts.map +1 -0
  217. package/dist/team/__tests__/coordination-protocol.test.js +173 -0
  218. package/dist/team/__tests__/coordination-protocol.test.js.map +1 -0
  219. package/dist/team/__tests__/runtime.test.js +51 -2
  220. package/dist/team/__tests__/runtime.test.js.map +1 -1
  221. package/dist/team/__tests__/state.test.js +83 -0
  222. package/dist/team/__tests__/state.test.js.map +1 -1
  223. package/dist/team/__tests__/tmux-session.test.js +45 -0
  224. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  225. package/dist/team/__tests__/worker-bootstrap.test.js +84 -0
  226. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  227. package/dist/team/coordination-protocol.d.ts +14 -0
  228. package/dist/team/coordination-protocol.d.ts.map +1 -0
  229. package/dist/team/coordination-protocol.js +244 -0
  230. package/dist/team/coordination-protocol.js.map +1 -0
  231. package/dist/team/runtime.d.ts +1 -0
  232. package/dist/team/runtime.d.ts.map +1 -1
  233. package/dist/team/runtime.js +19 -3
  234. package/dist/team/runtime.js.map +1 -1
  235. package/dist/team/state/tasks.d.ts.map +1 -1
  236. package/dist/team/state/tasks.js +24 -0
  237. package/dist/team/state/tasks.js.map +1 -1
  238. package/dist/team/state/types.d.ts +21 -1
  239. package/dist/team/state/types.d.ts.map +1 -1
  240. package/dist/team/state/types.js.map +1 -1
  241. package/dist/team/state.d.ts +17 -1
  242. package/dist/team/state.d.ts.map +1 -1
  243. package/dist/team/state.js +12 -5
  244. package/dist/team/state.js.map +1 -1
  245. package/dist/team/team-ops.d.ts +1 -1
  246. package/dist/team/team-ops.d.ts.map +1 -1
  247. package/dist/team/team-ops.js.map +1 -1
  248. package/dist/team/tmux-session.d.ts.map +1 -1
  249. package/dist/team/tmux-session.js +19 -1
  250. package/dist/team/tmux-session.js.map +1 -1
  251. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  252. package/dist/team/worker-bootstrap.js +63 -0
  253. package/dist/team/worker-bootstrap.js.map +1 -1
  254. package/dist/utils/__tests__/agents-model-table.test.js +4 -2
  255. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  256. package/dist/utils/agents-model-table.d.ts.map +1 -1
  257. package/dist/utils/agents-model-table.js +3 -0
  258. package/dist/utils/agents-model-table.js.map +1 -1
  259. package/package.json +1 -1
  260. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  261. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +10 -5
  262. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +9 -4
  263. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +12 -0
  264. package/plugins/oh-my-codex/skills/team/SKILL.md +16 -0
  265. package/plugins/oh-my-codex/skills/worker/SKILL.md +14 -0
  266. package/skills/autopilot/SKILL.md +10 -5
  267. package/skills/deep-interview/SKILL.md +9 -4
  268. package/skills/ralplan/SKILL.md +12 -0
  269. package/skills/team/SKILL.md +16 -0
  270. package/skills/worker/SKILL.md +14 -0
  271. package/src/scripts/__tests__/codex-native-hook.test.ts +2202 -523
  272. package/src/scripts/codex-native-hook.ts +444 -36
  273. package/src/scripts/codex-native-pre-post.ts +80 -0
  274. package/src/scripts/hook-payload-guard.ts +113 -0
  275. package/src/scripts/notify-fallback-watcher.ts +8 -1
  276. package/src/scripts/notify-hook/__tests__/payload-guard.test.ts +41 -0
  277. package/src/scripts/notify-hook/team-worker-stop.ts +193 -52
  278. package/src/scripts/notify-hook.ts +14 -2
@@ -0,0 +1,79 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+ import { subagentTrackingPath } from '../../subagents/tracker.js';
7
+ import { buildAutopilotRalplanUltragoalGateError, canAdvanceAutopilotRalplanToUltragoal, } from '../ralplan-gate.js';
8
+ describe('autopilot ralplan gate', () => {
9
+ it('rejects native review evidence from the session leader even when malformed tracking marks it as subagent', async () => {
10
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-leader-spoof-'));
11
+ const sessionId = 'sess-autopilot-leader-spoof';
12
+ const trackingPath = subagentTrackingPath(cwd);
13
+ try {
14
+ await mkdir(join(trackingPath, '..'), { recursive: true });
15
+ await writeFile(trackingPath, JSON.stringify({
16
+ schemaVersion: 1,
17
+ sessions: {
18
+ [sessionId]: {
19
+ session_id: sessionId,
20
+ leader_thread_id: 'thread-leader',
21
+ updated_at: '2026-05-28T18:34:51.000Z',
22
+ threads: {
23
+ 'thread-leader': {
24
+ thread_id: 'thread-leader',
25
+ kind: 'subagent',
26
+ first_seen_at: '2026-05-28T18:34:51.000Z',
27
+ last_seen_at: '2026-05-28T18:34:51.000Z',
28
+ turn_count: 2,
29
+ },
30
+ 'thread-critic': {
31
+ thread_id: 'thread-critic',
32
+ kind: 'subagent',
33
+ first_seen_at: '2026-05-28T18:35:10.000Z',
34
+ last_seen_at: '2026-05-28T18:35:10.000Z',
35
+ turn_count: 1,
36
+ },
37
+ },
38
+ },
39
+ },
40
+ }, null, 2));
41
+ const state = {
42
+ current_phase: 'ralplan',
43
+ handoff_artifacts: {
44
+ ralplan_consensus_gate: {
45
+ complete: true,
46
+ sequence: ['architect-review', 'critic-review'],
47
+ ralplan_architect_review: {
48
+ agent_role: 'architect',
49
+ provenance_kind: 'native_subagent',
50
+ verdict: 'approve',
51
+ session_id: sessionId,
52
+ thread_id: 'thread-leader',
53
+ artifact_path: '.omx/artifacts/architect.md',
54
+ tracker_path: '.omx/state/subagent-tracking.json',
55
+ completed_at: '2026-05-28T18:34:51.000Z',
56
+ },
57
+ ralplan_critic_review: {
58
+ agent_role: 'critic',
59
+ provenance_kind: 'native_subagent',
60
+ verdict: 'approve',
61
+ session_id: sessionId,
62
+ thread_id: 'thread-critic',
63
+ artifact_path: '.omx/artifacts/critic.md',
64
+ tracker_path: '.omx/state/subagent-tracking.json',
65
+ completed_at: '2026-05-28T18:35:10.000Z',
66
+ },
67
+ },
68
+ },
69
+ };
70
+ const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
71
+ assert.equal(decision.allowed, false);
72
+ assert.match(buildAutopilotRalplanUltragoalGateError(decision), /architect tracker thread thread-leader is the session leader/);
73
+ }
74
+ finally {
75
+ await rm(cwd, { recursive: true, force: true });
76
+ }
77
+ });
78
+ });
79
+ //# sourceMappingURL=ralplan-gate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralplan-gate.test.js","sourceRoot":"","sources":["../../../src/autopilot/__tests__/ralplan-gate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ type JsonObject = Record<string, unknown>;
2
+ export interface AutopilotDeepInterviewRalplanGateInput {
3
+ cwd: string;
4
+ sessionId?: string;
5
+ baseStateDir?: string;
6
+ currentState?: JsonObject | null;
7
+ nextState?: JsonObject | null;
8
+ deepInterviewState?: JsonObject | null;
9
+ }
10
+ export interface AutopilotDeepInterviewRalplanGateDecision {
11
+ allowed: boolean;
12
+ reason: string;
13
+ evidence?: JsonObject;
14
+ }
15
+ export declare function canAdvanceAutopilotDeepInterviewToRalplan(input: AutopilotDeepInterviewRalplanGateInput): Promise<AutopilotDeepInterviewRalplanGateDecision>;
16
+ export declare function buildAutopilotDeepInterviewRalplanGateError(decision: AutopilotDeepInterviewRalplanGateDecision): string;
17
+ export {};
18
+ //# sourceMappingURL=deep-interview-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-interview-gate.d.ts","sourceRoot":"","sources":["../../src/autopilot/deep-interview-gate.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,MAAM,WAAW,sCAAsC;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,kBAAkB,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,yCAAyC;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AA4PD,wBAAsB,yCAAyC,CAC7D,KAAK,EAAE,sCAAsC,GAC5C,OAAO,CAAC,yCAAyC,CAAC,CAoDpD;AAED,wBAAgB,2CAA2C,CACzD,QAAQ,EAAE,yCAAyC,GAClD,MAAM,CAER"}
@@ -0,0 +1,256 @@
1
+ import { getQuestionRecordPath, getQuestionRecordPathForStateDir, readQuestionRecord } from '../question/state.js';
2
+ function safeString(value) {
3
+ return typeof value === 'string' ? value.trim() : '';
4
+ }
5
+ function safeObject(value) {
6
+ return value && typeof value === 'object' && !Array.isArray(value)
7
+ ? value
8
+ : null;
9
+ }
10
+ async function readDeepInterviewState(input) {
11
+ // Autopilot supervisor handoffs must not be driven by sibling workflow files.
12
+ // Standalone deep-interview -> ralplan reconciliation passes its source state
13
+ // explicitly; Autopilot state writes pass only current/next supervisor state.
14
+ return input.deepInterviewState ?? null;
15
+ }
16
+ function nestedState(state) {
17
+ return safeObject(state?.state);
18
+ }
19
+ function handoffArtifacts(state) {
20
+ return safeObject(state?.handoff_artifacts) ?? safeObject(nestedState(state)?.handoff_artifacts);
21
+ }
22
+ function deepInterviewHandoff(state) {
23
+ return handoffArtifacts(state)?.deep_interview;
24
+ }
25
+ function deepInterviewGate(state) {
26
+ return safeObject(state?.deep_interview_gate) ?? safeObject(nestedState(state)?.deep_interview_gate);
27
+ }
28
+ function questionEnforcement(state) {
29
+ return safeObject(state?.question_enforcement);
30
+ }
31
+ function autopilotQuestionEnforcement(state) {
32
+ const wait = safeObject(state?.deep_interview_question) ?? safeObject(nestedState(state)?.deep_interview_question);
33
+ if (!wait)
34
+ return undefined;
35
+ if (safeString(wait.source) !== 'omx-question')
36
+ return undefined;
37
+ const obligationId = safeString(wait.obligation_id);
38
+ if (!obligationId)
39
+ return undefined;
40
+ const status = normalizeStatus(wait.status);
41
+ if (status === 'waiting-for-user') {
42
+ return {
43
+ obligation_id: obligationId,
44
+ source: 'omx-question',
45
+ status: 'pending',
46
+ lifecycle_outcome: 'askuserQuestion',
47
+ requested_at: safeString(wait.requested_at) || safeString(wait.updated_at),
48
+ };
49
+ }
50
+ if (status === 'satisfied') {
51
+ return {
52
+ obligation_id: obligationId,
53
+ source: 'omx-question',
54
+ status: 'satisfied',
55
+ lifecycle_outcome: 'askuserQuestion',
56
+ requested_at: safeString(wait.requested_at) || safeString(wait.updated_at),
57
+ question_id: safeString(wait.question_id) || undefined,
58
+ satisfied_at: safeString(wait.satisfied_at) || safeString(wait.resolved_at) || undefined,
59
+ };
60
+ }
61
+ if (status === 'cleared') {
62
+ const clearReason = normalizeStatus(wait.clear_reason);
63
+ return {
64
+ obligation_id: obligationId,
65
+ source: 'omx-question',
66
+ status: 'cleared',
67
+ lifecycle_outcome: 'askuserQuestion',
68
+ requested_at: safeString(wait.requested_at) || safeString(wait.updated_at),
69
+ cleared_at: safeString(wait.cleared_at) || safeString(wait.resolved_at) || undefined,
70
+ clear_reason: clearReason === 'abort' ? 'abort' : clearReason === 'error' ? 'error' : 'handoff',
71
+ };
72
+ }
73
+ return undefined;
74
+ }
75
+ function allCandidateStates(input, deepState) {
76
+ return [input.nextState, input.currentState, deepState];
77
+ }
78
+ function firstGate(input, deepState) {
79
+ const gates = allCandidateStates(input, deepState)
80
+ .map((state) => deepInterviewGate(state))
81
+ .filter((gate) => Boolean(gate));
82
+ return gates.find((gate) => isSkipGate(gate, input.sessionId))
83
+ ?? gates.find((gate) => isCompletionGate(gate, input, deepState))
84
+ ?? gates[0]
85
+ ?? null;
86
+ }
87
+ function hasNonEmptyObjectSummary(value) {
88
+ const object = safeObject(value);
89
+ if (!object)
90
+ return false;
91
+ return ['summary', 'rationale', 'handoff_summary', 'artifact_path', 'path']
92
+ .some((key) => safeString(object[key]).length > 0);
93
+ }
94
+ function completionRationaleExists(gate, input, deepState) {
95
+ if (['rationale', 'completion_rationale', 'handoff_summary', 'summary', 'reason']
96
+ .some((key) => safeString(gate[key]).length > 0)) {
97
+ return true;
98
+ }
99
+ for (const state of allCandidateStates(input, deepState)) {
100
+ const handoff = deepInterviewHandoff(state);
101
+ if (typeof handoff === 'string' && handoff.trim())
102
+ return true;
103
+ if (hasNonEmptyObjectSummary(handoff))
104
+ return true;
105
+ }
106
+ return false;
107
+ }
108
+ function normalizeStatus(value) {
109
+ return safeString(value).toLowerCase().replace(/_/g, '-');
110
+ }
111
+ function isCompletionGate(gate, input, deepState) {
112
+ const status = normalizeStatus(gate.status);
113
+ return (status === 'complete' || gate.complete === true)
114
+ && completionRationaleExists(gate, input, deepState);
115
+ }
116
+ function isSkipGate(gate, sessionId) {
117
+ const status = normalizeStatus(gate.status);
118
+ const reason = safeString(gate.reason) || safeString(gate.skip_reason) || safeString(gate.rationale);
119
+ const timestamp = safeString(gate.skipped_at) || safeString(gate.timestamp) || safeString(gate.updated_at);
120
+ const source = safeString(gate.source);
121
+ const gateSession = safeString(gate.session_id);
122
+ const userAuthorized = gate.skip_authorized_by_user === true || gate.authorized_by_user === true;
123
+ const sessionMatches = !sessionId || gateSession === sessionId;
124
+ return status === 'skipped'
125
+ && userAuthorized
126
+ && reason.length > 0
127
+ && timestamp.length > 0
128
+ && source.length > 0
129
+ && gateSession.length > 0
130
+ && sessionMatches;
131
+ }
132
+ function collectQuestionEnforcementsFromStates(states) {
133
+ const enforcements = [];
134
+ for (const state of states) {
135
+ const standalone = questionEnforcement(state);
136
+ if (standalone)
137
+ enforcements.push(standalone);
138
+ const autopilotWait = autopilotQuestionEnforcement(state);
139
+ if (autopilotWait)
140
+ enforcements.push(autopilotWait);
141
+ }
142
+ return enforcements;
143
+ }
144
+ function questionEnforcementKey(enforcement) {
145
+ const obligationId = safeString(enforcement.obligation_id);
146
+ if (obligationId)
147
+ return `obligation:${obligationId}`;
148
+ const questionId = safeString(enforcement.question_id);
149
+ if (questionId)
150
+ return `question:${questionId}`;
151
+ return null;
152
+ }
153
+ function collectResultingQuestionEnforcements(input, deepState) {
154
+ if (!input.nextState)
155
+ return collectQuestionEnforcementsFromStates([input.currentState, deepState]);
156
+ const resulting = collectQuestionEnforcementsFromStates([input.nextState, deepState]);
157
+ const resultingKeys = new Set(resulting
158
+ .map((enforcement) => questionEnforcementKey(enforcement))
159
+ .filter((key) => Boolean(key)));
160
+ for (const current of collectQuestionEnforcementsFromStates([input.currentState])) {
161
+ const key = questionEnforcementKey(current);
162
+ if (key && resultingKeys.has(key))
163
+ continue;
164
+ resulting.push(current);
165
+ }
166
+ return resulting;
167
+ }
168
+ function hasPendingQuestion(enforcements) {
169
+ return enforcements.some((enforcement) => normalizeStatus(enforcement.status) === 'pending');
170
+ }
171
+ function hasDeniedClearedQuestion(enforcements) {
172
+ return enforcements.some((enforcement) => (normalizeStatus(enforcement.status) === 'cleared'
173
+ && ['handoff', 'error'].includes(normalizeStatus(enforcement.clear_reason))));
174
+ }
175
+ function isSameSessionAnsweredDeepInterviewRecord(record, sessionId) {
176
+ if (!record)
177
+ return false;
178
+ const recordSession = safeString(record.session_id);
179
+ if (sessionId && recordSession && recordSession !== sessionId)
180
+ return false;
181
+ return record.status === 'answered'
182
+ && record.source === 'deep-interview'
183
+ && Boolean(record.answer || record.answers?.length);
184
+ }
185
+ async function satisfiedQuestionHasAnsweredRecord(input, enforcement) {
186
+ const questionId = safeString(enforcement.question_id);
187
+ const satisfiedAt = safeString(enforcement.satisfied_at);
188
+ if (!questionId || !satisfiedAt)
189
+ return false;
190
+ const recordPath = input.baseStateDir
191
+ ? getQuestionRecordPathForStateDir(input.baseStateDir, questionId, input.sessionId)
192
+ : getQuestionRecordPath(input.cwd, questionId, input.sessionId);
193
+ const record = await readQuestionRecord(recordPath);
194
+ return isSameSessionAnsweredDeepInterviewRecord(record, input.sessionId);
195
+ }
196
+ async function allSatisfiedQuestionsHaveAnsweredRecords(input, enforcements) {
197
+ for (const enforcement of enforcements) {
198
+ if (normalizeStatus(enforcement.status) !== 'satisfied')
199
+ continue;
200
+ if (!await satisfiedQuestionHasAnsweredRecord(input, enforcement))
201
+ return false;
202
+ }
203
+ return true;
204
+ }
205
+ export async function canAdvanceAutopilotDeepInterviewToRalplan(input) {
206
+ const deepState = await readDeepInterviewState(input);
207
+ const enforcements = collectResultingQuestionEnforcements(input, deepState);
208
+ if (hasPendingQuestion(enforcements)) {
209
+ return {
210
+ allowed: false,
211
+ reason: 'deep-interview question obligation is still pending; ralplan handoff requires completion or explicit user-authorized skip',
212
+ };
213
+ }
214
+ if (hasDeniedClearedQuestion(enforcements)) {
215
+ return {
216
+ allowed: false,
217
+ reason: 'cleared deep-interview question obligations with handoff/error are not completion evidence',
218
+ };
219
+ }
220
+ const gate = firstGate(input, deepState);
221
+ if (!gate) {
222
+ return {
223
+ allowed: false,
224
+ reason: 'missing deep-interview completion/skip gate for ralplan handoff',
225
+ };
226
+ }
227
+ if (isSkipGate(gate, input.sessionId)) {
228
+ return {
229
+ allowed: true,
230
+ reason: 'explicit user-authorized deep-interview skip gate',
231
+ evidence: { gate_status: 'skipped' },
232
+ };
233
+ }
234
+ if (!isCompletionGate(gate, input, deepState)) {
235
+ return {
236
+ allowed: false,
237
+ reason: 'deep-interview gate is not complete/skipped with required rationale',
238
+ evidence: { gate_status: gate.status },
239
+ };
240
+ }
241
+ if (!await allSatisfiedQuestionsHaveAnsweredRecords(input, enforcements)) {
242
+ return {
243
+ allowed: false,
244
+ reason: 'satisfied deep-interview question obligation lacks same-session answered omx question record',
245
+ };
246
+ }
247
+ return {
248
+ allowed: true,
249
+ reason: 'record-backed deep-interview completion gate',
250
+ evidence: { gate_status: 'complete' },
251
+ };
252
+ }
253
+ export function buildAutopilotDeepInterviewRalplanGateError(decision) {
254
+ return `Cannot transition deep-interview -> ralplan: ${decision.reason}.`;
255
+ }
256
+ //# sourceMappingURL=deep-interview-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-interview-gate.js","sourceRoot":"","sources":["../../src/autopilot/deep-interview-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ declare const AUTOPILOT_CHILD_PHASES: readonly ["deep-interview", "ralplan", "ultragoal", "team", "ralph", "code-review", "ultraqa"];
2
+ declare const AUTOPILOT_RUNTIME_PHASES: readonly ["deep-interview", "ralplan", "ultragoal", "team", "ralph", "code-review", "ultraqa", "waiting-for-user", "complete", "failed"];
3
+ export type AutopilotChildPhase = (typeof AUTOPILOT_CHILD_PHASES)[number];
4
+ export type AutopilotRuntimePhase = (typeof AUTOPILOT_RUNTIME_PHASES)[number];
5
+ export type AutopilotStageLabel = `autopilot:${AutopilotChildPhase}`;
6
+ export declare function isAutopilotChildPhase(value: unknown): value is AutopilotChildPhase;
7
+ export declare function normalizeAutopilotPhase(value: unknown): AutopilotRuntimePhase | null;
8
+ export declare function deriveAutopilotChildPhase(state: unknown): AutopilotChildPhase | null;
9
+ export declare function isAutopilotSupervising(state: unknown): boolean;
10
+ export declare function isAutopilotSupervisingChild(state: unknown, child: AutopilotChildPhase): boolean;
11
+ export declare function deriveAutopilotStageLabel(state: unknown): AutopilotStageLabel | null;
12
+ export {};
13
+ //# sourceMappingURL=fsm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsm.d.ts","sourceRoot":"","sources":["../../src/autopilot/fsm.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,sBAAsB,gGAQlB,CAAC;AAEX,QAAA,MAAM,wBAAwB,0IAKpB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1E,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9E,MAAM,MAAM,mBAAmB,GAAG,aAAa,mBAAmB,EAAE,CAAC;AAiBrE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,GAAG,IAAI,CAKpF;AAaD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAOpF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG9D;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAET;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAGpF"}
@@ -0,0 +1,70 @@
1
+ const AUTOPILOT_CHILD_PHASES = [
2
+ 'deep-interview',
3
+ 'ralplan',
4
+ 'ultragoal',
5
+ 'team',
6
+ 'ralph',
7
+ 'code-review',
8
+ 'ultraqa',
9
+ ];
10
+ const AUTOPILOT_RUNTIME_PHASES = [
11
+ ...AUTOPILOT_CHILD_PHASES,
12
+ 'waiting-for-user',
13
+ 'complete',
14
+ 'failed',
15
+ ];
16
+ function safeString(value) {
17
+ return typeof value === 'string' ? value.trim() : '';
18
+ }
19
+ function safeObject(value) {
20
+ return value && typeof value === 'object' ? value : {};
21
+ }
22
+ function normalizePhaseText(value) {
23
+ const normalized = safeString(value).toLowerCase().replace(/_/g, '-');
24
+ if (normalized === 'completed')
25
+ return 'complete';
26
+ if (normalized === 'planning')
27
+ return 'ralplan';
28
+ return normalized;
29
+ }
30
+ export function isAutopilotChildPhase(value) {
31
+ return AUTOPILOT_CHILD_PHASES.includes(normalizePhaseText(value));
32
+ }
33
+ export function normalizeAutopilotPhase(value) {
34
+ const normalized = normalizePhaseText(value);
35
+ return AUTOPILOT_RUNTIME_PHASES.includes(normalized)
36
+ ? normalized
37
+ : null;
38
+ }
39
+ function readWaitingPreviousPhase(state) {
40
+ const nestedState = safeObject(state.state);
41
+ const wait = safeObject(nestedState.deep_interview_question);
42
+ const previousPhase = normalizeAutopilotPhase(wait.previous_phase);
43
+ return previousPhase && isAutopilotChildPhase(previousPhase) ? previousPhase : null;
44
+ }
45
+ function isActiveAutopilotState(state) {
46
+ return safeString(state.mode) === 'autopilot' && state.active === true;
47
+ }
48
+ export function deriveAutopilotChildPhase(state) {
49
+ const candidate = safeObject(state);
50
+ if (!isActiveAutopilotState(candidate))
51
+ return null;
52
+ const phase = normalizeAutopilotPhase(candidate.current_phase);
53
+ if (phase && isAutopilotChildPhase(phase))
54
+ return phase;
55
+ if (phase === 'waiting-for-user')
56
+ return readWaitingPreviousPhase(candidate);
57
+ return null;
58
+ }
59
+ export function isAutopilotSupervising(state) {
60
+ const candidate = safeObject(state);
61
+ return isActiveAutopilotState(candidate) && deriveAutopilotChildPhase(candidate) !== null;
62
+ }
63
+ export function isAutopilotSupervisingChild(state, child) {
64
+ return isAutopilotSupervising(state) && deriveAutopilotChildPhase(state) === child;
65
+ }
66
+ export function deriveAutopilotStageLabel(state) {
67
+ const child = deriveAutopilotChildPhase(state);
68
+ return child ? `autopilot:${child}` : null;
69
+ }
70
+ //# sourceMappingURL=fsm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsm.js","sourceRoot":"","sources":["../../src/autopilot/fsm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type RalplanConsensusGateEvidence } from '../ralplan/consensus-gate.js';
2
+ type JsonObject = Record<string, unknown>;
3
+ export interface AutopilotRalplanUltragoalGateInput {
4
+ cwd: string;
5
+ sessionId?: string;
6
+ currentState?: JsonObject | null;
7
+ nextState?: JsonObject | null;
8
+ }
9
+ export interface AutopilotRalplanUltragoalGateDecision {
10
+ allowed: boolean;
11
+ reason: string;
12
+ evidence?: RalplanConsensusGateEvidence;
13
+ }
14
+ export declare function canAdvanceAutopilotRalplanToUltragoal(input: AutopilotRalplanUltragoalGateInput): AutopilotRalplanUltragoalGateDecision;
15
+ export declare function buildAutopilotRalplanUltragoalGateError(decision: AutopilotRalplanUltragoalGateDecision): string;
16
+ export {};
17
+ //# sourceMappingURL=ralplan-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralplan-gate.d.ts","sourceRoot":"","sources":["../../src/autopilot/ralplan-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAEvH,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,MAAM,WAAW,kCAAkC;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,qCAAqC;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,4BAA4B,CAAC;CACzC;AAoCD,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,kCAAkC,GACxC,qCAAqC,CAoBvC;AAED,wBAAgB,uCAAuC,CACrD,QAAQ,EAAE,qCAAqC,GAC9C,MAAM,CAKR"}
@@ -0,0 +1,61 @@
1
+ import { buildRalplanConsensusGateFromSources } from '../ralplan/consensus-gate.js';
2
+ function safeObject(value) {
3
+ return value && typeof value === 'object' && !Array.isArray(value)
4
+ ? value
5
+ : null;
6
+ }
7
+ function nestedState(state) {
8
+ return safeObject(state?.state);
9
+ }
10
+ function handoffArtifacts(state) {
11
+ return safeObject(state?.handoff_artifacts) ?? safeObject(nestedState(state)?.handoff_artifacts);
12
+ }
13
+ function ralplanHandoff(state) {
14
+ return safeObject(handoffArtifacts(state)?.ralplan);
15
+ }
16
+ function gateSources(input) {
17
+ const sources = [];
18
+ for (const [label, state] of [
19
+ ['next-autopilot-state', input.nextState],
20
+ ['current-autopilot-state', input.currentState],
21
+ ]) {
22
+ if (!state)
23
+ continue;
24
+ sources.push({ source: label, value: state });
25
+ const handoffs = handoffArtifacts(state);
26
+ if (handoffs)
27
+ sources.push({ source: `${label}:handoff_artifacts`, value: handoffs });
28
+ const ralplan = ralplanHandoff(state);
29
+ if (ralplan)
30
+ sources.push({ source: `${label}:handoff_artifacts.ralplan`, value: ralplan });
31
+ }
32
+ return sources;
33
+ }
34
+ export function canAdvanceAutopilotRalplanToUltragoal(input) {
35
+ const evidence = buildRalplanConsensusGateFromSources(gateSources(input), {
36
+ cwd: input.cwd,
37
+ sessionId: input.sessionId,
38
+ requireNativeSubagents: true,
39
+ });
40
+ if (evidence.complete) {
41
+ return {
42
+ allowed: true,
43
+ reason: 'tracker-backed native ralplan architect and critic consensus evidence',
44
+ evidence,
45
+ };
46
+ }
47
+ return {
48
+ allowed: false,
49
+ reason: evidence.blockedReason === 'native_subagent_consensus_evidence_missing'
50
+ ? 'ralplan consensus lacks tracker-backed native architect and critic lanes'
51
+ : 'missing ralplan consensus gate with tracker-backed native architect and critic lanes',
52
+ evidence,
53
+ };
54
+ }
55
+ export function buildAutopilotRalplanUltragoalGateError(decision) {
56
+ const details = decision.evidence?.blockedDetails?.length
57
+ ? ` Details: ${decision.evidence.blockedDetails.join('; ')}.`
58
+ : '';
59
+ return `Cannot transition ralplan -> ultragoal: ${decision.reason}.${details}`;
60
+ }
61
+ //# sourceMappingURL=ralplan-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralplan-gate.js","sourceRoot":"","sources":["../../src/autopilot/ralplan-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oCAAoC,EAAqC,MAAM,8BAA8B,CAAC;AAiBvH,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAChE,CAAC,CAAC,KAAmB;QACrB,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,KAAoC;IACvD,OAAO,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAoC;IAC5D,OAAO,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,cAAc,CAAC,KAAoC;IAC1D,OAAO,UAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,KAAyC;IAC5D,MAAM,OAAO,GAA8C,EAAE,CAAC;IAC9D,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;QAC3B,CAAC,sBAAsB,EAAE,KAAK,CAAC,SAAS,CAAC;QACzC,CAAC,yBAAyB,EAAE,KAAK,CAAC,YAAY,CAAC;KACvC,EAAE,CAAC;QACX,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtF,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,KAAyC;IAEzC,MAAM,QAAQ,GAAG,oCAAoC,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;QACxE,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,sBAAsB,EAAE,IAAI;KAC7B,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,uEAAuE;YAC/E,QAAQ;SACT,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,QAAQ,CAAC,aAAa,KAAK,4CAA4C;YAC7E,CAAC,CAAC,0EAA0E;YAC5E,CAAC,CAAC,sFAAsF;QAC1F,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,QAA+C;IAE/C,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM;QACvD,CAAC,CAAC,aAAa,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAC7D,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,2CAA2C,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;AACjF,CAAC"}