@openlife/cli 1.7.3

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 (394) hide show
  1. package/INSTALL.md +266 -0
  2. package/LICENSE +21 -0
  3. package/README.md +142 -0
  4. package/bin/openlife.js +3 -0
  5. package/dist/admin_panel_server.js +66 -0
  6. package/dist/cli/AgentManager.js +109 -0
  7. package/dist/cli/AutonomousInstaller.js +134 -0
  8. package/dist/cli/DreamOrganizer.js +88 -0
  9. package/dist/cli/HostInstaller.js +426 -0
  10. package/dist/cli/InstallBanner.js +16 -0
  11. package/dist/cli/InstallFlow.js +256 -0
  12. package/dist/cli/InstallHeadless.js +47 -0
  13. package/dist/cli/InstallModules.js +148 -0
  14. package/dist/cli/InstallStateStore.js +75 -0
  15. package/dist/cli/InstallWizard.js +364 -0
  16. package/dist/cli/ProfileManager.js +163 -0
  17. package/dist/cli/SystemInstaller.js +89 -0
  18. package/dist/cli/WorldClassCommands.js +208 -0
  19. package/dist/design/DesignMdImporter.js +82 -0
  20. package/dist/design/DesignMdMode.js +93 -0
  21. package/dist/design/DesignMdRegistry.js +67 -0
  22. package/dist/index.js +2575 -0
  23. package/dist/memory/ConversationMemory.js +33 -0
  24. package/dist/memory/LocalMemoryProvider.js +86 -0
  25. package/dist/memory/Mem0Provider.js +16 -0
  26. package/dist/memory/MemoryNamespacePolicy.js +27 -0
  27. package/dist/memory/MemoryOrchestrator.js +65 -0
  28. package/dist/memory/MemoryPromotionFlow.js +32 -0
  29. package/dist/memory/MemoryProvider.js +2 -0
  30. package/dist/memory/MemoryProviderRegistry.js +27 -0
  31. package/dist/memory/MemoryRetentionPolicy.js +60 -0
  32. package/dist/memory/MempalaceProvider.js +72 -0
  33. package/dist/memory/OmniMemory.js +106 -0
  34. package/dist/memory/RedisAgentMemoryProvider.js +16 -0
  35. package/dist/memory/SessionManager.js +86 -0
  36. package/dist/memory/ZepGraphitiProvider.js +16 -0
  37. package/dist/orchestrator/AgentRegistry.js +56 -0
  38. package/dist/orchestrator/AgentScoring.js +82 -0
  39. package/dist/orchestrator/AgentTeam.js +22 -0
  40. package/dist/orchestrator/ArbitrationAgent.js +43 -0
  41. package/dist/orchestrator/ArbitrationScorecard.js +17 -0
  42. package/dist/orchestrator/AssetPromotionEngine.js +65 -0
  43. package/dist/orchestrator/AssetReuseRouter.js +63 -0
  44. package/dist/orchestrator/BenchmarkEngine.js +75 -0
  45. package/dist/orchestrator/Brain.js +298 -0
  46. package/dist/orchestrator/CadenceEngine.js +76 -0
  47. package/dist/orchestrator/CapabilityRouter.js +36 -0
  48. package/dist/orchestrator/CommandLanguage.js +27 -0
  49. package/dist/orchestrator/CommandRouter.js +70 -0
  50. package/dist/orchestrator/ConsequenceForecaster.js +286 -0
  51. package/dist/orchestrator/CronManager.js +286 -0
  52. package/dist/orchestrator/DynamicAgentBuilder.js +48 -0
  53. package/dist/orchestrator/DynamicAgentExecutor.js +15 -0
  54. package/dist/orchestrator/EnterpriseAgenticCore.js +276 -0
  55. package/dist/orchestrator/ExecutionBoard.js +86 -0
  56. package/dist/orchestrator/ExecutionIntent.js +13 -0
  57. package/dist/orchestrator/ExecutionModePolicy.js +48 -0
  58. package/dist/orchestrator/ExecutionRouter.js +9 -0
  59. package/dist/orchestrator/ExecutionState.js +20 -0
  60. package/dist/orchestrator/ExecutorHealth.js +86 -0
  61. package/dist/orchestrator/ExternalCatalogRegistry.js +83 -0
  62. package/dist/orchestrator/Gatekeeper.js +414 -0
  63. package/dist/orchestrator/Gateway.js +508 -0
  64. package/dist/orchestrator/GovernanceConsentStore.js +66 -0
  65. package/dist/orchestrator/GovernanceLayer.js +179 -0
  66. package/dist/orchestrator/GovernancePolicyStore.js +53 -0
  67. package/dist/orchestrator/GovernanceScopeLedger.js +134 -0
  68. package/dist/orchestrator/GovernanceScopePolicy.js +67 -0
  69. package/dist/orchestrator/IntentClassifier.js +45 -0
  70. package/dist/orchestrator/JobLifecycle.js +91 -0
  71. package/dist/orchestrator/LearningRouter.js +24 -0
  72. package/dist/orchestrator/MediaManager.js +92 -0
  73. package/dist/orchestrator/MemoryCuratorAgent.js +41 -0
  74. package/dist/orchestrator/MissionState.js +155 -0
  75. package/dist/orchestrator/ModelManager.js +84 -0
  76. package/dist/orchestrator/OperatingSystem.js +71 -0
  77. package/dist/orchestrator/OperationalMemoryStore.js +94 -0
  78. package/dist/orchestrator/OptimizationLoop.js +72 -0
  79. package/dist/orchestrator/OrchestrationLoop.js +905 -0
  80. package/dist/orchestrator/OrgStructure.js +88 -0
  81. package/dist/orchestrator/OutcomeSimulator.js +46 -0
  82. package/dist/orchestrator/ParallelOrchestrationLoop.js +36 -0
  83. package/dist/orchestrator/PerformanceScorecard.js +105 -0
  84. package/dist/orchestrator/PlannerAgent.js +46 -0
  85. package/dist/orchestrator/ProcessSandbox.js +129 -0
  86. package/dist/orchestrator/PromotionPipeline.js +74 -0
  87. package/dist/orchestrator/PromotionReviewGate.js +11 -0
  88. package/dist/orchestrator/QueueScheduler.js +260 -0
  89. package/dist/orchestrator/ReleaseGate.js +36 -0
  90. package/dist/orchestrator/ReleaseWorkflow.js +68 -0
  91. package/dist/orchestrator/RemotePublisher.js +139 -0
  92. package/dist/orchestrator/ReuseEngine.js +89 -0
  93. package/dist/orchestrator/ReviewerAgent.js +49 -0
  94. package/dist/orchestrator/RoleHandoff.js +65 -0
  95. package/dist/orchestrator/RuntimeHealthMonitor.js +143 -0
  96. package/dist/orchestrator/RuntimePolicy.js +105 -0
  97. package/dist/orchestrator/RuntimeProbe.js +97 -0
  98. package/dist/orchestrator/RuntimeRegistry.js +73 -0
  99. package/dist/orchestrator/SandboxPolicy.js +22 -0
  100. package/dist/orchestrator/SecurityDownloadGuard.js +169 -0
  101. package/dist/orchestrator/SecurityEventStore.js +58 -0
  102. package/dist/orchestrator/ServiceCompletionPolicy.js +36 -0
  103. package/dist/orchestrator/ServiceState.js +195 -0
  104. package/dist/orchestrator/SkillCreator.js +404 -0
  105. package/dist/orchestrator/SkillLearningLoop.js +57 -0
  106. package/dist/orchestrator/SkillManager.js +75 -0
  107. package/dist/orchestrator/SkillNetwork.js +29 -0
  108. package/dist/orchestrator/SkillRegistryV2.js +28 -0
  109. package/dist/orchestrator/SkillScoring.js +70 -0
  110. package/dist/orchestrator/SquadAutoCreator.js +64 -0
  111. package/dist/orchestrator/SquadCreator.js +727 -0
  112. package/dist/orchestrator/SquadRegistry.js +28 -0
  113. package/dist/orchestrator/SquadRouter.js +33 -0
  114. package/dist/orchestrator/SquadScoring.js +70 -0
  115. package/dist/orchestrator/SubagentLifecycle.js +90 -0
  116. package/dist/orchestrator/SynthesizerAgent.js +48 -0
  117. package/dist/orchestrator/SystemDoctor.js +224 -0
  118. package/dist/orchestrator/TaskExecutor.js +422 -0
  119. package/dist/orchestrator/TeammateBoard.js +61 -0
  120. package/dist/orchestrator/TestHarness.js +184 -0
  121. package/dist/orchestrator/VoiceManager.js +203 -0
  122. package/dist/orchestrator/VoiceRouter.js +89 -0
  123. package/dist/orchestrator/capability/CapabilityGenesisEngine.js +278 -0
  124. package/dist/orchestrator/capability/CapabilityPackParser.js +223 -0
  125. package/dist/orchestrator/capability/CapabilityPackSchema.js +62 -0
  126. package/dist/orchestrator/capability/CapabilityPackState.js +163 -0
  127. package/dist/orchestrator/providers/AgentProvider.js +2 -0
  128. package/dist/orchestrator/providers/CapabilityProvider.js +12 -0
  129. package/dist/orchestrator/providers/CloudAgentProvider.js +55 -0
  130. package/dist/orchestrator/providers/CloudSkillProvider.js +55 -0
  131. package/dist/orchestrator/providers/CloudSquadProvider.js +55 -0
  132. package/dist/orchestrator/providers/CompositeAgentProvider.js +16 -0
  133. package/dist/orchestrator/providers/CompositeCapabilityProvider.js +25 -0
  134. package/dist/orchestrator/providers/CompositeSkillProvider.js +16 -0
  135. package/dist/orchestrator/providers/CompositeSquadProvider.js +16 -0
  136. package/dist/orchestrator/providers/CompositeWorkflowProvider.js +46 -0
  137. package/dist/orchestrator/providers/FileAgentProvider.js +105 -0
  138. package/dist/orchestrator/providers/FileCapabilityProvider.js +106 -0
  139. package/dist/orchestrator/providers/FileSkillProvider.js +65 -0
  140. package/dist/orchestrator/providers/FileSquadProvider.js +69 -0
  141. package/dist/orchestrator/providers/FileWorkflowProvider.js +103 -0
  142. package/dist/orchestrator/providers/SkillProvider.js +2 -0
  143. package/dist/orchestrator/providers/SquadProvider.js +2 -0
  144. package/dist/orchestrator/toolset/ToolsetGuard.js +69 -0
  145. package/dist/orchestrator/toolset/ToolsetRegistry.js +65 -0
  146. package/dist/orchestrator/toolset/ToolsetSchema.js +21 -0
  147. package/dist/orchestrator/util/AtomicWriter.js +204 -0
  148. package/dist/orchestrator/util/DistributedLock.js +232 -0
  149. package/dist/orchestrator/util/TemplateRenderer.js +87 -0
  150. package/dist/orchestrator/util/WatchdogHeartbeat.js +116 -0
  151. package/dist/orchestrator/workflow/ConditionParser.js +232 -0
  152. package/dist/orchestrator/workflow/WorkflowEngine.js +379 -0
  153. package/dist/orchestrator/workflow/WorkflowParser.js +368 -0
  154. package/dist/orchestrator/workflow/WorkflowSchema.js +65 -0
  155. package/dist/orchestrator/workflow/WorkflowState.js +11 -0
  156. package/dist/reversa/ReversaAgent.js +134 -0
  157. package/dist/reversa/ReversaContracts.js +62 -0
  158. package/dist/reversa/ReversaExecutors.js +65 -0
  159. package/dist/skills/SkillRegistry.js +71 -0
  160. package/dist/squads/SquadManager.js +87 -0
  161. package/dist/test_admin_teams_networks.js +54 -0
  162. package/dist/test_agent_team_skill_network.js +15 -0
  163. package/dist/test_aiobuilder_cli_parity.js +169 -0
  164. package/dist/test_ask_exit.js +73 -0
  165. package/dist/test_atomic_writer.js +209 -0
  166. package/dist/test_autonomous_soak.js +141 -0
  167. package/dist/test_benchmark_engine.js +41 -0
  168. package/dist/test_brain_error_diagnostics.js +51 -0
  169. package/dist/test_brain_fallback_chain.js +93 -0
  170. package/dist/test_capability_genesis_engine.js +225 -0
  171. package/dist/test_capability_pack_schema.js +214 -0
  172. package/dist/test_catalog_quality.js +150 -0
  173. package/dist/test_cli_crud_roundtrip.js +154 -0
  174. package/dist/test_cli_diagnostics.js +131 -0
  175. package/dist/test_cli_doc_parity.js +126 -0
  176. package/dist/test_cli_help_surface.js +106 -0
  177. package/dist/test_cli_service_commands.js +83 -0
  178. package/dist/test_consequence_forecast_brain.js +165 -0
  179. package/dist/test_consequence_forecaster.js +24 -0
  180. package/dist/test_conversation_memory.js +36 -0
  181. package/dist/test_create_entities.js +54 -0
  182. package/dist/test_creator_placeholders_completed.js +177 -0
  183. package/dist/test_cron_manager.js +123 -0
  184. package/dist/test_daemon_sigterm.js +72 -0
  185. package/dist/test_deep_research_capability.js +87 -0
  186. package/dist/test_designmd_import_registry.js +16 -0
  187. package/dist/test_designmd_mode.js +50 -0
  188. package/dist/test_designmd_mode_workspace.js +13 -0
  189. package/dist/test_dist_templates_layout.js +135 -0
  190. package/dist/test_distributed_lock.js +201 -0
  191. package/dist/test_distribution_installability.js +67 -0
  192. package/dist/test_doctor_sandbox_check.js +44 -0
  193. package/dist/test_dream_organizer.js +25 -0
  194. package/dist/test_dual_mode.js +15 -0
  195. package/dist/test_enterprise_agentic_core.js +128 -0
  196. package/dist/test_forecast_brain_wiring.js +87 -0
  197. package/dist/test_gateway_telegram_guardrails.js +52 -0
  198. package/dist/test_governance.js +34 -0
  199. package/dist/test_governance_advanced.js +75 -0
  200. package/dist/test_governance_scope_ledger.js +147 -0
  201. package/dist/test_governance_v13_policies.js +44 -0
  202. package/dist/test_guided_creator_cli.js +100 -0
  203. package/dist/test_host_install_e2e.js +324 -0
  204. package/dist/test_host_installer.js +259 -0
  205. package/dist/test_host_installers_gemini_codex.js +95 -0
  206. package/dist/test_host_uninstaller.js +295 -0
  207. package/dist/test_install_flow.js +70 -0
  208. package/dist/test_install_flow_host_validation.js +143 -0
  209. package/dist/test_install_wizard.js +272 -0
  210. package/dist/test_integration_gemini_live.js +95 -0
  211. package/dist/test_integration_http_trigger_live.js +154 -0
  212. package/dist/test_integration_telegram_live.js +102 -0
  213. package/dist/test_job_lifecycle.js +16 -0
  214. package/dist/test_memory_orchestrator.js +33 -0
  215. package/dist/test_memory_promotion.js +36 -0
  216. package/dist/test_memory_retention.js +37 -0
  217. package/dist/test_mission_checkpoint.js +204 -0
  218. package/dist/test_multi_host_docs_parity.js +125 -0
  219. package/dist/test_openlife_auto_creator_routing.js +69 -0
  220. package/dist/test_openlife_evolution_surface.js +77 -0
  221. package/dist/test_openlife_gatekeeper_routing.js +15 -0
  222. package/dist/test_openlife_routing_surface.js +27 -0
  223. package/dist/test_openlife_runtime_source_truth.js +25 -0
  224. package/dist/test_operating_system.js +45 -0
  225. package/dist/test_optimization_loop.js +38 -0
  226. package/dist/test_orchestration_assets_lifecycle.js +78 -0
  227. package/dist/test_outcome_simulator.js +38 -0
  228. package/dist/test_performance_latency.js +215 -0
  229. package/dist/test_performance_scorecard.js +38 -0
  230. package/dist/test_phase1_check_exit.js +103 -0
  231. package/dist/test_phase6_board.js +31 -0
  232. package/dist/test_phase6_cadence.js +29 -0
  233. package/dist/test_phase6_ops.js +37 -0
  234. package/dist/test_post_mission_evaluation.js +190 -0
  235. package/dist/test_process_sandbox.js +88 -0
  236. package/dist/test_profile_toolset_mcp.js +125 -0
  237. package/dist/test_queue_scheduler.js +239 -0
  238. package/dist/test_release_gate.js +23 -0
  239. package/dist/test_remote_publish.js +193 -0
  240. package/dist/test_reversa_contracts_e2e.js +48 -0
  241. package/dist/test_reversa_export_and_strict.js +51 -0
  242. package/dist/test_reversa_full_execution.js +12 -0
  243. package/dist/test_reversa_lite.js +9 -0
  244. package/dist/test_royal_stack_golden.js +179 -0
  245. package/dist/test_runtime_health_backoff.js +154 -0
  246. package/dist/test_runtime_policy.js +26 -0
  247. package/dist/test_runtime_probe.js +19 -0
  248. package/dist/test_runtime_profile_oauth_only.js +262 -0
  249. package/dist/test_runtime_registry.js +11 -0
  250. package/dist/test_security_download_and_scan.js +103 -0
  251. package/dist/test_security_download_guard.js +14 -0
  252. package/dist/test_service_command_surface.js +12 -0
  253. package/dist/test_service_completion_policy.js +32 -0
  254. package/dist/test_service_guardrails_delete.js +12 -0
  255. package/dist/test_service_mode_explicit_only.js +174 -0
  256. package/dist/test_sources_import_ref.js +46 -0
  257. package/dist/test_sources_scaffold.js +43 -0
  258. package/dist/test_squad_skill_creator.js +305 -0
  259. package/dist/test_squad_skill_design_llm.js +176 -0
  260. package/dist/test_subsystems_org_state.js +271 -0
  261. package/dist/test_subsystems_promotion_memory_assets.js +343 -0
  262. package/dist/test_subsystems_routing_governance.js +234 -0
  263. package/dist/test_task_executor_sandbox_optin.js +127 -0
  264. package/dist/test_teammate_learning.js +15 -0
  265. package/dist/test_telegram_delete_guardrail.js +21 -0
  266. package/dist/test_toolset_enforcement.js +188 -0
  267. package/dist/test_trigger_basic_auth.js +112 -0
  268. package/dist/test_util/doc_parity.js +120 -0
  269. package/dist/test_v15_e2e_integration.js +207 -0
  270. package/dist/test_watchdog_heartbeat.js +152 -0
  271. package/dist/test_workflow_condition_parser.js +63 -0
  272. package/dist/test_workflow_e2e.js +240 -0
  273. package/dist/test_workflow_engine.js +330 -0
  274. package/dist/test_workflow_parser.js +245 -0
  275. package/dist/test_workflow_schema_backward_compat.js +197 -0
  276. package/dist-templates/README.md +91 -0
  277. package/dist-templates/claude-code/agents/openlife-atlas.md +52 -0
  278. package/dist-templates/claude-code/agents/openlife-forge.md +42 -0
  279. package/dist-templates/claude-code/agents/openlife-genesis.md +59 -0
  280. package/dist-templates/claude-code/agents/openlife-lyra.md +40 -0
  281. package/dist-templates/claude-code/agents/openlife-maestro.md +45 -0
  282. package/dist-templates/claude-code/commands/openlife/ask.md +14 -0
  283. package/dist-templates/claude-code/commands/openlife/doctor.md +19 -0
  284. package/dist-templates/claude-code/commands/openlife/dream.md +20 -0
  285. package/dist-templates/claude-code/commands/openlife/status.md +14 -0
  286. package/dist-templates/claude-code/mcp/openlife-orchestrator.json +46 -0
  287. package/dist-templates/codex/README.md +7 -0
  288. package/dist-templates/codex/agents/openlife-atlas.md +52 -0
  289. package/dist-templates/codex/agents/openlife-forge.md +42 -0
  290. package/dist-templates/codex/agents/openlife-genesis.md +59 -0
  291. package/dist-templates/codex/agents/openlife-lyra.md +40 -0
  292. package/dist-templates/codex/agents/openlife-maestro.md +45 -0
  293. package/dist-templates/codex/commands/openlife/ask.md +14 -0
  294. package/dist-templates/codex/commands/openlife/doctor.md +19 -0
  295. package/dist-templates/codex/commands/openlife/dream.md +20 -0
  296. package/dist-templates/codex/commands/openlife/status.md +14 -0
  297. package/dist-templates/codex/mcp/openlife-orchestrator.json +46 -0
  298. package/dist-templates/gemini-cli/README.md +8 -0
  299. package/dist-templates/gemini-cli/agents/openlife-atlas.md +52 -0
  300. package/dist-templates/gemini-cli/agents/openlife-forge.md +42 -0
  301. package/dist-templates/gemini-cli/agents/openlife-genesis.md +59 -0
  302. package/dist-templates/gemini-cli/agents/openlife-lyra.md +40 -0
  303. package/dist-templates/gemini-cli/agents/openlife-maestro.md +45 -0
  304. package/dist-templates/gemini-cli/commands/openlife/ask.md +14 -0
  305. package/dist-templates/gemini-cli/commands/openlife/doctor.md +19 -0
  306. package/dist-templates/gemini-cli/commands/openlife/dream.md +20 -0
  307. package/dist-templates/gemini-cli/commands/openlife/status.md +14 -0
  308. package/dist-templates/gemini-cli/mcp/openlife-orchestrator.json +46 -0
  309. package/dist-templates/skill-template/README.md +34 -0
  310. package/dist-templates/skill-template/SKILL.md.template +59 -0
  311. package/dist-templates/squad-template/README.md +82 -0
  312. package/dist-templates/squad-template/SQUAD.md.template +51 -0
  313. package/dist-templates/squad-template/agent-template.md +51 -0
  314. package/dist-templates/squad-template/checklist-template.md +25 -0
  315. package/dist-templates/squad-template/task-template.md +36 -0
  316. package/dist-templates/workflows/PORTED_WORKFLOWS.md +60 -0
  317. package/dist-templates/workflows/brownfield-discovery.yaml +137 -0
  318. package/dist-templates/workflows/greenfield-fullstack.yaml +132 -0
  319. package/dist-templates/workflows/qa-loop.yaml +125 -0
  320. package/dist-templates/workflows/story-development-cycle.yaml +80 -0
  321. package/docs/CHANGELOG_FEATURE_ROLLOUT_DESIGNMD.md +43 -0
  322. package/docs/EXTERNAL_SOURCES_AND_SECURITY_GUARD.md +33 -0
  323. package/docs/OPENLIFE_AUDIT_2026-05-06.md +170 -0
  324. package/docs/OPENLIFE_CONSOLIDATED_PLAN_2026-05-06.md +299 -0
  325. package/docs/OPENLIFE_DUAL_MODE_IMPLEMENTATION_PLAN.md +205 -0
  326. package/docs/OPENLIFE_EVOLUTION_SURFACE_2026-05-07.md +53 -0
  327. package/docs/OPENLIFE_SKILLS_IMPORT_2026-05-07.json +223 -0
  328. package/docs/OPENLIFE_SQUADS_IMPORT_2026-05-07.json +184 -0
  329. package/docs/PAPERCLIP_OPENLIFE_INVESTIGATION.md +85 -0
  330. package/docs/README.md +28 -0
  331. package/docs/RELEASE_ORGANIZATION_PLAN.md +164 -0
  332. package/docs/audit/CLI-EXECUTION-RESULTS.md +113 -0
  333. package/docs/audit/CLI-MATRIX.md +556 -0
  334. package/docs/audit/DOC-PARITY-GAPS.md +351 -0
  335. package/docs/audit/ORCHESTRATOR-MATRIX.md +136 -0
  336. package/docs/audit/TEST-COVERAGE-GAPS.md +334 -0
  337. package/docs/audit/integrations/SKIPPED.md +101 -0
  338. package/docs/autonomous-install.md +79 -0
  339. package/docs/capability-genesis.md +137 -0
  340. package/docs/capability-pack-schema.md +157 -0
  341. package/docs/commands.md +82 -0
  342. package/docs/deep-research-capability.md +114 -0
  343. package/docs/development/typescript-conventions.md +95 -0
  344. package/docs/host-installers.md +68 -0
  345. package/docs/install/aiobuilder.md +70 -0
  346. package/docs/install/claude-code.md +83 -0
  347. package/docs/install/codex.md +64 -0
  348. package/docs/install/gemini-cli.md +64 -0
  349. package/docs/install/runtime-profiles.md +83 -0
  350. package/docs/openlife-agent-os-blueprint.md +114 -0
  351. package/docs/openlife-install-backlog.md +115 -0
  352. package/docs/openlife-install-spec.md +306 -0
  353. package/docs/operations/CLOUD_CUTOVER_AUDIT.md +37 -0
  354. package/docs/operations/PHASE_PROGRESS_CONTINUATION.md +24 -0
  355. package/docs/performance-benchmarks.md +83 -0
  356. package/docs/planning/v1.3-capability-genesis.md +157 -0
  357. package/docs/plans/2026-05-05-admin-interface-professional-dark-premium-plan.md +84 -0
  358. package/docs/plans/2026-05-05-openlife-autonomous-domain-marketplace-masterplan.md +122 -0
  359. package/docs/quickstart.md +60 -0
  360. package/docs/release-process.md +236 -0
  361. package/docs/roadmap/OPENLIFE_MASTER_PLAN_CLOUD_V3.md +97 -0
  362. package/docs/sandboxing-research.md +117 -0
  363. package/docs/stories/epic-feature-audit/1.1.story.md +84 -0
  364. package/docs/stories/epic-feature-audit/1.2.story.md +102 -0
  365. package/docs/stories/epic-feature-audit/1.3.story.md +93 -0
  366. package/docs/stories/epic-feature-audit/1.5.story.md +121 -0
  367. package/docs/stories/epic-feature-audit/1.6.story.md +80 -0
  368. package/docs/stories/epic-feature-completeness/2.1.story.md +70 -0
  369. package/docs/stories/epic-feature-completeness/2.2.story.md +49 -0
  370. package/docs/stories/epic-feature-completeness/2.3.story.md +74 -0
  371. package/docs/stories/epic-feature-completeness/2.4.story.md +71 -0
  372. package/docs/stories/epic-feature-completeness/3.1.story.md +56 -0
  373. package/docs/stories/epic-feature-completeness/3.2.story.md +80 -0
  374. package/docs/stories/epic-feature-completeness/3.3.story.md +68 -0
  375. package/docs/stories/epic-feature-completeness/3.4.story.md +71 -0
  376. package/docs/stories/epic-feature-completeness/3.5.story.md +72 -0
  377. package/docs/stories/epic-feature-completeness/3.6.story.md +69 -0
  378. package/docs/stories/epic-feature-completeness/3.7.story.md +68 -0
  379. package/docs/stories/epic-feature-completeness/3.8.story.md +57 -0
  380. package/docs/toolset-enforcement.md +122 -0
  381. package/docs/v1.4-changelog.md +159 -0
  382. package/docs/v1.5-changelog.md +106 -0
  383. package/docs/v1.5-roadmap.md +121 -0
  384. package/docs/v1.6-changelog.md +67 -0
  385. package/docs/v1.6-roadmap.md +89 -0
  386. package/docs/v1.7-changelog.md +98 -0
  387. package/docs/workflow-schema.md +177 -0
  388. package/package.json +177 -0
  389. package/scripts/clean-test-pollution.js +61 -0
  390. package/scripts/openlife-agent-start.sh +6 -0
  391. package/scripts/openlife-agent.service.example +13 -0
  392. package/scripts/openlife-agent.supervisord.conf.example +8 -0
  393. package/scripts/openlife-autonomous-install.sh +29 -0
  394. package/scripts/postinstall-check.sh +37 -0
@@ -0,0 +1,48 @@
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
+ const ReversaAgent_1 = require("./reversa/ReversaAgent");
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const r = new ReversaAgent_1.ReversaAgent();
40
+ r.setMode('designmd', 'claude');
41
+ r.runAll('contract e2e');
42
+ const finalPath = path.join(process.cwd(), '.reversa', 'final-contracts.md');
43
+ if (!fs.existsSync(finalPath))
44
+ throw new Error('final contracts file missing');
45
+ const txt = fs.readFileSync(finalPath, 'utf-8');
46
+ if (!txt.includes('validation_ok: true'))
47
+ throw new Error('contracts validation should be true');
48
+ console.log('TEST_REVERSA_CONTRACTS_E2E_OK');
@@ -0,0 +1,51 @@
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
+ const ReversaAgent_1 = require("./reversa/ReversaAgent");
37
+ const fs = __importStar(require("fs"));
38
+ const child_process_1 = require("child_process");
39
+ const r = new ReversaAgent_1.ReversaAgent();
40
+ r.setMode('designmd', 'claude');
41
+ r.runAll('strict test');
42
+ const jsonPath = r.exportContractsJson();
43
+ if (!fs.existsSync(jsonPath))
44
+ throw new Error('final-contracts.json missing');
45
+ const data = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
46
+ if (!data?.validation?.ok)
47
+ throw new Error('validation should be ok');
48
+ const out = (0, child_process_1.execSync)('node dist/index.js aiobuilder generate-ui dashboard --strict-contracts', { encoding: 'utf-8' });
49
+ if (!out.includes('dashboard'))
50
+ throw new Error('strict generate-ui did not run');
51
+ console.log('TEST_REVERSA_EXPORT_STRICT_OK');
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ReversaAgent_1 = require("./reversa/ReversaAgent");
4
+ const r = new ReversaAgent_1.ReversaAgent();
5
+ r.setMode('designmd', 'claude');
6
+ const p1 = r.runPhase('reconnaissance', 'phase test');
7
+ if (p1.phase !== 'reconnaissance')
8
+ throw new Error('runPhase should set requested phase');
9
+ const p2 = r.runAll('all test');
10
+ if (p2.phase !== 'review')
11
+ throw new Error('runAll should end in review');
12
+ console.log('TEST_REVERSA_FULL_EXECUTION_OK');
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ReversaAgent_1 = require("./reversa/ReversaAgent");
4
+ const r = new ReversaAgent_1.ReversaAgent();
5
+ const s1 = r.resume();
6
+ const s2 = r.advance('phase progress');
7
+ if (!s1.phase || !s2.phase)
8
+ throw new Error('reversa state must have phase');
9
+ console.log('TEST_REVERSA_LITE_OK');
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * test_royal_stack_golden.ts — Story 7.3
4
+ *
5
+ * Golden end-to-end test for v1.2 "Royal Stack".
6
+ *
7
+ * Asserts that the three pillars (Workflow + Squad/Skill Creators + Autonomy)
8
+ * cooperate inside a single CLI session against an isolated working tree.
9
+ *
10
+ * Sequence (all under a temp directory rooted at .artifacts/test_royal_stack/):
11
+ * 1. Build a tiny squad via SquadCreator (rendered from dist-templates/).
12
+ * 2. Build a tiny skill via SkillCreator.
13
+ * 3. Validate both via the CLI.
14
+ * 4. List built-in workflows via the CLI — assert 4 are present.
15
+ * 5. Validate one of the built-in workflows.
16
+ * 6. Run a workflow in dry-run mode and assert the state file is persisted.
17
+ * 7. Acquire and release a distributed lock to prove autonomy primitives work.
18
+ *
19
+ * Budget: under 60 seconds, no network calls, no LLM spend.
20
+ */
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ const child_process_1 = require("child_process");
56
+ const fs = __importStar(require("fs"));
57
+ const path = __importStar(require("path"));
58
+ const os = __importStar(require("os"));
59
+ const CLI = path.join(process.cwd(), 'dist', 'index.js');
60
+ function cli(args, env) {
61
+ const r = (0, child_process_1.spawnSync)('node', [CLI, ...args], {
62
+ encoding: 'utf-8',
63
+ timeout: 30000,
64
+ env: { ...process.env, ...(env || {}) },
65
+ });
66
+ return { ok: r.status === 0, status: r.status, stdout: r.stdout || '', stderr: r.stderr || '' };
67
+ }
68
+ function parseJson(stdout) {
69
+ // CLI prints surrounding chatter; pluck the first {...} block.
70
+ const m = stdout.match(/\{[\s\S]*\}\s*$/);
71
+ if (!m)
72
+ throw new Error(`No JSON found in stdout:\n${stdout.slice(0, 400)}`);
73
+ return JSON.parse(m[0]);
74
+ }
75
+ function makeTempDir(prefix) {
76
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), prefix));
77
+ return root;
78
+ }
79
+ function assertTrue(cond, label) {
80
+ if (!cond)
81
+ throw new Error(`ASSERT_FAILED[${label}]`);
82
+ }
83
+ function main() {
84
+ const sandboxRoot = makeTempDir('openlife-royal-stack-');
85
+ console.log(`[golden] sandbox: ${sandboxRoot}`);
86
+ // Per-test catalog + state isolation via env overrides.
87
+ const env = {
88
+ OPENLIFE_STATE_DIR: path.join(sandboxRoot, '.openlife'),
89
+ OPENLIFE_SQUAD_ROOT: path.join(sandboxRoot, '.catalog', 'squads'),
90
+ OPENLIFE_SKILL_ROOT: path.join(sandboxRoot, '.catalog', 'skills'),
91
+ };
92
+ fs.mkdirSync(env.OPENLIFE_STATE_DIR, { recursive: true });
93
+ fs.mkdirSync(env.OPENLIFE_SQUAD_ROOT, { recursive: true });
94
+ fs.mkdirSync(env.OPENLIFE_SKILL_ROOT, { recursive: true });
95
+ try {
96
+ // === Pillar 1: SquadCreator + SkillCreator (in-process — these aren't yet
97
+ // exposed via the CLI under sandbox env in a single shot; we call the
98
+ // classes directly to keep the test hermetic and fast.) ===
99
+ const { SquadCreator } = require(path.join(process.cwd(), 'dist', 'orchestrator', 'SquadCreator.js'));
100
+ const { SkillCreator } = require(path.join(process.cwd(), 'dist', 'orchestrator', 'SkillCreator.js'));
101
+ const sc = new SquadCreator({ catalogRoot: env.OPENLIFE_SQUAD_ROOT });
102
+ const squadResult = sc.create({
103
+ id: 'rs-golden-squad',
104
+ name: 'royal-stack-golden',
105
+ description: 'Sentinel squad for the Royal Stack golden test.',
106
+ version: '1.0.0',
107
+ agents: [
108
+ { id: 'agent-one', role: 'planner', description: 'Plans the work.' },
109
+ ],
110
+ tasks: [
111
+ { id: 'task-one', title: 'Discover', description: 'Discover the scope.' },
112
+ ],
113
+ });
114
+ assertTrue(squadResult.ok, 'SquadCreator.create ok');
115
+ console.log(`[golden] squad created at ${squadResult.squadDir}`);
116
+ const squadValidation = sc.validate('rs-golden-squad');
117
+ assertTrue(squadValidation.ok, 'SquadCreator.validate ok');
118
+ const skc = new SkillCreator({ catalogRoot: env.OPENLIFE_SKILL_ROOT });
119
+ const skillResult = skc.create({
120
+ id: 'rs-golden-skill',
121
+ name: 'royal-stack-golden-skill',
122
+ description: 'Sentinel skill for the Royal Stack golden test.',
123
+ whenToUse: ['When validating the Royal Stack pipeline'],
124
+ procedure: ['Run the test', 'Inspect the artifacts'],
125
+ });
126
+ assertTrue(skillResult.ok, 'SkillCreator.create ok');
127
+ console.log(`[golden] skill created at ${skillResult.filePath}`);
128
+ // === Pillar 2: Workflow list/validate/run (via CLI, hits real WorkflowEngine) ===
129
+ const listResult = cli(['workflow', 'list'], env);
130
+ assertTrue(listResult.ok, `workflow list ok (status=${listResult.status})`);
131
+ const listPayload = parseJson(listResult.stdout);
132
+ assertTrue(listPayload.ok && Array.isArray(listPayload.workflows), 'workflow list payload shape');
133
+ assertTrue(listPayload.workflows.length >= 4, `workflow list >= 4 (got ${listPayload.workflows.length})`);
134
+ console.log(`[golden] workflow list: ${listPayload.workflows.map((w) => w.id).join(', ')}`);
135
+ const targetWorkflow = listPayload.workflows[0];
136
+ const validateResult = cli(['workflow', 'validate', targetWorkflow.filePath], env);
137
+ assertTrue(validateResult.ok, `workflow validate ${targetWorkflow.id} ok`);
138
+ const runResult = cli(['workflow', 'run', targetWorkflow.filePath, '--dry-run'], env);
139
+ assertTrue(runResult.ok, `workflow run --dry-run ok (status=${runResult.status})`);
140
+ const runPayload = parseJson(runResult.stdout);
141
+ assertTrue(runPayload.ok, 'workflow run payload ok');
142
+ const runId = runPayload.state?.runId;
143
+ assertTrue(typeof runId === 'string' && runId.length > 0, 'runId present');
144
+ console.log(`[golden] workflow run ${targetWorkflow.id} → runId=${runId} state=${runPayload.state?.status}`);
145
+ // Confirm state file was persisted under sandbox .openlife/
146
+ const stateFile = path.join(env.OPENLIFE_STATE_DIR, 'workflows', `${runId}.json`);
147
+ assertTrue(fs.existsSync(stateFile), `workflow state file persisted at ${stateFile}`);
148
+ const statusResult = cli(['workflow', 'status', runId], env);
149
+ assertTrue(statusResult.ok, 'workflow status ok');
150
+ // === Pillar 3: Autonomy primitives (DistributedLock in-process) ===
151
+ const { DistributedLock } = require(path.join(process.cwd(), 'dist', 'orchestrator', 'util', 'DistributedLock.js'));
152
+ const lock = new DistributedLock({ stateDir: env.OPENLIFE_STATE_DIR });
153
+ const acquired = lock.acquire('rs-golden-lock', 5000);
154
+ assertTrue(acquired.ok, 'lock acquire ok');
155
+ const reacquired = lock.acquire('rs-golden-lock', 5000);
156
+ assertTrue(!reacquired.ok, 'second lock acquire blocked while held');
157
+ lock.release(acquired.lockId); // returns void; throws on failure
158
+ // Peek confirms the lock is gone.
159
+ assertTrue(lock.peek('rs-golden-lock') === null, 'lock peek empty after release');
160
+ const reacquiredAfterRelease = lock.acquire('rs-golden-lock', 5000);
161
+ assertTrue(reacquiredAfterRelease.ok, 'lock re-acquirable after release');
162
+ lock.release(reacquiredAfterRelease.lockId);
163
+ console.log('[golden] all three pillars cooperate.');
164
+ console.log('TEST_ROYAL_STACK_GOLDEN_OK');
165
+ }
166
+ finally {
167
+ try {
168
+ fs.rmSync(sandboxRoot, { recursive: true, force: true });
169
+ }
170
+ catch { /* ignore */ }
171
+ }
172
+ }
173
+ try {
174
+ main();
175
+ }
176
+ catch (err) {
177
+ console.error('[golden] FAILED:', err instanceof Error ? err.message : err);
178
+ process.exit(1);
179
+ }
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ /**
3
+ * test_runtime_health_backoff — Story 6.5 regression suite.
4
+ *
5
+ * Three scenarios:
6
+ * 1. Exponential schedule: failure N produces delay ≈ 10s * 2^(N-1)
7
+ * with a 1h cap; explicit unit test on the pure function.
8
+ * 2. markFailure + markHealthy: failures accumulate, until extends with
9
+ * backoff, markHealthy resets to failures=0 and clears
10
+ * permanentlyDown.
11
+ * 3. Retry budget breach: more than MAX_FAILURES failures within the
12
+ * window flips permanentlyDown=true and isCoolingDown()=true.
13
+ *
14
+ * Prints TEST_RUNTIME_HEALTH_BACKOFF_OK on full pass.
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ const fs = __importStar(require("fs"));
51
+ const os = __importStar(require("os"));
52
+ const path = __importStar(require("path"));
53
+ const RuntimeHealthMonitor_1 = require("./orchestrator/RuntimeHealthMonitor");
54
+ function assert(cond, msg) {
55
+ if (!cond)
56
+ throw new Error(`assertion failed: ${msg}`);
57
+ }
58
+ function mkTmp() {
59
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'rh-test-'));
60
+ }
61
+ function rmTmp(dir) {
62
+ try {
63
+ fs.rmSync(dir, { recursive: true, force: true });
64
+ }
65
+ catch { /* ignore */ }
66
+ }
67
+ // ─────────────────────────────────────────────────────────────
68
+ // Scenario 1 — pure backoff function
69
+ // ─────────────────────────────────────────────────────────────
70
+ function scenarioBackoffFunction() {
71
+ assert((0, RuntimeHealthMonitor_1.exponentialBackoffDelayMs)(1) === RuntimeHealthMonitor_1.BASE_DELAY_MS, 'failure 1 = base');
72
+ assert((0, RuntimeHealthMonitor_1.exponentialBackoffDelayMs)(2) === RuntimeHealthMonitor_1.BASE_DELAY_MS * 2, 'failure 2 = 2x');
73
+ assert((0, RuntimeHealthMonitor_1.exponentialBackoffDelayMs)(3) === RuntimeHealthMonitor_1.BASE_DELAY_MS * 4, 'failure 3 = 4x');
74
+ assert((0, RuntimeHealthMonitor_1.exponentialBackoffDelayMs)(4) === RuntimeHealthMonitor_1.BASE_DELAY_MS * 8, 'failure 4 = 8x');
75
+ // Cap at MAX_DELAY_MS — failure count above the cap stays capped
76
+ assert((0, RuntimeHealthMonitor_1.exponentialBackoffDelayMs)(100) === RuntimeHealthMonitor_1.MAX_DELAY_MS, 'failure 100 = cap');
77
+ assert((0, RuntimeHealthMonitor_1.exponentialBackoffDelayMs)(0) === RuntimeHealthMonitor_1.BASE_DELAY_MS, 'failure 0 = base (defensive)');
78
+ console.log('✅ scenario 1: exponential backoff function (base + cap + clamp)');
79
+ }
80
+ // ─────────────────────────────────────────────────────────────
81
+ // Scenario 2 — failure accumulation + recovery
82
+ // ─────────────────────────────────────────────────────────────
83
+ function scenarioAccumulateAndRecover() {
84
+ const tmp = mkTmp();
85
+ try {
86
+ const monitor = new RuntimeHealthMonitor_1.RuntimeHealthMonitor(tmp);
87
+ monitor.markFailure('codex', 'timeout');
88
+ const after1 = monitor.get('codex');
89
+ assert(after1?.failures === 1, 'failures after first call = 1');
90
+ assert(after1.until !== undefined, 'until must be set');
91
+ assert(after1.permanentlyDown !== true, 'must not be permanently down after one failure');
92
+ assert(monitor.isCoolingDown('codex') === true, 'must be cooling down');
93
+ monitor.markFailure('codex', 'timeout again');
94
+ const after2 = monitor.get('codex');
95
+ assert(after2?.failures === 2, 'failures after second call = 2');
96
+ // Until extends — second failure has a larger backoff than first
97
+ const after1UntilMs = new Date(after1.until).getTime();
98
+ const after2UntilMs = new Date(after2.until).getTime();
99
+ assert(after2UntilMs > after1UntilMs, `second until must be later: ${after2UntilMs} vs ${after1UntilMs}`);
100
+ // markHealthy resets
101
+ monitor.markHealthy('codex');
102
+ const recovered = monitor.get('codex');
103
+ assert(recovered?.failures === 0, 'failures reset on markHealthy');
104
+ assert(recovered.permanentlyDown !== true, 'permanentlyDown cleared on markHealthy');
105
+ assert(monitor.isCoolingDown('codex') === false, 'no longer cooling down after markHealthy');
106
+ console.log('✅ scenario 2: accumulate failures + markHealthy resets');
107
+ }
108
+ finally {
109
+ rmTmp(tmp);
110
+ }
111
+ }
112
+ // ─────────────────────────────────────────────────────────────
113
+ // Scenario 3 — retry budget exhausted → permanentlyDown
114
+ // ─────────────────────────────────────────────────────────────
115
+ function scenarioBudgetExhausted() {
116
+ const tmp = mkTmp();
117
+ try {
118
+ const monitor = new RuntimeHealthMonitor_1.RuntimeHealthMonitor(tmp);
119
+ // Drive failures past MAX_FAILURES
120
+ for (let i = 0; i < RuntimeHealthMonitor_1.MAX_FAILURES + 2; i++) {
121
+ monitor.markFailure('gemini', `failure ${i + 1}`);
122
+ }
123
+ const final = monitor.get('gemini');
124
+ assert(final?.failures === RuntimeHealthMonitor_1.MAX_FAILURES + 2, `expected ${RuntimeHealthMonitor_1.MAX_FAILURES + 2} failures, got ${final?.failures}`);
125
+ assert(final.permanentlyDown === true, 'must be permanently down past budget');
126
+ assert(monitor.isCoolingDown('gemini') === true, 'permanentlyDown implies cooling down');
127
+ assert(final.until === undefined, 'permanentlyDown means no scheduled retry');
128
+ // markHealthy reverts even from permanentlyDown (manual reset surface)
129
+ monitor.markHealthy('gemini');
130
+ assert(monitor.get('gemini')?.permanentlyDown !== true, 'manual reset clears permanentlyDown');
131
+ console.log('✅ scenario 3: retry budget exhausted → permanentlyDown + manual reset');
132
+ }
133
+ finally {
134
+ rmTmp(tmp);
135
+ }
136
+ }
137
+ // ─────────────────────────────────────────────────────────────
138
+ // Driver
139
+ // ─────────────────────────────────────────────────────────────
140
+ function main() {
141
+ console.log('🧪 test_runtime_health_backoff — Story 6.5 regression suite');
142
+ scenarioBackoffFunction();
143
+ scenarioAccumulateAndRecover();
144
+ scenarioBudgetExhausted();
145
+ console.log('');
146
+ console.log('TEST_RUNTIME_HEALTH_BACKOFF_OK');
147
+ }
148
+ try {
149
+ main();
150
+ }
151
+ catch (err) {
152
+ console.error('❌ test_runtime_health_backoff FAILED:', err instanceof Error ? err.message : err);
153
+ process.exit(1);
154
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const RuntimePolicy_1 = require("./orchestrator/RuntimePolicy");
4
+ function assert(condition, message) {
5
+ if (!condition)
6
+ throw new Error(message);
7
+ }
8
+ async function main() {
9
+ const runtime = new RuntimePolicy_1.RuntimePolicy();
10
+ runtime.recordResult('gemini', false, 'quota exhausted');
11
+ runtime.recordResult('claude', false, 'auth expired');
12
+ runtime.recordResult('codex', true, 'ok');
13
+ const research = runtime.decide('RESEARCH_ANALYSIS');
14
+ assert(!research.preferred.includes('gemini'), 'gemini should enter cooldown after quota failure');
15
+ assert(research.preferred.includes('codex'), 'research should fallback to codex when gemini is unhealthy');
16
+ const engineering = runtime.decide('ENGINEERING_BUILD');
17
+ assert(!engineering.preferred.includes('claude'), 'claude should enter cooldown after auth failure');
18
+ assert(engineering.preferred[0] === 'codex', 'codex should become preferred when secondary executors cool down');
19
+ const snapshot = runtime.saveSnapshot();
20
+ assert(!!snapshot, 'runtime policy snapshot should be saved');
21
+ console.log('TEST_RUNTIME_POLICY_OK');
22
+ }
23
+ main().catch((error) => {
24
+ console.error(error.message || error);
25
+ process.exit(1);
26
+ });
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const RuntimeProbe_1 = require("./orchestrator/RuntimeProbe");
4
+ function assert(condition, message) {
5
+ if (!condition)
6
+ throw new Error(message);
7
+ }
8
+ async function main() {
9
+ const probe = new RuntimeProbe_1.RuntimeProbe();
10
+ const results = await probe.probeAll();
11
+ assert(results.length === 4, 'should probe all four executors');
12
+ assert(results.every((result) => Array.isArray(result.command) && result.command.length > 0), 'every probe should expose the command used');
13
+ assert(results.every((result) => typeof result.available === 'boolean'), 'every probe should report availability');
14
+ console.log('TEST_RUNTIME_PROBE_OK');
15
+ }
16
+ main().catch((error) => {
17
+ console.error(error.message || error);
18
+ process.exit(1);
19
+ });