@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,256 @@
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.InstallFlow = exports.DEFAULT_HOST = exports.VALID_HOSTS = void 0;
37
+ exports.validateHost = validateHost;
38
+ exports.detectHostFromEnv = detectHostFromEnv;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const SystemInstaller_1 = require("./SystemInstaller");
42
+ const AutonomousInstaller_1 = require("./AutonomousInstaller");
43
+ const SystemDoctor_1 = require("../orchestrator/SystemDoctor");
44
+ const ModelManager_1 = require("../orchestrator/ModelManager");
45
+ const HostInstaller_1 = require("./HostInstaller");
46
+ exports.VALID_HOSTS = ['claude-code', 'gemini-cli', 'codex'];
47
+ exports.DEFAULT_HOST = 'claude-code';
48
+ /**
49
+ * Validates a string is a known host. Throws with a clear message listing valid hosts.
50
+ * Use this at CLI boundary (option parsing) to reject typos early.
51
+ */
52
+ function validateHost(value) {
53
+ if (!value)
54
+ return exports.DEFAULT_HOST;
55
+ const normalized = String(value).trim().toLowerCase();
56
+ if (!exports.VALID_HOSTS.includes(normalized)) {
57
+ throw new Error(`INVALID_HOST: "${value}" — hosts válidos: ${exports.VALID_HOSTS.join(', ')}. Default: ${exports.DEFAULT_HOST}.`);
58
+ }
59
+ return normalized;
60
+ }
61
+ /**
62
+ * Auto-detects which host CLI invoked OpenLife by inspecting env vars set by each CLI:
63
+ * - claude-code sets CLAUDECODE or CLAUDE_PROJECT_DIR
64
+ * - gemini-cli sets GEMINI_CONFIG_DIR
65
+ * - codex sets CODEX_HOME
66
+ * Returns null if no detection matches — caller falls back to DEFAULT_HOST.
67
+ */
68
+ function detectHostFromEnv(env = process.env) {
69
+ if (env.CLAUDECODE || env.CLAUDE_PROJECT_DIR)
70
+ return 'claude-code';
71
+ if (env.GEMINI_CONFIG_DIR)
72
+ return 'gemini-cli';
73
+ if (env.CODEX_HOME)
74
+ return 'codex';
75
+ return null;
76
+ }
77
+ class InstallFlow {
78
+ root;
79
+ systemInstaller;
80
+ autonomousInstaller;
81
+ doctor;
82
+ modelManager;
83
+ constructor(root = process.cwd(), systemInstaller = new SystemInstaller_1.SystemInstaller(root), autonomousInstaller = new AutonomousInstaller_1.AutonomousInstaller(root), doctor = new SystemDoctor_1.SystemDoctor(root), modelManager = new ModelManager_1.ModelManager()) {
84
+ this.root = root;
85
+ this.systemInstaller = systemInstaller;
86
+ this.autonomousInstaller = autonomousInstaller;
87
+ this.doctor = doctor;
88
+ this.modelManager = modelManager;
89
+ }
90
+ run(options = {}) {
91
+ const profile = options.profile || 'framework';
92
+ // Story 3.1 — host now validated; auto-detect from env if not provided.
93
+ const host = options.host
94
+ ? validateHost(options.host)
95
+ : (detectHostFromEnv() || exports.DEFAULT_HOST);
96
+ const manifestPath = this.systemInstaller.install();
97
+ const projectFilePath = this.systemInstaller.initProject();
98
+ const doctorSummary = options.skipDoctor ? undefined : this.buildDoctorSummary(this.doctor.run());
99
+ const autonomous = profile === 'autonomous' ? this.autonomousInstaller.install() : undefined;
100
+ const modelChain = this.applyModelOrder(options.modelOrder || []);
101
+ // Story 3.3 — host-specific file copy (templates → host CLI paths).
102
+ // Gracefully degrade when the host installer hasn't been implemented for the
103
+ // chosen host yet: still produce the `.openlife/` state and report, but surface
104
+ // the skip in `hostInstall` so the user knows the host-specific copy was a no-op.
105
+ let hostInstall;
106
+ try {
107
+ hostInstall = new HostInstaller_1.HostInstaller().install(host, { targetRoot: this.root });
108
+ }
109
+ catch (err) {
110
+ if (err instanceof HostInstaller_1.HostNotYetSupportedError) {
111
+ const reason = err.message;
112
+ console.warn(`[install-flow] host install skipped: ${reason}`);
113
+ hostInstall = { skipped: true, reason };
114
+ }
115
+ else {
116
+ throw err;
117
+ }
118
+ }
119
+ const nextCommands = this.buildNextCommands(profile, host);
120
+ const report = {
121
+ installedAt: new Date().toISOString(),
122
+ profile,
123
+ host,
124
+ root: this.root,
125
+ manifestPath,
126
+ projectFilePath,
127
+ doctorSummary,
128
+ autonomous,
129
+ modelChain,
130
+ nextCommands,
131
+ hostInstall
132
+ };
133
+ const reportPath = path.join(this.root, '.openlife', 'install-flow-report.json');
134
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf-8');
135
+ return {
136
+ ...report,
137
+ reportPath
138
+ };
139
+ }
140
+ renderSummary(result) {
141
+ const lines = [];
142
+ lines.push('🚀 OpenLife Setup concluído');
143
+ lines.push('=================================================');
144
+ lines.push(`📁 Root: ${result.root}`);
145
+ lines.push(`🧭 Profile: ${result.profile}`);
146
+ lines.push(`🧠 Host: ${result.host}`);
147
+ lines.push(`🧾 Manifest: ${result.manifestPath}`);
148
+ lines.push(`📝 Projeto: ${result.projectFilePath}`);
149
+ lines.push(`📦 Report: ${result.reportPath}`);
150
+ if (result.modelChain?.length) {
151
+ lines.push(`🧠 Model chain: ${result.modelChain.join(' -> ')}`);
152
+ }
153
+ if (result.doctorSummary) {
154
+ lines.push('');
155
+ lines.push('🩺 Doctor summary');
156
+ lines.push(`- checks: ${result.doctorSummary.total}`);
157
+ lines.push(`- ok: ${result.doctorSummary.ok}`);
158
+ lines.push(`- failed: ${result.doctorSummary.failed}`);
159
+ if (result.doctorSummary.failed > 0) {
160
+ lines.push('- principais pendências:');
161
+ for (const check of result.doctorSummary.failedChecks.slice(0, 5)) {
162
+ lines.push(` • ${check.name}: ${check.detail}`);
163
+ }
164
+ }
165
+ }
166
+ if (result.autonomous) {
167
+ lines.push('');
168
+ lines.push(`🤖 Artefatos autônomos: ${result.autonomous.filesCreated.length} arquivos atualizados`);
169
+ }
170
+ if (result.hostInstall) {
171
+ lines.push('');
172
+ if ('skipped' in result.hostInstall && result.hostInstall.skipped) {
173
+ lines.push(`🧩 Host install: skipped — ${result.hostInstall.reason}`);
174
+ }
175
+ else {
176
+ const files = result.hostInstall.files;
177
+ const created = files.filter((f) => f.action === 'created').length;
178
+ const updated = files.filter((f) => f.action === 'updated').length;
179
+ const unchanged = files.filter((f) => f.action === 'skipped-identical').length;
180
+ lines.push(`🧩 Host install: ${files.length} files copied (${created} created, ${updated} updated, ${unchanged} unchanged)`);
181
+ for (const note of result.hostInstall.notes) {
182
+ lines.push(` • ${note}`);
183
+ }
184
+ }
185
+ }
186
+ lines.push('');
187
+ lines.push('▶️ Próximos comandos (copiar e colar):');
188
+ for (const command of result.nextCommands) {
189
+ lines.push(` ${command}`);
190
+ }
191
+ return lines;
192
+ }
193
+ buildDoctorSummary(checks) {
194
+ const failedChecks = checks.filter((check) => !check.ok);
195
+ return {
196
+ total: checks.length,
197
+ ok: checks.length - failedChecks.length,
198
+ failed: failedChecks.length,
199
+ failedChecks
200
+ };
201
+ }
202
+ applyModelOrder(modelOrder) {
203
+ const normalized = modelOrder.map(m => m.trim()).filter(Boolean);
204
+ if (!normalized.length)
205
+ return undefined;
206
+ const primary = this.modelManager.parseModelString(normalized[0]);
207
+ const fallbacks = normalized.slice(1).map(m => this.modelManager.parseModelString(m));
208
+ const cfg = this.modelManager.getModelConfig();
209
+ cfg.primary = primary;
210
+ cfg.fallbacks = fallbacks;
211
+ this.modelManager.saveConfig(cfg);
212
+ const allowlist = Array.from(new Set(normalized.map((m) => {
213
+ const p = m.split('/')[0].toLowerCase();
214
+ if (p.includes('gemini'))
215
+ return 'gemini';
216
+ if (p.includes('openai') || p.includes('codex'))
217
+ return 'codex';
218
+ if (p.includes('claude') || p.includes('anthropic'))
219
+ return 'claude';
220
+ return '';
221
+ }).filter(Boolean)));
222
+ if (allowlist.length > 0) {
223
+ const envPath = path.join(this.root, '.env');
224
+ const current = fs.existsSync(envPath) ? fs.readFileSync(envPath, 'utf-8') : '';
225
+ const without = current
226
+ .split('\n')
227
+ .filter(line => !line.startsWith('OPENLIFE_ALLOWED_LLM_EXECUTORS='))
228
+ .join('\n')
229
+ .replace(/\n+$/, '');
230
+ const next = `${without}\nOPENLIFE_ALLOWED_LLM_EXECUTORS=${allowlist.join(',')}\n`;
231
+ fs.writeFileSync(envPath, next, 'utf-8');
232
+ }
233
+ return normalized;
234
+ }
235
+ buildNextCommands(profile, host) {
236
+ // Story 3.1 — `mode set` is documented but doesn't exist; replaced with `system setup`
237
+ // (which was the working command). Same fix shipped in commit aba599b (INSTALL.md).
238
+ const base = [
239
+ `openlife system setup --profile ${profile} --host ${host}`,
240
+ 'openlife system status',
241
+ 'openlife system doctor'
242
+ ];
243
+ if (profile === 'autonomous') {
244
+ return [
245
+ ...base,
246
+ 'openlife agent start',
247
+ 'openlife agent status'
248
+ ];
249
+ }
250
+ return [
251
+ ...base,
252
+ 'openlife models status'
253
+ ];
254
+ }
255
+ }
256
+ exports.InstallFlow = InstallFlow;
@@ -0,0 +1,47 @@
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.loadHeadlessConfig = loadHeadlessConfig;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ function loadHeadlessConfig(filePath) {
40
+ if (!filePath)
41
+ return {};
42
+ const abs = path.isAbsolute(filePath) ? filePath : path.join(process.cwd(), filePath);
43
+ if (!fs.existsSync(abs))
44
+ throw new Error(`setup file não encontrado: ${abs}`);
45
+ const raw = fs.readFileSync(abs, 'utf-8');
46
+ return JSON.parse(raw);
47
+ }
@@ -0,0 +1,148 @@
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.runPrecheck = runPrecheck;
37
+ exports.maskToken = maskToken;
38
+ exports.saveTelegramConfig = saveTelegramConfig;
39
+ exports.validateTelegramToken = validateTelegramToken;
40
+ exports.checkTelegram409Conflict = checkTelegram409Conflict;
41
+ exports.writeTelegramLock = writeTelegramLock;
42
+ exports.validateTelegramChatId = validateTelegramChatId;
43
+ exports.chatSmoke = chatSmoke;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const child_process_1 = require("child_process");
47
+ function runPrecheck() {
48
+ const checks = [];
49
+ try {
50
+ const v = (0, child_process_1.execSync)('node -v', { encoding: 'utf-8' }).trim();
51
+ checks.push({ name: 'node', ok: true, detail: v });
52
+ }
53
+ catch {
54
+ checks.push({ name: 'node', ok: false, detail: 'node não encontrado' });
55
+ }
56
+ try {
57
+ const v = (0, child_process_1.execSync)('npm -v', { encoding: 'utf-8' }).trim();
58
+ checks.push({ name: 'npm', ok: true, detail: v });
59
+ }
60
+ catch {
61
+ checks.push({ name: 'npm', ok: false, detail: 'npm não encontrado' });
62
+ }
63
+ const dirOk = fs.existsSync(process.cwd());
64
+ checks.push({ name: 'workspace', ok: dirOk, detail: process.cwd() });
65
+ return { ok: checks.every(c => c.ok), checks };
66
+ }
67
+ function maskToken(token) {
68
+ if (!token)
69
+ return '';
70
+ if (token.length < 10)
71
+ return '***';
72
+ return `${token.slice(0, 6)}...${token.slice(-4)}`;
73
+ }
74
+ function saveTelegramConfig(root, token, chatId) {
75
+ const envPath = path.join(root, '.env');
76
+ const current = fs.existsSync(envPath) ? fs.readFileSync(envPath, 'utf-8') : '';
77
+ const lines = current.split('\n').filter(Boolean).filter(l => !l.startsWith('TELEGRAM_BOT_TOKEN=') && !l.startsWith('TELEGRAM_CHAT_ID='));
78
+ if (token)
79
+ lines.push(`TELEGRAM_BOT_TOKEN=${token}`);
80
+ if (chatId)
81
+ lines.push(`TELEGRAM_CHAT_ID=${chatId}`);
82
+ fs.writeFileSync(envPath, lines.join('\n') + '\n', 'utf-8');
83
+ return { saved: true, path: envPath, maskedToken: token ? maskToken(token) : undefined };
84
+ }
85
+ function validateTelegramToken(token) {
86
+ if (!token)
87
+ return { ok: false, detail: 'token ausente' };
88
+ const formatOk = /^\d{6,}:[A-Za-z0-9_-]{20,}$/.test(token);
89
+ if (!formatOk)
90
+ return { ok: false, detail: 'formato inválido' };
91
+ try {
92
+ const raw = (0, child_process_1.execFileSync)('curl', ['-sS', '--max-time', '12', `https://api.telegram.org/bot${token}/getMe`], { encoding: 'utf-8' }).trim();
93
+ const parsed = JSON.parse(raw);
94
+ if (parsed.ok)
95
+ return { ok: true, detail: 'token válido (getMe OK)' };
96
+ return { ok: false, detail: parsed.description || 'getMe retornou erro' };
97
+ }
98
+ catch (e) {
99
+ const msg = e instanceof Error ? e.message : 'erro desconhecido';
100
+ return { ok: false, detail: `falha na validação remota: ${msg}` };
101
+ }
102
+ }
103
+ function checkTelegram409Conflict(root, token) {
104
+ if (!token)
105
+ return { ok: true, detail: 'token ausente, sem verificação de conflito' };
106
+ const lockPath = path.join(root, '.openlife', 'telegram-poller.lock.json');
107
+ if (!fs.existsSync(lockPath))
108
+ return { ok: true, detail: 'sem lock ativo' };
109
+ try {
110
+ const lock = JSON.parse(fs.readFileSync(lockPath, 'utf-8'));
111
+ if (lock.token && lock.token === token) {
112
+ return { ok: false, detail: `conflito 409 provável: token já em uso (pid=${lock.pid ?? 'unknown'})` };
113
+ }
114
+ return { ok: true, detail: 'lock existe, mas com token diferente' };
115
+ }
116
+ catch {
117
+ return { ok: true, detail: 'lock inválido, ignorado' };
118
+ }
119
+ }
120
+ function writeTelegramLock(root, token) {
121
+ if (!token)
122
+ return;
123
+ const lockPath = path.join(root, '.openlife', 'telegram-poller.lock.json');
124
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
125
+ fs.writeFileSync(lockPath, JSON.stringify({ token, pid: process.pid, ts: new Date().toISOString() }, null, 2), 'utf-8');
126
+ }
127
+ function validateTelegramChatId(token, chatId) {
128
+ if (!token)
129
+ return { ok: false, detail: 'token ausente para validar chat_id' };
130
+ if (!chatId)
131
+ return { ok: true, detail: 'chat_id não informado (validação de envio pulada)' };
132
+ const msg = encodeURIComponent('✅ OpenLife install test message');
133
+ try {
134
+ const cmd = `curl -sS --max-time 15 "https://api.telegram.org/bot${token}/sendMessage?chat_id=${chatId}&text=${msg}"`;
135
+ const raw = (0, child_process_1.execSync)(cmd, { encoding: 'utf-8' }).trim();
136
+ const parsed = JSON.parse(raw);
137
+ if (parsed.ok)
138
+ return { ok: true, detail: 'chat_id válido (sendMessage OK)' };
139
+ return { ok: false, detail: parsed.description || 'sendMessage retornou erro' };
140
+ }
141
+ catch (e) {
142
+ const msg = e instanceof Error ? e.message : 'erro desconhecido';
143
+ return { ok: false, detail: `falha ao validar chat_id: ${msg}` };
144
+ }
145
+ }
146
+ function chatSmoke() {
147
+ return { ok: true, detail: 'openlife chat disponível (smoke lógico inicial)' };
148
+ }
@@ -0,0 +1,75 @@
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.InstallStateStore = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ class InstallStateStore {
40
+ root;
41
+ filePath;
42
+ constructor(root = process.cwd()) {
43
+ this.root = root;
44
+ this.filePath = path.join(this.root, '.openlife', 'install-state.json');
45
+ }
46
+ path() {
47
+ return this.filePath;
48
+ }
49
+ load() {
50
+ if (!fs.existsSync(this.filePath))
51
+ return null;
52
+ try {
53
+ const raw = fs.readFileSync(this.filePath, 'utf-8');
54
+ return JSON.parse(raw);
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ save(state) {
61
+ const next = {
62
+ version: 1,
63
+ updatedAt: new Date().toISOString(),
64
+ ...state
65
+ };
66
+ fs.mkdirSync(path.dirname(this.filePath), { recursive: true });
67
+ fs.writeFileSync(this.filePath, JSON.stringify(next, null, 2), 'utf-8');
68
+ return next;
69
+ }
70
+ clear() {
71
+ if (fs.existsSync(this.filePath))
72
+ fs.unlinkSync(this.filePath);
73
+ }
74
+ }
75
+ exports.InstallStateStore = InstallStateStore;