@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
package/INSTALL.md ADDED
@@ -0,0 +1,266 @@
1
+ # OpenLife Installation Manual
2
+
3
+ Este manual deixa qualquer usuário pronto para instalar e usar o OpenLife.
4
+
5
+ ## Quick start
6
+
7
+ ```bash
8
+ npm install -g @openlife/cli
9
+ openlife init
10
+ ```
11
+
12
+ `openlife init` é o **wizard interativo** recomendado: pergunta profile, host, ordem de modelos LLM, Telegram (autonomous) e doctor, e roda o `InstallFlow` para você. Se já houver instalação prévia (`.openlife/install-manifest.json`), o wizard oferece `reinstall | repair | abort`.
13
+
14
+ Para automação/CI use o caminho não-interativo na seção 5.
15
+
16
+ ### Disponibilidade no npm
17
+
18
+ A primeira versão pública (`@openlife/cli@1.6.0`) é publicada via GitHub
19
+ Actions (`.github/workflows/publish.yml`) quando o owner do repositório
20
+ dispara o workflow após registrar o secret `NPM_TOKEN`. Detalhes em
21
+ `docs/release-process.md` seção 8.
22
+
23
+ Se `npm install -g @openlife/cli` retornar **404 Not Found**, o publish
24
+ ainda não foi acionado. Caminhos alternativos enquanto isso:
25
+
26
+ - **Via código-fonte** (seção 8 deste manual) — funciona em qualquer
27
+ máquina com Node 20+ e Git.
28
+ - **Via `npm link` local** — se você está desenvolvendo no próprio
29
+ clone: `git clone … && cd openlife-core && npm install && npm run
30
+ build && npm link`. Depois `openlife --help` resolve para o checkout.
31
+
32
+ Conflito conhecido: se você já fez `npm link` local e depois roda
33
+ `npm install -g @openlife/cli`, o instalador global pode falhar.
34
+ Rode `npm unlink -g @openlife/cli` antes do `install -g`.
35
+
36
+ ## 1) Requisitos
37
+
38
+ - Node.js **20+**
39
+ - npm **10+**
40
+ - Git (para instalação por fonte)
41
+
42
+ Verificação:
43
+
44
+ ```bash
45
+ node -v
46
+ npm -v
47
+ git --version
48
+ ```
49
+
50
+ ## 2) Hosts suportados
51
+
52
+ OpenLife instala artefatos no host CLI escolhido. Cada host tem um documento dedicado em `docs/install/`.
53
+
54
+ | Host | Status | Detecção (env var) | Artefatos instalados |
55
+ |--------------|---------------------------------|------------------------------------------|-------------------------------------------------------------------------------------|
56
+ | `claude-code`| **Supported (v1.0)** | `CLAUDECODE` ou `CLAUDE_PROJECT_DIR` | `.claude/agents/openlife-*.md`, `.claude/commands/openlife/*.md`, MCP staged |
57
+ | `gemini-cli` | Reserved for v1.1 follow-up | `GEMINI_CONFIG_DIR` | Nenhum no host — `.openlife/` é criado; install retorna `HOST_NOT_YET_SUPPORTED` |
58
+ | `codex` | Reserved for v1.1 follow-up | `CODEX_HOME` | Nenhum no host — `.openlife/` é criado; install retorna `HOST_NOT_YET_SUPPORTED` |
59
+
60
+ **Degradação graciosa:** escolher `gemini-cli` ou `codex` não trava o setup. O `InstallFlow` captura `HostNotYetSupportedError` e segue: `.openlife/` (state dir) ainda é provisionado, e o resultado reporta `hostInstall: { ok: false, reason: 'host_not_yet_supported' }` em vez de abortar.
61
+
62
+ Documentação por host:
63
+
64
+ - `docs/install/claude-code.md`
65
+ - `docs/install/gemini-cli.md`
66
+ - `docs/install/codex.md`
67
+
68
+ ## 3) Detecção automática de host
69
+
70
+ Se você não passar `--host`, o `InstallFlow.detectHostFromEnv()` infere a partir do ambiente (ordem de precedência):
71
+
72
+ 1. `CLAUDECODE` ou `CLAUDE_PROJECT_DIR` → `claude-code`
73
+ 2. `GEMINI_CONFIG_DIR` → `gemini-cli`
74
+ 3. `CODEX_HOME` → `codex`
75
+ 4. Sem match → default `claude-code`
76
+
77
+ Para forçar um host independentemente do ambiente, use `--host <name>`.
78
+
79
+ ## 4) Profiles: `framework` vs `autonomous`
80
+
81
+ | Profile | Quando usar | O que muda |
82
+ |--------------|----------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|
83
+ | `framework` | Uso interativo local — operador no terminal chamando comandos. | Não inicia daemon, não exige `TELEGRAM_BOT_TOKEN`. |
84
+ | `autonomous` | Runtime contínuo — daemon + Telegram gateway + governance always-on. | Exige `TELEGRAM_BOT_TOKEN`; o wizard checa e avisa se ausente. |
85
+
86
+ ### Runtime profiles (advanced)
87
+
88
+ Além do profile de instalação (`framework` vs `autonomous`), existe um profile **runtime** opcional controlado por `OPENLIFE_RUNTIME_PROFILE`. Hoje só há um valor suportado:
89
+
90
+ | `OPENLIFE_RUNTIME_PROFILE` | Efeito |
91
+ |----------------------------|--------|
92
+ | `oauth-only` (case-insensitive) | `openlife doctor world` rebaixa quatro checks para **`info`** quando falham: `cli:ollama` (default: `blocker`) e `env:OPENAI_API_KEY` / `env:GEMINI_API_KEY` / `env:ANTHROPIC_API_KEY` (default: `warning`). |
93
+
94
+ Use quando o operador roda exclusivamente via CLIs autenticadas por OAuth (`claude`, `codex`, `gemini`) e não tem API keys nem Ollama local — essas ausências deixam de bloquear o doctor. **É apenas um classificador de severidade**: a fallback chain do `Brain.ts` continua igual; nenhum provider é ligado/desligado. Para detalhes (incluindo exemplo before/after) veja [`docs/install/runtime-profiles.md`](docs/install/runtime-profiles.md).
95
+
96
+ ## 5) Instalação não-interativa
97
+
98
+ Para scripts, CI e automação, pule o wizard e use os flags diretos:
99
+
100
+ ```bash
101
+ # Framework + claude-code (caminho mais comum)
102
+ openlife system setup --profile framework --host claude-code
103
+
104
+ # Autonomous + claude-code
105
+ openlife system setup --profile autonomous --host claude-code
106
+
107
+ # Forçar host reservado (state dir é criado, host install é skipped)
108
+ openlife system setup --profile framework --host gemini-cli
109
+ ```
110
+
111
+ Explicação dos flags:
112
+
113
+ - `--profile <framework|autonomous>` — required. Veja seção 4.
114
+ - `--host <claude-code|gemini-cli|codex>` — opcional. Sem ele, usa `detectHostFromEnv()` → default `claude-code`.
115
+ - O comando imprime um JSON com o resultado por etapa (`stateDir`, `hostInstall`, `manifestPath`) para que CI processe.
116
+
117
+ ## 6) Instalação recomendada (npm global)
118
+
119
+ ```bash
120
+ npm install -g @openlife/cli
121
+ openlife --help
122
+ openlife init # ou: openlife system setup --profile framework --host claude-code
123
+ ```
124
+
125
+ ## 7) Instalação sem global (npx)
126
+
127
+ ```bash
128
+ npx @openlife/cli --help
129
+ npx @openlife/cli init
130
+ ```
131
+
132
+ ## 8) Instalação via código-fonte
133
+
134
+ ```bash
135
+ git clone https://github.com/GOOODZ/openlife-core.git
136
+ cd openlife-core
137
+ npm install
138
+ npm run build
139
+ node bin/openlife.js init
140
+ ```
141
+
142
+ ## 9) Modo autônomo (após install)
143
+
144
+ ### Instalação de artefatos do daemon
145
+
146
+ ```bash
147
+ openlife agent install
148
+ ```
149
+
150
+ ### Start manual
151
+
152
+ ```bash
153
+ openlife agent start
154
+ openlife agent status
155
+ ```
156
+
157
+ ### Bundle automatizado (local/WSL/Linux)
158
+
159
+ ```bash
160
+ ./scripts/openlife-autonomous-install.sh
161
+ ```
162
+
163
+ ## 10) Uninstall reversível
164
+
165
+ ```bash
166
+ openlife system uninstall --host claude-code
167
+ ```
168
+
169
+ **Removido** (apenas artefatos OpenLife):
170
+ - `.claude/agents/openlife-*.md` — somente arquivos com prefixo `openlife-`, agentes do usuário ficam intactos
171
+ - `.claude/commands/openlife/` — diretório inteiro (namespace nosso)
172
+ - MCP snippet staged
173
+
174
+ **Preservado** (intencionalmente, para evitar perda de dados):
175
+ - `.openlife/` — runtime state, missions, governance consents, learning, pilots
176
+ - `.catalog/` — catálogos runtime de agents/skills/squads
177
+ - `~/.claude.json` — config global do Claude Code (operator merges manualmente)
178
+
179
+ Para começar do zero: `rm -rf .openlife/` após o uninstall.
180
+
181
+ ## 11) Linux server (systemd)
182
+
183
+ ```bash
184
+ sudo cp scripts/openlife-agent.service.example /etc/systemd/system/openlife-agent.service
185
+ sudo systemctl daemon-reload
186
+ sudo systemctl enable --now openlife-agent
187
+ sudo systemctl status openlife-agent
188
+ ```
189
+
190
+ ## 12) Fallback (Supervisor)
191
+
192
+ ```bash
193
+ sudo supervisorctl reread
194
+ sudo supervisorctl update
195
+ sudo supervisorctl status
196
+ ```
197
+
198
+ Use o template: `scripts/openlife-agent.supervisord.conf.example`.
199
+
200
+ ## 13) PATH e pós-instalação
201
+
202
+ O pacote executa checks automáticos no `postinstall`:
203
+ - valida Node/npm no PATH
204
+ - avisa sobre PATH global npm
205
+ - alerta sobre dependências opcionais (`claude`, `codex`, `gemini`)
206
+
207
+ Descobrir diretório de binários globais npm:
208
+
209
+ ```bash
210
+ npm bin -g
211
+ ```
212
+
213
+ ## 14) Diagnóstico
214
+
215
+ Após o install, rode:
216
+
217
+ ```bash
218
+ openlife system doctor
219
+ openlife system status
220
+ openlife models status
221
+ ```
222
+
223
+ No Claude Code (depois de instalar para `claude-code`), use os slash commands:
224
+
225
+ - `/openlife:status`
226
+ - `/openlife:doctor`
227
+ - `/openlife:ask`
228
+ - `/openlife:dream`
229
+
230
+ ## 15) Troubleshooting
231
+
232
+ ### Problema 1 — Missing API keys (`OPENAI_API_KEY` / `ANTHROPIC_API_KEY` / `GEMINI_API_KEY`)
233
+
234
+ `openlife system doctor` reporta keys ausentes. Crie `.env` na raiz do projeto:
235
+
236
+ ```bash
237
+ OPENAI_API_KEY=sk-...
238
+ ANTHROPIC_API_KEY=sk-ant-...
239
+ GEMINI_API_KEY=...
240
+ ```
241
+
242
+ O wizard `openlife init` não bloqueia por falta de keys (`framework` profile roda com fallback), mas o autonomous profile precisa de pelo menos um provider funcional + Telegram.
243
+
244
+ ### Problema 2 — Host não detectado / wizard escolhe o errado
245
+
246
+ Sintoma: `openlife init` propõe `claude-code` quando você queria `gemini-cli` (ou vice-versa).
247
+
248
+ Causa: env vars ausentes ou conflitantes. Verifique:
249
+
250
+ ```bash
251
+ echo $CLAUDECODE $CLAUDE_PROJECT_DIR $GEMINI_CONFIG_DIR $CODEX_HOME
252
+ ```
253
+
254
+ Solução: passe `--host` explicitamente no caminho não-interativo, ou aceite o default proposto pelo wizard e troque depois com um novo `openlife system setup`.
255
+
256
+ ### Problema 3 — Install para `gemini-cli` ou `codex` retorna `skipped`
257
+
258
+ Esperado. Esses hosts estão **reservados para v1.1 follow-up** (ver seção 2). O `.openlife/` ainda é criado e o restante do sistema funciona — só não há agents/commands no host. Quando a Story 3.7 (gemini-cli/codex installers) for shipada, o mesmo comando passa a instalar sem alterações de flags.
259
+
260
+ ## 16) Links úteis
261
+
262
+ - README: [README.md](README.md)
263
+ - Per-host docs: [docs/install/claude-code.md](docs/install/claude-code.md), [docs/install/gemini-cli.md](docs/install/gemini-cli.md), [docs/install/codex.md](docs/install/codex.md)
264
+ - Quickstart: [docs/quickstart.md](docs/quickstart.md)
265
+ - Comandos: [docs/commands.md](docs/commands.md)
266
+ - Autônomo: [docs/autonomous-install.md](docs/autonomous-install.md)
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rafa Leão
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,142 @@
1
+ # OpenLife CLI
2
+
3
+ OpenLife é um CLI/framework de orquestração com dois modos principais:
4
+
5
+ - **CLI framework**: uso local por terminal, automações e comandos de operador.
6
+ - **Agente autônomo**: runtime contínuo com daemon, Telegram e governança.
7
+
8
+ > OpenLife é separado do Hermes. Hermes pode ajudar a operar/desenvolver OpenLife, mas o runtime do OpenLife não deve depender de `~/.hermes` nem de pastas do Obsidian.
9
+
10
+ ## Fonte executável canônica
11
+
12
+ - Código/dev: `D:\VSCODDE-DEV\openlife-core-main`
13
+ - WSL: `/mnt/d/VSCODDE-DEV/openlife-core-main`
14
+ - GitHub: `https://github.com/GOOODZ/openlife-core`
15
+
16
+ Obsidian (`OPENLIFE_PRODUCTION` e `LARA/OPEN-LIFE`) é camada estratégica/documental. Catálogos runtime devem viver no repo/cloud, por exemplo:
17
+
18
+ ```txt
19
+ .catalog/agents/
20
+ .catalog/squads/
21
+ .catalog/skills/
22
+ .catalog/mcps/
23
+ ```
24
+
25
+ ## Quick Start
26
+
27
+ ### Caminho recomendado — wizard interativo
28
+
29
+ ```bash
30
+ npm install -g @openlife/cli
31
+ openlife init
32
+ ```
33
+
34
+ `openlife init` pergunta profile, host, ordem de modelos LLM, Telegram (autonomous) e doctor; depois chama o mesmo `InstallFlow` que o caminho não-interativo. Detalhes completos em [INSTALL.md](INSTALL.md).
35
+
36
+ ### Fallback não-interativo (CI / scripts)
37
+
38
+ ```bash
39
+ openlife system setup --profile framework --host claude-code
40
+ # ou
41
+ openlife system setup --profile autonomous --host claude-code
42
+ ```
43
+
44
+ ### Hosts suportados
45
+
46
+ | Host | Status | Detecção (env) |
47
+ |--------------|---------------------------------|--------------------------------------|
48
+ | `claude-code`| **Supported (v1.0)** | `CLAUDECODE` ou `CLAUDE_PROJECT_DIR` |
49
+ | `gemini-cli` | Reserved for v1.1 follow-up | `GEMINI_CONFIG_DIR` |
50
+ | `codex` | Reserved for v1.1 follow-up | `CODEX_HOME` |
51
+
52
+ `gemini-cli` e `codex` são aceitos pelo wizard e pelo CLI mas retornam `HOST_NOT_YET_SUPPORTED` no passo de instalação no host — `.openlife/` ainda é criado. Veja [INSTALL.md](INSTALL.md) para o quadro completo e os documentos por host em [docs/install/](docs/install/).
53
+
54
+ ## Outros comandos
55
+
56
+ ### Subir operação diária
57
+
58
+ ```bash
59
+ openlife up
60
+ ```
61
+
62
+ ### Iniciar daemon manualmente
63
+
64
+ ```bash
65
+ openlife start --daemon
66
+ ```
67
+
68
+ ### Chat local
69
+
70
+ ```bash
71
+ openlife ask "sua mensagem aqui"
72
+ ```
73
+
74
+ ## Rodar do código-fonte
75
+
76
+ ```bash
77
+ git clone https://github.com/GOOODZ/openlife-core.git
78
+ cd openlife-core
79
+ npm install
80
+ npm run build
81
+ node bin/openlife.js --help
82
+ ```
83
+
84
+ ## Quickstart de validação
85
+
86
+ ```bash
87
+ node bin/openlife.js --help
88
+ node bin/openlife.js status
89
+ node bin/openlife.js doctor
90
+ node bin/openlife.js system doctor
91
+ node bin/openlife.js phase1-check
92
+ node bin/openlife.js agents list
93
+ node bin/openlife.js squads list
94
+ node bin/openlife.js skills list
95
+ node bin/openlife.js mcp status --real
96
+ ```
97
+
98
+ ## Testes e qualidade
99
+
100
+ ```bash
101
+ npm run build
102
+ npm run test:all
103
+ ```
104
+
105
+ Testes essenciais individuais:
106
+
107
+ ```bash
108
+ npm run test:distribution
109
+ npm run test:orchestration
110
+ npm run test:runtime-source
111
+ ```
112
+
113
+ ## Pré-requisitos
114
+
115
+ - Node.js 20+
116
+ - npm 10+
117
+ - CLIs opcionais de execução: `claude`, `codex`, `gemini`
118
+ - Telegram configurado para modo autônomo
119
+
120
+ ## Telegram
121
+
122
+ O bot/routing Telegram deve:
123
+
124
+ - validar `TELEGRAM_BOT_TOKEN` antes de iniciar;
125
+ - validar `OPENLIFE_TELEGRAM_ALLOWED_USER_ID` em produção;
126
+ - evitar múltiplos long-pollers com o mesmo token;
127
+ - responder de forma verdadeira, sem fallback mock enganoso.
128
+
129
+ ## Troubleshooting rápido
130
+
131
+ ```bash
132
+ openlife doctor
133
+ openlife system doctor
134
+ openlife status
135
+ openlife phase1-check
136
+ ```
137
+
138
+ Se o comando global não funcionar, rode via repo:
139
+
140
+ ```bash
141
+ node bin/openlife.js --help
142
+ ```
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require('../dist/index.js');
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const express_1 = __importDefault(require("express"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const app = (0, express_1.default)();
10
+ app.use(express_1.default.json());
11
+ function readJson(filePath) {
12
+ if (!fs_1.default.existsSync(filePath))
13
+ return [];
14
+ try {
15
+ return JSON.parse(fs_1.default.readFileSync(filePath, 'utf-8'));
16
+ }
17
+ catch {
18
+ return [];
19
+ }
20
+ }
21
+ function writeJson(filePath, payload) {
22
+ fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true });
23
+ fs_1.default.writeFileSync(filePath, JSON.stringify(payload, null, 2), 'utf-8');
24
+ }
25
+ const catalogDir = path_1.default.join(process.cwd(), '.catalog');
26
+ const teamsFile = path_1.default.join(catalogDir, 'teams.json');
27
+ const networksFile = path_1.default.join(catalogDir, 'skill-networks.json');
28
+ app.get('/api/v1/admin/teams', (_req, res) => {
29
+ res.json({ ok: true, teams: readJson(teamsFile) });
30
+ });
31
+ app.get('/api/v1/admin/networks', (_req, res) => {
32
+ res.json({ ok: true, networks: readJson(networksFile) });
33
+ });
34
+ app.post('/api/v1/admin/teams/upsert', (req, res) => {
35
+ const body = req.body || {};
36
+ if (!body.id)
37
+ return res.status(400).json({ ok: false, error: 'id obrigatório' });
38
+ const arr = readJson(teamsFile);
39
+ const next = { id: String(body.id), domain: String(body.domain || 'general'), description: String(body.description || ''), slaProfile: String(body.slaProfile || 'balanced'), members: Array.isArray(body.members) ? body.members : [] };
40
+ const idx = arr.findIndex((x) => x.id === next.id);
41
+ if (idx >= 0)
42
+ arr[idx] = { ...arr[idx], ...next };
43
+ else
44
+ arr.push(next);
45
+ writeJson(teamsFile, arr);
46
+ res.json({ ok: true, team: next });
47
+ });
48
+ app.post('/api/v1/admin/networks/upsert', (req, res) => {
49
+ const body = req.body || {};
50
+ if (!body.id)
51
+ return res.status(400).json({ ok: false, error: 'id obrigatório' });
52
+ const arr = readJson(networksFile);
53
+ const next = { id: String(body.id), domain: String(body.domain || 'general'), nodes: Array.isArray(body.nodes) ? body.nodes : [] };
54
+ const idx = arr.findIndex((x) => x.id === next.id);
55
+ if (idx >= 0)
56
+ arr[idx] = { ...arr[idx], ...next };
57
+ else
58
+ arr.push(next);
59
+ writeJson(networksFile, arr);
60
+ res.json({ ok: true, network: next });
61
+ });
62
+ app.get('/admin', (_req, res) => {
63
+ res.sendFile(path_1.default.join(process.cwd(), 'src', 'admin_panel.html'));
64
+ });
65
+ const port = Number(process.env.ADMIN_PANEL_PORT || 8091);
66
+ app.listen(port, () => console.log(`[ADMIN_PANEL] running at http://localhost:${port}/admin`));
@@ -0,0 +1,109 @@
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.AgentManager = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ class AgentManager {
40
+ root;
41
+ constructor(root = process.cwd()) {
42
+ this.root = root;
43
+ }
44
+ filePath() {
45
+ return path.join(this.root, '.openlife', 'agents.json');
46
+ }
47
+ list() {
48
+ const p = this.filePath();
49
+ if (!fs.existsSync(p))
50
+ return [{ id: 'default', name: 'Lara', isDefault: true }];
51
+ try {
52
+ return JSON.parse(fs.readFileSync(p, 'utf-8'));
53
+ }
54
+ catch {
55
+ return [{ id: 'default', name: 'Lara', isDefault: true }];
56
+ }
57
+ }
58
+ save(list) {
59
+ const p = this.filePath();
60
+ fs.mkdirSync(path.dirname(p), { recursive: true });
61
+ fs.writeFileSync(p, JSON.stringify(list, null, 2), 'utf-8');
62
+ }
63
+ ensureDefault(defaultName) {
64
+ const list = this.list();
65
+ const hasDefault = list.some(a => a.isDefault);
66
+ if (!hasDefault)
67
+ list.unshift({ id: 'default', name: defaultName || 'Lara', isDefault: true });
68
+ if (defaultName) {
69
+ const idx = list.findIndex(a => a.isDefault);
70
+ if (idx >= 0)
71
+ list[idx].name = defaultName;
72
+ }
73
+ // Dedup extras by normalized name and avoid collision with default name
74
+ const defaultAgent = list.find(a => a.isDefault);
75
+ const defaultNorm = (defaultAgent?.name || 'lara').trim().toLowerCase();
76
+ const seen = new Set();
77
+ const normalized = [];
78
+ for (const a of list) {
79
+ if (a.isDefault) {
80
+ normalized.push(a);
81
+ continue;
82
+ }
83
+ const key = a.name.trim().toLowerCase();
84
+ if (key === defaultNorm)
85
+ continue;
86
+ if (seen.has(key))
87
+ continue;
88
+ seen.add(key);
89
+ normalized.push(a);
90
+ }
91
+ this.save(normalized);
92
+ return normalized;
93
+ }
94
+ createAdditional(name) {
95
+ const list = this.ensureDefault();
96
+ const normalized = name.trim().toLowerCase();
97
+ const defaultNorm = (list.find(a => a.isDefault)?.name || 'lara').trim().toLowerCase();
98
+ const exists = list.some(a => !a.isDefault && a.name.trim().toLowerCase() === normalized);
99
+ if (exists || normalized === defaultNorm) {
100
+ this.save(list);
101
+ return list;
102
+ }
103
+ const id = `agent-${Date.now()}`;
104
+ list.push({ id, name, isDefault: false });
105
+ this.save(list);
106
+ return list;
107
+ }
108
+ }
109
+ exports.AgentManager = AgentManager;