@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.
- package/INSTALL.md +266 -0
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/bin/openlife.js +3 -0
- package/dist/admin_panel_server.js +66 -0
- package/dist/cli/AgentManager.js +109 -0
- package/dist/cli/AutonomousInstaller.js +134 -0
- package/dist/cli/DreamOrganizer.js +88 -0
- package/dist/cli/HostInstaller.js +426 -0
- package/dist/cli/InstallBanner.js +16 -0
- package/dist/cli/InstallFlow.js +256 -0
- package/dist/cli/InstallHeadless.js +47 -0
- package/dist/cli/InstallModules.js +148 -0
- package/dist/cli/InstallStateStore.js +75 -0
- package/dist/cli/InstallWizard.js +364 -0
- package/dist/cli/ProfileManager.js +163 -0
- package/dist/cli/SystemInstaller.js +89 -0
- package/dist/cli/WorldClassCommands.js +208 -0
- package/dist/design/DesignMdImporter.js +82 -0
- package/dist/design/DesignMdMode.js +93 -0
- package/dist/design/DesignMdRegistry.js +67 -0
- package/dist/index.js +2575 -0
- package/dist/memory/ConversationMemory.js +33 -0
- package/dist/memory/LocalMemoryProvider.js +86 -0
- package/dist/memory/Mem0Provider.js +16 -0
- package/dist/memory/MemoryNamespacePolicy.js +27 -0
- package/dist/memory/MemoryOrchestrator.js +65 -0
- package/dist/memory/MemoryPromotionFlow.js +32 -0
- package/dist/memory/MemoryProvider.js +2 -0
- package/dist/memory/MemoryProviderRegistry.js +27 -0
- package/dist/memory/MemoryRetentionPolicy.js +60 -0
- package/dist/memory/MempalaceProvider.js +72 -0
- package/dist/memory/OmniMemory.js +106 -0
- package/dist/memory/RedisAgentMemoryProvider.js +16 -0
- package/dist/memory/SessionManager.js +86 -0
- package/dist/memory/ZepGraphitiProvider.js +16 -0
- package/dist/orchestrator/AgentRegistry.js +56 -0
- package/dist/orchestrator/AgentScoring.js +82 -0
- package/dist/orchestrator/AgentTeam.js +22 -0
- package/dist/orchestrator/ArbitrationAgent.js +43 -0
- package/dist/orchestrator/ArbitrationScorecard.js +17 -0
- package/dist/orchestrator/AssetPromotionEngine.js +65 -0
- package/dist/orchestrator/AssetReuseRouter.js +63 -0
- package/dist/orchestrator/BenchmarkEngine.js +75 -0
- package/dist/orchestrator/Brain.js +298 -0
- package/dist/orchestrator/CadenceEngine.js +76 -0
- package/dist/orchestrator/CapabilityRouter.js +36 -0
- package/dist/orchestrator/CommandLanguage.js +27 -0
- package/dist/orchestrator/CommandRouter.js +70 -0
- package/dist/orchestrator/ConsequenceForecaster.js +286 -0
- package/dist/orchestrator/CronManager.js +286 -0
- package/dist/orchestrator/DynamicAgentBuilder.js +48 -0
- package/dist/orchestrator/DynamicAgentExecutor.js +15 -0
- package/dist/orchestrator/EnterpriseAgenticCore.js +276 -0
- package/dist/orchestrator/ExecutionBoard.js +86 -0
- package/dist/orchestrator/ExecutionIntent.js +13 -0
- package/dist/orchestrator/ExecutionModePolicy.js +48 -0
- package/dist/orchestrator/ExecutionRouter.js +9 -0
- package/dist/orchestrator/ExecutionState.js +20 -0
- package/dist/orchestrator/ExecutorHealth.js +86 -0
- package/dist/orchestrator/ExternalCatalogRegistry.js +83 -0
- package/dist/orchestrator/Gatekeeper.js +414 -0
- package/dist/orchestrator/Gateway.js +508 -0
- package/dist/orchestrator/GovernanceConsentStore.js +66 -0
- package/dist/orchestrator/GovernanceLayer.js +179 -0
- package/dist/orchestrator/GovernancePolicyStore.js +53 -0
- package/dist/orchestrator/GovernanceScopeLedger.js +134 -0
- package/dist/orchestrator/GovernanceScopePolicy.js +67 -0
- package/dist/orchestrator/IntentClassifier.js +45 -0
- package/dist/orchestrator/JobLifecycle.js +91 -0
- package/dist/orchestrator/LearningRouter.js +24 -0
- package/dist/orchestrator/MediaManager.js +92 -0
- package/dist/orchestrator/MemoryCuratorAgent.js +41 -0
- package/dist/orchestrator/MissionState.js +155 -0
- package/dist/orchestrator/ModelManager.js +84 -0
- package/dist/orchestrator/OperatingSystem.js +71 -0
- package/dist/orchestrator/OperationalMemoryStore.js +94 -0
- package/dist/orchestrator/OptimizationLoop.js +72 -0
- package/dist/orchestrator/OrchestrationLoop.js +905 -0
- package/dist/orchestrator/OrgStructure.js +88 -0
- package/dist/orchestrator/OutcomeSimulator.js +46 -0
- package/dist/orchestrator/ParallelOrchestrationLoop.js +36 -0
- package/dist/orchestrator/PerformanceScorecard.js +105 -0
- package/dist/orchestrator/PlannerAgent.js +46 -0
- package/dist/orchestrator/ProcessSandbox.js +129 -0
- package/dist/orchestrator/PromotionPipeline.js +74 -0
- package/dist/orchestrator/PromotionReviewGate.js +11 -0
- package/dist/orchestrator/QueueScheduler.js +260 -0
- package/dist/orchestrator/ReleaseGate.js +36 -0
- package/dist/orchestrator/ReleaseWorkflow.js +68 -0
- package/dist/orchestrator/RemotePublisher.js +139 -0
- package/dist/orchestrator/ReuseEngine.js +89 -0
- package/dist/orchestrator/ReviewerAgent.js +49 -0
- package/dist/orchestrator/RoleHandoff.js +65 -0
- package/dist/orchestrator/RuntimeHealthMonitor.js +143 -0
- package/dist/orchestrator/RuntimePolicy.js +105 -0
- package/dist/orchestrator/RuntimeProbe.js +97 -0
- package/dist/orchestrator/RuntimeRegistry.js +73 -0
- package/dist/orchestrator/SandboxPolicy.js +22 -0
- package/dist/orchestrator/SecurityDownloadGuard.js +169 -0
- package/dist/orchestrator/SecurityEventStore.js +58 -0
- package/dist/orchestrator/ServiceCompletionPolicy.js +36 -0
- package/dist/orchestrator/ServiceState.js +195 -0
- package/dist/orchestrator/SkillCreator.js +404 -0
- package/dist/orchestrator/SkillLearningLoop.js +57 -0
- package/dist/orchestrator/SkillManager.js +75 -0
- package/dist/orchestrator/SkillNetwork.js +29 -0
- package/dist/orchestrator/SkillRegistryV2.js +28 -0
- package/dist/orchestrator/SkillScoring.js +70 -0
- package/dist/orchestrator/SquadAutoCreator.js +64 -0
- package/dist/orchestrator/SquadCreator.js +727 -0
- package/dist/orchestrator/SquadRegistry.js +28 -0
- package/dist/orchestrator/SquadRouter.js +33 -0
- package/dist/orchestrator/SquadScoring.js +70 -0
- package/dist/orchestrator/SubagentLifecycle.js +90 -0
- package/dist/orchestrator/SynthesizerAgent.js +48 -0
- package/dist/orchestrator/SystemDoctor.js +224 -0
- package/dist/orchestrator/TaskExecutor.js +422 -0
- package/dist/orchestrator/TeammateBoard.js +61 -0
- package/dist/orchestrator/TestHarness.js +184 -0
- package/dist/orchestrator/VoiceManager.js +203 -0
- package/dist/orchestrator/VoiceRouter.js +89 -0
- package/dist/orchestrator/capability/CapabilityGenesisEngine.js +278 -0
- package/dist/orchestrator/capability/CapabilityPackParser.js +223 -0
- package/dist/orchestrator/capability/CapabilityPackSchema.js +62 -0
- package/dist/orchestrator/capability/CapabilityPackState.js +163 -0
- package/dist/orchestrator/providers/AgentProvider.js +2 -0
- package/dist/orchestrator/providers/CapabilityProvider.js +12 -0
- package/dist/orchestrator/providers/CloudAgentProvider.js +55 -0
- package/dist/orchestrator/providers/CloudSkillProvider.js +55 -0
- package/dist/orchestrator/providers/CloudSquadProvider.js +55 -0
- package/dist/orchestrator/providers/CompositeAgentProvider.js +16 -0
- package/dist/orchestrator/providers/CompositeCapabilityProvider.js +25 -0
- package/dist/orchestrator/providers/CompositeSkillProvider.js +16 -0
- package/dist/orchestrator/providers/CompositeSquadProvider.js +16 -0
- package/dist/orchestrator/providers/CompositeWorkflowProvider.js +46 -0
- package/dist/orchestrator/providers/FileAgentProvider.js +105 -0
- package/dist/orchestrator/providers/FileCapabilityProvider.js +106 -0
- package/dist/orchestrator/providers/FileSkillProvider.js +65 -0
- package/dist/orchestrator/providers/FileSquadProvider.js +69 -0
- package/dist/orchestrator/providers/FileWorkflowProvider.js +103 -0
- package/dist/orchestrator/providers/SkillProvider.js +2 -0
- package/dist/orchestrator/providers/SquadProvider.js +2 -0
- package/dist/orchestrator/toolset/ToolsetGuard.js +69 -0
- package/dist/orchestrator/toolset/ToolsetRegistry.js +65 -0
- package/dist/orchestrator/toolset/ToolsetSchema.js +21 -0
- package/dist/orchestrator/util/AtomicWriter.js +204 -0
- package/dist/orchestrator/util/DistributedLock.js +232 -0
- package/dist/orchestrator/util/TemplateRenderer.js +87 -0
- package/dist/orchestrator/util/WatchdogHeartbeat.js +116 -0
- package/dist/orchestrator/workflow/ConditionParser.js +232 -0
- package/dist/orchestrator/workflow/WorkflowEngine.js +379 -0
- package/dist/orchestrator/workflow/WorkflowParser.js +368 -0
- package/dist/orchestrator/workflow/WorkflowSchema.js +65 -0
- package/dist/orchestrator/workflow/WorkflowState.js +11 -0
- package/dist/reversa/ReversaAgent.js +134 -0
- package/dist/reversa/ReversaContracts.js +62 -0
- package/dist/reversa/ReversaExecutors.js +65 -0
- package/dist/skills/SkillRegistry.js +71 -0
- package/dist/squads/SquadManager.js +87 -0
- package/dist/test_admin_teams_networks.js +54 -0
- package/dist/test_agent_team_skill_network.js +15 -0
- package/dist/test_aiobuilder_cli_parity.js +169 -0
- package/dist/test_ask_exit.js +73 -0
- package/dist/test_atomic_writer.js +209 -0
- package/dist/test_autonomous_soak.js +141 -0
- package/dist/test_benchmark_engine.js +41 -0
- package/dist/test_brain_error_diagnostics.js +51 -0
- package/dist/test_brain_fallback_chain.js +93 -0
- package/dist/test_capability_genesis_engine.js +225 -0
- package/dist/test_capability_pack_schema.js +214 -0
- package/dist/test_catalog_quality.js +150 -0
- package/dist/test_cli_crud_roundtrip.js +154 -0
- package/dist/test_cli_diagnostics.js +131 -0
- package/dist/test_cli_doc_parity.js +126 -0
- package/dist/test_cli_help_surface.js +106 -0
- package/dist/test_cli_service_commands.js +83 -0
- package/dist/test_consequence_forecast_brain.js +165 -0
- package/dist/test_consequence_forecaster.js +24 -0
- package/dist/test_conversation_memory.js +36 -0
- package/dist/test_create_entities.js +54 -0
- package/dist/test_creator_placeholders_completed.js +177 -0
- package/dist/test_cron_manager.js +123 -0
- package/dist/test_daemon_sigterm.js +72 -0
- package/dist/test_deep_research_capability.js +87 -0
- package/dist/test_designmd_import_registry.js +16 -0
- package/dist/test_designmd_mode.js +50 -0
- package/dist/test_designmd_mode_workspace.js +13 -0
- package/dist/test_dist_templates_layout.js +135 -0
- package/dist/test_distributed_lock.js +201 -0
- package/dist/test_distribution_installability.js +67 -0
- package/dist/test_doctor_sandbox_check.js +44 -0
- package/dist/test_dream_organizer.js +25 -0
- package/dist/test_dual_mode.js +15 -0
- package/dist/test_enterprise_agentic_core.js +128 -0
- package/dist/test_forecast_brain_wiring.js +87 -0
- package/dist/test_gateway_telegram_guardrails.js +52 -0
- package/dist/test_governance.js +34 -0
- package/dist/test_governance_advanced.js +75 -0
- package/dist/test_governance_scope_ledger.js +147 -0
- package/dist/test_governance_v13_policies.js +44 -0
- package/dist/test_guided_creator_cli.js +100 -0
- package/dist/test_host_install_e2e.js +324 -0
- package/dist/test_host_installer.js +259 -0
- package/dist/test_host_installers_gemini_codex.js +95 -0
- package/dist/test_host_uninstaller.js +295 -0
- package/dist/test_install_flow.js +70 -0
- package/dist/test_install_flow_host_validation.js +143 -0
- package/dist/test_install_wizard.js +272 -0
- package/dist/test_integration_gemini_live.js +95 -0
- package/dist/test_integration_http_trigger_live.js +154 -0
- package/dist/test_integration_telegram_live.js +102 -0
- package/dist/test_job_lifecycle.js +16 -0
- package/dist/test_memory_orchestrator.js +33 -0
- package/dist/test_memory_promotion.js +36 -0
- package/dist/test_memory_retention.js +37 -0
- package/dist/test_mission_checkpoint.js +204 -0
- package/dist/test_multi_host_docs_parity.js +125 -0
- package/dist/test_openlife_auto_creator_routing.js +69 -0
- package/dist/test_openlife_evolution_surface.js +77 -0
- package/dist/test_openlife_gatekeeper_routing.js +15 -0
- package/dist/test_openlife_routing_surface.js +27 -0
- package/dist/test_openlife_runtime_source_truth.js +25 -0
- package/dist/test_operating_system.js +45 -0
- package/dist/test_optimization_loop.js +38 -0
- package/dist/test_orchestration_assets_lifecycle.js +78 -0
- package/dist/test_outcome_simulator.js +38 -0
- package/dist/test_performance_latency.js +215 -0
- package/dist/test_performance_scorecard.js +38 -0
- package/dist/test_phase1_check_exit.js +103 -0
- package/dist/test_phase6_board.js +31 -0
- package/dist/test_phase6_cadence.js +29 -0
- package/dist/test_phase6_ops.js +37 -0
- package/dist/test_post_mission_evaluation.js +190 -0
- package/dist/test_process_sandbox.js +88 -0
- package/dist/test_profile_toolset_mcp.js +125 -0
- package/dist/test_queue_scheduler.js +239 -0
- package/dist/test_release_gate.js +23 -0
- package/dist/test_remote_publish.js +193 -0
- package/dist/test_reversa_contracts_e2e.js +48 -0
- package/dist/test_reversa_export_and_strict.js +51 -0
- package/dist/test_reversa_full_execution.js +12 -0
- package/dist/test_reversa_lite.js +9 -0
- package/dist/test_royal_stack_golden.js +179 -0
- package/dist/test_runtime_health_backoff.js +154 -0
- package/dist/test_runtime_policy.js +26 -0
- package/dist/test_runtime_probe.js +19 -0
- package/dist/test_runtime_profile_oauth_only.js +262 -0
- package/dist/test_runtime_registry.js +11 -0
- package/dist/test_security_download_and_scan.js +103 -0
- package/dist/test_security_download_guard.js +14 -0
- package/dist/test_service_command_surface.js +12 -0
- package/dist/test_service_completion_policy.js +32 -0
- package/dist/test_service_guardrails_delete.js +12 -0
- package/dist/test_service_mode_explicit_only.js +174 -0
- package/dist/test_sources_import_ref.js +46 -0
- package/dist/test_sources_scaffold.js +43 -0
- package/dist/test_squad_skill_creator.js +305 -0
- package/dist/test_squad_skill_design_llm.js +176 -0
- package/dist/test_subsystems_org_state.js +271 -0
- package/dist/test_subsystems_promotion_memory_assets.js +343 -0
- package/dist/test_subsystems_routing_governance.js +234 -0
- package/dist/test_task_executor_sandbox_optin.js +127 -0
- package/dist/test_teammate_learning.js +15 -0
- package/dist/test_telegram_delete_guardrail.js +21 -0
- package/dist/test_toolset_enforcement.js +188 -0
- package/dist/test_trigger_basic_auth.js +112 -0
- package/dist/test_util/doc_parity.js +120 -0
- package/dist/test_v15_e2e_integration.js +207 -0
- package/dist/test_watchdog_heartbeat.js +152 -0
- package/dist/test_workflow_condition_parser.js +63 -0
- package/dist/test_workflow_e2e.js +240 -0
- package/dist/test_workflow_engine.js +330 -0
- package/dist/test_workflow_parser.js +245 -0
- package/dist/test_workflow_schema_backward_compat.js +197 -0
- package/dist-templates/README.md +91 -0
- package/dist-templates/claude-code/agents/openlife-atlas.md +52 -0
- package/dist-templates/claude-code/agents/openlife-forge.md +42 -0
- package/dist-templates/claude-code/agents/openlife-genesis.md +59 -0
- package/dist-templates/claude-code/agents/openlife-lyra.md +40 -0
- package/dist-templates/claude-code/agents/openlife-maestro.md +45 -0
- package/dist-templates/claude-code/commands/openlife/ask.md +14 -0
- package/dist-templates/claude-code/commands/openlife/doctor.md +19 -0
- package/dist-templates/claude-code/commands/openlife/dream.md +20 -0
- package/dist-templates/claude-code/commands/openlife/status.md +14 -0
- package/dist-templates/claude-code/mcp/openlife-orchestrator.json +46 -0
- package/dist-templates/codex/README.md +7 -0
- package/dist-templates/codex/agents/openlife-atlas.md +52 -0
- package/dist-templates/codex/agents/openlife-forge.md +42 -0
- package/dist-templates/codex/agents/openlife-genesis.md +59 -0
- package/dist-templates/codex/agents/openlife-lyra.md +40 -0
- package/dist-templates/codex/agents/openlife-maestro.md +45 -0
- package/dist-templates/codex/commands/openlife/ask.md +14 -0
- package/dist-templates/codex/commands/openlife/doctor.md +19 -0
- package/dist-templates/codex/commands/openlife/dream.md +20 -0
- package/dist-templates/codex/commands/openlife/status.md +14 -0
- package/dist-templates/codex/mcp/openlife-orchestrator.json +46 -0
- package/dist-templates/gemini-cli/README.md +8 -0
- package/dist-templates/gemini-cli/agents/openlife-atlas.md +52 -0
- package/dist-templates/gemini-cli/agents/openlife-forge.md +42 -0
- package/dist-templates/gemini-cli/agents/openlife-genesis.md +59 -0
- package/dist-templates/gemini-cli/agents/openlife-lyra.md +40 -0
- package/dist-templates/gemini-cli/agents/openlife-maestro.md +45 -0
- package/dist-templates/gemini-cli/commands/openlife/ask.md +14 -0
- package/dist-templates/gemini-cli/commands/openlife/doctor.md +19 -0
- package/dist-templates/gemini-cli/commands/openlife/dream.md +20 -0
- package/dist-templates/gemini-cli/commands/openlife/status.md +14 -0
- package/dist-templates/gemini-cli/mcp/openlife-orchestrator.json +46 -0
- package/dist-templates/skill-template/README.md +34 -0
- package/dist-templates/skill-template/SKILL.md.template +59 -0
- package/dist-templates/squad-template/README.md +82 -0
- package/dist-templates/squad-template/SQUAD.md.template +51 -0
- package/dist-templates/squad-template/agent-template.md +51 -0
- package/dist-templates/squad-template/checklist-template.md +25 -0
- package/dist-templates/squad-template/task-template.md +36 -0
- package/dist-templates/workflows/PORTED_WORKFLOWS.md +60 -0
- package/dist-templates/workflows/brownfield-discovery.yaml +137 -0
- package/dist-templates/workflows/greenfield-fullstack.yaml +132 -0
- package/dist-templates/workflows/qa-loop.yaml +125 -0
- package/dist-templates/workflows/story-development-cycle.yaml +80 -0
- package/docs/CHANGELOG_FEATURE_ROLLOUT_DESIGNMD.md +43 -0
- package/docs/EXTERNAL_SOURCES_AND_SECURITY_GUARD.md +33 -0
- package/docs/OPENLIFE_AUDIT_2026-05-06.md +170 -0
- package/docs/OPENLIFE_CONSOLIDATED_PLAN_2026-05-06.md +299 -0
- package/docs/OPENLIFE_DUAL_MODE_IMPLEMENTATION_PLAN.md +205 -0
- package/docs/OPENLIFE_EVOLUTION_SURFACE_2026-05-07.md +53 -0
- package/docs/OPENLIFE_SKILLS_IMPORT_2026-05-07.json +223 -0
- package/docs/OPENLIFE_SQUADS_IMPORT_2026-05-07.json +184 -0
- package/docs/PAPERCLIP_OPENLIFE_INVESTIGATION.md +85 -0
- package/docs/README.md +28 -0
- package/docs/RELEASE_ORGANIZATION_PLAN.md +164 -0
- package/docs/audit/CLI-EXECUTION-RESULTS.md +113 -0
- package/docs/audit/CLI-MATRIX.md +556 -0
- package/docs/audit/DOC-PARITY-GAPS.md +351 -0
- package/docs/audit/ORCHESTRATOR-MATRIX.md +136 -0
- package/docs/audit/TEST-COVERAGE-GAPS.md +334 -0
- package/docs/audit/integrations/SKIPPED.md +101 -0
- package/docs/autonomous-install.md +79 -0
- package/docs/capability-genesis.md +137 -0
- package/docs/capability-pack-schema.md +157 -0
- package/docs/commands.md +82 -0
- package/docs/deep-research-capability.md +114 -0
- package/docs/development/typescript-conventions.md +95 -0
- package/docs/host-installers.md +68 -0
- package/docs/install/aiobuilder.md +70 -0
- package/docs/install/claude-code.md +83 -0
- package/docs/install/codex.md +64 -0
- package/docs/install/gemini-cli.md +64 -0
- package/docs/install/runtime-profiles.md +83 -0
- package/docs/openlife-agent-os-blueprint.md +114 -0
- package/docs/openlife-install-backlog.md +115 -0
- package/docs/openlife-install-spec.md +306 -0
- package/docs/operations/CLOUD_CUTOVER_AUDIT.md +37 -0
- package/docs/operations/PHASE_PROGRESS_CONTINUATION.md +24 -0
- package/docs/performance-benchmarks.md +83 -0
- package/docs/planning/v1.3-capability-genesis.md +157 -0
- package/docs/plans/2026-05-05-admin-interface-professional-dark-premium-plan.md +84 -0
- package/docs/plans/2026-05-05-openlife-autonomous-domain-marketplace-masterplan.md +122 -0
- package/docs/quickstart.md +60 -0
- package/docs/release-process.md +236 -0
- package/docs/roadmap/OPENLIFE_MASTER_PLAN_CLOUD_V3.md +97 -0
- package/docs/sandboxing-research.md +117 -0
- package/docs/stories/epic-feature-audit/1.1.story.md +84 -0
- package/docs/stories/epic-feature-audit/1.2.story.md +102 -0
- package/docs/stories/epic-feature-audit/1.3.story.md +93 -0
- package/docs/stories/epic-feature-audit/1.5.story.md +121 -0
- package/docs/stories/epic-feature-audit/1.6.story.md +80 -0
- package/docs/stories/epic-feature-completeness/2.1.story.md +70 -0
- package/docs/stories/epic-feature-completeness/2.2.story.md +49 -0
- package/docs/stories/epic-feature-completeness/2.3.story.md +74 -0
- package/docs/stories/epic-feature-completeness/2.4.story.md +71 -0
- package/docs/stories/epic-feature-completeness/3.1.story.md +56 -0
- package/docs/stories/epic-feature-completeness/3.2.story.md +80 -0
- package/docs/stories/epic-feature-completeness/3.3.story.md +68 -0
- package/docs/stories/epic-feature-completeness/3.4.story.md +71 -0
- package/docs/stories/epic-feature-completeness/3.5.story.md +72 -0
- package/docs/stories/epic-feature-completeness/3.6.story.md +69 -0
- package/docs/stories/epic-feature-completeness/3.7.story.md +68 -0
- package/docs/stories/epic-feature-completeness/3.8.story.md +57 -0
- package/docs/toolset-enforcement.md +122 -0
- package/docs/v1.4-changelog.md +159 -0
- package/docs/v1.5-changelog.md +106 -0
- package/docs/v1.5-roadmap.md +121 -0
- package/docs/v1.6-changelog.md +67 -0
- package/docs/v1.6-roadmap.md +89 -0
- package/docs/v1.7-changelog.md +98 -0
- package/docs/workflow-schema.md +177 -0
- package/package.json +177 -0
- package/scripts/clean-test-pollution.js +61 -0
- package/scripts/openlife-agent-start.sh +6 -0
- package/scripts/openlife-agent.service.example +13 -0
- package/scripts/openlife-agent.supervisord.conf.example +8 -0
- package/scripts/openlife-autonomous-install.sh +29 -0
- 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;
|