@nextclaw/service 0.1.15 → 0.1.16
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/dist/cli/commands/agent/agent-runtime.utils.d.ts +2 -1
- package/dist/cli/commands/agent/agent-runtime.utils.d.ts.map +1 -0
- package/dist/cli/commands/agent/agent-runtime.utils.js +2 -0
- package/dist/cli/commands/agent/agent-runtime.utils.js.map +1 -0
- package/dist/cli/commands/agent/cli-agent-runner.utils.d.ts +2 -1
- package/dist/cli/commands/agent/cli-agent-runner.utils.d.ts.map +1 -0
- package/dist/cli/commands/agent/cli-agent-runner.utils.js +2 -0
- package/dist/cli/commands/agent/cli-agent-runner.utils.js.map +1 -0
- package/dist/cli/commands/agent/services/agent-commands.service.d.ts +2 -1
- package/dist/cli/commands/agent/services/agent-commands.service.d.ts.map +1 -0
- package/dist/cli/commands/agent/services/agent-commands.service.js +2 -0
- package/dist/cli/commands/agent/services/agent-commands.service.js.map +1 -0
- package/dist/cli/commands/config/services/config-commands.service.d.ts +2 -1
- package/dist/cli/commands/config/services/config-commands.service.d.ts.map +1 -0
- package/dist/cli/commands/config/services/config-commands.service.js +2 -0
- package/dist/cli/commands/config/services/config-commands.service.js.map +1 -0
- package/dist/cli/commands/cron/services/cron-commands.service.d.ts +2 -1
- package/dist/cli/commands/cron/services/cron-commands.service.d.ts.map +1 -0
- package/dist/cli/commands/cron/services/cron-commands.service.js +2 -0
- package/dist/cli/commands/cron/services/cron-commands.service.js.map +1 -0
- package/dist/cli/commands/cron/services/cron-local.service.d.ts +2 -1
- package/dist/cli/commands/cron/services/cron-local.service.d.ts.map +1 -0
- package/dist/cli/commands/cron/services/cron-local.service.js +2 -0
- package/dist/cli/commands/cron/services/cron-local.service.js.map +1 -0
- package/dist/cli/commands/cron/utils/cron-job.utils.d.ts +2 -1
- package/dist/cli/commands/cron/utils/cron-job.utils.d.ts.map +1 -0
- package/dist/cli/commands/cron/utils/cron-job.utils.js +2 -0
- package/dist/cli/commands/cron/utils/cron-job.utils.js.map +1 -0
- package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.d.ts +2 -1
- package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.d.ts.map +1 -0
- package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.js +2 -0
- package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.js.map +1 -0
- package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.d.ts +2 -1
- package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.d.ts.map +1 -0
- package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.js +2 -0
- package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.js.map +1 -0
- package/dist/cli/commands/gateway/index.d.ts +2 -1
- package/dist/cli/commands/gateway/index.d.ts.map +1 -0
- package/dist/cli/commands/gateway/index.js +2 -0
- package/dist/cli/commands/gateway/index.js.map +1 -0
- package/dist/cli/commands/logs/index.d.ts +2 -1
- package/dist/cli/commands/logs/index.d.ts.map +1 -0
- package/dist/cli/commands/logs/index.js +2 -0
- package/dist/cli/commands/logs/index.js.map +1 -0
- package/dist/cli/commands/mcp/index.d.ts +2 -1
- package/dist/cli/commands/mcp/index.d.ts.map +1 -0
- package/dist/cli/commands/mcp/index.js +2 -0
- package/dist/cli/commands/mcp/index.js.map +1 -0
- package/dist/cli/commands/restart/index.d.ts +2 -1
- package/dist/cli/commands/restart/index.d.ts.map +1 -0
- package/dist/cli/commands/restart/index.js +2 -0
- package/dist/cli/commands/restart/index.js.map +1 -0
- package/dist/cli/commands/secrets/index.d.ts +2 -1
- package/dist/cli/commands/secrets/index.d.ts.map +1 -0
- package/dist/cli/commands/secrets/index.js +2 -0
- package/dist/cli/commands/secrets/index.js.map +1 -0
- package/dist/cli/commands/serve/index.d.ts +2 -1
- package/dist/cli/commands/serve/index.d.ts.map +1 -0
- package/dist/cli/commands/serve/index.js +2 -0
- package/dist/cli/commands/serve/index.js.map +1 -0
- package/dist/cli/commands/skills/index.d.ts +2 -1
- package/dist/cli/commands/skills/index.d.ts.map +1 -0
- package/dist/cli/commands/skills/index.js +2 -0
- package/dist/cli/commands/skills/index.js.map +1 -0
- package/dist/cli/commands/skills/marketplace-client.d.ts +2 -1
- package/dist/cli/commands/skills/marketplace-client.d.ts.map +1 -0
- package/dist/cli/commands/skills/marketplace-client.js +2 -0
- package/dist/cli/commands/skills/marketplace-client.js.map +1 -0
- package/dist/cli/commands/skills/marketplace-command-options.utils.d.ts +2 -1
- package/dist/cli/commands/skills/marketplace-command-options.utils.d.ts.map +1 -0
- package/dist/cli/commands/skills/marketplace-command-options.utils.js +2 -0
- package/dist/cli/commands/skills/marketplace-command-options.utils.js.map +1 -0
- package/dist/cli/commands/skills/marketplace-identity.utils.d.ts +2 -1
- package/dist/cli/commands/skills/marketplace-identity.utils.d.ts.map +1 -0
- package/dist/cli/commands/skills/marketplace-identity.utils.js +2 -0
- package/dist/cli/commands/skills/marketplace-identity.utils.js.map +1 -0
- package/dist/cli/commands/skills/marketplace-network-retry.d.ts +2 -1
- package/dist/cli/commands/skills/marketplace-network-retry.d.ts.map +1 -0
- package/dist/cli/commands/skills/marketplace-network-retry.js +2 -0
- package/dist/cli/commands/skills/marketplace-network-retry.js.map +1 -0
- package/dist/cli/commands/skills/marketplace.metadata.d.ts +2 -1
- package/dist/cli/commands/skills/marketplace.metadata.d.ts.map +1 -0
- package/dist/cli/commands/skills/marketplace.metadata.js +2 -0
- package/dist/cli/commands/skills/marketplace.metadata.js.map +1 -0
- package/dist/cli/commands/skills/marketplace.utils.d.ts +2 -1
- package/dist/cli/commands/skills/marketplace.utils.d.ts.map +1 -0
- package/dist/cli/commands/skills/marketplace.utils.js +2 -0
- package/dist/cli/commands/skills/marketplace.utils.js.map +1 -0
- package/dist/cli/commands/skills/skills-query.service.d.ts +2 -1
- package/dist/cli/commands/skills/skills-query.service.d.ts.map +1 -0
- package/dist/cli/commands/skills/skills-query.service.js +2 -0
- package/dist/cli/commands/skills/skills-query.service.js.map +1 -0
- package/dist/cli/commands/start/index.d.ts +2 -1
- package/dist/cli/commands/start/index.d.ts.map +1 -0
- package/dist/cli/commands/start/index.js +2 -0
- package/dist/cli/commands/start/index.js.map +1 -0
- package/dist/cli/commands/stop/index.d.ts +2 -1
- package/dist/cli/commands/stop/index.d.ts.map +1 -0
- package/dist/cli/commands/stop/index.js +2 -0
- package/dist/cli/commands/stop/index.js.map +1 -0
- package/dist/cli/commands/ui/index.d.ts +2 -1
- package/dist/cli/commands/ui/index.d.ts.map +1 -0
- package/dist/cli/commands/ui/index.js +2 -0
- package/dist/cli/commands/ui/index.js.map +1 -0
- package/dist/cli/commands/usage/services/llm-usage-command.service.d.ts +2 -1
- package/dist/cli/commands/usage/services/llm-usage-command.service.d.ts.map +1 -0
- package/dist/cli/commands/usage/services/llm-usage-command.service.js +2 -0
- package/dist/cli/commands/usage/services/llm-usage-command.service.js.map +1 -0
- package/dist/commands/channel/channel-config-view.d.ts +2 -1
- package/dist/commands/channel/channel-config-view.d.ts.map +1 -0
- package/dist/commands/channel/channel-config-view.js +2 -0
- package/dist/commands/channel/channel-config-view.js.map +1 -0
- package/dist/commands/channel/channel-list-view.service.d.ts +2 -1
- package/dist/commands/channel/channel-list-view.service.d.ts.map +1 -0
- package/dist/commands/channel/channel-list-view.service.js +2 -0
- package/dist/commands/channel/channel-list-view.service.js.map +1 -0
- package/dist/commands/channel/index.d.ts +2 -1
- package/dist/commands/channel/index.d.ts.map +1 -0
- package/dist/commands/channel/index.js +2 -0
- package/dist/commands/channel/index.js.map +1 -0
- package/dist/commands/platform-auth/services/account-status.service.d.ts +2 -1
- package/dist/commands/platform-auth/services/account-status.service.d.ts.map +1 -0
- package/dist/commands/platform-auth/services/account-status.service.js +2 -0
- package/dist/commands/platform-auth/services/account-status.service.js.map +1 -0
- package/dist/commands/platform-auth/services/platform-auth-commands.service.d.ts +2 -1
- package/dist/commands/platform-auth/services/platform-auth-commands.service.d.ts.map +1 -0
- package/dist/commands/platform-auth/services/platform-auth-commands.service.js +2 -0
- package/dist/commands/platform-auth/services/platform-auth-commands.service.js.map +1 -0
- package/dist/commands/platform-auth/utils/payload.utils.d.ts +2 -1
- package/dist/commands/platform-auth/utils/payload.utils.d.ts.map +1 -0
- package/dist/commands/platform-auth/utils/payload.utils.js +2 -0
- package/dist/commands/platform-auth/utils/payload.utils.js.map +1 -0
- package/dist/commands/plugin/index.d.ts +2 -1
- package/dist/commands/plugin/index.d.ts.map +1 -0
- package/dist/commands/plugin/index.js +2 -0
- package/dist/commands/plugin/index.js.map +1 -0
- package/dist/commands/plugin/plugin-command.utils.d.ts +4 -3
- package/dist/commands/plugin/plugin-command.utils.d.ts.map +1 -0
- package/dist/commands/plugin/plugin-command.utils.js +2 -0
- package/dist/commands/plugin/plugin-command.utils.js.map +1 -0
- package/dist/commands/plugin/plugin-mutation-actions.utils.d.ts +2 -1
- package/dist/commands/plugin/plugin-mutation-actions.utils.d.ts.map +1 -0
- package/dist/commands/plugin/plugin-mutation-actions.utils.js +2 -0
- package/dist/commands/plugin/plugin-mutation-actions.utils.js.map +1 -0
- package/dist/commands/remote/index.d.ts +2 -1
- package/dist/commands/remote/index.d.ts.map +1 -0
- package/dist/commands/remote/index.js +2 -0
- package/dist/commands/remote/index.js.map +1 -0
- package/dist/commands/remote/services/remote-access-host.service.d.ts +2 -1
- package/dist/commands/remote/services/remote-access-host.service.d.ts.map +1 -0
- package/dist/commands/remote/services/remote-access-host.service.js +2 -0
- package/dist/commands/remote/services/remote-access-host.service.js.map +1 -0
- package/dist/commands/remote/services/remote-service-control.service.d.ts +2 -1
- package/dist/commands/remote/services/remote-service-control.service.d.ts.map +1 -0
- package/dist/commands/remote/services/remote-service-control.service.js +2 -0
- package/dist/commands/remote/services/remote-service-control.service.js.map +1 -0
- package/dist/commands/remote/utils/platform-api-base.utils.d.ts +2 -1
- package/dist/commands/remote/utils/platform-api-base.utils.d.ts.map +1 -0
- package/dist/commands/remote/utils/platform-api-base.utils.js +2 -0
- package/dist/commands/remote/utils/platform-api-base.utils.js.map +1 -0
- package/dist/commands/remote/utils/remote-runtime-support.utils.d.ts +2 -1
- package/dist/commands/remote/utils/remote-runtime-support.utils.d.ts.map +1 -0
- package/dist/commands/remote/utils/remote-runtime-support.utils.js +2 -0
- package/dist/commands/remote/utils/remote-runtime-support.utils.js.map +1 -0
- package/dist/commands/service/index.d.ts +2 -1
- package/dist/commands/service/index.d.ts.map +1 -0
- package/dist/commands/service/index.js +2 -0
- package/dist/commands/service/index.js.map +1 -0
- package/dist/commands/service/services/autostart/host-autostart-command.service.d.ts +2 -1
- package/dist/commands/service/services/autostart/host-autostart-command.service.d.ts.map +1 -0
- package/dist/commands/service/services/autostart/host-autostart-command.service.js +2 -0
- package/dist/commands/service/services/autostart/host-autostart-command.service.js.map +1 -0
- package/dist/commands/service/services/autostart/host-autostart-runtime.service.d.ts +2 -1
- package/dist/commands/service/services/autostart/host-autostart-runtime.service.d.ts.map +1 -0
- package/dist/commands/service/services/autostart/host-autostart-runtime.service.js +2 -0
- package/dist/commands/service/services/autostart/host-autostart-runtime.service.js.map +1 -0
- package/dist/commands/service/services/autostart/host-autostart.service.d.ts +2 -1
- package/dist/commands/service/services/autostart/host-autostart.service.d.ts.map +1 -0
- package/dist/commands/service/services/autostart/host-autostart.service.js +2 -0
- package/dist/commands/service/services/autostart/host-autostart.service.js.map +1 -0
- package/dist/commands/service/services/autostart/linux-systemd-autostart.service.d.ts +2 -1
- package/dist/commands/service/services/autostart/linux-systemd-autostart.service.d.ts.map +1 -0
- package/dist/commands/service/services/autostart/linux-systemd-autostart.service.js +2 -0
- package/dist/commands/service/services/autostart/linux-systemd-autostart.service.js.map +1 -0
- package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.d.ts +2 -1
- package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.d.ts.map +1 -0
- package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.js +2 -0
- package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.js.map +1 -0
- package/dist/commands/service/services/autostart/windows-task-autostart.service.d.ts +2 -1
- package/dist/commands/service/services/autostart/windows-task-autostart.service.d.ts.map +1 -0
- package/dist/commands/service/services/autostart/windows-task-autostart.service.js +2 -0
- package/dist/commands/service/services/autostart/windows-task-autostart.service.js.map +1 -0
- package/dist/commands/service/types/autostart/host-autostart.types.d.ts +2 -1
- package/dist/commands/service/types/autostart/host-autostart.types.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-bundle-layout.store.d.ts +2 -1
- package/dist/launcher/npm-runtime-bundle-layout.store.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-bundle-layout.store.js +2 -0
- package/dist/launcher/npm-runtime-bundle-layout.store.js.map +1 -0
- package/dist/launcher/npm-runtime-bundle-manifest.service.d.ts +2 -1
- package/dist/launcher/npm-runtime-bundle-manifest.service.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-bundle-manifest.service.js +2 -0
- package/dist/launcher/npm-runtime-bundle-manifest.service.js.map +1 -0
- package/dist/launcher/npm-runtime-bundle.service.d.ts +2 -1
- package/dist/launcher/npm-runtime-bundle.service.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-bundle.service.js +2 -0
- package/dist/launcher/npm-runtime-bundle.service.js.map +1 -0
- package/dist/launcher/npm-runtime-bundle.types.d.ts +2 -1
- package/dist/launcher/npm-runtime-bundle.types.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-launcher.service.d.ts +2 -1
- package/dist/launcher/npm-runtime-launcher.service.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-launcher.service.js +2 -0
- package/dist/launcher/npm-runtime-launcher.service.js.map +1 -0
- package/dist/launcher/npm-runtime-update-command.service.d.ts +5 -1
- package/dist/launcher/npm-runtime-update-command.service.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-update-command.service.js +32 -0
- package/dist/launcher/npm-runtime-update-command.service.js.map +1 -0
- package/dist/launcher/npm-runtime-update-source.service.d.ts +2 -1
- package/dist/launcher/npm-runtime-update-source.service.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-update-source.service.js +2 -0
- package/dist/launcher/npm-runtime-update-source.service.js.map +1 -0
- package/dist/launcher/npm-runtime-update-state.store.d.ts +2 -1
- package/dist/launcher/npm-runtime-update-state.store.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-update-state.store.js +2 -0
- package/dist/launcher/npm-runtime-update-state.store.js.map +1 -0
- package/dist/launcher/npm-runtime-update.manager.d.ts +2 -1
- package/dist/launcher/npm-runtime-update.manager.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-update.manager.js +2 -0
- package/dist/launcher/npm-runtime-update.manager.js.map +1 -0
- package/dist/launcher/npm-runtime-update.service.d.ts +2 -1
- package/dist/launcher/npm-runtime-update.service.d.ts.map +1 -0
- package/dist/launcher/npm-runtime-update.service.js +2 -0
- package/dist/launcher/npm-runtime-update.service.js.map +1 -0
- package/dist/service-runtime.service.d.ts +2 -1
- package/dist/service-runtime.service.d.ts.map +1 -0
- package/dist/service-runtime.service.js +6 -1
- package/dist/service-runtime.service.js.map +1 -0
- package/dist/shared/controllers/gateway.controller.d.ts +2 -1
- package/dist/shared/controllers/gateway.controller.d.ts.map +1 -0
- package/dist/shared/controllers/gateway.controller.js +2 -0
- package/dist/shared/controllers/gateway.controller.js.map +1 -0
- package/dist/shared/services/gateway/gateway-restart-wake.service.d.ts +2 -1
- package/dist/shared/services/gateway/gateway-restart-wake.service.d.ts.map +1 -0
- package/dist/shared/services/gateway/gateway-restart-wake.service.js +2 -0
- package/dist/shared/services/gateway/gateway-restart-wake.service.js.map +1 -0
- package/dist/shared/services/gateway/managers/gateway-plugin.manager.d.ts +2 -1
- package/dist/shared/services/gateway/managers/gateway-plugin.manager.d.ts.map +1 -0
- package/dist/shared/services/gateway/managers/gateway-plugin.manager.js +2 -0
- package/dist/shared/services/gateway/managers/gateway-plugin.manager.js.map +1 -0
- package/dist/shared/services/gateway/managers/gateway-remote.manager.d.ts +2 -1
- package/dist/shared/services/gateway/managers/gateway-remote.manager.d.ts.map +1 -0
- package/dist/shared/services/gateway/managers/gateway-remote.manager.js +2 -0
- package/dist/shared/services/gateway/managers/gateway-remote.manager.js.map +1 -0
- package/dist/shared/services/gateway/nextclaw-app.service.d.ts +2 -1
- package/dist/shared/services/gateway/nextclaw-app.service.d.ts.map +1 -0
- package/dist/shared/services/gateway/nextclaw-app.service.js +2 -0
- package/dist/shared/services/gateway/nextclaw-app.service.js.map +1 -0
- package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.d.ts +2 -1
- package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.d.ts.map +1 -0
- package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.js +2 -0
- package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.js.map +1 -0
- package/dist/shared/services/gateway/service-bootstrap-status.service.d.ts +2 -1
- package/dist/shared/services/gateway/service-bootstrap-status.service.d.ts.map +1 -0
- package/dist/shared/services/gateway/service-bootstrap-status.service.js +2 -0
- package/dist/shared/services/gateway/service-bootstrap-status.service.js.map +1 -0
- package/dist/shared/services/gateway/service-startup-support.service.d.ts +2 -1
- package/dist/shared/services/gateway/service-startup-support.service.d.ts.map +1 -0
- package/dist/shared/services/gateway/service-startup-support.service.js +2 -0
- package/dist/shared/services/gateway/service-startup-support.service.js.map +1 -0
- package/dist/shared/services/gateway/utils/cron-job-handler.utils.d.ts +2 -1
- package/dist/shared/services/gateway/utils/cron-job-handler.utils.d.ts.map +1 -0
- package/dist/shared/services/gateway/utils/cron-job-handler.utils.js +2 -0
- package/dist/shared/services/gateway/utils/cron-job-handler.utils.js.map +1 -0
- package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.d.ts +2 -1
- package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.d.ts.map +1 -0
- package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.js +2 -0
- package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.js.map +1 -0
- package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts +2 -1
- package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts.map +1 -0
- package/dist/shared/services/marketplace/service-marketplace-installer.service.js +2 -0
- package/dist/shared/services/marketplace/service-marketplace-installer.service.js.map +1 -0
- package/dist/shared/services/marketplace/service-mcp-marketplace-ops.d.ts +2 -1
- package/dist/shared/services/marketplace/service-mcp-marketplace-ops.d.ts.map +1 -0
- package/dist/shared/services/marketplace/service-mcp-marketplace-ops.js +2 -0
- package/dist/shared/services/marketplace/service-mcp-marketplace-ops.js.map +1 -0
- package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.d.ts +2 -1
- package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.d.ts.map +1 -0
- package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.js +2 -0
- package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.js.map +1 -0
- package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.d.ts +2 -1
- package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.d.ts.map +1 -0
- package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.js +2 -0
- package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.js.map +1 -0
- package/dist/shared/services/restart/restart-coordinator.service.d.ts +2 -1
- package/dist/shared/services/restart/restart-coordinator.service.d.ts.map +1 -0
- package/dist/shared/services/restart/restart-coordinator.service.js +2 -0
- package/dist/shared/services/restart/restart-coordinator.service.js.map +1 -0
- package/dist/shared/services/restart/restart-sentinel.service.d.ts +2 -1
- package/dist/shared/services/restart/restart-sentinel.service.d.ts.map +1 -0
- package/dist/shared/services/restart/restart-sentinel.service.js +2 -0
- package/dist/shared/services/restart/restart-sentinel.service.js.map +1 -0
- package/dist/shared/services/restart/runtime-restart-request.service.d.ts +2 -1
- package/dist/shared/services/restart/runtime-restart-request.service.d.ts.map +1 -0
- package/dist/shared/services/restart/runtime-restart-request.service.js +2 -0
- package/dist/shared/services/restart/runtime-restart-request.service.js.map +1 -0
- package/dist/shared/services/runtime/managed-service-supervisor.service.d.ts +2 -1
- package/dist/shared/services/runtime/managed-service-supervisor.service.d.ts.map +1 -0
- package/dist/shared/services/runtime/managed-service-supervisor.service.js +2 -0
- package/dist/shared/services/runtime/managed-service-supervisor.service.js.map +1 -0
- package/dist/shared/services/runtime/nextclaw-distribution.service.d.ts +2 -1
- package/dist/shared/services/runtime/nextclaw-distribution.service.d.ts.map +1 -0
- package/dist/shared/services/runtime/nextclaw-distribution.service.js +2 -0
- package/dist/shared/services/runtime/nextclaw-distribution.service.js.map +1 -0
- package/dist/shared/services/runtime/runtime-command.service.d.ts +2 -1
- package/dist/shared/services/runtime/runtime-command.service.d.ts.map +1 -0
- package/dist/shared/services/runtime/runtime-command.service.js +2 -0
- package/dist/shared/services/runtime/runtime-command.service.js.map +1 -0
- package/dist/shared/services/runtime/runtime-config-init.service.d.ts +2 -1
- package/dist/shared/services/runtime/runtime-config-init.service.d.ts.map +1 -0
- package/dist/shared/services/runtime/runtime-config-init.service.js +2 -0
- package/dist/shared/services/runtime/runtime-config-init.service.js.map +1 -0
- package/dist/shared/services/runtime/service-managed-startup.service.d.ts +2 -1
- package/dist/shared/services/runtime/service-managed-startup.service.d.ts.map +1 -0
- package/dist/shared/services/runtime/service-managed-startup.service.js +2 -0
- package/dist/shared/services/runtime/service-managed-startup.service.js.map +1 -0
- package/dist/shared/services/runtime/utils/managed-service-routing.utils.d.ts +2 -1
- package/dist/shared/services/runtime/utils/managed-service-routing.utils.d.ts.map +1 -0
- package/dist/shared/services/runtime/utils/managed-service-routing.utils.js +2 -0
- package/dist/shared/services/runtime/utils/managed-service-routing.utils.js.map +1 -0
- package/dist/shared/services/runtime/utils/service-remote-runtime.utils.d.ts +2 -1
- package/dist/shared/services/runtime/utils/service-remote-runtime.utils.d.ts.map +1 -0
- package/dist/shared/services/runtime/utils/service-remote-runtime.utils.js +2 -0
- package/dist/shared/services/runtime/utils/service-remote-runtime.utils.js.map +1 -0
- package/dist/shared/services/ui/companion-runtime.service.d.ts +2 -1
- package/dist/shared/services/ui/companion-runtime.service.d.ts.map +1 -0
- package/dist/shared/services/ui/companion-runtime.service.js +2 -0
- package/dist/shared/services/ui/companion-runtime.service.js.map +1 -0
- package/dist/shared/services/ui/local-ui-discovery.service.d.ts +2 -1
- package/dist/shared/services/ui/local-ui-discovery.service.d.ts.map +1 -0
- package/dist/shared/services/ui/local-ui-discovery.service.js +2 -0
- package/dist/shared/services/ui/local-ui-discovery.service.js.map +1 -0
- package/dist/shared/services/ui/npm-runtime-update-host.service.d.ts +2 -1
- package/dist/shared/services/ui/npm-runtime-update-host.service.d.ts.map +1 -0
- package/dist/shared/services/ui/npm-runtime-update-host.service.js +2 -0
- package/dist/shared/services/ui/npm-runtime-update-host.service.js.map +1 -0
- package/dist/shared/services/ui/runtime-control-host.service.d.ts +2 -1
- package/dist/shared/services/ui/runtime-control-host.service.d.ts.map +1 -0
- package/dist/shared/services/ui/runtime-control-host.service.js +2 -0
- package/dist/shared/services/ui/runtime-control-host.service.js.map +1 -0
- package/dist/shared/services/ui/service-remote-access.service.d.ts +2 -1
- package/dist/shared/services/ui/service-remote-access.service.d.ts.map +1 -0
- package/dist/shared/services/ui/service-remote-access.service.js +2 -0
- package/dist/shared/services/ui/service-remote-access.service.js.map +1 -0
- package/dist/shared/services/ui/ui-bridge-api.service.d.ts +2 -1
- package/dist/shared/services/ui/ui-bridge-api.service.d.ts.map +1 -0
- package/dist/shared/services/ui/ui-bridge-api.service.js +2 -0
- package/dist/shared/services/ui/ui-bridge-api.service.js.map +1 -0
- package/dist/shared/services/workspace/workspace-manager.service.d.ts +2 -1
- package/dist/shared/services/workspace/workspace-manager.service.d.ts.map +1 -0
- package/dist/shared/services/workspace/workspace-manager.service.js +2 -0
- package/dist/shared/services/workspace/workspace-manager.service.js.map +1 -0
- package/dist/shared/stores/companion-runtime.store.d.ts +2 -1
- package/dist/shared/stores/companion-runtime.store.d.ts.map +1 -0
- package/dist/shared/stores/companion-runtime.store.js +2 -0
- package/dist/shared/stores/companion-runtime.store.js.map +1 -0
- package/dist/shared/stores/local-ui-runtime.store.d.ts +2 -1
- package/dist/shared/stores/local-ui-runtime.store.d.ts.map +1 -0
- package/dist/shared/stores/local-ui-runtime.store.js +2 -0
- package/dist/shared/stores/local-ui-runtime.store.js.map +1 -0
- package/dist/shared/stores/managed-service-state.store.d.ts +2 -1
- package/dist/shared/stores/managed-service-state.store.d.ts.map +1 -0
- package/dist/shared/stores/managed-service-state.store.js +2 -0
- package/dist/shared/stores/managed-service-state.store.js.map +1 -0
- package/dist/shared/stores/pending-restart.store.d.ts +2 -1
- package/dist/shared/stores/pending-restart.store.d.ts.map +1 -0
- package/dist/shared/stores/pending-restart.store.js +2 -0
- package/dist/shared/stores/pending-restart.store.js.map +1 -0
- package/dist/shared/types/cli.types.d.ts +2 -1
- package/dist/shared/types/cli.types.d.ts.map +1 -0
- package/dist/shared/types/distribution.types.d.ts +2 -1
- package/dist/shared/types/distribution.types.d.ts.map +1 -0
- package/dist/shared/utils/cli.utils.d.ts +2 -1
- package/dist/shared/utils/cli.utils.d.ts.map +1 -0
- package/dist/shared/utils/cli.utils.js +2 -0
- package/dist/shared/utils/cli.utils.js.map +1 -0
- package/dist/shared/utils/config-path.d.ts +2 -1
- package/dist/shared/utils/config-path.d.ts.map +1 -0
- package/dist/shared/utils/config-path.js +2 -0
- package/dist/shared/utils/config-path.js.map +1 -0
- package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.d.ts +2 -1
- package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.d.ts.map +1 -0
- package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.js +2 -0
- package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.js.map +1 -0
- package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.d.ts +2 -1
- package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.d.ts.map +1 -0
- package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.js +2 -0
- package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.js.map +1 -0
- package/dist/shared/utils/package/package-manifest.utils.d.ts +2 -1
- package/dist/shared/utils/package/package-manifest.utils.d.ts.map +1 -0
- package/dist/shared/utils/package/package-manifest.utils.js +2 -0
- package/dist/shared/utils/package/package-manifest.utils.js.map +1 -0
- package/dist/shared/utils/runtime-helpers.d.ts +2 -1
- package/dist/shared/utils/runtime-helpers.d.ts.map +1 -0
- package/dist/shared/utils/runtime-helpers.js +2 -0
- package/dist/shared/utils/runtime-helpers.js.map +1 -0
- package/dist/shared/utils/service-port-probe.utils.d.ts +2 -1
- package/dist/shared/utils/service-port-probe.utils.d.ts.map +1 -0
- package/dist/shared/utils/service-port-probe.utils.js +2 -0
- package/dist/shared/utils/service-port-probe.utils.js.map +1 -0
- package/dist/shared/utils/startup-trace.d.ts +2 -1
- package/dist/shared/utils/startup-trace.d.ts.map +1 -0
- package/dist/shared/utils/startup-trace.js +2 -0
- package/dist/shared/utils/startup-trace.js.map +1 -0
- package/dist/shared/utils/top-level-nextclaw-command-env.utils.d.ts +2 -1
- package/dist/shared/utils/top-level-nextclaw-command-env.utils.d.ts.map +1 -0
- package/dist/shared/utils/top-level-nextclaw-command-env.utils.js +2 -0
- package/dist/shared/utils/top-level-nextclaw-command-env.utils.js.map +1 -0
- package/package.json +20 -20
|
@@ -38,4 +38,5 @@ declare class RuntimeCommandService {
|
|
|
38
38
|
private printServiceControlHints;
|
|
39
39
|
}
|
|
40
40
|
//#endregion
|
|
41
|
-
export { RuntimeCommandService, buildMarketplaceSkillInstallArgs, describeUnmanagedHealthyTargetMessage, pickUserFacingCommandSummary };
|
|
41
|
+
export { RuntimeCommandService, buildMarketplaceSkillInstallArgs, describeUnmanagedHealthyTargetMessage, pickUserFacingCommandSummary };
|
|
42
|
+
//# sourceMappingURL=runtime-command.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-command.service.d.ts","names":[],"sources":["../../../../src/shared/services/runtime/runtime-command.service.ts"],"mappings":";;;;;;;KAiBK,QAAA,GAAS,YAAA,CAAa,MAAA;AAAA,cAEd,qBAAA;EAAA,QAaS,IAAA;EAAA,QAZZ,gBAAA;EAAA,QACA,2BAAA;EAAA,iBACS,aAAA;EAAA,iBACA,wBAAA;EAAA,iBACA,4BAAA;cAQG,IAAA;IAClB,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;IAClD,4BAAA,GAA+B,aAAA;EAAA;EAGjC,YAAA,GAAsB,OAAA;IAAW,WAAA,GAAc,OAAA,CAAQ,QAAA;IAAe,WAAA;EAAA,MAAqC,OAAA;EA0B3G,YAAA,GAAsB,OAAA,EAAS,mBAAA,KAAsB,OAAA;EAIrD,WAAA,QAAwB,OAAA;EAIxB,aAAA,GAAuB,OAAA;IACrB,WAAA,EAAa,OAAA,CAAQ,QAAA;IACrB,IAAA;EAAA,MACE,OAAA;EAAA,QAII,8BAAA;EAAA,QAUA,kBAAA;EAAA,QAIA,gBAAA;EAAA,QAWA,UAAA;EAAA,QA2CA,6BAAA;EAAA,QAWA,yBAAA;EAAA,QAcA,oBAAA;EAAA,QA6BA,iBAAA;EAAA,QAoBA,wBAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-command.service.js","names":["getWorkspacePath","loadConfig"],"sources":["../../../../src/shared/services/runtime/runtime-command.service.ts"],"sourcesContent":["import * as NextclawCore from \"@nextclaw/core\";\nimport { spawn } from \"node:child_process\";\nimport { SkillManager } from \"@nextclaw/kernel\";\nimport type { RequestRestartParams } from \"@nextclaw-service/shared/types/cli.types.js\";\nimport { ManagedServiceCommandService, type StartServiceOptions } from \"@nextclaw-service/shared/services/runtime/service-managed-startup.service.js\";\nimport { ManagedServiceSupervisor } from \"@nextclaw-service/shared/services/runtime/managed-service-supervisor.service.js\";\nimport { NextclawGatewayRuntime } from \"@nextclaw-service/shared/services/gateway/nextclaw-gateway-runtime.service.js\";\nimport { NextclawDistributionService } from \"@nextclaw-service/shared/services/runtime/nextclaw-distribution.service.js\";\nimport { describeUnmanagedHealthyTargetMessage, inspectUiTarget } from \"@nextclaw-service/shared/utils/service-port-probe.utils.js\";\nimport { resolveCliSubcommandEntry } from \"@nextclaw-service/shared/utils/marketplace/cli-subcommand-launch.utils.js\";\nimport { isLoopbackHost, resolvePublicIp, resolveUiStaticDir } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nexport { buildMarketplaceSkillInstallArgs, pickUserFacingCommandSummary } from \"@nextclaw-service/shared/utils/marketplace/service-marketplace-helpers.utils.js\";\nexport { describeUnmanagedHealthyTargetMessage };\nconst {\n getWorkspacePath,\n loadConfig,\n} = NextclawCore;\ntype Config = NextclawCore.Config;\n\nexport class RuntimeCommandService {\n private loggingInstalled = false;\n private processExitLoggingInstalled = false;\n private readonly runtimeLogger = NextclawCore.getAppLogger(\"service.runtime\");\n private readonly managedServiceSupervisor = new ManagedServiceSupervisor();\n private readonly managedServiceCommandService = new ManagedServiceCommandService({\n startGateway: async (options) => await this.startGateway(options),\n printPublicUiUrls: async (host, port) => await this.printPublicUiUrls(host, port),\n printServiceControlHints: () => this.printServiceControlHints(),\n checkUiPortPreflight: async (params) => await this.checkUiPortPreflight(params),\n resolveUiStaticDir: () => resolveUiStaticDir(NextclawDistributionService.get().uiDistDir)\n });\n\n constructor(private deps: {\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n initializeAgentHomeDirectory: (homeDirectory: string) => void;\n }) {}\n\n startGateway = async (options: { uiOverrides?: Partial<Config[\"ui\"]>; uiStaticDir?: string | null } = {}): Promise<void> => {\n this.ensureRuntimeLoggingInstalled();\n this.installProcessExitLogging();\n this.managedServiceSupervisor.installCurrentProcessLifecycleTracking();\n this.runtimeLogger.info(\"runtime.process.started\", {\n runtimeKind: \"serve-process\",\n pid: process.pid,\n source: \"RuntimeCommandService.startGateway\"\n });\n await new NextclawGatewayRuntime({\n requestRestart: this.deps.requestRestart,\n initializeAgentHomeDirectory: this.deps.initializeAgentHomeDirectory,\n startService: this.startService,\n stopService: this.stopService,\n runCliSubcommand: this.runCliSubcommand,\n installBuiltinMarketplaceSkill: this.installBuiltinMarketplaceSkill,\n }, {\n ...options\n }).start();\n this.runtimeLogger.info(\"runtime.process.ready\", {\n runtimeKind: \"serve-process\",\n pid: process.pid,\n source: \"RuntimeCommandService.startGateway\"\n });\n };\n\n startService = async (options: StartServiceOptions): Promise<void> => {\n await this.managedServiceCommandService.startService(options);\n };\n\n stopService = async (): Promise<void> => {\n await this.managedServiceCommandService.stopService();\n };\n\n runForeground = async (options: {\n uiOverrides: Partial<Config[\"ui\"]>;\n open: boolean;\n }): Promise<void> => {\n await this.managedServiceCommandService.runForeground(options);\n };\n\n private installBuiltinMarketplaceSkill = (slug: string, _force: boolean | undefined): { message: string; output?: string } | null => {\n const workspace = getWorkspacePath(loadConfig().agents.defaults.workspace);\n if (!new SkillManager({ workspace }).findBuiltinSkill(slug)) {\n return null;\n }\n return {\n message: `${slug} is already available (built-in)`\n };\n };\n\n private mergeCommandOutput = (stdout: string, stderr: string): string => {\n return `${stdout}\\n${stderr}`.trim();\n };\n\n private runCliSubcommand = (args: string[], timeoutMs = 180_000): Promise<string> => {\n const cliEntry = resolveCliSubcommandEntry({\n argvEntry: process.argv[1],\n importMetaUrl: import.meta.url\n });\n return this.runCommand(process.execPath, [...process.execArgv, cliEntry, ...args], {\n cwd: process.cwd(),\n timeoutMs\n }).then((result) => this.mergeCommandOutput(result.stdout, result.stderr));\n };\n\n private runCommand = (command: string, args: string[], options: { cwd?: string; timeoutMs?: number } = {}): Promise<{ stdout: string; stderr: string }> => {\n const timeoutMs = options.timeoutMs ?? 180_000;\n return new Promise((resolvePromise, rejectPromise) => {\n const child = spawn(command, args, {\n cwd: options.cwd ?? process.cwd(),\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true\n });\n\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.setEncoding(\"utf-8\");\n child.stderr?.setEncoding(\"utf-8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\");\n rejectPromise(new Error(`command timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n child.on(\"error\", (error) => {\n clearTimeout(timer);\n rejectPromise(new Error(`failed to start command: ${String(error)}`));\n });\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n const output = this.mergeCommandOutput(stdout, stderr);\n if (code === 0) {\n resolvePromise({ stdout, stderr });\n return;\n }\n rejectPromise(new Error(output || `command failed with code ${code ?? 1}`));\n });\n });\n };\n\n private ensureRuntimeLoggingInstalled = (): void => {\n if (this.loggingInstalled) {\n return;\n }\n NextclawCore.configureAppLogging({\n installConsoleMirror: true,\n installProcessCrashMonitor: true\n });\n this.loggingInstalled = true;\n };\n\n private installProcessExitLogging = (): void => {\n if (this.processExitLoggingInstalled) {\n return;\n }\n this.processExitLoggingInstalled = true;\n process.once(\"exit\", (code) => {\n this.runtimeLogger.warn(\"runtime.process.exited\", {\n runtimeKind: \"serve-process\",\n pid: process.pid,\n code\n });\n });\n };\n\n private checkUiPortPreflight = async (params: {\n host: string;\n port: number;\n healthUrl: string;\n }): Promise<\n | { ok: true; reusedExistingHealthyTarget: boolean }\n | { ok: false; message: string }\n > => {\n const target = await inspectUiTarget(params);\n if (target.state === \"available\") {\n return { ok: true, reusedExistingHealthyTarget: false };\n }\n if (target.state === \"healthy-existing\") {\n return { ok: true, reusedExistingHealthyTarget: true };\n }\n\n const lines = [`Port probe: ${target.availabilityDetail}`];\n if (target.probeError) {\n lines.push(`Health probe: ${target.probeError}`);\n }\n lines.push(\"The port is occupied by a process that does not answer as a healthy NextClaw HTTP server.\");\n lines.push(`Fix: free port ${params.port} or start NextClaw with another port via --ui-port <port>.`);\n lines.push(`Inspect locally with: ss -ltnp | grep ${params.port} || lsof -iTCP:${params.port} -sTCP:LISTEN -n -P`);\n return {\n ok: false,\n message: lines.join(\"\\n\")\n };\n };\n\n private printPublicUiUrls = async (host: string, port: number): Promise<void> => {\n if (isLoopbackHost(host)) {\n console.log(\"Public URL: disabled (UI host is loopback). Current release expects public exposure; run nextclaw restart.\");\n return;\n }\n\n const publicIp = await resolvePublicIp();\n if (!publicIp) {\n console.log(\"Public URL: UI is exposed, but automatic public IP detection failed.\");\n return;\n }\n\n const publicBase = `http://${publicIp}:${port}`;\n console.log(`Public UI (if firewall/NAT allows): ${publicBase}`);\n console.log(`Public API (if firewall/NAT allows): ${publicBase}/api`);\n console.log(`Public deploy note: NextClaw serves plain HTTP on ${port}.`);\n console.log(`For https:// or standard 80/443 access, terminate TLS in Nginx/Caddy and proxy to http://127.0.0.1:${port}.`);\n console.log(`If a reverse proxy returns 502, verify its upstream is http://127.0.0.1:${port} (not https://, not a stale port, and not a stopped process).`);\n };\n\n private printServiceControlHints = (): void => {\n console.log(\"Service controls:\");\n console.log(\" - Check status: NextClaw status\");\n console.log(\" - If you need to stop the service, run: NextClaw stop\");\n console.log(\" - View log paths: NextClaw logs path\");\n console.log(\" - Tail recent logs: NextClaw logs tail\");\n console.log(\" - Check autostart: NextClaw service autostart status --user\");\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
//#region src/shared/services/runtime/runtime-config-init.service.d.ts
|
|
2
2
|
declare function initializeConfigIfMissing(configPath?: string): boolean;
|
|
3
3
|
//#endregion
|
|
4
|
-
export { initializeConfigIfMissing };
|
|
4
|
+
export { initializeConfigIfMissing };
|
|
5
|
+
//# sourceMappingURL=runtime-config-init.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-config-init.service.d.ts","names":[],"sources":["../../../../src/shared/services/runtime/runtime-config-init.service.ts"],"mappings":";iBAGgB,yBAAA,CAA0B,UAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-config-init.service.js","names":[],"sources":["../../../../src/shared/services/runtime/runtime-config-init.service.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { getConfigPath, loadConfig } from \"@nextclaw/core\";\n\nexport function initializeConfigIfMissing(configPath = getConfigPath()): boolean {\n if (existsSync(configPath)) {\n return false;\n }\n loadConfig(configPath);\n return true;\n}\n"],"mappings":";;;AAGA,SAAgB,0BAA0B,aAAa,eAAe,EAAW;AAC/E,KAAI,WAAW,WAAW,CACxB,QAAO;AAET,YAAW,WAAW;AACtB,QAAO"}
|
|
@@ -91,4 +91,5 @@ declare class ManagedServiceCommandService {
|
|
|
91
91
|
private printStartupFailureDiagnostics;
|
|
92
92
|
}
|
|
93
93
|
//#endregion
|
|
94
|
-
export { ManagedServiceCommandService, StartServiceOptions, reportManagedServiceStart, resolveManagedServiceReadySnapshot, resolveManagedServiceUiBinding, resolveSessionRouteCandidate, waitForManagedServiceReadiness };
|
|
94
|
+
export { ManagedServiceCommandService, StartServiceOptions, reportManagedServiceStart, resolveManagedServiceReadySnapshot, resolveManagedServiceUiBinding, resolveSessionRouteCandidate, waitForManagedServiceReadiness };
|
|
95
|
+
//# sourceMappingURL=service-managed-startup.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-managed-startup.service.d.ts","names":[],"sources":["../../../../src/shared/services/runtime/service-managed-startup.service.ts"],"mappings":";;;;KAqBK,QAAA,GAAS,YAAA,CAAa,MAAA;AAAA,KAEf,mBAAA;EACV,WAAA,EAAa,OAAA,CAAQ,QAAA;EACrB,IAAA;EACA,gBAAA;AAAA;AAAA,iBAKoB,8BAAA,CAA+B,MAAA;EACnD,OAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,kBAAA;EACA,mBAAA;EACA,sBAAA;EACA,kBAAA,GAAqB,OAAA,UAAiB,OAAA;EACtC,6BAAA,GAAgC,MAAA;IAC9B,GAAA;IACA,SAAA;IACA,SAAA;EAAA,MACI,OAAA;IAAU,KAAA;IAAgB,cAAA;EAAA;EAChC,gBAAA,GAAmB,GAAA;AAAA,IACjB,OAAA;EAAU,KAAA;EAAgB,cAAA;AAAA;AAAA,iBA8BR,yBAAA,CAA0B,MAAA;EAC9C,OAAA;EACA,KAAA;IAAS,GAAA;IAAa,OAAA;EAAA;EACtB,QAAA;IAAY,IAAA;IAAc,IAAA;EAAA;EAC1B,KAAA;EACA,MAAA;EACA,kBAAA;EACA,SAAA;IAAa,KAAA;IAAgB,cAAA;EAAA;EAC7B,iBAAA,GAAoB,IAAA,UAAc,IAAA,aAAiB,OAAA;EACnD,wBAAA;AAAA,IACE,OAAA;AAAA,cAiBS,4BAAA;EAAA,iBAMkB,IAAA;EAAA,iBALZ,cAAA;EAAA,iBACA,aAAA;EAAA,iBACA,aAAA;EAAA,iBACA,UAAA;cAEY,IAAA;IAC3B,YAAA,GAAe,OAAA;MAAW,WAAA,EAAa,OAAA,CAAQ,QAAA;MAAe,WAAA;IAAA,MAAkC,OAAA;IAChG,iBAAA,GAAoB,IAAA,UAAc,IAAA,aAAiB,OAAA;IACnD,wBAAA;IACA,oBAAA,GAAuB,MAAA;MAAU,IAAA;MAAc,IAAA;MAAc,SAAA;IAAA,MAAwB,OAAA;MAAU,EAAA;MAAU,2BAAA;IAAA;MAA2C,EAAA;MAAW,OAAA;IAAA;IAC/J,kBAAA;EAAA;EAGF,aAAA,GAAuB,OAAA;IACrB,WAAA,EAAa,OAAA,CAAQ,QAAA;IACrB,IAAA;EAAA,MACE,OAAA;EAeJ,YAAA,GAAsB,OAAA,EAAS,mBAAA,KAAsB,OAAA;EAsDrD,WAAA,QAAwB,OAAA;EAAA,QA0DhB,4BAAA;EAAA,QAgCA,+BAAA;EAAA,QAuBA,4BAAA;EAAA,QA+FA,6BAAA;EAAA,QAuBA,uBAAA;EAAA,QAYA,kBAAA;EAAA,QASA,8BAAA;AAAA"}
|
|
@@ -337,3 +337,5 @@ var ManagedServiceCommandService = class {
|
|
|
337
337
|
};
|
|
338
338
|
//#endregion
|
|
339
339
|
export { ManagedServiceCommandService, reportManagedServiceStart, resolveManagedServiceReadySnapshot, resolveManagedServiceUiBinding, resolveSessionRouteCandidate, waitForManagedServiceReadiness };
|
|
340
|
+
|
|
341
|
+
//# sourceMappingURL=service-managed-startup.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-managed-startup.service.js","names":["loadConfig","APP_NAME"],"sources":["../../../../src/shared/services/runtime/service-managed-startup.service.ts"],"sourcesContent":["import * as NextclawCore from \"@nextclaw/core\";\nimport { localUiRuntimeStore } from \"@nextclaw-service/shared/stores/local-ui-runtime.store.js\";\nimport { managedServiceStateStore, type ManagedServiceState } from \"@nextclaw-service/shared/stores/managed-service-state.store.js\";\nimport {\n resolveManagedServiceReadySnapshot,\n resolveManagedServiceUiBinding,\n resolveSessionRouteCandidate,\n} from \"@nextclaw-service/shared/services/runtime/utils/managed-service-routing.utils.js\";\nimport {\n isProcessRunning,\n openBrowser,\n resolveServiceLogPath,\n resolveUiApiBase,\n resolveUiConfig,\n waitForExit\n} from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport { probeHealthEndpoint } from \"@nextclaw-service/shared/utils/service-port-probe.utils.js\";\nimport { ManagedServiceSupervisor } from \"@nextclaw-service/shared/services/runtime/managed-service-supervisor.service.js\";\n\nconst { APP_NAME, loadConfig } = NextclawCore;\n\ntype Config = NextclawCore.Config;\n\nexport type StartServiceOptions = {\n uiOverrides: Partial<Config[\"ui\"]>;\n open: boolean;\n startupTimeoutMs?: number;\n};\n\nexport { resolveManagedServiceReadySnapshot, resolveManagedServiceUiBinding, resolveSessionRouteCandidate };\n\nexport async function waitForManagedServiceReadiness(params: {\n appName: string;\n childPid: number;\n healthUrl: string;\n logPath: string;\n readinessTimeoutMs: number;\n quickPhaseTimeoutMs: number;\n extendedPhaseTimeoutMs: number;\n appendStartupStage: (logPath: string, message: string) => void;\n waitForBackgroundServiceReady: (params: {\n pid: number;\n healthUrl: string;\n timeoutMs: number;\n }) => Promise<{ ready: boolean; lastProbeError: string | null }>;\n isProcessRunning: (pid: number) => boolean;\n}): Promise<{ ready: boolean; lastProbeError: string | null }> {\n params.appendStartupStage(params.logPath, `health probe started: ${params.healthUrl} (phase=quick, timeoutMs=${params.quickPhaseTimeoutMs})`);\n let readiness = await params.waitForBackgroundServiceReady({\n pid: params.childPid,\n healthUrl: params.healthUrl,\n timeoutMs: params.quickPhaseTimeoutMs\n });\n if (!readiness.ready && params.isProcessRunning(params.childPid) && params.extendedPhaseTimeoutMs > 0) {\n console.warn(\n `Warning: Background service is still running but not ready after ${Math.ceil(params.quickPhaseTimeoutMs / 1000)}s; waiting up to ${Math.ceil(params.extendedPhaseTimeoutMs / 1000)}s more.`\n );\n params.appendStartupStage(\n params.logPath,\n `health probe entering extended phase (timeoutMs=${params.extendedPhaseTimeoutMs}, lastError=${readiness.lastProbeError ?? \"none\"})`\n );\n readiness = await params.waitForBackgroundServiceReady({\n pid: params.childPid,\n healthUrl: params.healthUrl,\n timeoutMs: params.extendedPhaseTimeoutMs\n });\n }\n if (!readiness.ready && params.isProcessRunning(params.childPid)) {\n params.appendStartupStage(\n params.logPath,\n `startup degraded: process alive but health probe timed out after ${params.readinessTimeoutMs}ms (lastError=${readiness.lastProbeError ?? \"none\"})`\n );\n }\n return readiness;\n}\n\nexport async function reportManagedServiceStart(params: {\n appName: string;\n state: { pid: number; logPath: string };\n uiConfig: { host: string; port: number };\n uiUrl: string;\n apiUrl: string;\n readinessTimeoutMs: number;\n readiness: { ready: boolean; lastProbeError: string | null };\n printPublicUiUrls: (host: string, port: number) => Promise<void>;\n printServiceControlHints: () => void;\n}): Promise<void> {\n if (!params.readiness.ready) {\n const hint = params.readiness.lastProbeError ? ` Last probe error: ${params.readiness.lastProbeError}` : \"\";\n console.warn(\n `Warning: ${params.appName} is running (PID ${params.state.pid}) but not healthy yet after ${Math.ceil(params.readinessTimeoutMs / 1000)}s. Marked as degraded.${hint}`\n );\n console.warn(`Tip: Run \"${params.appName} status --json\" and check logs: ${params.state.logPath}`);\n } else {\n console.log(`✓ ${params.appName} started in background (PID ${params.state.pid})`);\n }\n console.log(`UI: ${params.uiUrl}`);\n console.log(`API: ${params.apiUrl}`);\n await params.printPublicUiUrls(params.uiConfig.host, params.uiConfig.port);\n console.log(`Logs: ${params.state.logPath}`);\n params.printServiceControlHints();\n}\n\nexport class ManagedServiceCommandService {\n private readonly loggingRuntime = NextclawCore.getLoggingRuntime();\n private readonly serviceLogger = this.loggingRuntime.getLogger(\"service\");\n private readonly startupLogger = this.serviceLogger.child(\"startup\");\n private readonly supervisor = new ManagedServiceSupervisor();\n\n constructor(private readonly deps: {\n startGateway: (options: { uiOverrides: Partial<Config[\"ui\"]>; uiStaticDir?: string | null }) => Promise<void>;\n printPublicUiUrls: (host: string, port: number) => Promise<void>;\n printServiceControlHints: () => void;\n checkUiPortPreflight: (params: { host: string; port: number; healthUrl: string }) => Promise<{ ok: true; reusedExistingHealthyTarget: boolean } | { ok: false; message: string }>;\n resolveUiStaticDir: () => string | null;\n }) {}\n\n runForeground = async (options: {\n uiOverrides: Partial<Config[\"ui\"]>;\n open: boolean;\n }): Promise<void> => {\n const config = loadConfig();\n const uiConfig = resolveUiConfig(config, options.uiOverrides);\n const uiUrl = resolveUiApiBase(uiConfig.host, uiConfig.port);\n\n if (options.open) {\n openBrowser(uiUrl);\n }\n\n await this.deps.startGateway({\n uiOverrides: options.uiOverrides,\n uiStaticDir: this.deps.resolveUiStaticDir()\n });\n };\n\n startService = async (options: StartServiceOptions): Promise<void> => {\n this.loggingRuntime.ensureReady();\n const { open, startupTimeoutMs, uiOverrides } = options;\n const config = loadConfig();\n const uiConfig = resolveUiConfig(config, uiOverrides);\n const uiUrl = resolveUiApiBase(uiConfig.host, uiConfig.port);\n const apiUrl = `${uiUrl}/api`;\n const staticDir = this.deps.resolveUiStaticDir();\n\n const existing = managedServiceStateStore.read();\n const existingLiveness = this.supervisor.resolveStateLiveness(existing);\n if (existing && existingLiveness.running) {\n await this.handleExistingManagedService({ existing, uiConfig, options });\n return;\n }\n if (existing && !existingLiveness.processExists) {\n managedServiceStateStore.clear();\n }\n\n if (!staticDir) {\n return void (\n process.exitCode = 1,\n console.error(`Error: ${APP_NAME} UI frontend bundle not found. Reinstall or rebuild ${APP_NAME}. For dev-only overrides, set NEXTCLAW_UI_STATIC_DIR to a built frontend directory.`)\n );\n }\n\n const healthUrl = `${apiUrl}/health`;\n const portPreflight = await this.deps.checkUiPortPreflight({ host: uiConfig.host, port: uiConfig.port, healthUrl });\n if (!portPreflight.ok) {\n return void (\n process.exitCode = 1,\n console.error(`Error: Cannot start ${APP_NAME} because UI port ${uiConfig.port} is already occupied.`),\n console.error(portPreflight.message)\n );\n }\n if (portPreflight.reusedExistingHealthyTarget) {\n await this.reuseExistingHealthyStartTarget({ uiConfig, uiUrl, apiUrl, open });\n return;\n }\n\n await this.startNewManagedServiceTarget({\n config,\n uiConfig,\n uiUrl,\n apiUrl,\n healthUrl,\n startupTimeoutMs,\n });\n\n if (open) {\n openBrowser(uiUrl);\n }\n };\n\n stopService = async (): Promise<void> => {\n const state = managedServiceStateStore.read();\n if (!state) {\n console.log(\"No running background service found.\");\n return;\n }\n if (!isProcessRunning(state.pid)) {\n console.log(\"Service is not running. Cleaning up state.\");\n managedServiceStateStore.clear();\n return;\n }\n\n console.log(`Stopping ${APP_NAME} (PID ${state.pid})...`);\n this.serviceLogger.info(\"runtime.process.stop_requested\", {\n runtimeKind: \"managed-service\",\n pid: state.pid,\n reason: \"nextclaw-stop-command\",\n uiUrl: state.uiUrl,\n apiUrl: state.apiUrl\n });\n try {\n process.kill(state.pid, \"SIGTERM\");\n } catch (error) {\n console.error(`Failed to stop service: ${String(error)}`);\n return;\n }\n\n const stopped = await waitForExit(state.pid, 3000);\n if (!stopped) {\n this.serviceLogger.warn(\"runtime.process.stop_requested\", {\n runtimeKind: \"managed-service\",\n pid: state.pid,\n reason: \"nextclaw-stop-command-force\",\n signal: \"SIGKILL\",\n uiUrl: state.uiUrl,\n apiUrl: state.apiUrl\n });\n try {\n process.kill(state.pid, \"SIGKILL\");\n } catch (error) {\n console.error(`Failed to force stop service: ${String(error)}`);\n return;\n }\n await waitForExit(state.pid, 2000);\n }\n\n managedServiceStateStore.clear();\n localUiRuntimeStore.clearIfOwnedByProcess(state.pid);\n this.serviceLogger.info(\"service_state.cleared\", {\n runtimeKind: \"managed-service\",\n pid: state.pid,\n statePath: managedServiceStateStore.path,\n uiUrl: state.uiUrl,\n apiUrl: state.apiUrl\n });\n console.log(`✓ ${APP_NAME} stopped`);\n };\n\n private handleExistingManagedService = async (params: {\n existing: ManagedServiceState;\n uiConfig: Config[\"ui\"];\n options: StartServiceOptions;\n }): Promise<boolean> => {\n const { existing, options, uiConfig } = params;\n console.log(`✓ ${APP_NAME} is already running (PID ${existing.pid})`);\n console.log(`UI: ${existing.uiUrl}`);\n console.log(`API: ${existing.apiUrl}`);\n\n const binding = resolveManagedServiceUiBinding(existing);\n if (binding.host !== uiConfig.host || binding.port !== uiConfig.port) {\n console.log(\n `Detected running service UI bind (${binding.host}:${binding.port}); enforcing (${uiConfig.host}:${uiConfig.port})...`\n );\n await this.stopService();\n const stateAfterStop = managedServiceStateStore.read();\n if (stateAfterStop && isProcessRunning(stateAfterStop.pid)) {\n process.exitCode = 1;\n console.error(\"Error: Failed to stop running service while enforcing public UI exposure.\");\n return true;\n }\n await this.startService(options);\n return true;\n }\n\n await this.deps.printPublicUiUrls(binding.host, binding.port);\n console.log(`Logs: ${existing.logPath}`);\n this.deps.printServiceControlHints();\n return true;\n };\n\n private reuseExistingHealthyStartTarget = async (params: {\n uiConfig: Config[\"ui\"];\n uiUrl: string;\n apiUrl: string;\n open: boolean;\n }): Promise<void> => {\n const { apiUrl, open, uiConfig, uiUrl } = params;\n console.log(`✓ ${APP_NAME} is already serving the target UI/API port`);\n console.log(`UI: ${uiUrl}`);\n console.log(`API: ${apiUrl}`);\n console.warn(\n [\n `Warning: The healthy listener on ${uiConfig.port} is not tracked by ${managedServiceStateStore.path}.`,\n \"This start call reused the existing runtime instead of spawning another one.\",\n \"Use the owning process or port-level tools to stop it; managed stop/restart will not control it automatically.\"\n ].join(\" \")\n );\n await this.deps.printPublicUiUrls(uiConfig.host, uiConfig.port);\n if (open) {\n openBrowser(uiUrl);\n }\n };\n\n private startNewManagedServiceTarget = async (params: {\n config: Config;\n uiConfig: Config[\"ui\"];\n uiUrl: string;\n apiUrl: string;\n healthUrl: string;\n startupTimeoutMs?: number;\n }): Promise<void> => {\n const { apiUrl, config, healthUrl, startupTimeoutMs, uiConfig, uiUrl } = params;\n const startup = this.supervisor.spawnManagedService({\n appName: APP_NAME,\n config,\n uiConfig,\n uiUrl,\n apiUrl,\n healthUrl,\n startupTimeoutMs,\n resolveStartupTimeoutMs: this.resolveStartupTimeoutMs,\n appendStartupStage: this.appendStartupStage,\n printStartupFailureDiagnostics: this.printStartupFailureDiagnostics,\n resolveServiceLogPath\n });\n if (!startup) {\n this.serviceLogger.fatal(\"managed service startup aborted\", {\n reason: \"child_process_not_created\"\n });\n process.exitCode = 1;\n return;\n }\n\n const readiness = await waitForManagedServiceReadiness({\n appName: APP_NAME,\n childPid: startup.snapshot.pid,\n healthUrl,\n logPath: startup.logPath,\n readinessTimeoutMs: startup.readinessTimeoutMs,\n quickPhaseTimeoutMs: startup.quickPhaseTimeoutMs,\n extendedPhaseTimeoutMs: startup.extendedPhaseTimeoutMs,\n appendStartupStage: this.appendStartupStage,\n waitForBackgroundServiceReady: this.waitForBackgroundServiceReady,\n isProcessRunning\n });\n if (!readiness.ready && !isProcessRunning(startup.snapshot.pid)) {\n process.exitCode = 1;\n managedServiceStateStore.clear();\n const hint = readiness.lastProbeError ? ` Last probe error: ${readiness.lastProbeError}` : \"\";\n this.appendStartupStage(startup.logPath, `startup failed: process exited before ready.${hint}`);\n this.serviceLogger.fatal(\"managed service exited before readiness completed\", {\n uiUrl,\n apiUrl,\n healthUrl,\n logPath: startup.logPath,\n ...(readiness.lastProbeError ? { lastProbeError: readiness.lastProbeError } : {}),\n });\n console.error(`Error: Failed to start background service. Check logs: ${startup.logPath}.${hint}`);\n this.printStartupFailureDiagnostics({\n uiUrl,\n apiUrl,\n healthUrl,\n logPath: startup.logPath,\n lastProbeError: readiness.lastProbeError\n });\n return;\n }\n\n startup.child.unref();\n const readySnapshot = resolveManagedServiceReadySnapshot({\n snapshot: startup.snapshot\n });\n const state = this.supervisor.writeReadyState({\n readinessTimeoutMs: startup.readinessTimeoutMs,\n readiness,\n snapshot: readySnapshot\n });\n this.startupLogger.info(\"runtime.process.ready\", {\n runtimeKind: \"managed-service\",\n pid: state.pid,\n uiUrl: state.uiUrl,\n apiUrl: state.apiUrl,\n startupState: state.startupState,\n readinessTimeoutMs: startup.readinessTimeoutMs\n });\n await reportManagedServiceStart({\n appName: APP_NAME,\n state,\n uiConfig,\n uiUrl,\n apiUrl,\n readinessTimeoutMs: startup.readinessTimeoutMs,\n readiness,\n printPublicUiUrls: this.deps.printPublicUiUrls,\n printServiceControlHints: this.deps.printServiceControlHints\n });\n };\n\n private waitForBackgroundServiceReady = async (params: { pid: number; healthUrl: string; timeoutMs: number }): Promise<{ ready: boolean; lastProbeError: string | null }> => {\n const { pid, healthUrl, timeoutMs } = params;\n const startedAt = Date.now();\n let lastProbeError: string | null = null;\n while (Date.now() - startedAt < timeoutMs) {\n if (!isProcessRunning(pid)) {\n return { ready: false, lastProbeError };\n }\n const probe = await probeHealthEndpoint(healthUrl);\n if (!probe.healthy) {\n lastProbeError = probe.error;\n await new Promise((resolvePromise) => setTimeout(resolvePromise, 200));\n continue;\n }\n await new Promise((resolvePromise) => setTimeout(resolvePromise, 300));\n if (isProcessRunning(pid)) {\n return { ready: true, lastProbeError: null };\n }\n await new Promise((resolvePromise) => setTimeout(resolvePromise, 200));\n }\n return { ready: false, lastProbeError };\n };\n\n private resolveStartupTimeoutMs = (overrideTimeoutMs: number | undefined): number => {\n const fallback = process.platform === \"win32\" ? 28000 : 33000;\n const envRaw = process.env.NEXTCLAW_START_TIMEOUT_MS?.trim();\n const envValue = envRaw ? Number(envRaw) : Number.NaN;\n const fromEnv = Number.isFinite(envValue) && envValue > 0 ? Math.floor(envValue) : null;\n const fromOverride = Number.isFinite(overrideTimeoutMs) && Number(overrideTimeoutMs) > 0\n ? Math.floor(Number(overrideTimeoutMs))\n : null;\n const resolved = fromOverride ?? fromEnv ?? fallback;\n return Math.max(3000, resolved);\n };\n\n private appendStartupStage = (logPath: string, message: string): void => {\n try {\n this.startupLogger.info(message, { logPath });\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n console.error(`Warning: failed to write startup diagnostics log (${logPath}): ${detail}`);\n }\n };\n\n private printStartupFailureDiagnostics = (params: { uiUrl: string; apiUrl: string; healthUrl: string; logPath: string; lastProbeError: string | null }): void => {\n const { apiUrl, healthUrl, lastProbeError, logPath, uiUrl } = params;\n const statePath = managedServiceStateStore.path;\n const lines = [\n \"Startup diagnostics:\",\n `- UI URL: ${uiUrl}`,\n `- API URL: ${apiUrl}`,\n `- Health probe: ${healthUrl}`,\n `- Service state path: ${statePath}`,\n `- Startup log path: ${logPath}`\n ];\n if (lastProbeError) {\n lines.push(`- Last probe detail: ${lastProbeError}`);\n }\n console.error(lines.join(\"\\n\"));\n };\n\n}\n"],"mappings":"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"}
|
|
@@ -27,4 +27,5 @@ declare function resolveSessionRouteCandidate(params: {
|
|
|
27
27
|
updatedAt: number;
|
|
28
28
|
} | null;
|
|
29
29
|
//#endregion
|
|
30
|
-
export { ManagedServiceSnapshot, resolveManagedServiceReadySnapshot, resolveManagedServiceUiBinding, resolveSessionRouteCandidate };
|
|
30
|
+
export { ManagedServiceSnapshot, resolveManagedServiceReadySnapshot, resolveManagedServiceUiBinding, resolveSessionRouteCandidate };
|
|
31
|
+
//# sourceMappingURL=managed-service-routing.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-service-routing.utils.d.ts","names":[],"sources":["../../../../../src/shared/services/runtime/utils/managed-service-routing.utils.ts"],"mappings":";;;;KAIY,sBAAA;EACV,GAAA;EACA,KAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,OAAA;AAAA;AAAA,iBAGc,kCAAA,CAAmC,MAAA;EACjD,QAAA,EAAU,sBAAA;EACV,uBAAA,UAAiC,mBAAA,CAAoB,IAAA;EACrD,kBAAA,IAAsB,GAAA;AAAA,IACpB,sBAAA;AAAA,iBA6CY,8BAAA,CAA+B,KAAA,EAAO,mBAAA;EACpD,IAAA;EACA,IAAA;AAAA;AAAA,iBAiBc,4BAAA,CAA6B,MAAA;EAC3C,OAAA;EACA,uBAAA,GAA0B,KAAA;AAAA;EACtB,GAAA;EAAa,SAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-service-routing.utils.js","names":[],"sources":["../../../../../src/shared/services/runtime/utils/managed-service-routing.utils.ts"],"sourcesContent":["import { type ManagedServiceState } from \"@nextclaw-service/shared/stores/managed-service-state.store.js\";\nimport { localUiRuntimeStore } from \"@nextclaw-service/shared/stores/local-ui-runtime.store.js\";\nimport { isProcessRunning } from \"@nextclaw-service/shared/utils/cli.utils.js\";\n\nexport type ManagedServiceSnapshot = {\n pid: number;\n uiUrl: string;\n apiUrl: string;\n uiHost: string;\n uiPort: number;\n logPath: string;\n};\n\nexport function resolveManagedServiceReadySnapshot(params: {\n snapshot: ManagedServiceSnapshot;\n readLocalUiRuntimeState?: typeof localUiRuntimeStore.read;\n isProcessRunningFn?: (pid: number) => boolean;\n}): ManagedServiceSnapshot {\n const { snapshot, readLocalUiRuntimeState, isProcessRunningFn: providedIsProcessRunningFn } = params;\n const localUiRuntimeState = (readLocalUiRuntimeState ?? localUiRuntimeStore.read)();\n const isProcessRunningFn = providedIsProcessRunningFn ?? isProcessRunning;\n if (\n !localUiRuntimeState\n || typeof localUiRuntimeState.pid !== \"number\"\n || !Number.isFinite(localUiRuntimeState.pid)\n || localUiRuntimeState.uiPort !== snapshot.uiPort\n || !isProcessRunningFn(localUiRuntimeState.pid)\n ) {\n return snapshot;\n }\n return {\n ...snapshot,\n pid: localUiRuntimeState.pid,\n uiUrl: localUiRuntimeState.uiUrl,\n apiUrl: localUiRuntimeState.apiUrl,\n uiHost: localUiRuntimeState.uiHost ?? snapshot.uiHost,\n uiPort: localUiRuntimeState.uiPort ?? snapshot.uiPort\n };\n}\n\nfunction toObjectRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction hasSessionRoutingMetadata(params: {\n metadata: Record<string, unknown>;\n normalizeOptionalString: (value: unknown) => string | undefined;\n}): boolean {\n const { metadata, normalizeOptionalString } = params;\n const context = toObjectRecord(metadata.last_delivery_context) ?? {};\n const hasPrimaryRoute =\n Boolean(normalizeOptionalString(context.channel)) &&\n Boolean(normalizeOptionalString(context.chatId));\n const hasFallbackRoute =\n Boolean(normalizeOptionalString(metadata.last_channel)) &&\n Boolean(normalizeOptionalString(metadata.last_to));\n return hasPrimaryRoute || hasFallbackRoute;\n}\n\nexport function resolveManagedServiceUiBinding(state: ManagedServiceState): {\n host: string;\n port: number;\n} {\n try {\n const parsed = new URL(state.uiUrl);\n const parsedPort = Number(parsed.port || 80);\n return {\n host: state.uiHost ?? parsed.hostname,\n port: Number.isFinite(parsedPort) ? parsedPort : state.uiPort ?? 55667\n };\n } catch {\n return {\n host: state.uiHost ?? \"127.0.0.1\",\n port: state.uiPort ?? 55667\n };\n }\n}\n\nexport function resolveSessionRouteCandidate(params: {\n session: unknown;\n normalizeOptionalString: (value: unknown) => string | undefined;\n}): { key: string; updatedAt: number } | null {\n const { session, normalizeOptionalString } = params;\n const sessionRecord = toObjectRecord(session);\n const key = normalizeOptionalString(sessionRecord?.key);\n if (!key || key.startsWith(\"cli:\")) {\n return null;\n }\n const metadata = toObjectRecord(sessionRecord?.metadata) ?? {};\n if (!hasSessionRoutingMetadata({ metadata, normalizeOptionalString })) {\n return null;\n }\n const updatedAtRaw = normalizeOptionalString(sessionRecord?.updated_at);\n const updatedAt = updatedAtRaw ? Date.parse(updatedAtRaw) : Number.NaN;\n return {\n key,\n updatedAt: Number.isFinite(updatedAt) ? updatedAt : 0\n };\n}\n"],"mappings":";;;;AAaA,SAAgB,mCAAmC,QAIxB;CACzB,MAAM,EAAE,UAAU,yBAAyB,oBAAoB,+BAA+B;CAC9F,MAAM,uBAAuB,2BAA2B,oBAAoB,OAAO;CACnF,MAAM,qBAAqB,8BAA8B;AACzD,KACE,CAAC,uBACE,OAAO,oBAAoB,QAAQ,YACnC,CAAC,OAAO,SAAS,oBAAoB,IAAI,IACzC,oBAAoB,WAAW,SAAS,UACxC,CAAC,mBAAmB,oBAAoB,IAAI,CAE/C,QAAO;AAET,QAAO;EACL,GAAG;EACH,KAAK,oBAAoB;EACzB,OAAO,oBAAoB;EAC3B,QAAQ,oBAAoB;EAC5B,QAAQ,oBAAoB,UAAU,SAAS;EAC/C,QAAQ,oBAAoB,UAAU,SAAS;EAChD;;AAGH,SAAS,eAAe,OAAgD;AACtE,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO;AAET,QAAO;;AAGT,SAAS,0BAA0B,QAGvB;CACV,MAAM,EAAE,UAAU,4BAA4B;CAC9C,MAAM,UAAU,eAAe,SAAS,sBAAsB,IAAI,EAAE;CACpE,MAAM,kBACJ,QAAQ,wBAAwB,QAAQ,QAAQ,CAAC,IACjD,QAAQ,wBAAwB,QAAQ,OAAO,CAAC;CAClD,MAAM,mBACJ,QAAQ,wBAAwB,SAAS,aAAa,CAAC,IACvD,QAAQ,wBAAwB,SAAS,QAAQ,CAAC;AACpD,QAAO,mBAAmB;;AAG5B,SAAgB,+BAA+B,OAG7C;AACA,KAAI;EACF,MAAM,SAAS,IAAI,IAAI,MAAM,MAAM;EACnC,MAAM,aAAa,OAAO,OAAO,QAAQ,GAAG;AAC5C,SAAO;GACL,MAAM,MAAM,UAAU,OAAO;GAC7B,MAAM,OAAO,SAAS,WAAW,GAAG,aAAa,MAAM,UAAU;GAClE;SACK;AACN,SAAO;GACL,MAAM,MAAM,UAAU;GACtB,MAAM,MAAM,UAAU;GACvB;;;AAIL,SAAgB,6BAA6B,QAGC;CAC5C,MAAM,EAAE,SAAS,4BAA4B;CAC7C,MAAM,gBAAgB,eAAe,QAAQ;CAC7C,MAAM,MAAM,wBAAwB,eAAe,IAAI;AACvD,KAAI,CAAC,OAAO,IAAI,WAAW,OAAO,CAChC,QAAO;AAGT,KAAI,CAAC,0BAA0B;EAAE,UADhB,eAAe,eAAe,SAAS,IAAI,EAAE;EACnB;EAAyB,CAAC,CACnE,QAAO;CAET,MAAM,eAAe,wBAAwB,eAAe,WAAW;CACvE,MAAM,YAAY,eAAe,KAAK,MAAM,aAAa,GAAG;AAC5D,QAAO;EACL;EACA,WAAW,OAAO,SAAS,UAAU,GAAG,YAAY;EACrD"}
|
|
@@ -54,4 +54,5 @@ declare function writeReadyManagedServiceState(params: {
|
|
|
54
54
|
snapshot: ManagedServiceSnapshot;
|
|
55
55
|
}): ManagedServiceState;
|
|
56
56
|
//#endregion
|
|
57
|
-
export { claimManagedRemoteRuntimeOwnership, createManagedRemoteModule, createManagedRemoteModuleForUi, writeInitialManagedServiceState, writeReadyManagedServiceState };
|
|
57
|
+
export { claimManagedRemoteRuntimeOwnership, createManagedRemoteModule, createManagedRemoteModuleForUi, writeInitialManagedServiceState, writeReadyManagedServiceState };
|
|
58
|
+
//# sourceMappingURL=service-remote-runtime.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-remote-runtime.utils.d.ts","names":[],"sources":["../../../../../src/shared/services/runtime/utils/service-remote-runtime.utils.ts"],"mappings":";;;;;KA0BK,sBAAA;EACH,GAAA;EACA,KAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,OAAA;AAAA;AAAA,KASG,2BAAA;EAAgC,EAAA;EAAU,OAAA;AAAA;EAA0B,EAAA;EAAW,KAAA;AAAA;AAAA,iBA2IpE,kCAAA,CAAmC,MAAA;EACjD,WAAA;EACA,QAAA;EACA,UAAA;EACA,GAAA;EACA,kBAAA,IAAsB,GAAA;EACtB,kBAAA,SAA2B,mBAAA;AAAA,IACzB,2BAAA;AAAA,iBA+BY,yBAAA,CAA0B,MAAA;EACxC,UAAA,QAAkB,MAAA;EAClB,SAAA;EACA,WAAA;EACA,mBAAA,IAAuB,KAAA,EAAO,kBAAA;AAAA,IAC5B,mBAAA;AAAA,iBAmBY,8BAAA,CAA+B,MAAA;EAC7C,UAAA,QAAkB,MAAA;EAClB,QAAA,EAAU,IAAA,CAAK,MAAA;EACf,mBAAA;EAA8B,mBAAA,IAAuB,KAAA,EAAO,kBAAA;AAAA,IAC1D,mBAAA;AAAA,iBAaY,+BAAA,CAAgC,MAAA;EAC9C,MAAA,EAAQ,MAAA;EACR,KAAA,GAAQ,mBAAA;EACR,kBAAA;EACA,QAAA,EAAU,sBAAA;AAAA;AAAA,iBAmBI,6BAAA,CAA8B,MAAA;EAC5C,KAAA,GAAQ,mBAAA;EACR,kBAAA;EACA,SAAA;IAAa,KAAA;IAAgB,cAAA;EAAA;EAC7B,QAAA,EAAU,sBAAA;AAAA,IACR,mBAAA"}
|
|
@@ -176,3 +176,5 @@ function writeReadyManagedServiceState(params) {
|
|
|
176
176
|
}
|
|
177
177
|
//#endregion
|
|
178
178
|
export { claimManagedRemoteRuntimeOwnership, createManagedRemoteModule, createManagedRemoteModuleForUi, writeInitialManagedServiceState, writeReadyManagedServiceState };
|
|
179
|
+
|
|
180
|
+
//# sourceMappingURL=service-remote-runtime.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-remote-runtime.utils.js","names":[],"sources":["../../../../../src/shared/services/runtime/utils/service-remote-runtime.utils.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport { RemoteServiceModule, type RemoteRuntimeState } from \"@nextclaw/remote\";\nimport {\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n rmSync,\n unlinkSync,\n writeFileSync\n} from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { getDataDir } from \"@nextclaw/core\";\nimport { resolveUiApiBase, isProcessRunning } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport {\n managedServiceStateStore,\n type ManagedServiceLease,\n type ManagedServiceState\n} from \"@nextclaw-service/shared/stores/managed-service-state.store.js\";\nimport {\n buildNextclawConfiguredRemoteState,\n createNextclawRemoteConnector,\n createNextclawRemoteStatusStore\n} from \"@nextclaw-service/commands/remote/utils/remote-runtime-support.utils.js\";\n\ntype ManagedServiceSnapshot = {\n pid: number;\n uiUrl: string;\n apiUrl: string;\n uiHost: string;\n uiPort: number;\n logPath: string;\n};\n\ntype RemoteRuntimeOwnerRecord = {\n pid: number;\n localOrigin: string;\n claimedAt: string;\n};\n\ntype RemoteRuntimeOwnershipClaim = { ok: true; release: () => void } | { ok: false; error: string };\n\nfunction resolveRemoteOwnershipLockPath(): string {\n return resolve(getDataDir(), \"run\", \"remote-owner.lock.json\");\n}\n\nfunction readRemoteOwnershipRecord(lockPath: string): RemoteRuntimeOwnerRecord | null {\n try {\n const raw = JSON.parse(readFileSync(lockPath, \"utf-8\")) as Partial<RemoteRuntimeOwnerRecord>;\n if (typeof raw.pid !== \"number\" || !Number.isFinite(raw.pid)) {\n return null;\n }\n return {\n pid: raw.pid,\n localOrigin: typeof raw.localOrigin === \"string\" ? raw.localOrigin : \"\",\n claimedAt: typeof raw.claimedAt === \"string\" ? raw.claimedAt : \"\"\n };\n } catch {\n return null;\n }\n}\n\nfunction removeRemoteOwnershipLock(lockPath: string): void {\n if (!existsSync(lockPath)) {\n return;\n }\n try {\n unlinkSync(lockPath);\n } catch {\n try {\n rmSync(lockPath, { force: true });\n } catch {\n // Ignore cleanup failures.\n }\n }\n}\n\nfunction buildManagedServiceOwnershipError(params: {\n pid: number;\n ownerOrigin?: string;\n}): string {\n return (\n `Remote access is already owned by running NextClaw service PID ${params.pid}`\n + `${params.ownerOrigin ? ` (${params.ownerOrigin})` : \"\"}. `\n + \"Stop that service or disable remote there before starting another process with the same NEXTCLAW_HOME.\"\n );\n}\n\nfunction buildLocalProcessOwnershipError(record: RemoteRuntimeOwnerRecord): string {\n const originText = record.localOrigin ? ` (${record.localOrigin})` : \"\";\n return (\n `Remote access is already owned by local NextClaw process PID ${record.pid}${originText}. `\n + \"Stop that process or use a different NEXTCLAW_HOME before starting another remote-enabled process.\"\n );\n}\n\nfunction createRemoteOwnershipRelease(params: {\n lockPath: string;\n claim: RemoteRuntimeOwnerRecord;\n}): () => void {\n let released = false;\n return () => {\n if (released) {\n return;\n }\n released = true;\n const current = readRemoteOwnershipRecord(params.lockPath);\n if (!current || (current.pid === params.claim.pid && current.claimedAt === params.claim.claimedAt)) {\n removeRemoteOwnershipLock(params.lockPath);\n }\n };\n}\n\nfunction detectManagedRemoteOwnershipConflict(params: {\n currentPid: number;\n isProcessRunningFn: (pid: number) => boolean;\n readServiceStateFn: () => ManagedServiceState | null;\n}): string | null {\n const runningService = params.readServiceStateFn();\n if (\n !runningService\n || runningService.pid === params.currentPid\n || !params.isProcessRunningFn(runningService.pid)\n || !runningService.remote?.enabled\n ) {\n return null;\n }\n\n return buildManagedServiceOwnershipError({\n pid: runningService.pid,\n ownerOrigin: runningService.remote.localOrigin ?? runningService.uiUrl\n });\n}\n\nfunction tryClaimRemoteOwnershipLock(params: {\n lockPath: string;\n claim: RemoteRuntimeOwnerRecord;\n currentPid: number;\n isProcessRunningFn: (pid: number) => boolean;\n}): RemoteRuntimeOwnershipClaim {\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n const fd = openSync(params.lockPath, \"wx\");\n writeFileSync(fd, `${JSON.stringify(params.claim, null, 2)}\\n`, \"utf-8\");\n closeSync(fd);\n return {\n ok: true,\n release: createRemoteOwnershipRelease({\n lockPath: params.lockPath,\n claim: params.claim\n })\n };\n } catch (error) {\n const code = typeof error === \"object\" && error && \"code\" in error ? String(error.code) : \"\";\n if (code !== \"EEXIST\") {\n return {\n ok: false,\n error: `Failed to claim local remote runtime ownership: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n\n const existing = readRemoteOwnershipRecord(params.lockPath);\n if (existing && existing.pid !== params.currentPid && params.isProcessRunningFn(existing.pid)) {\n return {\n ok: false,\n error: buildLocalProcessOwnershipError(existing)\n };\n }\n\n removeRemoteOwnershipLock(params.lockPath);\n }\n }\n\n return {\n ok: false,\n error: \"Failed to claim local remote runtime ownership after clearing a stale lock.\"\n };\n}\n\nexport function claimManagedRemoteRuntimeOwnership(params: {\n localOrigin: string;\n lockPath?: string;\n currentPid?: number;\n now?: () => string;\n isProcessRunningFn?: (pid: number) => boolean;\n readServiceStateFn?: () => ManagedServiceState | null;\n}): RemoteRuntimeOwnershipClaim {\n const lockPath = params.lockPath ?? resolveRemoteOwnershipLockPath();\n const currentPid = params.currentPid ?? process.pid;\n const now = params.now ?? (() => new Date().toISOString());\n const isProcessRunningFn = params.isProcessRunningFn ?? isProcessRunning;\n const readServiceStateFn = params.readServiceStateFn ?? managedServiceStateStore.read;\n const managedConflict = detectManagedRemoteOwnershipConflict({\n currentPid,\n isProcessRunningFn,\n readServiceStateFn\n });\n if (managedConflict) {\n return {\n ok: false,\n error: managedConflict\n };\n }\n\n mkdirSync(dirname(lockPath), { recursive: true });\n return tryClaimRemoteOwnershipLock({\n lockPath,\n claim: {\n pid: currentPid,\n localOrigin: params.localOrigin,\n claimedAt: now()\n },\n currentPid,\n isProcessRunningFn\n });\n}\n\nexport function createManagedRemoteModule(params: {\n loadConfig: () => Config;\n uiEnabled: boolean;\n localOrigin: string;\n onRemoteStateChange?: (state: RemoteRuntimeState) => void;\n}): RemoteServiceModule | null {\n if (!params.uiEnabled) {\n return null;\n }\n return new RemoteServiceModule({\n loadConfig: params.loadConfig,\n uiEnabled: params.uiEnabled,\n localOrigin: params.localOrigin,\n statusStore: createNextclawRemoteStatusStore(\"service\", params.onRemoteStateChange),\n createConnector: (logger) => createNextclawRemoteConnector({ logger }),\n claimOwnership: () => claimManagedRemoteRuntimeOwnership({ localOrigin: params.localOrigin }),\n logger: {\n info: (message) => console.log(`[remote] ${message}`),\n warn: (message) => console.warn(`[remote] ${message}`),\n error: (message) => console.error(`[remote] ${message}`)\n }\n });\n}\n\nexport function createManagedRemoteModuleForUi(params: {\n loadConfig: () => Config;\n uiConfig: Pick<Config[\"ui\"], \"enabled\" | \"host\" | \"port\">;\n localOriginOverride?: string; onRemoteStateChange?: (state: RemoteRuntimeState) => void;\n}): RemoteServiceModule | null {\n const explicitLocalOrigin = params.localOriginOverride?.trim() ?? process.env.NEXTCLAW_REMOTE_LOCAL_ORIGIN?.trim();\n return createManagedRemoteModule({\n loadConfig: params.loadConfig,\n uiEnabled: params.uiConfig.enabled,\n onRemoteStateChange: params.onRemoteStateChange,\n localOrigin:\n explicitLocalOrigin && explicitLocalOrigin.length > 0\n ? explicitLocalOrigin.replace(/\\/+$/, \"\")\n : resolveUiApiBase(params.uiConfig.host, params.uiConfig.port)\n });\n}\n\nexport function writeInitialManagedServiceState(params: {\n config: Config;\n lease?: ManagedServiceLease;\n readinessTimeoutMs: number;\n snapshot: ManagedServiceSnapshot;\n}): void {\n const { config, lease, readinessTimeoutMs, snapshot } = params;\n managedServiceStateStore.write({\n pid: snapshot.pid,\n startedAt: new Date().toISOString(),\n uiUrl: snapshot.uiUrl,\n apiUrl: snapshot.apiUrl,\n uiHost: snapshot.uiHost,\n uiPort: snapshot.uiPort,\n logPath: snapshot.logPath,\n ...(lease ? { lease } : {}),\n startupLastProbeError: null,\n startupTimeoutMs: readinessTimeoutMs,\n startupCheckedAt: new Date().toISOString(),\n ...(config.remote.enabled ? { remote: buildNextclawConfiguredRemoteState(config) } : {})\n });\n}\n\nexport function writeReadyManagedServiceState(params: {\n lease?: ManagedServiceLease;\n readinessTimeoutMs: number;\n readiness: { ready: boolean; lastProbeError: string | null };\n snapshot: ManagedServiceSnapshot;\n}): ManagedServiceState {\n const { lease, readiness, readinessTimeoutMs, snapshot } = params;\n const currentState = managedServiceStateStore.read();\n const state: ManagedServiceState = {\n pid: snapshot.pid,\n startedAt: currentState?.startedAt ?? new Date().toISOString(),\n uiUrl: snapshot.uiUrl,\n apiUrl: snapshot.apiUrl,\n uiHost: snapshot.uiHost,\n uiPort: snapshot.uiPort,\n logPath: snapshot.logPath,\n ...(lease ? { lease } : currentState?.lease ? { lease: currentState.lease } : {}),\n startupState: readiness.ready ? \"ready\" : \"degraded\",\n startupLastProbeError: readiness.lastProbeError,\n startupTimeoutMs: readinessTimeoutMs,\n startupCheckedAt: new Date().toISOString(),\n ...(currentState?.remote ? { remote: currentState.remote } : {})\n };\n managedServiceStateStore.write(state);\n return state;\n}\n"],"mappings":"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"}
|
|
@@ -32,4 +32,5 @@ declare class CompanionRuntimeService {
|
|
|
32
32
|
}
|
|
33
33
|
declare const companionRuntimeService: CompanionRuntimeService;
|
|
34
34
|
//#endregion
|
|
35
|
-
export { CompanionRuntimeService, companionRuntimeService };
|
|
35
|
+
export { CompanionRuntimeService, companionRuntimeService };
|
|
36
|
+
//# sourceMappingURL=companion-runtime.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"companion-runtime.service.d.ts","names":[],"sources":["../../../../src/shared/services/ui/companion-runtime.service.ts"],"mappings":";;;;;cA2Ba,uBAAA;EAAA,iBAEQ,YAAA;EAAA,iBACA,kBAAA;cADA,YAAA,GAAc,qBAAA,EACd,kBAAA,GAAoB,uBAAA;EAAA,SAG9B,eAAA,QAAsB,qBAAA;EAAA,SAYtB,wBAAA;EAAA,SAIA,WAAA;EAAA,SAYA,WAAA,GAAqB,MAAA,EAAQ,MAAA,KAAS,OAAA;EAAA,SAUtC,aAAA,GAAuB,OAAA,WAAkB,OAAA;IAAW,OAAA;EAAA,MAA0B,OAAA,CAAQ,MAAA;EAAA,SA4BtF,aAAA,GAAuB,OAAA;IAAW,OAAA;EAAA,MAAoB,OAAA,CAAQ,qBAAA;EAAA,SA0B9D,aAAA,GAAuB,OAAA;IAAW,KAAA;EAAA,MAAyB,OAAA;EAAA,SAc3D,WAAA,GAAe,OAAA;IAAW,IAAA;EAAA;EAAA,SA0B1B,YAAA,GAAgB,KAAA,EAAO,qBAAA;EAAA,SAIvB,YAAA,GAAgB,OAAA;EAAA,iBAIR,WAAA;EAAA,iBAIA,wBAAA;EAAA,iBAcA,iBAAA;EAAA,iBAwBA,mBAAA;AAAA;AAAA,cAqBN,uBAAA,EAAuB,uBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"companion-runtime.service.js","names":[],"sources":["../../../../src/shared/services/ui/companion-runtime.service.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path\";\nimport { getConfigPath, loadConfig, saveConfig, type Config } from \"@nextclaw/core\";\nimport { APP_NAME } from \"@nextclaw/core\";\nimport { localUiDiscoveryService, type LocalUiDiscoveryService } from \"@nextclaw-service/shared/services/ui/local-ui-discovery.service.js\";\nimport { isProcessRunning } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport {\n companionRuntimeStore,\n type CompanionRuntimeState,\n type CompanionRuntimeStore\n} from \"@nextclaw-service/shared/stores/companion-runtime.store.js\";\n\nconst require = createRequire(import.meta.url);\n\nclass CompanionUnavailableError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CompanionUnavailableError\";\n }\n}\n\nfunction isCompanionUnavailableError(error: unknown): error is CompanionUnavailableError {\n return error instanceof CompanionUnavailableError;\n}\n\nexport class CompanionRuntimeService {\n constructor(\n private readonly runtimeStore: CompanionRuntimeStore = companionRuntimeStore,\n private readonly uiDiscoveryService: LocalUiDiscoveryService = localUiDiscoveryService\n ) {}\n\n readonly getRunningState = (): CompanionRuntimeState | null => {\n const state = this.runtimeStore.read();\n if (!state) {\n return null;\n }\n if (!isProcessRunning(state.pid)) {\n this.runtimeStore.clear();\n return null;\n }\n return state;\n };\n\n readonly resolveDiscoveredBaseUrl = (): string | null => {\n return this.uiDiscoveryService.resolveApiBase();\n };\n\n readonly isAvailable = (): boolean => {\n try {\n this.resolveLaunchSpec();\n return true;\n } catch (error) {\n if (isCompanionUnavailableError(error)) {\n return false;\n }\n throw error;\n }\n };\n\n readonly applyConfig = async (config: Config): Promise<void> => {\n if (!config.companion.enabled) {\n await this.ensureStopped();\n return;\n }\n await this.ensureStartedIfAvailable({\n baseUrl: this.uiDiscoveryService.resolveLocalOrigin(config)\n });\n };\n\n readonly updateEnabled = async (enabled: boolean, options: { baseUrl?: string } = {}): Promise<Config> => {\n const config = loadConfig(getConfigPath());\n const next: Config = {\n ...config,\n companion: {\n ...config.companion,\n enabled\n }\n };\n saveConfig(next, getConfigPath());\n\n if (enabled) {\n const explicitBaseUrl = options.baseUrl?.trim();\n if (explicitBaseUrl) {\n await this.ensureStartedIfAvailable({ baseUrl: explicitBaseUrl });\n return next;\n }\n const discoveredBaseUrl = this.uiDiscoveryService.resolveApiBase();\n if (discoveredBaseUrl) {\n await this.ensureStartedIfAvailable({ baseUrl: discoveredBaseUrl });\n }\n return next;\n }\n\n await this.ensureStopped();\n return next;\n };\n\n readonly ensureStarted = async (options: { baseUrl: string }): Promise<CompanionRuntimeState> => {\n const baseUrl = options.baseUrl.trim().replace(/\\/+$/, \"\");\n const runningState = this.getRunningState();\n if (runningState?.baseUrl === baseUrl) {\n return runningState;\n }\n if (runningState) {\n this.killProcess(runningState.pid, false);\n this.runtimeStore.clear();\n }\n\n const launchSpec = this.resolveLaunchSpec();\n const child = spawn(launchSpec.command, [...launchSpec.args, \"--base-url\", baseUrl], {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n env: {\n ...process.env,\n NEXTCLAW_COMPANION_RUNTIME_STATE_PATH: this.runtimeStore.path\n }\n });\n child.unref();\n\n return await this.waitForRunningState(baseUrl, child.pid ?? -1);\n };\n\n readonly ensureStopped = async (options: { force?: boolean } = {}): Promise<boolean> => {\n const state = this.runtimeStore.read();\n if (!state) {\n return false;\n }\n if (!isProcessRunning(state.pid)) {\n this.runtimeStore.clear();\n return false;\n }\n this.killProcess(state.pid, options.force === true);\n this.runtimeStore.clear();\n return true;\n };\n\n readonly printStatus = (options: { json?: boolean } = {}): void => {\n const runningState = this.getRunningState();\n const config = loadConfig(getConfigPath());\n const view = runningState\n ? { configuredEnabled: config.companion.enabled, running: true, ...runningState }\n : { configuredEnabled: config.companion.enabled, running: false };\n\n if (options.json) {\n console.log(JSON.stringify(view, null, 2));\n return;\n }\n\n if (!runningState) {\n console.log(\n config.companion.enabled\n ? \"Companion is enabled in config but is not running.\"\n : \"Companion is disabled and not running.\"\n );\n return;\n }\n\n console.log(\n `Companion is running (pid ${runningState.pid}) at ${runningState.baseUrl}. Configured enabled: ${config.companion.enabled ? \"yes\" : \"no\"}.`\n );\n };\n\n readonly printStarted = (state: CompanionRuntimeState): void => {\n console.log(`Started ${APP_NAME} companion (pid ${state.pid}) using ${state.baseUrl}.`);\n };\n\n readonly printStopped = (stopped: boolean): void => {\n console.log(stopped ? \"Stopped companion process.\" : \"Companion is not running.\");\n };\n\n private readonly killProcess = (pid: number, force: boolean): void => {\n process.kill(pid, force ? \"SIGKILL\" : \"SIGTERM\");\n };\n\n private readonly ensureStartedIfAvailable = async (\n options: { baseUrl: string }\n ): Promise<CompanionRuntimeState | null> => {\n try {\n return await this.ensureStarted(options);\n } catch (error) {\n if (!isCompanionUnavailableError(error)) {\n throw error;\n }\n console.warn(error.message);\n return null;\n }\n };\n\n private readonly resolveLaunchSpec = (): { command: string; args: string[] } => {\n let packageJsonPath: string;\n try {\n packageJsonPath = require.resolve(\"@nextclaw/companion/package.json\");\n } catch {\n throw new CompanionUnavailableError(\n \"@nextclaw/companion is not installed. Install it separately to use the companion shell.\"\n );\n }\n const packageRoot = dirname(packageJsonPath);\n const mainPath = resolve(packageRoot, \"dist\", \"src\", \"main.js\");\n if (!existsSync(mainPath)) {\n throw new CompanionUnavailableError(\n `Companion app build is missing at ${mainPath}. Install or build @nextclaw/companion separately to use the companion shell.`\n );\n }\n const companionRequire = createRequire(packageJsonPath);\n const electronBinary = companionRequire(\"electron\") as string;\n return {\n command: electronBinary,\n args: [packageRoot]\n };\n };\n\n private readonly waitForRunningState = async (\n baseUrl: string,\n fallbackPid: number\n ): Promise<CompanionRuntimeState> => {\n const timeoutAt = Date.now() + 5000;\n while (Date.now() < timeoutAt) {\n const state = this.getRunningState();\n if (state?.baseUrl === baseUrl) {\n return state;\n }\n await new Promise((resolvePromise) => setTimeout(resolvePromise, 100));\n }\n\n throw new Error(\n fallbackPid > 0\n ? `Companion started but did not report a live runtime state (launcher pid ${fallbackPid}).`\n : \"Companion started but did not report a live runtime state.\"\n );\n };\n}\n\nexport const companionRuntimeService = new CompanionRuntimeService();\n"],"mappings":"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"}
|
|
@@ -16,4 +16,5 @@ declare class LocalUiDiscoveryService {
|
|
|
16
16
|
}
|
|
17
17
|
declare const localUiDiscoveryService: LocalUiDiscoveryService;
|
|
18
18
|
//#endregion
|
|
19
|
-
export { LocalUiDiscoveryService, localUiDiscoveryService };
|
|
19
|
+
export { LocalUiDiscoveryService, localUiDiscoveryService };
|
|
20
|
+
//# sourceMappingURL=local-ui-discovery.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-ui-discovery.service.d.ts","names":[],"sources":["../../../../src/shared/services/ui/local-ui-discovery.service.ts"],"mappings":";;;;;KAaK,sBAAA,GAAyB,mBAAA,GAAsB,mBAAA;AAAA,cAEvC,uBAAA;EAAA,iBAEQ,YAAA;EAAA,iBACA,mBAAA;EAAA,iBACA,kBAAA;cAFA,YAAA,GAAc,mBAAA,EACd,mBAAA,GAAqB,wBAAA,EACrB,kBAAA,IAAqB,GAAA;EAAA,iBAGvB,gBAAA;EAAA,SAOR,uBAAA,QAA8B,sBAAA;EAAA,SAI9B,cAAA;EAAA,SAcA,kBAAA,GAAsB,MAAA,EAAQ,MAAA;AAAA;AAAA,cAc5B,uBAAA,EAAuB,uBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-ui-discovery.service.js","names":[],"sources":["../../../../src/shared/services/ui/local-ui-discovery.service.ts"],"sourcesContent":["import { resolveLocalUiBaseUrl, type Config } from \"@nextclaw/core\";\nimport { isProcessRunning } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport {\n type LocalUiRuntimeState,\n type LocalUiRuntimeStore,\n localUiRuntimeStore\n} from \"@nextclaw-service/shared/stores/local-ui-runtime.store.js\";\nimport {\n type ManagedServiceState,\n type ManagedServiceStateStore,\n managedServiceStateStore\n} from \"@nextclaw-service/shared/stores/managed-service-state.store.js\";\n\ntype DiscoveredLocalUiState = LocalUiRuntimeState | ManagedServiceState;\n\nexport class LocalUiDiscoveryService {\n constructor(\n private readonly localUiStore: LocalUiRuntimeStore = localUiRuntimeStore,\n private readonly managedServiceStore: ManagedServiceStateStore = managedServiceStateStore,\n private readonly isProcessRunningFn: (pid: number) => boolean = (pid) => isProcessRunning(pid)\n ) {}\n\n private readonly readRunningState = (state: DiscoveredLocalUiState | null): DiscoveredLocalUiState | null => {\n if (!state || !this.isProcessRunningFn(state.pid)) {\n return null;\n }\n return state;\n };\n\n readonly readRunningRuntimeState = (): DiscoveredLocalUiState | null => {\n return this.readRunningState(this.localUiStore.read()) ?? this.readRunningState(this.managedServiceStore.read());\n };\n\n readonly resolveApiBase = (): string | null => {\n const state = this.readRunningRuntimeState();\n if (!state) {\n return null;\n }\n if (typeof state.uiUrl === \"string\" && state.uiUrl.trim().length > 0) {\n return state.uiUrl.replace(/\\/+$/, \"\");\n }\n if (typeof state.apiUrl === \"string\" && state.apiUrl.trim().length > 0) {\n return state.apiUrl.replace(/\\/api\\/?$/, \"\").replace(/\\/+$/, \"\");\n }\n return null;\n };\n\n readonly resolveLocalOrigin = (config: Config): string => {\n const state = this.readRunningRuntimeState();\n const runtimePort =\n state && typeof state.uiPort === \"number\" && Number.isFinite(state.uiPort)\n ? state.uiPort\n : null;\n if (runtimePort !== null) {\n return resolveLocalUiBaseUrl({ host: \"0.0.0.0\", port: runtimePort });\n }\n const port = typeof config.ui.port === \"number\" && Number.isFinite(config.ui.port) ? config.ui.port : 55667;\n return resolveLocalUiBaseUrl({ host: \"0.0.0.0\", port });\n };\n}\n\nexport const localUiDiscoveryService = new LocalUiDiscoveryService();\n"],"mappings":";;;;;AAeA,IAAa,0BAAb,MAAqC;CACnC,YACE,eAAqD,qBACrD,sBAAiE,0BACjE,sBAAiE,QAAQ,iBAAiB,IAAI,EAC9F;AAHiB,OAAA,eAAA;AACA,OAAA,sBAAA;AACA,OAAA,qBAAA;;CAGnB,oBAAqC,UAAwE;AAC3G,MAAI,CAAC,SAAS,CAAC,KAAK,mBAAmB,MAAM,IAAI,CAC/C,QAAO;AAET,SAAO;;CAGT,gCAAwE;AACtE,SAAO,KAAK,iBAAiB,KAAK,aAAa,MAAM,CAAC,IAAI,KAAK,iBAAiB,KAAK,oBAAoB,MAAM,CAAC;;CAGlH,uBAA+C;EAC7C,MAAM,QAAQ,KAAK,yBAAyB;AAC5C,MAAI,CAAC,MACH,QAAO;AAET,MAAI,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,MAAM,CAAC,SAAS,EACjE,QAAO,MAAM,MAAM,QAAQ,QAAQ,GAAG;AAExC,MAAI,OAAO,MAAM,WAAW,YAAY,MAAM,OAAO,MAAM,CAAC,SAAS,EACnE,QAAO,MAAM,OAAO,QAAQ,aAAa,GAAG,CAAC,QAAQ,QAAQ,GAAG;AAElE,SAAO;;CAGT,sBAA+B,WAA2B;EACxD,MAAM,QAAQ,KAAK,yBAAyB;EAC5C,MAAM,cACJ,SAAS,OAAO,MAAM,WAAW,YAAY,OAAO,SAAS,MAAM,OAAO,GACtE,MAAM,SACN;AACN,MAAI,gBAAgB,KAClB,QAAO,sBAAsB;GAAE,MAAM;GAAW,MAAM;GAAa,CAAC;AAGtE,SAAO,sBAAsB;GAAE,MAAM;GAAW,MADnC,OAAO,OAAO,GAAG,SAAS,YAAY,OAAO,SAAS,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO;GAChD,CAAC;;;AAI3D,MAAa,0BAA0B,IAAI,yBAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-runtime-update-host.service.d.ts","names":[],"sources":["../../../../src/shared/services/ui/npm-runtime-update-host.service.ts"],"mappings":";;;;;;KAyBK,wBAAA;EACH,QAAA,EAAU,QAAA;EACV,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAClD,QAAA,EAAU,IAAA,CAAK,MAAA;EACf,gBAAA;AAAA;AAAA,cAGW,oBAAA,YAAgC,mBAAA;EAAA,iBAWd,IAAA;EAAA,iBAVZ,MAAA;EAAA,iBACA,MAAA;EAAA,iBACA,eAAA;EAAA,iBACA,UAAA;EAAA,iBACA,aAAA;EAAA,iBACA,aAAA;EAAA,QACT,QAAA;EAAA,QACA,UAAA;EAAA,QACA,oBAAA;cAEqB,IAAA,EAAM,wBAAA;EAyBnC,QAAA,QAAqB,OAAA,CAAQ,cAAA;EAK7B,eAAA,QAA4B,OAAA,CAAQ,cAAA;EAIpC,cAAA,QAA2B,OAAA,CAAQ,cAAA;EAInC,qBAAA,QAAkC,OAAA,CAAQ,cAAA;EAkC1C,iBAAA,GAA2B,WAAA,EAAa,OAAA,CAAQ,iBAAA,MAAqB,OAAA,CAAQ,cAAA;EAe7E,aAAA,GAAuB,OAAA,EAAS,cAAA,gBAA4B,OAAA,CAAQ,cAAA;EAAA,QAY5D,kBAAA;EAAA,QAeA,UAAA;EAAA,QA2BA,aAAA;EAAA,QAuBA,eAAA;EAAA,QAYA,aAAA;EAAA,QAYA,gBAAA;EAAA,QASA,WAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-runtime-update-host.service.js","names":[],"sources":["../../../../src/shared/services/ui/npm-runtime-update-host.service.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport {\n eventKeys,\n type EventBus,\n type UpdatePreferences,\n type UpdateProgress,\n type UpdateSnapshot,\n} from \"@nextclaw/shared\";\nimport type { UiRuntimeUpdateHost } from \"@nextclaw/server\";\nimport { NpmRuntimeBundleLayoutStore } from \"@nextclaw-service/launcher/npm-runtime-bundle-layout.store.js\";\nimport { NpmRuntimeBundleService } from \"@nextclaw-service/launcher/npm-runtime-bundle.service.js\";\nimport { NpmRuntimeUpdateManager } from \"@nextclaw-service/launcher/npm-runtime-update.manager.js\";\nimport { NpmRuntimeUpdateService } from \"@nextclaw-service/launcher/npm-runtime-update.service.js\";\nimport { NpmRuntimeUpdateSourceService } from \"@nextclaw-service/launcher/npm-runtime-update-source.service.js\";\nimport { NpmRuntimeUpdateStateStore } from \"@nextclaw-service/launcher/npm-runtime-update-state.store.js\";\nimport { NextclawDistributionService } from \"@nextclaw-service/shared/services/runtime/nextclaw-distribution.service.js\";\nimport { requestManagedServiceRestart } from \"@nextclaw-service/shared/services/ui/service-remote-access.service.js\";\nimport type { RequestRestartParams } from \"@nextclaw-service/shared/types/cli.types.js\";\n\nconst INITIAL_DOWNLOAD_PROGRESS: UpdateProgress = {\n downloadedBytes: 0,\n totalBytes: null,\n percent: null\n};\n\ntype NpmRuntimeUpdateHostDeps = {\n eventBus: EventBus;\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n uiConfig: Pick<Config[\"ui\"], \"port\">;\n applyRestartMode: \"managed-service-restart\" | \"manual-process-restart\";\n};\n\nexport class NpmRuntimeUpdateHost implements UiRuntimeUpdateHost {\n private readonly source: NpmRuntimeUpdateSourceService;\n private readonly layout: NpmRuntimeBundleLayoutStore;\n private readonly launcherVersion: string;\n private readonly stateStore: NpmRuntimeUpdateStateStore;\n private readonly bundleService: NpmRuntimeBundleService;\n private readonly updateService: NpmRuntimeUpdateService;\n private snapshot: UpdateSnapshot;\n private activeTask: Promise<void> | null = null;\n private automaticSyncStarted = false;\n\n constructor(private readonly deps: NpmRuntimeUpdateHostDeps) {\n const distribution = NextclawDistributionService.get();\n this.source = new NpmRuntimeUpdateSourceService({\n packagedPublicKeyPath: distribution.runtimeUpdatePublicKeyPath\n });\n this.layout = new NpmRuntimeBundleLayoutStore();\n this.launcherVersion = distribution.version;\n this.stateStore = new NpmRuntimeUpdateStateStore(this.layout.getStatePath(), {\n defaultChannel: this.source.resolveChannel(undefined, this.launcherVersion)\n });\n this.bundleService = new NpmRuntimeBundleService({\n layout: this.layout,\n stateStore: this.stateStore,\n launcherVersion: this.launcherVersion\n });\n this.updateService = new NpmRuntimeUpdateService({\n layout: this.layout,\n bundleService: this.bundleService,\n launcherVersion: this.launcherVersion,\n bundlePublicKey: this.source.resolveBundlePublicKey() ?? undefined\n });\n this.snapshot = this.createManager().getSnapshot();\n this.startAutomaticSync();\n }\n\n getState = async (): Promise<UpdateSnapshot> => {\n this.startAutomaticSync();\n return this.snapshot;\n };\n\n checkForUpdates = async (): Promise<UpdateSnapshot> => {\n return this.startCheck({ autoDownload: false });\n };\n\n downloadUpdate = async (): Promise<UpdateSnapshot> => {\n return this.startDownload();\n };\n\n applyDownloadedUpdate = async (): Promise<UpdateSnapshot> => {\n if (this.activeTask) {\n return this.snapshot;\n }\n\n this.setSnapshot({\n ...this.snapshot,\n status: \"applying\",\n progress: null,\n errorMessage: null\n });\n try {\n const snapshot = this.createManager().applyDownloadedUpdate();\n this.setSnapshot(\n this.deps.applyRestartMode === \"managed-service-restart\"\n ? snapshot\n : {\n ...snapshot,\n recoveryCommand: \"Restart this NextClaw process to launch the downloaded runtime.\"\n },\n );\n if (this.deps.applyRestartMode === \"managed-service-restart\") {\n await requestManagedServiceRestart(this.deps.requestRestart, {\n reason: \"runtime update apply\",\n uiPort: this.deps.uiConfig.port\n });\n }\n return this.snapshot;\n } catch (error) {\n this.setSnapshot(this.toFailedSnapshot(error));\n throw error;\n }\n };\n\n updatePreferences = async (preferences: Partial<UpdatePreferences>): Promise<UpdateSnapshot> => {\n const nextState = this.stateStore.update((current) => ({\n ...current,\n updatePreferences: {\n ...current.updatePreferences,\n ...preferences\n }\n }));\n this.setSnapshot(this.createManager(nextState.channel).getSnapshot());\n if (nextState.updatePreferences.automaticChecks) {\n this.startAutomaticSync({ force: true });\n }\n return this.snapshot;\n };\n\n updateChannel = async (channel: UpdateSnapshot[\"channel\"]): Promise<UpdateSnapshot> => {\n const nextState = this.stateStore.update((current) => ({\n ...current,\n channel\n }));\n this.setSnapshot(this.createManager(nextState.channel).getSnapshot());\n if (nextState.updatePreferences.automaticChecks) {\n return this.startCheck({ autoDownload: nextState.updatePreferences.autoDownload });\n }\n return this.snapshot;\n };\n\n private startAutomaticSync = (options: { force?: boolean } = {}): void => {\n if (this.activeTask) {\n return;\n }\n if (this.automaticSyncStarted && !options.force) {\n return;\n }\n this.automaticSyncStarted = true;\n const state = this.stateStore.read();\n if (!state.updatePreferences.automaticChecks || state.downloadedVersion) {\n return;\n }\n void this.startCheck({ autoDownload: state.updatePreferences.autoDownload });\n };\n\n private startCheck = async (options: { autoDownload: boolean }): Promise<UpdateSnapshot> => {\n if (this.activeTask) {\n return this.snapshot;\n }\n\n this.setSnapshot({\n ...this.createManager().getSnapshot(),\n status: \"checking\",\n progress: null,\n errorMessage: null\n });\n this.activeTask = (async () => {\n try {\n const checkedSnapshot = await this.createManager().checkForUpdate();\n this.setSnapshot(checkedSnapshot);\n if (options.autoDownload && checkedSnapshot.status === \"update-available\") {\n await this.runDownloadTask();\n }\n } catch (error) {\n this.setSnapshot(this.toFailedSnapshot(error));\n } finally {\n this.activeTask = null;\n }\n })();\n return this.snapshot;\n };\n\n private startDownload = async (): Promise<UpdateSnapshot> => {\n if (this.activeTask) {\n return this.snapshot;\n }\n\n this.setSnapshot({\n ...this.createManager().getSnapshot(),\n status: \"downloading\",\n progress: INITIAL_DOWNLOAD_PROGRESS,\n errorMessage: null\n });\n this.activeTask = (async () => {\n try {\n await this.runDownloadTask();\n } catch (error) {\n this.setSnapshot(this.toFailedSnapshot(error));\n } finally {\n this.activeTask = null;\n }\n })();\n return this.snapshot;\n };\n\n private runDownloadTask = async (): Promise<void> => {\n const downloadedSnapshot = await this.createManager().downloadUpdate((progress) => {\n this.setSnapshot({\n ...this.snapshot,\n status: \"downloading\",\n progress,\n errorMessage: null\n });\n });\n this.setSnapshot(downloadedSnapshot);\n };\n\n private createManager = (channel = this.stateStore.read().channel): NpmRuntimeUpdateManager => {\n return new NpmRuntimeUpdateManager({\n layout: this.layout,\n stateStore: this.stateStore,\n bundleService: this.bundleService,\n updateService: this.updateService,\n resolveManifestUrl: (resolvedChannel) => this.source.resolveManifestUrl(resolvedChannel),\n launcherVersion: this.launcherVersion,\n channel\n });\n };\n\n private toFailedSnapshot = (error: unknown): UpdateSnapshot => {\n return {\n ...this.createManager().getSnapshot(),\n status: \"failed\",\n progress: null,\n errorMessage: error instanceof Error ? error.message : String(error ?? \"Unknown error\")\n };\n };\n\n private setSnapshot = (snapshot: UpdateSnapshot): UpdateSnapshot => {\n this.snapshot = snapshot;\n this.deps.eventBus.emit(eventKeys.runtimeUpdateSnapshot, snapshot, {\n source: \"backend\"\n });\n return snapshot;\n };\n}\n"],"mappings":"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"}
|
|
@@ -25,4 +25,5 @@ declare class RuntimeControlHost implements UiRuntimeControlHost {
|
|
|
25
25
|
}
|
|
26
26
|
declare function createRuntimeControlHost(params: RuntimeControlHostDeps): RuntimeControlHost;
|
|
27
27
|
//#endregion
|
|
28
|
-
export { RuntimeControlHost, createRuntimeControlHost };
|
|
28
|
+
export { RuntimeControlHost, createRuntimeControlHost };
|
|
29
|
+
//# sourceMappingURL=runtime-control-host.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-control-host.service.d.ts","names":[],"sources":["../../../../src/shared/services/ui/runtime-control-host.service.ts"],"mappings":";;;;;KAWK,sBAAA;EACH,eAAA;IACE,YAAA,GAAe,OAAA;MAAW,WAAA,EAAa,MAAA;MAAyB,IAAA;IAAA,MAAoB,OAAA;IACpF,WAAA,QAAmB,OAAA;EAAA;EAErB,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAClD,QAAA,EAAU,IAAA,CAAK,MAAA;AAAA;AAAA,cAGJ,kBAAA,YAA8B,oBAAA;EAAA,iBACZ,IAAA;cAAA,IAAA,EAAM,sBAAA;EAEnC,UAAA,QAAiB,kBAAA;EA0CjB,YAAA,QAAyB,OAAA,CAAQ,0BAAA;EAUjC,cAAA,QAA2B,OAAA,CAAQ,0BAAA;EAUnC,WAAA,QAAwB,OAAA,CAAQ,0BAAA;EAAA,QAUxB,wBAAA;AAAA;AAAA,iBAUM,wBAAA,CAAyB,MAAA,EAAQ,sBAAA,GAAyB,kBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-control-host.service.js","names":[],"sources":["../../../../src/shared/services/ui/runtime-control-host.service.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport type { RuntimeControlActionResult, RuntimeControlView, UiRuntimeControlHost } from \"@nextclaw/server\";\nimport { requestManagedServiceRestart } from \"@nextclaw-service/shared/services/ui/service-remote-access.service.js\";\nimport { controlRemoteService, resolveRemoteServiceView } from \"@nextclaw-service/commands/remote/services/remote-service-control.service.js\";\nimport type { RequestRestartParams } from \"@nextclaw-service/shared/types/cli.types.js\";\nimport { pendingRestartStore } from \"@nextclaw-service/shared/stores/pending-restart.store.js\";\n\nconst MANAGED_SERVICE_OWNER_LABEL = \"Managed local service\";\nconst DESKTOP_APP_ONLY_REASON = \"App restart is only available in the desktop shell.\";\nconst RUNNING_PAGE_START_REASON = \"This page is already hosted by the running local service.\";\n\ntype RuntimeControlHostDeps = {\n serviceCommands: {\n startService: (options: { uiOverrides: Record<string, unknown>; open: boolean }) => Promise<void>;\n stopService: () => Promise<void>;\n };\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n uiConfig: Pick<Config[\"ui\"], \"host\" | \"port\">;\n};\n\nexport class RuntimeControlHost implements UiRuntimeControlHost {\n constructor(private readonly deps: RuntimeControlHostDeps) {}\n\n getControl = (): RuntimeControlView => {\n const service = resolveRemoteServiceView(this.deps.uiConfig);\n const serviceRunning = service.running;\n const pendingRestart = pendingRestartStore.read();\n\n return {\n environment: \"managed-local-service\",\n lifecycle: serviceRunning ? \"healthy\" : \"unavailable\",\n serviceState: serviceRunning ? \"running\" : \"stopped\",\n canStartService: {\n available: !serviceRunning,\n requiresConfirmation: false,\n impact: \"brief-ui-disconnect\",\n ...(serviceRunning ? { reasonIfUnavailable: RUNNING_PAGE_START_REASON } : {})\n },\n canRestartService: {\n available: serviceRunning,\n requiresConfirmation: false,\n impact: \"brief-ui-disconnect\",\n ...(!serviceRunning ? { reasonIfUnavailable: \"The local service is not running.\" } : {})\n },\n canStopService: {\n available: serviceRunning,\n requiresConfirmation: true,\n impact: \"brief-ui-disconnect\",\n ...(!serviceRunning ? { reasonIfUnavailable: \"The local service is already stopped.\" } : {})\n },\n canRestartApp: {\n available: false,\n requiresConfirmation: true,\n impact: \"full-app-relaunch\",\n reasonIfUnavailable: DESKTOP_APP_ONLY_REASON\n },\n pendingRestart,\n ownerLabel: MANAGED_SERVICE_OWNER_LABEL,\n managementHint: service.currentProcess\n ? \"This page is served by the running local service. Closing the browser does not stop it.\"\n : \"Manage the local NextClaw service from this page without tying service lifecycle to the browser tab.\",\n message: \"Use this page to manage the local NextClaw service. Closing the browser does not stop the service.\"\n };\n };\n\n startService = async (): Promise<RuntimeControlActionResult> => {\n const result = await controlRemoteService(\"start\", this.createServiceControlDeps());\n return {\n accepted: result.accepted,\n action: \"start-service\",\n lifecycle: \"starting-service\",\n message: result.message\n };\n };\n\n restartService = async (): Promise<RuntimeControlActionResult> => {\n const result = await controlRemoteService(\"restart\", this.createServiceControlDeps());\n return {\n accepted: result.accepted,\n action: \"restart-service\",\n lifecycle: \"restarting-service\",\n message: result.message\n };\n };\n\n stopService = async (): Promise<RuntimeControlActionResult> => {\n const result = await controlRemoteService(\"stop\", this.createServiceControlDeps());\n return {\n accepted: result.accepted,\n action: \"stop-service\",\n lifecycle: \"stopping-service\",\n message: result.message\n };\n };\n\n private createServiceControlDeps = () => {\n return {\n serviceCommands: this.deps.serviceCommands,\n requestManagedServiceRestart: () =>\n requestManagedServiceRestart(this.deps.requestRestart, { uiPort: this.deps.uiConfig.port }),\n currentUi: this.deps.uiConfig\n };\n };\n}\n\nexport function createRuntimeControlHost(params: RuntimeControlHostDeps): RuntimeControlHost {\n return new RuntimeControlHost(params);\n}\n"],"mappings":";;;;AAOA,MAAM,8BAA8B;AACpC,MAAM,0BAA0B;AAChC,MAAM,4BAA4B;AAWlC,IAAa,qBAAb,MAAgE;CAC9D,YAAY,MAA+C;AAA9B,OAAA,OAAA;;CAE7B,mBAAuC;EACrC,MAAM,UAAU,yBAAyB,KAAK,KAAK,SAAS;EAC5D,MAAM,iBAAiB,QAAQ;EAC/B,MAAM,iBAAiB,oBAAoB,MAAM;AAEjD,SAAO;GACL,aAAa;GACb,WAAW,iBAAiB,YAAY;GACxC,cAAc,iBAAiB,YAAY;GAC3C,iBAAiB;IACf,WAAW,CAAC;IACZ,sBAAsB;IACtB,QAAQ;IACR,GAAI,iBAAiB,EAAE,qBAAqB,2BAA2B,GAAG,EAAE;IAC7E;GACD,mBAAmB;IACjB,WAAW;IACX,sBAAsB;IACtB,QAAQ;IACR,GAAI,CAAC,iBAAiB,EAAE,qBAAqB,qCAAqC,GAAG,EAAE;IACxF;GACD,gBAAgB;IACd,WAAW;IACX,sBAAsB;IACtB,QAAQ;IACR,GAAI,CAAC,iBAAiB,EAAE,qBAAqB,yCAAyC,GAAG,EAAE;IAC5F;GACD,eAAe;IACb,WAAW;IACX,sBAAsB;IACtB,QAAQ;IACR,qBAAqB;IACtB;GACD;GACA,YAAY;GACZ,gBAAgB,QAAQ,iBACpB,4FACA;GACJ,SAAS;GACV;;CAGH,eAAe,YAAiD;EAC9D,MAAM,SAAS,MAAM,qBAAqB,SAAS,KAAK,0BAA0B,CAAC;AACnF,SAAO;GACL,UAAU,OAAO;GACjB,QAAQ;GACR,WAAW;GACX,SAAS,OAAO;GACjB;;CAGH,iBAAiB,YAAiD;EAChE,MAAM,SAAS,MAAM,qBAAqB,WAAW,KAAK,0BAA0B,CAAC;AACrF,SAAO;GACL,UAAU,OAAO;GACjB,QAAQ;GACR,WAAW;GACX,SAAS,OAAO;GACjB;;CAGH,cAAc,YAAiD;EAC7D,MAAM,SAAS,MAAM,qBAAqB,QAAQ,KAAK,0BAA0B,CAAC;AAClF,SAAO;GACL,UAAU,OAAO;GACjB,QAAQ;GACR,WAAW;GACX,SAAS,OAAO;GACjB;;CAGH,iCAAyC;AACvC,SAAO;GACL,iBAAiB,KAAK,KAAK;GAC3B,oCACE,6BAA6B,KAAK,KAAK,gBAAgB,EAAE,QAAQ,KAAK,KAAK,SAAS,MAAM,CAAC;GAC7F,WAAW,KAAK,KAAK;GACtB;;;AAIL,SAAgB,yBAAyB,QAAoD;AAC3F,QAAO,IAAI,mBAAmB,OAAO"}
|
|
@@ -22,4 +22,5 @@ declare function createRemoteAccessHost(params: {
|
|
|
22
22
|
remoteModule: RemoteServiceModule | null;
|
|
23
23
|
}): RemoteAccessHost;
|
|
24
24
|
//#endregion
|
|
25
|
-
export { createRemoteAccessHost, requestManagedServiceRestart };
|
|
25
|
+
export { createRemoteAccessHost, requestManagedServiceRestart };
|
|
26
|
+
//# sourceMappingURL=service-remote-access.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-remote-access.service.d.ts","names":[],"sources":["../../../../src/shared/services/ui/service-remote-access.service.ts"],"mappings":";;;;;;KAOK,4BAAA;EACH,MAAA;EACA,MAAA;AAAA;AAAA,iBAGc,4BAAA,CACd,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA,QAClD,OAAA,GAAS,4BAAA,GACR,OAAA;AAAA,iBAgBa,sBAAA,CAAuB,MAAA;EACrC,eAAA;IACE,YAAA,GAAe,OAAA;MAAW,WAAA,EAAa,MAAA;MAAyB,IAAA;IAAA,MAAoB,OAAA;IACpF,WAAA,QAAmB,OAAA;EAAA;EAErB,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAClD,QAAA,EAAU,IAAA,CAAK,MAAA;EACf,YAAA,EAAc,mBAAA;AAAA,IACZ,gBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-remote-access.service.js","names":[],"sources":["../../../../src/shared/services/ui/service-remote-access.service.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport type { RemoteServiceModule } from \"@nextclaw/remote\";\nimport type { RequestRestartParams } from \"@nextclaw-service/shared/types/cli.types.js\";\nimport { RemoteAccessHost } from \"@nextclaw-service/commands/remote/services/remote-access-host.service.js\";\nimport { PlatformAuthCommands } from \"@nextclaw-service/commands/platform-auth/index.js\";\nimport { RemoteCommands } from \"@nextclaw-service/commands/remote/index.js\";\n\ntype ManagedServiceRestartOptions = {\n uiPort?: number;\n reason?: string;\n};\n\nexport function requestManagedServiceRestart(\n requestRestart: (params: RequestRestartParams) => Promise<void>,\n options: ManagedServiceRestartOptions = {}\n): Promise<void> {\n const uiPort =\n typeof options.uiPort === \"number\" && Number.isFinite(options.uiPort) ? Math.floor(options.uiPort) : undefined;\n const reason = options.reason?.trim() || \"remote access service restart\";\n const manualMessage = uiPort\n ? `Restart the managed service to restore the UI on port ${uiPort}.`\n : \"Restart the managed service to restore the UI.\";\n return requestRestart({\n reason,\n manualMessage,\n strategy: \"background-service-or-exit\",\n delayMs: 500,\n silentOnServiceRestart: true\n });\n}\n\nexport function createRemoteAccessHost(params: {\n serviceCommands: {\n startService: (options: { uiOverrides: Record<string, unknown>; open: boolean }) => Promise<void>;\n stopService: () => Promise<void>;\n };\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n uiConfig: Pick<Config[\"ui\"], \"host\" | \"port\">;\n remoteModule: RemoteServiceModule | null;\n}): RemoteAccessHost {\n const { remoteModule, requestRestart, serviceCommands, uiConfig } = params;\n const currentLocalOrigin = `http://127.0.0.1:${uiConfig.port}`;\n return new RemoteAccessHost({\n serviceCommands,\n requestManagedServiceRestart: (options?: ManagedServiceRestartOptions) => requestManagedServiceRestart(requestRestart, options),\n remoteCommands: new RemoteCommands({ currentLocalOrigin }),\n platformAuthCommands: new PlatformAuthCommands(),\n currentUi: uiConfig,\n remoteRuntimeController: remoteModule\n ? {\n start: async () => {\n remoteModule?.start();\n },\n stop: async () => {\n await remoteModule?.stop();\n },\n restart: async () => {\n await remoteModule?.restart();\n }\n }\n : null\n });\n}\n"],"mappings":";;;;;AAYA,SAAgB,6BACd,gBACA,UAAwC,EAAE,EAC3B;CACf,MAAM,SACJ,OAAO,QAAQ,WAAW,YAAY,OAAO,SAAS,QAAQ,OAAO,GAAG,KAAK,MAAM,QAAQ,OAAO,GAAG,KAAA;AAKvG,QAAO,eAAe;EACpB,QALa,QAAQ,QAAQ,MAAM,IAAI;EAMvC,eALoB,SAClB,yDAAyD,OAAO,KAChE;EAIF,UAAU;EACV,SAAS;EACT,wBAAwB;EACzB,CAAC;;AAGJ,SAAgB,uBAAuB,QAQlB;CACnB,MAAM,EAAE,cAAc,gBAAgB,iBAAiB,aAAa;AAEpE,QAAO,IAAI,iBAAiB;EAC1B;EACA,+BAA+B,YAA2C,6BAA6B,gBAAgB,QAAQ;EAC/H,gBAAgB,IAAI,eAAe,EAAE,oBAJZ,oBAAoB,SAAS,QAIG,CAAC;EAC1D,sBAAsB,IAAI,sBAAsB;EAChD,WAAW;EACX,yBAAyB,eACrB;GACA,OAAO,YAAY;AACjB,kBAAc,OAAO;;GAEvB,MAAM,YAAY;AAChB,UAAM,cAAc,MAAM;;GAE5B,SAAS,YAAY;AACnB,UAAM,cAAc,SAAS;;GAEhC,GACC;EACL,CAAC"}
|
|
@@ -13,4 +13,5 @@ declare class UiBridgeApiClient {
|
|
|
13
13
|
}) => Promise<T>;
|
|
14
14
|
}
|
|
15
15
|
//#endregion
|
|
16
|
-
export { UiBridgeApiClient, UiBridgeApiMethod, resolveLocalUiApiBase };
|
|
16
|
+
export { UiBridgeApiClient, UiBridgeApiMethod, resolveLocalUiApiBase };
|
|
17
|
+
//# sourceMappingURL=ui-bridge-api.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-bridge-api.service.d.ts","names":[],"sources":["../../../../src/shared/services/ui/ui-bridge-api.service.ts"],"mappings":";KAiBY,iBAAA;AAAA,iBAEI,qBAAA,CAAA;AAAA,cAIH,iBAAA;EAAA,iBAGkB,OAAA;EAAA,QAFrB,MAAA;cAEqB,OAAA;EAAA,iBAEZ,SAAA;EAAA,SAyBR,OAAA,MAAoB,MAAA;IAC3B,IAAA;IACA,MAAA,GAAS,iBAAA;IACT,IAAA;EAAA,MACE,OAAA,CAAQ,CAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-bridge-api.service.js","names":[],"sources":["../../../../src/shared/services/ui/ui-bridge-api.service.ts"],"sourcesContent":["import { ensureUiBridgeSecret } from \"@nextclaw/server\";\nimport { localUiDiscoveryService } from \"./local-ui-discovery.service.js\";\n\ntype ApiOkResponse<T> = {\n ok: true;\n data: T;\n};\n\ntype ApiErrorResponse = {\n ok: false;\n error?: {\n message?: string;\n };\n};\n\ntype ApiResponse<T> = ApiOkResponse<T> | ApiErrorResponse;\n\nexport type UiBridgeApiMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n\nexport function resolveLocalUiApiBase(): string | null {\n return localUiDiscoveryService.resolveApiBase();\n}\n\nexport class UiBridgeApiClient {\n private cookie: string | null | undefined;\n\n constructor(private readonly apiBase: string) {}\n\n private readonly getCookie = async (): Promise<string | null> => {\n if (this.cookie !== undefined) {\n return this.cookie;\n }\n const bridgeSecret = ensureUiBridgeSecret();\n const response = await fetch(`${this.apiBase}/api/auth/bridge`, {\n method: \"POST\",\n headers: {\n \"x-nextclaw-ui-bridge-secret\": bridgeSecret\n }\n });\n if (!response.ok) {\n throw new Error(`bridge auth failed with status ${response.status}`);\n }\n const payload = (await response.json()) as ApiResponse<{ cookie?: string | null }>;\n if (!payload.ok) {\n throw new Error(payload.error?.message ?? \"bridge auth failed\");\n }\n this.cookie =\n typeof payload.data.cookie === \"string\" && payload.data.cookie.trim()\n ? payload.data.cookie.trim()\n : null;\n return this.cookie;\n };\n\n readonly request = async <T>(params: {\n path: string;\n method?: UiBridgeApiMethod;\n body?: unknown;\n }): Promise<T> => {\n const { body, method, path } = params;\n const cookie = await this.getCookie();\n const response = await fetch(`${this.apiBase}${path}`, {\n method: method ?? \"GET\",\n headers: {\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(cookie ? { Cookie: cookie } : {})\n },\n ...(body ? { body: JSON.stringify(body) } : {})\n });\n if (!response.ok) {\n throw new Error(`api request failed with status ${response.status}`);\n }\n const payload = (await response.json()) as ApiResponse<T>;\n if (!payload.ok) {\n throw new Error(payload.error?.message ?? \"api request failed\");\n }\n return payload.data;\n };\n}\n"],"mappings":";;;AAmBA,SAAgB,wBAAuC;AACrD,QAAO,wBAAwB,gBAAgB;;AAGjD,IAAa,oBAAb,MAA+B;CAC7B;CAEA,YAAY,SAAkC;AAAjB,OAAA,UAAA;;CAE7B,YAA6B,YAAoC;AAC/D,MAAI,KAAK,WAAW,KAAA,EAClB,QAAO,KAAK;EAEd,MAAM,eAAe,sBAAsB;EAC3C,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,mBAAmB;GAC9D,QAAQ;GACR,SAAS,EACP,+BAA+B,cAChC;GACF,CAAC;AACF,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,kCAAkC,SAAS,SAAS;EAEtE,MAAM,UAAW,MAAM,SAAS,MAAM;AACtC,MAAI,CAAC,QAAQ,GACX,OAAM,IAAI,MAAM,QAAQ,OAAO,WAAW,qBAAqB;AAEjE,OAAK,SACH,OAAO,QAAQ,KAAK,WAAW,YAAY,QAAQ,KAAK,OAAO,MAAM,GACjE,QAAQ,KAAK,OAAO,MAAM,GAC1B;AACN,SAAO,KAAK;;CAGd,UAAmB,OAAU,WAIX;EAChB,MAAM,EAAE,MAAM,QAAQ,SAAS;EAC/B,MAAM,SAAS,MAAM,KAAK,WAAW;EACrC,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,UAAU,QAAQ;GACrD,QAAQ,UAAU;GAClB,SAAS;IACP,GAAI,OAAO,EAAE,gBAAgB,oBAAoB,GAAG,EAAE;IACtD,GAAI,SAAS,EAAE,QAAQ,QAAQ,GAAG,EAAE;IACrC;GACD,GAAI,OAAO,EAAE,MAAM,KAAK,UAAU,KAAK,EAAE,GAAG,EAAE;GAC/C,CAAC;AACF,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,kCAAkC,SAAS,SAAS;EAEtE,MAAM,UAAW,MAAM,SAAS,MAAM;AACtC,MAAI,CAAC,QAAQ,GACX,OAAM,IAAI,MAAM,QAAQ,OAAO,WAAW,qBAAqB;AAEjE,SAAO,QAAQ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-manager.service.d.ts","names":[],"sources":["../../../../src/shared/services/workspace/workspace-manager.service.ts"],"mappings":";cAOa,gBAAA;EAAA,QACS,IAAA;cAAA,IAAA;EAAA,iBAEH,OAAA;EAAA,SASR,wBAAA,GAA4B,SAAA,UAAmB,OAAA;IAAW,KAAA;EAAA;IAA2B,OAAA;EAAA;EAAA,iBAoD7E,kBAAA;EAAA,SAcR,YAAA;EAAA,iBAyBQ,mBAAA;EAAA,iBAUA,sBAAA;EAAA,iBAOA,gBAAA;EAAA,iBASA,aAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-manager.service.js","names":[],"sources":["../../../../src/shared/services/workspace/workspace-manager.service.ts"],"sourcesContent":["import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { APP_NAME, DEFAULT_SKILLS_DIR, getDataDir } from \"@nextclaw/core\";\nimport { findExecutableOnPath } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport { spawnSync } from \"node:child_process\";\n\nexport class WorkspaceManager {\n constructor(private logo: string) {}\n\n private readonly pkgRoot = resolve(\n fileURLToPath(new URL(\".\", import.meta.url)),\n \"..\",\n \"..\",\n \"..\",\n \"..\",\n \"..\"\n );\n\n readonly createWorkspaceTemplates = (workspace: string, options: { force?: boolean } = {}): { created: string[] } => {\n const created: string[] = [];\n const force = Boolean(options.force);\n const templateDir = this.resolveTemplateDir();\n if (!templateDir) {\n console.warn(\"Warning: Template directory not found. Skipping workspace templates.\");\n }\n const templateFiles = [\n { source: \"AGENTS.md\", target: \"AGENTS.md\" },\n { source: \"SOUL.md\", target: \"SOUL.md\" },\n { source: \"USER.md\", target: \"USER.md\" },\n { source: \"IDENTITY.md\", target: \"IDENTITY.md\" },\n { source: \"TOOLS.md\", target: \"TOOLS.md\" },\n { source: \"BOOT.md\", target: \"BOOT.md\" },\n { source: \"BOOTSTRAP.md\", target: \"BOOTSTRAP.md\" },\n { source: \"MEMORY.md\", target: \"MEMORY.md\" },\n { source: \"memory/MEMORY.md\", target: \"memory/MEMORY.md\" }\n ];\n\n if (templateDir) {\n for (const entry of templateFiles) {\n const filePath = join(workspace, entry.target);\n if (!force && existsSync(filePath)) {\n continue;\n }\n const templatePath = join(templateDir, entry.source);\n if (!existsSync(templatePath)) {\n console.warn(`Warning: Template file missing: ${templatePath}`);\n continue;\n }\n const raw = readFileSync(templatePath, \"utf-8\");\n const content = raw.replace(/\\$\\{APP_NAME\\}/g, APP_NAME);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, content);\n created.push(entry.target);\n }\n }\n\n const memoryDir = join(workspace, \"memory\");\n if (!existsSync(memoryDir)) {\n mkdirSync(memoryDir, { recursive: true });\n created.push(join(\"memory\", \"\"));\n }\n\n const skillsDir = join(workspace, DEFAULT_SKILLS_DIR);\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n created.push(join(DEFAULT_SKILLS_DIR, \"\"));\n }\n return { created };\n };\n\n private readonly resolveTemplateDir = (): string | null => {\n const override = process.env.NEXTCLAW_TEMPLATE_DIR?.trim();\n if (override) {\n return override;\n }\n const candidates = [join(this.pkgRoot, \"templates\")];\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n };\n\n readonly getBridgeDir = (): string => {\n const userBridge = join(getDataDir(), \"bridge\");\n if (existsSync(join(userBridge, \"dist\", \"index.js\"))) {\n return userBridge;\n }\n\n this.assertCommandAvailable(\"npm\");\n const source = this.resolveBridgeSource();\n\n console.log(`${this.logo} Setting up bridge...`);\n mkdirSync(resolve(userBridge, \"..\"), { recursive: true });\n if (existsSync(userBridge)) {\n rmSync(userBridge, { recursive: true, force: true });\n }\n cpSync(source, userBridge, {\n recursive: true,\n filter: (src) => !src.includes(\"node_modules\") && !src.includes(\"dist\")\n });\n this.runBridgeCommand(userBridge, [\"install\"], \"install\");\n this.runBridgeCommand(userBridge, [\"run\", \"build\"], \"build\");\n\n console.log(\"✓ Bridge ready\\n\");\n return userBridge;\n };\n\n private readonly resolveBridgeSource = (): string => {\n const candidates = [join(this.pkgRoot, \"bridge\"), join(this.pkgRoot, \"..\", \"..\", \"bridge\")];\n for (const candidate of candidates) {\n if (existsSync(join(candidate, \"package.json\"))) {\n return candidate;\n }\n }\n return this.exitWithError(`Bridge source not found. Try reinstalling ${APP_NAME}.`);\n };\n\n private readonly assertCommandAvailable = (command: string): void => {\n if (findExecutableOnPath(command)) {\n return;\n }\n this.exitWithError(`${command} not found. Please install Node.js >= 18.`);\n };\n\n private readonly runBridgeCommand = (cwd: string, args: string[], step: \"install\" | \"build\"): void => {\n const result = spawnSync(\"npm\", args, { cwd, stdio: \"pipe\" });\n if (result.status === 0) {\n return;\n }\n const stderr = result.stderr ? String(result.stderr).slice(0, 500) : null;\n this.exitWithError(`Bridge ${step} failed: ${result.status ?? 1}`, stderr);\n };\n\n private readonly exitWithError = (message: string, detail?: string | null): never => {\n console.error(message);\n if (detail) {\n console.error(detail);\n }\n process.exit(1);\n };\n}\n"],"mappings":"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"}
|
|
@@ -12,4 +12,5 @@ declare class CompanionRuntimeStore {
|
|
|
12
12
|
}
|
|
13
13
|
declare const companionRuntimeStore: CompanionRuntimeStore;
|
|
14
14
|
//#endregion
|
|
15
|
-
export { CompanionRuntimeState, CompanionRuntimeStore, companionRuntimeStore };
|
|
15
|
+
export { CompanionRuntimeState, CompanionRuntimeStore, companionRuntimeStore };
|
|
16
|
+
//# sourceMappingURL=companion-runtime.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"companion-runtime.store.d.ts","names":[],"sources":["../../../src/shared/stores/companion-runtime.store.ts"],"mappings":";KAIY,qBAAA;EACV,GAAA;EACA,SAAA;EACA,OAAA;AAAA;AAAA,cAGW,qBAAA;EAAA,IACP,IAAA,CAAA;EAAA,SAIK,IAAA,QAAW,qBAAA;EAAA,SAWX,KAAA,GAAS,KAAA,EAAO,qBAAA;EAAA,SAKhB,KAAA;AAAA;AAAA,cAOE,qBAAA,EAAqB,qBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"companion-runtime.store.js","names":[],"sources":["../../../src/shared/stores/companion-runtime.store.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { getDataDir } from \"@nextclaw/core\";\n\nexport type CompanionRuntimeState = {\n pid: number;\n startedAt: string;\n baseUrl: string;\n};\n\nexport class CompanionRuntimeStore {\n get path(): string {\n return resolve(getDataDir(), \"run\", \"companion.json\");\n }\n\n readonly read = (): CompanionRuntimeState | null => {\n if (!existsSync(this.path)) {\n return null;\n }\n try {\n return JSON.parse(readFileSync(this.path, \"utf-8\")) as CompanionRuntimeState;\n } catch {\n return null;\n }\n };\n\n readonly write = (state: CompanionRuntimeState): void => {\n mkdirSync(resolve(this.path, \"..\"), { recursive: true });\n writeFileSync(this.path, JSON.stringify(state, null, 2));\n };\n\n readonly clear = (): void => {\n if (existsSync(this.path)) {\n rmSync(this.path, { force: true });\n }\n };\n}\n\nexport const companionRuntimeStore = new CompanionRuntimeStore();\n"],"mappings":";;;;AAUA,IAAa,wBAAb,MAAmC;CACjC,IAAI,OAAe;AACjB,SAAO,QAAQ,YAAY,EAAE,OAAO,iBAAiB;;CAGvD,aAAoD;AAClD,MAAI,CAAC,WAAW,KAAK,KAAK,CACxB,QAAO;AAET,MAAI;AACF,UAAO,KAAK,MAAM,aAAa,KAAK,MAAM,QAAQ,CAAC;UAC7C;AACN,UAAO;;;CAIX,SAAkB,UAAuC;AACvD,YAAU,QAAQ,KAAK,MAAM,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;AACxD,gBAAc,KAAK,MAAM,KAAK,UAAU,OAAO,MAAM,EAAE,CAAC;;CAG1D,cAA6B;AAC3B,MAAI,WAAW,KAAK,KAAK,CACvB,QAAO,KAAK,MAAM,EAAE,OAAO,MAAM,CAAC;;;AAKxC,MAAa,wBAAwB,IAAI,uBAAuB"}
|
|
@@ -22,4 +22,5 @@ declare class LocalUiRuntimeStore {
|
|
|
22
22
|
}
|
|
23
23
|
declare const localUiRuntimeStore: LocalUiRuntimeStore;
|
|
24
24
|
//#endregion
|
|
25
|
-
export { LocalUiRuntimeState, LocalUiRuntimeStore, localUiRuntimeStore };
|
|
25
|
+
export { LocalUiRuntimeState, LocalUiRuntimeStore, localUiRuntimeStore };
|
|
26
|
+
//# sourceMappingURL=local-ui-runtime.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-ui-runtime.store.d.ts","names":[],"sources":["../../../src/shared/stores/local-ui-runtime.store.ts"],"mappings":";;;;KAMY,mBAAA;EACV,GAAA;EACA,SAAA;EACA,KAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA,GAAS,kBAAA;AAAA;AAAA,cAGE,mBAAA;EAAA,IACP,IAAA,CAAA;EAAA,SAIK,IAAA,QAAW,mBAAA;EAAA,SAYX,KAAA,GAAS,KAAA,EAAO,mBAAA;EAAA,SAKhB,MAAA,GAAU,OAAA,GAAU,KAAA,EAAO,mBAAA,KAAwB,mBAAA,KAAsB,mBAAA;EAAA,SAUzE,KAAA;EAAA,SAMA,qBAAA,GAAyB,GAAA;EAAA,SAMzB,mBAAA,GACP,QAAA,EAAU,IAAA,CAAK,MAAA,0BACf,GAAA,cACC,mBAAA;AAAA;AAAA,cAoBQ,mBAAA,EAAmB,mBAAA"}
|