@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,203 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.VoiceManager = void 0;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const child_process = __importStar(require("child_process"));
|
|
43
|
+
const util_1 = require("util");
|
|
44
|
+
const openai_1 = __importDefault(require("openai"));
|
|
45
|
+
const VoiceRouter_1 = require("./VoiceRouter");
|
|
46
|
+
const ToolsetGuard_1 = require("./toolset/ToolsetGuard");
|
|
47
|
+
const execFile = (0, util_1.promisify)(child_process.execFile);
|
|
48
|
+
class VoiceManager {
|
|
49
|
+
elevenLabsApiKey;
|
|
50
|
+
voiceRouter;
|
|
51
|
+
openai = null;
|
|
52
|
+
constructor() {
|
|
53
|
+
this.elevenLabsApiKey = process.env.ELEVENLABS_API_KEY;
|
|
54
|
+
this.voiceRouter = new VoiceRouter_1.VoiceRouter();
|
|
55
|
+
const openAIKey = process.env.OPENAI_API_KEY;
|
|
56
|
+
if (openAIKey && openAIKey.trim() !== '') {
|
|
57
|
+
this.openai = new openai_1.default({ apiKey: openAIKey });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async processAudioInput(fileLink) {
|
|
61
|
+
const sttOrder = this.voiceRouter.getSttOrder();
|
|
62
|
+
let lastError = null;
|
|
63
|
+
for (const provider of sttOrder) {
|
|
64
|
+
try {
|
|
65
|
+
switch (provider) {
|
|
66
|
+
case 'gemini':
|
|
67
|
+
return await this.transcribeWithGemini(fileLink);
|
|
68
|
+
case 'openai':
|
|
69
|
+
return await this.transcribeWithOpenAI(fileLink);
|
|
70
|
+
default:
|
|
71
|
+
throw new Error(`[VOICE] Provider de STT desconhecido: ${provider}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
76
|
+
const msg = lastError.message;
|
|
77
|
+
console.log(`[VOICE] Falha no provider STT ${provider}:`, msg);
|
|
78
|
+
this.logMediaRoute('stt', provider, 'failed', msg);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
throw lastError || new Error('[VOICE] Nenhum provider de STT disponível.');
|
|
82
|
+
}
|
|
83
|
+
async generateSpeech(text, voiceId) {
|
|
84
|
+
(0, ToolsetGuard_1.assertToolsetAllowed)('tts', 'VoiceManager.generateSpeech');
|
|
85
|
+
const ttsOrder = this.voiceRouter.getTtsOrder();
|
|
86
|
+
const selectedVoice = voiceId || this.voiceRouter.getDefaultVoice() || 'EXAVITQu4vr4xnSDxMaL';
|
|
87
|
+
let lastError = null;
|
|
88
|
+
for (const provider of ttsOrder) {
|
|
89
|
+
try {
|
|
90
|
+
switch (provider) {
|
|
91
|
+
case 'gemini':
|
|
92
|
+
return await this.generateSpeechWithGemini(text);
|
|
93
|
+
case 'elevenlabs':
|
|
94
|
+
return await this.generateSpeechWithElevenLabs(text, selectedVoice);
|
|
95
|
+
case 'piper':
|
|
96
|
+
throw new Error('[VOICE] Piper ainda não implementado no runtime atual.');
|
|
97
|
+
case 'openai':
|
|
98
|
+
return await this.generateSpeechWithOpenAI(text, selectedVoice);
|
|
99
|
+
default:
|
|
100
|
+
throw new Error(`[VOICE] Provider de TTS desconhecido: ${provider}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
105
|
+
const msg = lastError.message;
|
|
106
|
+
console.log(`[VOICE] Falha no provider ${provider}:`, msg);
|
|
107
|
+
this.logMediaRoute('tts', provider, 'failed', msg);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
throw lastError || new Error('[VOICE] Nenhum provider de TTS disponível.');
|
|
111
|
+
}
|
|
112
|
+
async transcribeWithGemini(fileLink) {
|
|
113
|
+
const candidates = ['gemini-3.1-flash-lite-preview', 'gemini-2.5-flash', 'gemini-3.1-pro-preview'];
|
|
114
|
+
let lastError = null;
|
|
115
|
+
for (const model of candidates) {
|
|
116
|
+
try {
|
|
117
|
+
const args = ['-o', 'json', '-m', model, '-p', `Transcreva fielmente este áudio em português do Brasil: @${fileLink}`, '-y'];
|
|
118
|
+
const { stdout } = await execFile('gemini', args, { maxBuffer: 1024 * 1024 * 10, timeout: 120000 });
|
|
119
|
+
const jsonStart = stdout.indexOf('{');
|
|
120
|
+
if (jsonStart === -1)
|
|
121
|
+
throw new Error('Resposta Gemini inválida para STT.');
|
|
122
|
+
const parsed = JSON.parse(stdout.slice(jsonStart));
|
|
123
|
+
const text = String(parsed.response || parsed.text || '').trim();
|
|
124
|
+
if (!text)
|
|
125
|
+
throw new Error('Transcrição vazia no Gemini STT.');
|
|
126
|
+
this.logMediaRoute('stt', `gemini:${model}`, 'success');
|
|
127
|
+
return text;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
131
|
+
const reason = lastError.message.toLowerCase();
|
|
132
|
+
this.logMediaRoute('stt', `gemini:${model}`, 'failed', lastError.message);
|
|
133
|
+
if (!/429|resource_exhausted|capacity|rate limit|quota/.test(reason))
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
throw new Error(`Falha STT Gemini fallback-chain: ${lastError?.message || 'unknown error'}`);
|
|
138
|
+
}
|
|
139
|
+
async transcribeWithOpenAI(_fileLink) {
|
|
140
|
+
throw new Error('OpenAI STT fallback ainda não implementado neste runtime.');
|
|
141
|
+
}
|
|
142
|
+
async generateSpeechWithGemini(_text) {
|
|
143
|
+
throw new Error('Gemini TTS indisponível neste runtime; acionando fallback controlado.');
|
|
144
|
+
}
|
|
145
|
+
async generateSpeechWithOpenAI(text, voiceId = 'nova') {
|
|
146
|
+
if (!this.openai) {
|
|
147
|
+
throw new Error('[VOICE] OPENAI_API_KEY não configurada.');
|
|
148
|
+
}
|
|
149
|
+
const response = await this.openai.audio.speech.create({
|
|
150
|
+
model: 'gpt-4o-mini-tts',
|
|
151
|
+
voice: voiceId,
|
|
152
|
+
input: text
|
|
153
|
+
});
|
|
154
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
155
|
+
const outputDir = path.join(process.cwd(), '.temp_audio');
|
|
156
|
+
if (!fs.existsSync(outputDir)) {
|
|
157
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
158
|
+
}
|
|
159
|
+
const fileName = `speech_openai_${Date.now()}.mp3`;
|
|
160
|
+
const filePath = path.join(outputDir, fileName);
|
|
161
|
+
fs.writeFileSync(filePath, buffer);
|
|
162
|
+
this.logMediaRoute('tts', 'openai', 'success');
|
|
163
|
+
return filePath;
|
|
164
|
+
}
|
|
165
|
+
async generateSpeechWithElevenLabs(text, voiceId) {
|
|
166
|
+
if (!this.elevenLabsApiKey) {
|
|
167
|
+
throw new Error('[VOICE] ELEVENLABS_API_KEY não configurada.');
|
|
168
|
+
}
|
|
169
|
+
const url = `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`;
|
|
170
|
+
const response = await fetch(url, {
|
|
171
|
+
method: 'POST',
|
|
172
|
+
headers: {
|
|
173
|
+
'Accept': 'audio/mpeg',
|
|
174
|
+
'Content-Type': 'application/json',
|
|
175
|
+
'xi-api-key': this.elevenLabsApiKey
|
|
176
|
+
},
|
|
177
|
+
body: JSON.stringify({
|
|
178
|
+
text,
|
|
179
|
+
model_id: 'eleven_multilingual_v2',
|
|
180
|
+
voice_settings: { stability: 0.5, similarity_boost: 0.75 }
|
|
181
|
+
})
|
|
182
|
+
});
|
|
183
|
+
if (!response.ok) {
|
|
184
|
+
throw new Error(`[VOICE] Erro ElevenLabs: ${response.statusText}`);
|
|
185
|
+
}
|
|
186
|
+
const buffer = await response.arrayBuffer();
|
|
187
|
+
const outputDir = path.join(process.cwd(), '.temp_audio');
|
|
188
|
+
if (!fs.existsSync(outputDir)) {
|
|
189
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
190
|
+
}
|
|
191
|
+
const fileName = `speech_${Date.now()}.mp3`;
|
|
192
|
+
const filePath = path.join(outputDir, fileName);
|
|
193
|
+
fs.writeFileSync(filePath, Buffer.from(buffer));
|
|
194
|
+
this.logMediaRoute('tts', 'elevenlabs', 'success');
|
|
195
|
+
return filePath;
|
|
196
|
+
}
|
|
197
|
+
logMediaRoute(kind, provider, status, detail) {
|
|
198
|
+
const file = path.join(process.cwd(), '.openlife', 'media-routing.log.jsonl');
|
|
199
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
200
|
+
fs.appendFileSync(file, JSON.stringify({ ts: new Date().toISOString(), kind, provider, status, detail: detail || '' }) + '\n', 'utf-8');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.VoiceManager = VoiceManager;
|
|
@@ -0,0 +1,89 @@
|
|
|
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.VoiceRouter = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class VoiceRouter {
|
|
40
|
+
configPath;
|
|
41
|
+
constructor() {
|
|
42
|
+
this.configPath = path.join(process.cwd(), 'voice.config.json');
|
|
43
|
+
}
|
|
44
|
+
isGeminiPreferredForMedia() {
|
|
45
|
+
return (process.env.OPENLIFE_PREFER_GEMINI_FOR_MEDIA || 'true').toLowerCase() === 'true';
|
|
46
|
+
}
|
|
47
|
+
getConfig() {
|
|
48
|
+
const fallbackConfig = {
|
|
49
|
+
defaultProfile: 'default',
|
|
50
|
+
profiles: {
|
|
51
|
+
default: {
|
|
52
|
+
stt: { order: ['gemini', 'openai'], mode: 'fallback' },
|
|
53
|
+
tts: { order: ['gemini', 'openai', 'elevenlabs'], mode: 'fallback', defaultVoice: 'nova' }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
if (!fs.existsSync(this.configPath)) {
|
|
58
|
+
return this.applyGeminiPreference(fallbackConfig);
|
|
59
|
+
}
|
|
60
|
+
const raw = fs.readFileSync(this.configPath, 'utf-8');
|
|
61
|
+
return this.applyGeminiPreference(JSON.parse(raw));
|
|
62
|
+
}
|
|
63
|
+
applyGeminiPreference(config) {
|
|
64
|
+
if (!this.isGeminiPreferredForMedia())
|
|
65
|
+
return config;
|
|
66
|
+
const profileName = config.defaultProfile;
|
|
67
|
+
const profile = config.profiles[profileName];
|
|
68
|
+
if (!profile)
|
|
69
|
+
return config;
|
|
70
|
+
profile.stt.order = ['gemini', ...profile.stt.order.filter(p => p !== 'gemini')];
|
|
71
|
+
profile.tts.order = ['gemini', ...profile.tts.order.filter(p => p !== 'gemini')];
|
|
72
|
+
return config;
|
|
73
|
+
}
|
|
74
|
+
getProfile(profileName) {
|
|
75
|
+
const config = this.getConfig();
|
|
76
|
+
const selected = profileName || config.defaultProfile;
|
|
77
|
+
return config.profiles[selected] || config.profiles[config.defaultProfile];
|
|
78
|
+
}
|
|
79
|
+
getTtsOrder(profileName) {
|
|
80
|
+
return this.getProfile(profileName).tts.order;
|
|
81
|
+
}
|
|
82
|
+
getSttOrder(profileName) {
|
|
83
|
+
return this.getProfile(profileName).stt.order;
|
|
84
|
+
}
|
|
85
|
+
getDefaultVoice(profileName) {
|
|
86
|
+
return this.getProfile(profileName).tts.defaultVoice;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.VoiceRouter = VoiceRouter;
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CapabilityGenesisEngine — orchestrates existing creators to produce a
|
|
4
|
+
* draft Capability Pack from a free-form brief.
|
|
5
|
+
*
|
|
6
|
+
* Story 1.5 — OpenLife v1.3 Agent OS Integration.
|
|
7
|
+
*
|
|
8
|
+
* Reuse-first contract (Rafa-locked decision, 2026-05-12):
|
|
9
|
+
* 1. Call AssetReuseRouter.find(brief) — if existing asset covers the
|
|
10
|
+
* brief, the pack references it (`source: 'referenced'`) instead of
|
|
11
|
+
* creating a duplicate.
|
|
12
|
+
* 2. Only when no reusable asset is found does Genesis call the
|
|
13
|
+
* relevant creator (SkillCreator, SquadCreator) and embed the new
|
|
14
|
+
* asset under the pack directory (`source: 'embedded'`).
|
|
15
|
+
*
|
|
16
|
+
* Never auto-promotes. Always produces a `status: 'draft'` pack. Caller
|
|
17
|
+
* (CLI handler or operator) is responsible for promote → tested → active
|
|
18
|
+
* via CapabilityPackStateStore.
|
|
19
|
+
*
|
|
20
|
+
* Brain integration: when called with a Brain instance, Genesis asks for
|
|
21
|
+
* a structured proposal (which skills/squads/workflows the pack should
|
|
22
|
+
* contain). When Brain is omitted (test/offline mode), Genesis falls back
|
|
23
|
+
* to a heuristic that produces a single-skill pack from the brief.
|
|
24
|
+
*/
|
|
25
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
28
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
29
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
30
|
+
}
|
|
31
|
+
Object.defineProperty(o, k2, desc);
|
|
32
|
+
}) : (function(o, m, k, k2) {
|
|
33
|
+
if (k2 === undefined) k2 = k;
|
|
34
|
+
o[k2] = m[k];
|
|
35
|
+
}));
|
|
36
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
37
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
38
|
+
}) : function(o, v) {
|
|
39
|
+
o["default"] = v;
|
|
40
|
+
});
|
|
41
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
42
|
+
var ownKeys = function(o) {
|
|
43
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
44
|
+
var ar = [];
|
|
45
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
46
|
+
return ar;
|
|
47
|
+
};
|
|
48
|
+
return ownKeys(o);
|
|
49
|
+
};
|
|
50
|
+
return function (mod) {
|
|
51
|
+
if (mod && mod.__esModule) return mod;
|
|
52
|
+
var result = {};
|
|
53
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
54
|
+
__setModuleDefault(result, mod);
|
|
55
|
+
return result;
|
|
56
|
+
};
|
|
57
|
+
})();
|
|
58
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
+
exports.CapabilityGenesisEngine = void 0;
|
|
60
|
+
const fs = __importStar(require("fs"));
|
|
61
|
+
const path = __importStar(require("path"));
|
|
62
|
+
const AtomicWriter_1 = require("../util/AtomicWriter");
|
|
63
|
+
const yaml = __importStar(require("js-yaml"));
|
|
64
|
+
const CapabilityPackState_1 = require("./CapabilityPackState");
|
|
65
|
+
const AssetReuseRouter_1 = require("../AssetReuseRouter");
|
|
66
|
+
const SkillCreator_1 = require("../SkillCreator");
|
|
67
|
+
const SquadCreator_1 = require("../SquadCreator");
|
|
68
|
+
class CapabilityGenesisEngine {
|
|
69
|
+
catalogRoot;
|
|
70
|
+
skillCreator;
|
|
71
|
+
squadCreator;
|
|
72
|
+
assetReuseRouter;
|
|
73
|
+
stateStore;
|
|
74
|
+
constructor(opts = {}) {
|
|
75
|
+
this.catalogRoot = opts.catalogRoot
|
|
76
|
+
|| path.join(process.cwd(), '.catalog', 'capabilities');
|
|
77
|
+
this.skillCreator = opts.skillCreator || new SkillCreator_1.SkillCreator();
|
|
78
|
+
this.squadCreator = opts.squadCreator || new SquadCreator_1.SquadCreator();
|
|
79
|
+
this.assetReuseRouter = opts.assetReuseRouter || new AssetReuseRouter_1.AssetReuseRouter();
|
|
80
|
+
this.stateStore = opts.stateStore || new CapabilityPackState_1.CapabilityPackStateStore();
|
|
81
|
+
}
|
|
82
|
+
generate(brief) {
|
|
83
|
+
const packId = brief.packId || slugify(brief.description).slice(0, 60);
|
|
84
|
+
if (!/^[a-z0-9][a-z0-9._-]+$/i.test(packId)) {
|
|
85
|
+
return { ok: false, error: 'invalid_pack_id', detail: packId };
|
|
86
|
+
}
|
|
87
|
+
const packDir = path.join(this.catalogRoot, packId);
|
|
88
|
+
if (fs.existsSync(packDir)) {
|
|
89
|
+
return { ok: false, error: 'pack_already_exists', detail: packDir };
|
|
90
|
+
}
|
|
91
|
+
// Reuse-first: find existing promoted assets that match the brief
|
|
92
|
+
const reusedRaw = this.assetReuseRouter.find(brief.description);
|
|
93
|
+
const reusedAssets = reusedRaw.map((a) => a.id);
|
|
94
|
+
// Build the pack manifest. The hints drive what Genesis tries to
|
|
95
|
+
// create when no reusable asset is found. In 'quick' mode we only
|
|
96
|
+
// wire one skill; 'professional' adds a squad; 'elite' adds a full
|
|
97
|
+
// workflow stub too.
|
|
98
|
+
const mode = brief.mode || 'professional';
|
|
99
|
+
const skillsToInclude = brief.hints?.skills || [];
|
|
100
|
+
const squadsToInclude = brief.hints?.squads || [];
|
|
101
|
+
const workflowsToInclude = brief.hints?.workflows || [];
|
|
102
|
+
const createdAssets = [];
|
|
103
|
+
const skillRefs = [];
|
|
104
|
+
const squadRefs = [];
|
|
105
|
+
const workflowRefs = [];
|
|
106
|
+
// Create pack directory skeleton first so embedded creates land here.
|
|
107
|
+
fs.mkdirSync(packDir, { recursive: true });
|
|
108
|
+
for (const sub of ['skills', 'squads', 'agents', 'workflows', 'checklists', 'templates']) {
|
|
109
|
+
fs.mkdirSync(path.join(packDir, sub), { recursive: true });
|
|
110
|
+
}
|
|
111
|
+
// Skills
|
|
112
|
+
for (const skillId of skillsToInclude) {
|
|
113
|
+
const reuseHit = reusedAssets.find((a) => a.toLowerCase().includes(skillId.toLowerCase()));
|
|
114
|
+
if (reuseHit) {
|
|
115
|
+
skillRefs.push({ id: skillId, source: 'referenced', label: `Reused: ${reuseHit}` });
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// Embed: create a stub skill inside the pack
|
|
119
|
+
const stubPath = path.join(packDir, 'skills', `${skillId}.md`);
|
|
120
|
+
(0, AtomicWriter_1.writeStringAtomic)(stubPath, this.skillStub(skillId, brief.description));
|
|
121
|
+
skillRefs.push({ id: skillId, source: 'embedded' });
|
|
122
|
+
createdAssets.push(`skills/${skillId}.md`);
|
|
123
|
+
}
|
|
124
|
+
// Squads — only in professional/elite mode
|
|
125
|
+
if (mode === 'professional' || mode === 'elite') {
|
|
126
|
+
for (const squadId of squadsToInclude) {
|
|
127
|
+
const stubDir = path.join(packDir, 'squads', squadId);
|
|
128
|
+
fs.mkdirSync(stubDir, { recursive: true });
|
|
129
|
+
(0, AtomicWriter_1.writeStringAtomic)(path.join(stubDir, 'SQUAD.md'), this.squadStub(squadId, brief.description));
|
|
130
|
+
squadRefs.push({ id: squadId, source: 'embedded' });
|
|
131
|
+
createdAssets.push(`squads/${squadId}/SQUAD.md`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Workflows — only in elite mode
|
|
135
|
+
if (mode === 'elite') {
|
|
136
|
+
for (const wfId of workflowsToInclude) {
|
|
137
|
+
const stubPath = path.join(packDir, 'workflows', `${wfId}.yaml`);
|
|
138
|
+
(0, AtomicWriter_1.writeStringAtomic)(stubPath, this.workflowStub(wfId, brief.description));
|
|
139
|
+
workflowRefs.push({ id: wfId, source: 'embedded' });
|
|
140
|
+
createdAssets.push(`workflows/${wfId}.yaml`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Build the manifest
|
|
144
|
+
const pack = {
|
|
145
|
+
id: packId,
|
|
146
|
+
name: brief.packName || titleCase(packId),
|
|
147
|
+
description: brief.description,
|
|
148
|
+
version: '0.1.0',
|
|
149
|
+
status: 'draft',
|
|
150
|
+
objective: brief.description,
|
|
151
|
+
skills: skillRefs.length > 0 ? skillRefs : undefined,
|
|
152
|
+
squads: squadRefs.length > 0 ? squadRefs : undefined,
|
|
153
|
+
workflows: workflowRefs.length > 0 ? workflowRefs : undefined,
|
|
154
|
+
metadata: {
|
|
155
|
+
createdAt: new Date().toISOString(),
|
|
156
|
+
updatedAt: new Date().toISOString(),
|
|
157
|
+
author: brief.actor,
|
|
158
|
+
tags: [mode],
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
const manifestYaml = yaml.dump({ capability: pack }, { lineWidth: 100 });
|
|
162
|
+
const manifestPath = path.join(packDir, 'capability.yaml');
|
|
163
|
+
(0, AtomicWriter_1.writeStringAtomic)(manifestPath, manifestYaml);
|
|
164
|
+
// INDEX.md — quick browsable summary
|
|
165
|
+
const indexMd = this.renderIndexMd(pack, reusedAssets, createdAssets);
|
|
166
|
+
(0, AtomicWriter_1.writeStringAtomic)(path.join(packDir, 'INDEX.md'), indexMd);
|
|
167
|
+
// Initialize lifecycle status
|
|
168
|
+
this.stateStore.init(packId, brief.actor);
|
|
169
|
+
return {
|
|
170
|
+
ok: true,
|
|
171
|
+
packId,
|
|
172
|
+
packDir,
|
|
173
|
+
manifestPath,
|
|
174
|
+
pack,
|
|
175
|
+
reusedAssets,
|
|
176
|
+
createdAssets,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
skillStub(skillId, briefText) {
|
|
180
|
+
return `---
|
|
181
|
+
id: ${skillId}
|
|
182
|
+
name: ${skillId}
|
|
183
|
+
status: draft
|
|
184
|
+
source: capability-genesis
|
|
185
|
+
version: 0.1.0
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
# ${skillId}
|
|
189
|
+
|
|
190
|
+
> Auto-generated stub from CapabilityGenesisEngine.
|
|
191
|
+
> Brief: ${briefText}
|
|
192
|
+
|
|
193
|
+
## When to use
|
|
194
|
+
|
|
195
|
+
- TBD — operator must refine
|
|
196
|
+
|
|
197
|
+
## Procedure
|
|
198
|
+
|
|
199
|
+
1. TBD — operator must refine
|
|
200
|
+
|
|
201
|
+
## Validation
|
|
202
|
+
|
|
203
|
+
- TBD — operator must refine
|
|
204
|
+
`;
|
|
205
|
+
}
|
|
206
|
+
squadStub(squadId, briefText) {
|
|
207
|
+
return `---
|
|
208
|
+
id: ${squadId}
|
|
209
|
+
name: ${squadId}
|
|
210
|
+
status: draft
|
|
211
|
+
source: capability-genesis
|
|
212
|
+
version: 0.1.0
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
# ${squadId}
|
|
216
|
+
|
|
217
|
+
> Auto-generated stub from CapabilityGenesisEngine.
|
|
218
|
+
> Brief: ${briefText}
|
|
219
|
+
|
|
220
|
+
## Agents
|
|
221
|
+
|
|
222
|
+
| Agent | Role |
|
|
223
|
+
|-------|------|
|
|
224
|
+
| TBD | TBD |
|
|
225
|
+
`;
|
|
226
|
+
}
|
|
227
|
+
workflowStub(wfId, briefText) {
|
|
228
|
+
return `workflow:
|
|
229
|
+
id: ${wfId}
|
|
230
|
+
name: ${wfId}
|
|
231
|
+
description: "${briefText.replace(/"/g, '\\"')}"
|
|
232
|
+
type: custom
|
|
233
|
+
version: "0.1.0"
|
|
234
|
+
sequence:
|
|
235
|
+
- phase: 0
|
|
236
|
+
name: planning
|
|
237
|
+
description: TBD — operator must refine
|
|
238
|
+
- id: step-1
|
|
239
|
+
agent: planner
|
|
240
|
+
action: plan
|
|
241
|
+
notes: |
|
|
242
|
+
Auto-generated stub. Operator must refine.
|
|
243
|
+
`;
|
|
244
|
+
}
|
|
245
|
+
renderIndexMd(pack, reused, created) {
|
|
246
|
+
const lines = [
|
|
247
|
+
`# ${pack.name}`,
|
|
248
|
+
'',
|
|
249
|
+
`> ${pack.description}`,
|
|
250
|
+
'',
|
|
251
|
+
`**Status:** ${pack.status} • **Version:** ${pack.version}`,
|
|
252
|
+
'',
|
|
253
|
+
`## Objective`,
|
|
254
|
+
pack.objective,
|
|
255
|
+
'',
|
|
256
|
+
];
|
|
257
|
+
if (pack.skills?.length) {
|
|
258
|
+
lines.push('## Skills', ...pack.skills.map((s) => `- \`${s.id}\` (${s.source})`), '');
|
|
259
|
+
}
|
|
260
|
+
if (pack.squads?.length) {
|
|
261
|
+
lines.push('## Squads', ...pack.squads.map((s) => `- \`${s.id}\` (${s.source})`), '');
|
|
262
|
+
}
|
|
263
|
+
if (pack.workflows?.length) {
|
|
264
|
+
lines.push('## Workflows', ...pack.workflows.map((s) => `- \`${s.id}\` (${s.source})`), '');
|
|
265
|
+
}
|
|
266
|
+
lines.push('## Genesis report', '');
|
|
267
|
+
lines.push(`Reused assets: ${reused.length ? reused.join(', ') : '(none)'}`);
|
|
268
|
+
lines.push(`Created assets: ${created.length ? created.join(', ') : '(none)'}`);
|
|
269
|
+
return lines.join('\n') + '\n';
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
exports.CapabilityGenesisEngine = CapabilityGenesisEngine;
|
|
273
|
+
function slugify(s) {
|
|
274
|
+
return s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
275
|
+
}
|
|
276
|
+
function titleCase(s) {
|
|
277
|
+
return s.split(/[-_]/).map((w) => w[0]?.toUpperCase() + w.slice(1)).join(' ');
|
|
278
|
+
}
|