nomoreide 0.2.0 → 0.3.2
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/README.md +12 -9
- package/bin/nomoreide.js +82 -0
- package/package.json +24 -132
- package/dist/cli/agents.d.ts +0 -2
- package/dist/cli/agents.js +0 -43
- package/dist/cli/agents.js.map +0 -1
- package/dist/cli/commands.d.ts +0 -11
- package/dist/cli/commands.js +0 -235
- package/dist/cli/commands.js.map +0 -1
- package/dist/cli/daemon.d.ts +0 -15
- package/dist/cli/daemon.js +0 -139
- package/dist/cli/daemon.js.map +0 -1
- package/dist/cli/database.d.ts +0 -2
- package/dist/cli/database.js +0 -145
- package/dist/cli/database.js.map +0 -1
- package/dist/cli/errors.d.ts +0 -2
- package/dist/cli/errors.js +0 -3
- package/dist/cli/errors.js.map +0 -1
- package/dist/cli/flags.d.ts +0 -1
- package/dist/cli/flags.js +0 -19
- package/dist/cli/flags.js.map +0 -1
- package/dist/cli/git.d.ts +0 -2
- package/dist/cli/git.js +0 -113
- package/dist/cli/git.js.map +0 -1
- package/dist/cli/profile.d.ts +0 -2
- package/dist/cli/profile.js +0 -171
- package/dist/cli/profile.js.map +0 -1
- package/dist/core/agent-context.d.ts +0 -9
- package/dist/core/agent-context.js +0 -43
- package/dist/core/agent-context.js.map +0 -1
- package/dist/core/agent-env/antigravity-reader.d.ts +0 -7
- package/dist/core/agent-env/antigravity-reader.js +0 -86
- package/dist/core/agent-env/antigravity-reader.js.map +0 -1
- package/dist/core/agent-env/availability.d.ts +0 -6
- package/dist/core/agent-env/availability.js +0 -79
- package/dist/core/agent-env/availability.js.map +0 -1
- package/dist/core/agent-env/claude-reader.d.ts +0 -7
- package/dist/core/agent-env/claude-reader.js +0 -101
- package/dist/core/agent-env/claude-reader.js.map +0 -1
- package/dist/core/agent-env/codex-reader.d.ts +0 -11
- package/dist/core/agent-env/codex-reader.js +0 -164
- package/dist/core/agent-env/codex-reader.js.map +0 -1
- package/dist/core/agent-env/index.d.ts +0 -9
- package/dist/core/agent-env/index.js +0 -29
- package/dist/core/agent-env/index.js.map +0 -1
- package/dist/core/agent-env/managed-plugins.d.ts +0 -18
- package/dist/core/agent-env/managed-plugins.js +0 -68
- package/dist/core/agent-env/managed-plugins.js.map +0 -1
- package/dist/core/agent-env/plugin-reader.d.ts +0 -9
- package/dist/core/agent-env/plugin-reader.js +0 -174
- package/dist/core/agent-env/plugin-reader.js.map +0 -1
- package/dist/core/agent-env/shared.d.ts +0 -26
- package/dist/core/agent-env/shared.js +0 -116
- package/dist/core/agent-env/shared.js.map +0 -1
- package/dist/core/agent-env/types.d.ts +0 -66
- package/dist/core/agent-env/types.js +0 -7
- package/dist/core/agent-env/types.js.map +0 -1
- package/dist/core/agent-env-actions.d.ts +0 -117
- package/dist/core/agent-env-actions.js +0 -273
- package/dist/core/agent-env-actions.js.map +0 -1
- package/dist/core/agent-env-plugin-uninstall.d.ts +0 -11
- package/dist/core/agent-env-plugin-uninstall.js +0 -189
- package/dist/core/agent-env-plugin-uninstall.js.map +0 -1
- package/dist/core/agent-env-writers.d.ts +0 -71
- package/dist/core/agent-env-writers.js +0 -632
- package/dist/core/agent-env-writers.js.map +0 -1
- package/dist/core/agent-profiles/apply.d.ts +0 -57
- package/dist/core/agent-profiles/apply.js +0 -209
- package/dist/core/agent-profiles/apply.js.map +0 -1
- package/dist/core/agent-profiles/builtin.d.ts +0 -8
- package/dist/core/agent-profiles/builtin.js +0 -33
- package/dist/core/agent-profiles/builtin.js.map +0 -1
- package/dist/core/agent-profiles/credentials.d.ts +0 -26
- package/dist/core/agent-profiles/credentials.js +0 -151
- package/dist/core/agent-profiles/credentials.js.map +0 -1
- package/dist/core/agent-profiles/debug-setup.d.ts +0 -18
- package/dist/core/agent-profiles/debug-setup.js +0 -237
- package/dist/core/agent-profiles/debug-setup.js.map +0 -1
- package/dist/core/agent-profiles/index.d.ts +0 -18
- package/dist/core/agent-profiles/index.js +0 -19
- package/dist/core/agent-profiles/index.js.map +0 -1
- package/dist/core/agent-profiles/plugin-apply.d.ts +0 -16
- package/dist/core/agent-profiles/plugin-apply.js +0 -383
- package/dist/core/agent-profiles/plugin-apply.js.map +0 -1
- package/dist/core/agent-profiles/plugin-bundle.d.ts +0 -6
- package/dist/core/agent-profiles/plugin-bundle.js +0 -32
- package/dist/core/agent-profiles/plugin-bundle.js.map +0 -1
- package/dist/core/agent-profiles/publication.d.ts +0 -105
- package/dist/core/agent-profiles/publication.js +0 -126
- package/dist/core/agent-profiles/publication.js.map +0 -1
- package/dist/core/agent-profiles/registry-auth.d.ts +0 -25
- package/dist/core/agent-profiles/registry-auth.js +0 -78
- package/dist/core/agent-profiles/registry-auth.js.map +0 -1
- package/dist/core/agent-profiles/registry-client.d.ts +0 -98
- package/dist/core/agent-profiles/registry-client.js +0 -109
- package/dist/core/agent-profiles/registry-client.js.map +0 -1
- package/dist/core/agent-profiles/registry-config.d.ts +0 -62
- package/dist/core/agent-profiles/registry-config.js +0 -221
- package/dist/core/agent-profiles/registry-config.js.map +0 -1
- package/dist/core/agent-profiles/registry-transfer.d.ts +0 -42
- package/dist/core/agent-profiles/registry-transfer.js +0 -133
- package/dist/core/agent-profiles/registry-transfer.js.map +0 -1
- package/dist/core/agent-profiles/store.d.ts +0 -62
- package/dist/core/agent-profiles/store.js +0 -479
- package/dist/core/agent-profiles/store.js.map +0 -1
- package/dist/core/agent-profiles/transfer.d.ts +0 -27
- package/dist/core/agent-profiles/transfer.js +0 -359
- package/dist/core/agent-profiles/transfer.js.map +0 -1
- package/dist/core/agent-profiles/types.d.ts +0 -364
- package/dist/core/agent-profiles/types.js +0 -79
- package/dist/core/agent-profiles/types.js.map +0 -1
- package/dist/core/agent-runtime.d.ts +0 -114
- package/dist/core/agent-runtime.js +0 -494
- package/dist/core/agent-runtime.js.map +0 -1
- package/dist/core/agent-sessions.d.ts +0 -46
- package/dist/core/agent-sessions.js +0 -109
- package/dist/core/agent-sessions.js.map +0 -1
- package/dist/core/agent-settings.d.ts +0 -31
- package/dist/core/agent-settings.js +0 -129
- package/dist/core/agent-settings.js.map +0 -1
- package/dist/core/agent-terminal.d.ts +0 -22
- package/dist/core/agent-terminal.js +0 -62
- package/dist/core/agent-terminal.js.map +0 -1
- package/dist/core/agent-transcripts.d.ts +0 -29
- package/dist/core/agent-transcripts.js +0 -281
- package/dist/core/agent-transcripts.js.map +0 -1
- package/dist/core/app-settings.d.ts +0 -74
- package/dist/core/app-settings.js +0 -118
- package/dist/core/app-settings.js.map +0 -1
- package/dist/core/app-version.d.ts +0 -2
- package/dist/core/app-version.js +0 -16
- package/dist/core/app-version.js.map +0 -1
- package/dist/core/approval-broker.d.ts +0 -29
- package/dist/core/approval-broker.js +0 -48
- package/dist/core/approval-broker.js.map +0 -1
- package/dist/core/claude-settings.d.ts +0 -18
- package/dist/core/claude-settings.js +0 -48
- package/dist/core/claude-settings.js.map +0 -1
- package/dist/core/cloudflare-actions.d.ts +0 -90
- package/dist/core/cloudflare-actions.js +0 -178
- package/dist/core/cloudflare-actions.js.map +0 -1
- package/dist/core/cloudflare-auth.d.ts +0 -61
- package/dist/core/cloudflare-auth.js +0 -149
- package/dist/core/cloudflare-auth.js.map +0 -1
- package/dist/core/cloudflare-context.d.ts +0 -2
- package/dist/core/cloudflare-context.js +0 -106
- package/dist/core/cloudflare-context.js.map +0 -1
- package/dist/core/cloudflare-manager.d.ts +0 -258
- package/dist/core/cloudflare-manager.js +0 -414
- package/dist/core/cloudflare-manager.js.map +0 -1
- package/dist/core/cloudflare-provider.d.ts +0 -64
- package/dist/core/cloudflare-provider.js +0 -348
- package/dist/core/cloudflare-provider.js.map +0 -1
- package/dist/core/config-files.d.ts +0 -27
- package/dist/core/config-files.js +0 -154
- package/dist/core/config-files.js.map +0 -1
- package/dist/core/config-store.d.ts +0 -181
- package/dist/core/config-store.js +0 -1026
- package/dist/core/config-store.js.map +0 -1
- package/dist/core/context-library.d.ts +0 -53
- package/dist/core/context-library.js +0 -605
- package/dist/core/context-library.js.map +0 -1
- package/dist/core/context-types.d.ts +0 -83
- package/dist/core/context-types.js +0 -9
- package/dist/core/context-types.js.map +0 -1
- package/dist/core/daemon-client.d.ts +0 -84
- package/dist/core/daemon-client.js +0 -156
- package/dist/core/daemon-client.js.map +0 -1
- package/dist/core/daemon-lifecycle.d.ts +0 -59
- package/dist/core/daemon-lifecycle.js +0 -147
- package/dist/core/daemon-lifecycle.js.map +0 -1
- package/dist/core/db/catalog.d.ts +0 -57
- package/dist/core/db/catalog.js +0 -38
- package/dist/core/db/catalog.js.map +0 -1
- package/dist/core/db/data-masking.d.ts +0 -3
- package/dist/core/db/data-masking.js +0 -14
- package/dist/core/db/data-masking.js.map +0 -1
- package/dist/core/db/driver.d.ts +0 -151
- package/dist/core/db/driver.js +0 -209
- package/dist/core/db/driver.js.map +0 -1
- package/dist/core/db/export.d.ts +0 -17
- package/dist/core/db/export.js +0 -67
- package/dist/core/db/export.js.map +0 -1
- package/dist/core/db/mysql-driver.d.ts +0 -33
- package/dist/core/db/mysql-driver.js +0 -364
- package/dist/core/db/mysql-driver.js.map +0 -1
- package/dist/core/db/postgres-driver.d.ts +0 -34
- package/dist/core/db/postgres-driver.js +0 -430
- package/dist/core/db/postgres-driver.js.map +0 -1
- package/dist/core/db/sqlite-driver.d.ts +0 -30
- package/dist/core/db/sqlite-driver.js +0 -301
- package/dist/core/db/sqlite-driver.js.map +0 -1
- package/dist/core/db-peek.d.ts +0 -99
- package/dist/core/db-peek.js +0 -322
- package/dist/core/db-peek.js.map +0 -1
- package/dist/core/db-write.d.ts +0 -45
- package/dist/core/db-write.js +0 -190
- package/dist/core/db-write.js.map +0 -1
- package/dist/core/docker-inspect.d.ts +0 -34
- package/dist/core/docker-inspect.js +0 -108
- package/dist/core/docker-inspect.js.map +0 -1
- package/dist/core/docker-resources.d.ts +0 -28
- package/dist/core/docker-resources.js +0 -59
- package/dist/core/docker-resources.js.map +0 -1
- package/dist/core/docker-service-runner.d.ts +0 -21
- package/dist/core/docker-service-runner.js +0 -80
- package/dist/core/docker-service-runner.js.map +0 -1
- package/dist/core/docker-stats.d.ts +0 -24
- package/dist/core/docker-stats.js +0 -76
- package/dist/core/docker-stats.js.map +0 -1
- package/dist/core/docker.d.ts +0 -75
- package/dist/core/docker.js +0 -219
- package/dist/core/docker.js.map +0 -1
- package/dist/core/env-file.d.ts +0 -24
- package/dist/core/env-file.js +0 -123
- package/dist/core/env-file.js.map +0 -1
- package/dist/core/env-runtime.d.ts +0 -32
- package/dist/core/env-runtime.js +0 -42
- package/dist/core/env-runtime.js.map +0 -1
- package/dist/core/error-inbox.d.ts +0 -91
- package/dist/core/error-inbox.js +0 -292
- package/dist/core/error-inbox.js.map +0 -1
- package/dist/core/extensions.d.ts +0 -78
- package/dist/core/extensions.js +0 -41
- package/dist/core/extensions.js.map +0 -1
- package/dist/core/external-terminal.d.ts +0 -60
- package/dist/core/external-terminal.js +0 -429
- package/dist/core/external-terminal.js.map +0 -1
- package/dist/core/fix-loop.d.ts +0 -55
- package/dist/core/fix-loop.js +0 -73
- package/dist/core/fix-loop.js.map +0 -1
- package/dist/core/git-actions.d.ts +0 -69
- package/dist/core/git-actions.js +0 -161
- package/dist/core/git-actions.js.map +0 -1
- package/dist/core/git-graph-layout.d.ts +0 -34
- package/dist/core/git-graph-layout.js +0 -94
- package/dist/core/git-graph-layout.js.map +0 -1
- package/dist/core/git-identity.d.ts +0 -78
- package/dist/core/git-identity.js +0 -178
- package/dist/core/git-identity.js.map +0 -1
- package/dist/core/git-manager.d.ts +0 -129
- package/dist/core/git-manager.js +0 -509
- package/dist/core/git-manager.js.map +0 -1
- package/dist/core/git-worktrees.d.ts +0 -35
- package/dist/core/git-worktrees.js +0 -142
- package/dist/core/git-worktrees.js.map +0 -1
- package/dist/core/github-auth.d.ts +0 -28
- package/dist/core/github-auth.js +0 -134
- package/dist/core/github-auth.js.map +0 -1
- package/dist/core/github-context.d.ts +0 -12
- package/dist/core/github-context.js +0 -36
- package/dist/core/github-context.js.map +0 -1
- package/dist/core/github-manager.d.ts +0 -230
- package/dist/core/github-manager.js +0 -324
- package/dist/core/github-manager.js.map +0 -1
- package/dist/core/host-metrics.d.ts +0 -41
- package/dist/core/host-metrics.js +0 -93
- package/dist/core/host-metrics.js.map +0 -1
- package/dist/core/http-inspector.d.ts +0 -20
- package/dist/core/http-inspector.js +0 -106
- package/dist/core/http-inspector.js.map +0 -1
- package/dist/core/jetbrains-import.d.ts +0 -85
- package/dist/core/jetbrains-import.js +0 -599
- package/dist/core/jetbrains-import.js.map +0 -1
- package/dist/core/log-sources.d.ts +0 -21
- package/dist/core/log-sources.js +0 -219
- package/dist/core/log-sources.js.map +0 -1
- package/dist/core/log-store.d.ts +0 -33
- package/dist/core/log-store.js +0 -94
- package/dist/core/log-store.js.map +0 -1
- package/dist/core/log-volume.d.ts +0 -41
- package/dist/core/log-volume.js +0 -81
- package/dist/core/log-volume.js.map +0 -1
- package/dist/core/mcp-auth.d.ts +0 -27
- package/dist/core/mcp-auth.js +0 -90
- package/dist/core/mcp-auth.js.map +0 -1
- package/dist/core/metrics-store.d.ts +0 -74
- package/dist/core/metrics-store.js +0 -187
- package/dist/core/metrics-store.js.map +0 -1
- package/dist/core/one-time-skills.d.ts +0 -27
- package/dist/core/one-time-skills.js +0 -185
- package/dist/core/one-time-skills.js.map +0 -1
- package/dist/core/port-utils.d.ts +0 -23
- package/dist/core/port-utils.js +0 -83
- package/dist/core/port-utils.js.map +0 -1
- package/dist/core/process-manager.d.ts +0 -99
- package/dist/core/process-manager.js +0 -738
- package/dist/core/process-manager.js.map +0 -1
- package/dist/core/process-tree.d.ts +0 -17
- package/dist/core/process-tree.js +0 -64
- package/dist/core/process-tree.js.map +0 -1
- package/dist/core/project-overview.d.ts +0 -52
- package/dist/core/project-overview.js +0 -122
- package/dist/core/project-overview.js.map +0 -1
- package/dist/core/providers/api-base.d.ts +0 -24
- package/dist/core/providers/api-base.js +0 -44
- package/dist/core/providers/api-base.js.map +0 -1
- package/dist/core/providers/credentials.d.ts +0 -93
- package/dist/core/providers/credentials.js +0 -88
- package/dist/core/providers/credentials.js.map +0 -1
- package/dist/core/providers/deploy-provider.d.ts +0 -327
- package/dist/core/providers/deploy-provider.js +0 -25
- package/dist/core/providers/deploy-provider.js.map +0 -1
- package/dist/core/providers/egress.d.ts +0 -58
- package/dist/core/providers/egress.js +0 -124
- package/dist/core/providers/egress.js.map +0 -1
- package/dist/core/providers/host-bridge.d.ts +0 -20
- package/dist/core/providers/host-bridge.js +0 -57
- package/dist/core/providers/host-bridge.js.map +0 -1
- package/dist/core/providers/host-provider.d.ts +0 -160
- package/dist/core/providers/host-provider.js +0 -2
- package/dist/core/providers/host-provider.js.map +0 -1
- package/dist/core/providers/oauth.d.ts +0 -97
- package/dist/core/providers/oauth.js +0 -238
- package/dist/core/providers/oauth.js.map +0 -1
- package/dist/core/providers/project-resolution.d.ts +0 -81
- package/dist/core/providers/project-resolution.js +0 -101
- package/dist/core/providers/project-resolution.js.map +0 -1
- package/dist/core/providers/registry.d.ts +0 -73
- package/dist/core/providers/registry.js +0 -53
- package/dist/core/providers/registry.js.map +0 -1
- package/dist/core/providers/strings.d.ts +0 -95
- package/dist/core/providers/strings.js +0 -59
- package/dist/core/providers/strings.js.map +0 -1
- package/dist/core/public-config.d.ts +0 -18
- package/dist/core/public-config.js +0 -76
- package/dist/core/public-config.js.map +0 -1
- package/dist/core/read-only-files.d.ts +0 -28
- package/dist/core/read-only-files.js +0 -93
- package/dist/core/read-only-files.js.map +0 -1
- package/dist/core/repo-create.d.ts +0 -11
- package/dist/core/repo-create.js +0 -54
- package/dist/core/repo-create.js.map +0 -1
- package/dist/core/repo-match.d.ts +0 -12
- package/dist/core/repo-match.js +0 -40
- package/dist/core/repo-match.js.map +0 -1
- package/dist/core/repo-onboard.d.ts +0 -297
- package/dist/core/repo-onboard.js +0 -667
- package/dist/core/repo-onboard.js.map +0 -1
- package/dist/core/repro-bundle.d.ts +0 -30
- package/dist/core/repro-bundle.js +0 -116
- package/dist/core/repro-bundle.js.map +0 -1
- package/dist/core/service-graph.d.ts +0 -50
- package/dist/core/service-graph.js +0 -143
- package/dist/core/service-graph.js.map +0 -1
- package/dist/core/service-health.d.ts +0 -10
- package/dist/core/service-health.js +0 -46
- package/dist/core/service-health.js.map +0 -1
- package/dist/core/service-log-source.d.ts +0 -9
- package/dist/core/service-log-source.js +0 -49
- package/dist/core/service-log-source.js.map +0 -1
- package/dist/core/service-registry.d.ts +0 -52
- package/dist/core/service-registry.js +0 -101
- package/dist/core/service-registry.js.map +0 -1
- package/dist/core/snapshot-manager.d.ts +0 -62
- package/dist/core/snapshot-manager.js +0 -219
- package/dist/core/snapshot-manager.js.map +0 -1
- package/dist/core/ssh-servers.d.ts +0 -89
- package/dist/core/ssh-servers.js +0 -251
- package/dist/core/ssh-servers.js.map +0 -1
- package/dist/core/ssh-service-runner.d.ts +0 -7
- package/dist/core/ssh-service-runner.js +0 -36
- package/dist/core/ssh-service-runner.js.map +0 -1
- package/dist/core/ssh-setup.d.ts +0 -11
- package/dist/core/ssh-setup.js +0 -49
- package/dist/core/ssh-setup.js.map +0 -1
- package/dist/core/system-processes.d.ts +0 -29
- package/dist/core/system-processes.js +0 -119
- package/dist/core/system-processes.js.map +0 -1
- package/dist/core/terminal-manager.d.ts +0 -123
- package/dist/core/terminal-manager.js +0 -470
- package/dist/core/terminal-manager.js.map +0 -1
- package/dist/core/terminal-session.d.ts +0 -122
- package/dist/core/terminal-session.js +0 -242
- package/dist/core/terminal-session.js.map +0 -1
- package/dist/core/terminal-spawn.d.ts +0 -26
- package/dist/core/terminal-spawn.js +0 -63
- package/dist/core/terminal-spawn.js.map +0 -1
- package/dist/core/test-runner.d.ts +0 -69
- package/dist/core/test-runner.js +0 -199
- package/dist/core/test-runner.js.map +0 -1
- package/dist/core/timeline-store.d.ts +0 -20
- package/dist/core/timeline-store.js +0 -36
- package/dist/core/timeline-store.js.map +0 -1
- package/dist/core/tool-call-store.d.ts +0 -25
- package/dist/core/tool-call-store.js +0 -62
- package/dist/core/tool-call-store.js.map +0 -1
- package/dist/core/types.d.ts +0 -312
- package/dist/core/types.js +0 -2
- package/dist/core/types.js.map +0 -1
- package/dist/core/usage-history.d.ts +0 -81
- package/dist/core/usage-history.js +0 -149
- package/dist/core/usage-history.js.map +0 -1
- package/dist/core/vercel-actions.d.ts +0 -71
- package/dist/core/vercel-actions.js +0 -109
- package/dist/core/vercel-actions.js.map +0 -1
- package/dist/core/vercel-auth.d.ts +0 -40
- package/dist/core/vercel-auth.js +0 -88
- package/dist/core/vercel-auth.js.map +0 -1
- package/dist/core/vercel-context.d.ts +0 -2
- package/dist/core/vercel-context.js +0 -97
- package/dist/core/vercel-context.js.map +0 -1
- package/dist/core/vercel-manager.d.ts +0 -268
- package/dist/core/vercel-manager.js +0 -401
- package/dist/core/vercel-manager.js.map +0 -1
- package/dist/core/vercel-oauth.d.ts +0 -37
- package/dist/core/vercel-oauth.js +0 -57
- package/dist/core/vercel-oauth.js.map +0 -1
- package/dist/core/vercel-provider.d.ts +0 -23
- package/dist/core/vercel-provider.js +0 -276
- package/dist/core/vercel-provider.js.map +0 -1
- package/dist/core/vultr-actions.d.ts +0 -52
- package/dist/core/vultr-actions.js +0 -62
- package/dist/core/vultr-actions.js.map +0 -1
- package/dist/core/vultr-auth.d.ts +0 -32
- package/dist/core/vultr-auth.js +0 -54
- package/dist/core/vultr-auth.js.map +0 -1
- package/dist/core/vultr-context.d.ts +0 -2
- package/dist/core/vultr-context.js +0 -55
- package/dist/core/vultr-context.js.map +0 -1
- package/dist/core/vultr-manager.d.ts +0 -113
- package/dist/core/vultr-manager.js +0 -170
- package/dist/core/vultr-manager.js.map +0 -1
- package/dist/core/vultr-provider.d.ts +0 -69
- package/dist/core/vultr-provider.js +0 -226
- package/dist/core/vultr-provider.js.map +0 -1
- package/dist/core/workflow-triggers.d.ts +0 -139
- package/dist/core/workflow-triggers.js +0 -208
- package/dist/core/workflow-triggers.js.map +0 -1
- package/dist/core/workflows.d.ts +0 -290
- package/dist/core/workflows.js +0 -190
- package/dist/core/workflows.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -66
- package/dist/index.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -37
- package/dist/mcp/server.js +0 -84
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/tools/agent-env.d.ts +0 -9
- package/dist/mcp/tools/agent-env.js +0 -160
- package/dist/mcp/tools/agent-env.js.map +0 -1
- package/dist/mcp/tools/agent-profiles.d.ts +0 -9
- package/dist/mcp/tools/agent-profiles.js +0 -197
- package/dist/mcp/tools/agent-profiles.js.map +0 -1
- package/dist/mcp/tools/agent-registry.d.ts +0 -9
- package/dist/mcp/tools/agent-registry.js +0 -81
- package/dist/mcp/tools/agent-registry.js.map +0 -1
- package/dist/mcp/tools/agent.d.ts +0 -4
- package/dist/mcp/tools/agent.js +0 -29
- package/dist/mcp/tools/agent.js.map +0 -1
- package/dist/mcp/tools/context.d.ts +0 -36
- package/dist/mcp/tools/context.js +0 -69
- package/dist/mcp/tools/context.js.map +0 -1
- package/dist/mcp/tools/database.d.ts +0 -9
- package/dist/mcp/tools/database.js +0 -166
- package/dist/mcp/tools/database.js.map +0 -1
- package/dist/mcp/tools/docs.d.ts +0 -29
- package/dist/mcp/tools/docs.js +0 -134
- package/dist/mcp/tools/docs.js.map +0 -1
- package/dist/mcp/tools/errors.d.ts +0 -12
- package/dist/mcp/tools/errors.js +0 -47
- package/dist/mcp/tools/errors.js.map +0 -1
- package/dist/mcp/tools/git.d.ts +0 -4
- package/dist/mcp/tools/git.js +0 -209
- package/dist/mcp/tools/git.js.map +0 -1
- package/dist/mcp/tools/github.d.ts +0 -4
- package/dist/mcp/tools/github.js +0 -196
- package/dist/mcp/tools/github.js.map +0 -1
- package/dist/mcp/tools/index.d.ts +0 -36
- package/dist/mcp/tools/index.js +0 -61
- package/dist/mcp/tools/index.js.map +0 -1
- package/dist/mcp/tools/onboard.d.ts +0 -10
- package/dist/mcp/tools/onboard.js +0 -30
- package/dist/mcp/tools/onboard.js.map +0 -1
- package/dist/mcp/tools/provider.d.ts +0 -16
- package/dist/mcp/tools/provider.js +0 -110
- package/dist/mcp/tools/provider.js.map +0 -1
- package/dist/mcp/tools/services.d.ts +0 -13
- package/dist/mcp/tools/services.js +0 -204
- package/dist/mcp/tools/services.js.map +0 -1
- package/dist/mcp/tools/snapshots.d.ts +0 -8
- package/dist/mcp/tools/snapshots.js +0 -37
- package/dist/mcp/tools/snapshots.js.map +0 -1
- package/dist/mcp/tools/terminal.d.ts +0 -4
- package/dist/mcp/tools/terminal.js +0 -38
- package/dist/mcp/tools/terminal.js.map +0 -1
- package/dist/tui/app.d.ts +0 -22
- package/dist/tui/app.js +0 -138
- package/dist/tui/app.js.map +0 -1
- package/dist/web/agent-info.d.ts +0 -82
- package/dist/web/agent-info.js +0 -775
- package/dist/web/agent-info.js.map +0 -1
- package/dist/web/client/assets/SymbolsNerdFontMono-Regular-DDncdh2F.ttf +0 -0
- package/dist/web/client/assets/code-editor-TE0sjFGO.js +0 -30
- package/dist/web/client/assets/context-graph-B9MnBpp6.js +0 -7
- package/dist/web/client/assets/core-DhEqZVGG.js +0 -1
- package/dist/web/client/assets/event-BK_86lmQ.js +0 -1
- package/dist/web/client/assets/index-BhDAhmA1.js +0 -1
- package/dist/web/client/assets/index-CSo__8A6.css +0 -1
- package/dist/web/client/assets/index-DAJvBqn9.js +0 -352
- package/dist/web/client/assets/nomoreide-favicon-Ds7Tgj9p.svg +0 -24
- package/dist/web/client/assets/system-process-table-DetWu0Gj.js +0 -1
- package/dist/web/client/assets/window-DlR023_X.js +0 -1
- package/dist/web/client/index.html +0 -44
- package/dist/web/dashboard.d.ts +0 -61
- package/dist/web/dashboard.js +0 -221
- package/dist/web/dashboard.js.map +0 -1
- package/dist/web/directories.d.ts +0 -27
- package/dist/web/directories.js +0 -81
- package/dist/web/directories.js.map +0 -1
- package/dist/web/http-utils.d.ts +0 -13
- package/dist/web/http-utils.js +0 -72
- package/dist/web/http-utils.js.map +0 -1
- package/dist/web/routes/agent-chat-routes.d.ts +0 -3
- package/dist/web/routes/agent-chat-routes.js +0 -186
- package/dist/web/routes/agent-chat-routes.js.map +0 -1
- package/dist/web/routes/agent-env-routes.d.ts +0 -9
- package/dist/web/routes/agent-env-routes.js +0 -86
- package/dist/web/routes/agent-env-routes.js.map +0 -1
- package/dist/web/routes/agent-profile-routes.d.ts +0 -8
- package/dist/web/routes/agent-profile-routes.js +0 -211
- package/dist/web/routes/agent-profile-routes.js.map +0 -1
- package/dist/web/routes/agent-registry-routes.d.ts +0 -2
- package/dist/web/routes/agent-registry-routes.js +0 -375
- package/dist/web/routes/agent-registry-routes.js.map +0 -1
- package/dist/web/routes/agent-routes.d.ts +0 -3
- package/dist/web/routes/agent-routes.js +0 -73
- package/dist/web/routes/agent-routes.js.map +0 -1
- package/dist/web/routes/agent-settings-routes.d.ts +0 -8
- package/dist/web/routes/agent-settings-routes.js +0 -67
- package/dist/web/routes/agent-settings-routes.js.map +0 -1
- package/dist/web/routes/context-library-routes.d.ts +0 -2
- package/dist/web/routes/context-library-routes.js +0 -139
- package/dist/web/routes/context-library-routes.js.map +0 -1
- package/dist/web/routes/context.d.ts +0 -73
- package/dist/web/routes/context.js +0 -48
- package/dist/web/routes/context.js.map +0 -1
- package/dist/web/routes/dashboard-routes.d.ts +0 -3
- package/dist/web/routes/dashboard-routes.js +0 -47
- package/dist/web/routes/dashboard-routes.js.map +0 -1
- package/dist/web/routes/database-routes.d.ts +0 -3
- package/dist/web/routes/database-routes.js +0 -341
- package/dist/web/routes/database-routes.js.map +0 -1
- package/dist/web/routes/docker-routes.d.ts +0 -7
- package/dist/web/routes/docker-routes.js +0 -122
- package/dist/web/routes/docker-routes.js.map +0 -1
- package/dist/web/routes/errors-routes.d.ts +0 -3
- package/dist/web/routes/errors-routes.js +0 -77
- package/dist/web/routes/errors-routes.js.map +0 -1
- package/dist/web/routes/extensions-routes.d.ts +0 -14
- package/dist/web/routes/extensions-routes.js +0 -21
- package/dist/web/routes/extensions-routes.js.map +0 -1
- package/dist/web/routes/git-routes.d.ts +0 -3
- package/dist/web/routes/git-routes.js +0 -598
- package/dist/web/routes/git-routes.js.map +0 -1
- package/dist/web/routes/github-context.d.ts +0 -11
- package/dist/web/routes/github-context.js +0 -34
- package/dist/web/routes/github-context.js.map +0 -1
- package/dist/web/routes/github-routes.d.ts +0 -2
- package/dist/web/routes/github-routes.js +0 -699
- package/dist/web/routes/github-routes.js.map +0 -1
- package/dist/web/routes/host-routes.d.ts +0 -2
- package/dist/web/routes/host-routes.js +0 -188
- package/dist/web/routes/host-routes.js.map +0 -1
- package/dist/web/routes/index.d.ts +0 -10
- package/dist/web/routes/index.js +0 -72
- package/dist/web/routes/index.js.map +0 -1
- package/dist/web/routes/jetbrains-import-routes.d.ts +0 -2
- package/dist/web/routes/jetbrains-import-routes.js +0 -121
- package/dist/web/routes/jetbrains-import-routes.js.map +0 -1
- package/dist/web/routes/log-sources-routes.d.ts +0 -6
- package/dist/web/routes/log-sources-routes.js +0 -102
- package/dist/web/routes/log-sources-routes.js.map +0 -1
- package/dist/web/routes/metrics-routes.d.ts +0 -3
- package/dist/web/routes/metrics-routes.js +0 -60
- package/dist/web/routes/metrics-routes.js.map +0 -1
- package/dist/web/routes/onboard-routes.d.ts +0 -9
- package/dist/web/routes/onboard-routes.js +0 -146
- package/dist/web/routes/onboard-routes.js.map +0 -1
- package/dist/web/routes/overview-routes.d.ts +0 -2
- package/dist/web/routes/overview-routes.js +0 -36
- package/dist/web/routes/overview-routes.js.map +0 -1
- package/dist/web/routes/provider-routes.d.ts +0 -2
- package/dist/web/routes/provider-routes.js +0 -558
- package/dist/web/routes/provider-routes.js.map +0 -1
- package/dist/web/routes/service-routes.d.ts +0 -3
- package/dist/web/routes/service-routes.js +0 -511
- package/dist/web/routes/service-routes.js.map +0 -1
- package/dist/web/routes/settings-routes.d.ts +0 -2
- package/dist/web/routes/settings-routes.js +0 -151
- package/dist/web/routes/settings-routes.js.map +0 -1
- package/dist/web/routes/shell-routes.d.ts +0 -22
- package/dist/web/routes/shell-routes.js +0 -75
- package/dist/web/routes/shell-routes.js.map +0 -1
- package/dist/web/routes/skills-routes.d.ts +0 -2
- package/dist/web/routes/skills-routes.js +0 -49
- package/dist/web/routes/skills-routes.js.map +0 -1
- package/dist/web/routes/snapshot-routes.d.ts +0 -8
- package/dist/web/routes/snapshot-routes.js +0 -194
- package/dist/web/routes/snapshot-routes.js.map +0 -1
- package/dist/web/routes/ssh-server-routes.d.ts +0 -10
- package/dist/web/routes/ssh-server-routes.js +0 -163
- package/dist/web/routes/ssh-server-routes.js.map +0 -1
- package/dist/web/routes/terminal-routes.d.ts +0 -7
- package/dist/web/routes/terminal-routes.js +0 -313
- package/dist/web/routes/terminal-routes.js.map +0 -1
- package/dist/web/routes/workflow-routes.d.ts +0 -8
- package/dist/web/routes/workflow-routes.js +0 -45
- package/dist/web/routes/workflow-routes.js.map +0 -1
- package/dist/web/routes/workflow-trigger-routes.d.ts +0 -9
- package/dist/web/routes/workflow-trigger-routes.js +0 -78
- package/dist/web/routes/workflow-trigger-routes.js.map +0 -1
- package/dist/web/server.d.ts +0 -31
- package/dist/web/server.js +0 -325
- package/dist/web/server.js.map +0 -1
- package/dist/web/service-tester.d.ts +0 -16
- package/dist/web/service-tester.js +0 -107
- package/dist/web/service-tester.js.map +0 -1
- package/dist/web/static-assets.d.ts +0 -9
- package/dist/web/static-assets.js +0 -77
- package/dist/web/static-assets.js.map +0 -1
- package/dist/web/usage-info.d.ts +0 -56
- package/dist/web/usage-info.js +0 -265
- package/dist/web/usage-info.js.map +0 -1
|
@@ -1,738 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { readDockerServiceLogs, readDockerServiceStatus, startDockerService, stopDockerService, } from "./docker-service-runner.js";
|
|
3
|
-
import { startHttpInspector, } from "./http-inspector.js";
|
|
4
|
-
import { getPortHolder, isPortAvailable } from "./port-utils.js";
|
|
5
|
-
import { readProcessTree } from "./process-tree.js";
|
|
6
|
-
import { resolveStartOrder } from "./service-graph.js";
|
|
7
|
-
import { isPidAlive, } from "./service-registry.js";
|
|
8
|
-
import { createSshCommand } from "./ssh-service-runner.js";
|
|
9
|
-
import { entriesFromLines, envFilePath, readEnvFile } from "./env-file.js";
|
|
10
|
-
export class PortConflictError extends Error {
|
|
11
|
-
code = "PORT_IN_USE";
|
|
12
|
-
service;
|
|
13
|
-
port;
|
|
14
|
-
holder;
|
|
15
|
-
constructor(service, port, holder) {
|
|
16
|
-
const owner = holder ? ` (held by pid ${holder.pid} — ${holder.command})` : "";
|
|
17
|
-
super(`Port ${port} is already in use for ${service}${owner}.`);
|
|
18
|
-
this.name = "PortConflictError";
|
|
19
|
-
this.service = service;
|
|
20
|
-
this.port = port;
|
|
21
|
-
this.holder = holder;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
export class ProcessManager {
|
|
25
|
-
runtimes = new Map();
|
|
26
|
-
configStore;
|
|
27
|
-
logStore;
|
|
28
|
-
stopTimeoutMs;
|
|
29
|
-
timelineStore;
|
|
30
|
-
registry;
|
|
31
|
-
pendingWrites = new Set();
|
|
32
|
-
constructor(options) {
|
|
33
|
-
this.configStore = options.configStore;
|
|
34
|
-
this.logStore = options.logStore;
|
|
35
|
-
this.stopTimeoutMs = options.stopTimeoutMs ?? 3000;
|
|
36
|
-
this.timelineStore = options.timelineStore;
|
|
37
|
-
this.registry = options.registry;
|
|
38
|
-
}
|
|
39
|
-
async startService(name, options = {}) {
|
|
40
|
-
const service = await this.getService(name);
|
|
41
|
-
const existing = this.runtimes.get(name);
|
|
42
|
-
if (existing?.status.state === "running") {
|
|
43
|
-
return { ...existing.status };
|
|
44
|
-
}
|
|
45
|
-
const kind = resolveKind(service);
|
|
46
|
-
if (kind === "docker-compose") {
|
|
47
|
-
return this.startDockerComposeService(name, service);
|
|
48
|
-
}
|
|
49
|
-
// Another session may already be running this exact service. Adopt its
|
|
50
|
-
// status instead of spawning a duplicate — this also covers portless
|
|
51
|
-
// services, where the port check below cannot detect the conflict.
|
|
52
|
-
const tracked = this.registry?.get(name);
|
|
53
|
-
if (tracked) {
|
|
54
|
-
return registryEntryToStatus(tracked);
|
|
55
|
-
}
|
|
56
|
-
if (service.port && !(await isPortAvailable(service.port))) {
|
|
57
|
-
const holder = await getPortHolder(service.port);
|
|
58
|
-
if (options.killHolder && holder) {
|
|
59
|
-
await killHolder(holder);
|
|
60
|
-
if (!(await waitForPortFree(service.port, 3000))) {
|
|
61
|
-
throw new PortConflictError(name, service.port, holder);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
throw new PortConflictError(name, service.port, holder);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const child = await spawnService(name, service, kind);
|
|
69
|
-
const runtime = {
|
|
70
|
-
child,
|
|
71
|
-
stopping: false,
|
|
72
|
-
status: {
|
|
73
|
-
name,
|
|
74
|
-
state: "running",
|
|
75
|
-
kind,
|
|
76
|
-
host: kind === "ssh" ? service.host : undefined,
|
|
77
|
-
pid: child.pid,
|
|
78
|
-
startedAt: new Date().toISOString(),
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
|
-
this.runtimes.set(name, runtime);
|
|
82
|
-
if (child.pid) {
|
|
83
|
-
this.registry?.record({
|
|
84
|
-
name,
|
|
85
|
-
pid: child.pid,
|
|
86
|
-
pgid: child.pid, // detached spawn → child.pid is the process-group leader
|
|
87
|
-
port: service.port,
|
|
88
|
-
kind,
|
|
89
|
-
host: kind === "ssh" ? service.host : undefined,
|
|
90
|
-
startedAt: runtime.status.startedAt ?? new Date().toISOString(),
|
|
91
|
-
ownerPid: process.pid,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
this.appendTimeline({
|
|
95
|
-
kind: "service.lifecycle",
|
|
96
|
-
service: name,
|
|
97
|
-
severity: "info",
|
|
98
|
-
title: `${name} started`,
|
|
99
|
-
data: {
|
|
100
|
-
pid: child.pid,
|
|
101
|
-
},
|
|
102
|
-
});
|
|
103
|
-
this.captureStream(name, "stdout", child.stdout);
|
|
104
|
-
this.captureStream(name, "stderr", child.stderr);
|
|
105
|
-
child.once("exit", (exitCode, signal) => {
|
|
106
|
-
const nextState = runtime.stopping ? "stopped" : "exited";
|
|
107
|
-
runtime.status = {
|
|
108
|
-
...runtime.status,
|
|
109
|
-
state: nextState,
|
|
110
|
-
exitedAt: new Date().toISOString(),
|
|
111
|
-
exitCode,
|
|
112
|
-
signal,
|
|
113
|
-
};
|
|
114
|
-
runtime.child = undefined;
|
|
115
|
-
this.registry?.remove(name);
|
|
116
|
-
void this.stopInspector(runtime);
|
|
117
|
-
this.appendTimeline({
|
|
118
|
-
kind: "service.lifecycle",
|
|
119
|
-
service: name,
|
|
120
|
-
severity: nextState === "exited" && exitCode ? "error" : "info",
|
|
121
|
-
title: `${name} ${nextState}`,
|
|
122
|
-
data: {
|
|
123
|
-
exitCode,
|
|
124
|
-
signal,
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
child.once("error", (error) => {
|
|
129
|
-
runtime.status = {
|
|
130
|
-
...runtime.status,
|
|
131
|
-
state: "exited",
|
|
132
|
-
exitedAt: new Date().toISOString(),
|
|
133
|
-
exitCode: 1,
|
|
134
|
-
signal: null,
|
|
135
|
-
};
|
|
136
|
-
this.registry?.remove(name);
|
|
137
|
-
this.trackWrite(this.logStore.append(name, "stderr", error.message));
|
|
138
|
-
this.appendTimeline({
|
|
139
|
-
kind: "service.lifecycle",
|
|
140
|
-
service: name,
|
|
141
|
-
severity: "error",
|
|
142
|
-
title: `${name} failed`,
|
|
143
|
-
detail: error.message,
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
return { ...runtime.status };
|
|
147
|
-
}
|
|
148
|
-
async stopService(name) {
|
|
149
|
-
const runtime = this.runtimes.get(name);
|
|
150
|
-
if (runtime?.status.kind === "docker-compose" && runtime.status.state === "running") {
|
|
151
|
-
return this.stopDockerComposeService(name, runtime);
|
|
152
|
-
}
|
|
153
|
-
if (!runtime?.child || runtime.status.state !== "running") {
|
|
154
|
-
// No live child in this session — a sibling session may own it. If the
|
|
155
|
-
// registry has a live entry, signal its process group to stop it.
|
|
156
|
-
const tracked = this.registry?.get(name);
|
|
157
|
-
if (tracked) {
|
|
158
|
-
await stopByPid(tracked.pid, tracked.pgid, this.stopTimeoutMs);
|
|
159
|
-
this.registry?.remove(name);
|
|
160
|
-
}
|
|
161
|
-
const stopped = { name, state: "stopped" };
|
|
162
|
-
this.runtimes.set(name, { status: stopped, stopping: false });
|
|
163
|
-
this.appendTimeline({
|
|
164
|
-
kind: "service.lifecycle",
|
|
165
|
-
service: name,
|
|
166
|
-
severity: "info",
|
|
167
|
-
title: `${name} stopped`,
|
|
168
|
-
});
|
|
169
|
-
return stopped;
|
|
170
|
-
}
|
|
171
|
-
runtime.stopping = true;
|
|
172
|
-
await stopChild(runtime.child, this.stopTimeoutMs);
|
|
173
|
-
const stopped = {
|
|
174
|
-
...runtime.status,
|
|
175
|
-
state: "stopped",
|
|
176
|
-
exitedAt: runtime.status.exitedAt ?? new Date().toISOString(),
|
|
177
|
-
};
|
|
178
|
-
runtime.status = stopped;
|
|
179
|
-
runtime.child = undefined;
|
|
180
|
-
this.appendTimeline({
|
|
181
|
-
kind: "service.lifecycle",
|
|
182
|
-
service: name,
|
|
183
|
-
severity: "info",
|
|
184
|
-
title: `${name} stopped`,
|
|
185
|
-
});
|
|
186
|
-
return { ...stopped };
|
|
187
|
-
}
|
|
188
|
-
async restartService(name, options = {}) {
|
|
189
|
-
await this.stopService(name);
|
|
190
|
-
return this.startService(name, options);
|
|
191
|
-
}
|
|
192
|
-
async setInspectorEnabled(name, enabled) {
|
|
193
|
-
const runtime = this.runtimes.get(name);
|
|
194
|
-
if (!runtime) {
|
|
195
|
-
throw new Error(`Service "${name}" is not running.`);
|
|
196
|
-
}
|
|
197
|
-
runtime.inspectorEnabled = enabled;
|
|
198
|
-
if (enabled) {
|
|
199
|
-
await this.maybeStartInspector(name);
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
await this.stopInspector(runtime);
|
|
203
|
-
}
|
|
204
|
-
runtime.status = {
|
|
205
|
-
...runtime.status,
|
|
206
|
-
inspector: this.inspectorStatus(runtime),
|
|
207
|
-
};
|
|
208
|
-
return { ...runtime.status };
|
|
209
|
-
}
|
|
210
|
-
async maybeStartInspector(name) {
|
|
211
|
-
const runtime = this.runtimes.get(name);
|
|
212
|
-
if (!runtime?.inspectorEnabled || runtime.inspectorHandle)
|
|
213
|
-
return;
|
|
214
|
-
const upstreamPort = portFromUrl(runtime.status.url);
|
|
215
|
-
if (!upstreamPort)
|
|
216
|
-
return;
|
|
217
|
-
const handle = await startHttpInspector({
|
|
218
|
-
upstreamPort,
|
|
219
|
-
onEvent: (event) => this.recordInspectorEvent(name, event),
|
|
220
|
-
});
|
|
221
|
-
runtime.inspectorHandle = handle;
|
|
222
|
-
runtime.status = {
|
|
223
|
-
...runtime.status,
|
|
224
|
-
inspector: { enabled: true, port: handle.port, upstreamPort },
|
|
225
|
-
};
|
|
226
|
-
this.appendTimeline({
|
|
227
|
-
kind: "service.lifecycle",
|
|
228
|
-
service: name,
|
|
229
|
-
severity: "info",
|
|
230
|
-
title: `${name} HTTP inspector on :${handle.port}`,
|
|
231
|
-
detail: `Proxying to upstream :${upstreamPort}`,
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
async stopInspector(runtime) {
|
|
235
|
-
if (!runtime.inspectorHandle)
|
|
236
|
-
return;
|
|
237
|
-
const handle = runtime.inspectorHandle;
|
|
238
|
-
runtime.inspectorHandle = undefined;
|
|
239
|
-
await handle.stop();
|
|
240
|
-
}
|
|
241
|
-
inspectorStatus(runtime) {
|
|
242
|
-
if (!runtime.inspectorEnabled)
|
|
243
|
-
return undefined;
|
|
244
|
-
return {
|
|
245
|
-
enabled: true,
|
|
246
|
-
port: runtime.inspectorHandle?.port,
|
|
247
|
-
upstreamPort: portFromUrl(runtime.status.url),
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
recordInspectorEvent(name, event) {
|
|
251
|
-
const severity = event.status >= 500 ? "error" : event.status >= 400 ? "warning" : "info";
|
|
252
|
-
this.appendTimeline({
|
|
253
|
-
kind: "service.http",
|
|
254
|
-
service: name,
|
|
255
|
-
severity,
|
|
256
|
-
title: `${event.method} ${event.path} → ${event.status}`,
|
|
257
|
-
detail: `${event.durationMs} ms`,
|
|
258
|
-
timestamp: event.startedAt,
|
|
259
|
-
data: {
|
|
260
|
-
id: event.id,
|
|
261
|
-
method: event.method,
|
|
262
|
-
path: event.path,
|
|
263
|
-
status: event.status,
|
|
264
|
-
durationMs: event.durationMs,
|
|
265
|
-
reqBytes: event.reqBytes,
|
|
266
|
-
resBytes: event.resBytes,
|
|
267
|
-
},
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
async startBundle(name) {
|
|
271
|
-
const bundle = await this.getBundle(name);
|
|
272
|
-
const config = await this.configStore.load();
|
|
273
|
-
// Topologically order the bundle (and any transitive deps it declares) so
|
|
274
|
-
// dependencies come up before dependents. Throws DependencyCycleError on a
|
|
275
|
-
// cycle, surfacing a clear message instead of a half-started bundle.
|
|
276
|
-
const order = resolveStartOrder(config.services, bundle.services);
|
|
277
|
-
const byName = new Map(config.services.map((service) => [service.name, service]));
|
|
278
|
-
const statuses = [];
|
|
279
|
-
for (const serviceName of order) {
|
|
280
|
-
// Each declared dependency precedes this service in `order` and is thus
|
|
281
|
-
// already started; wait for it to report ready before the dependent.
|
|
282
|
-
for (const dep of byName.get(serviceName)?.dependsOn ?? []) {
|
|
283
|
-
if (byName.has(dep))
|
|
284
|
-
await this.waitForServiceReady(dep);
|
|
285
|
-
}
|
|
286
|
-
statuses.push(await this.startService(serviceName));
|
|
287
|
-
}
|
|
288
|
-
return statuses;
|
|
289
|
-
}
|
|
290
|
-
async stopBundle(name) {
|
|
291
|
-
const bundle = await this.getBundle(name);
|
|
292
|
-
const order = await this.safeStopOrder(bundle);
|
|
293
|
-
const statuses = [];
|
|
294
|
-
// Reverse dependency order: stop dependents before the services they need.
|
|
295
|
-
for (const serviceName of order.reverse()) {
|
|
296
|
-
statuses.push(await this.stopService(serviceName));
|
|
297
|
-
}
|
|
298
|
-
return statuses;
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Stop order scoped to the bundle's own members, in dependency order so we
|
|
302
|
-
* can reverse it. Falls back to declaration order if a cycle makes a topo
|
|
303
|
-
* sort impossible — stopping must never throw the way a start can.
|
|
304
|
-
*/
|
|
305
|
-
async safeStopOrder(bundle) {
|
|
306
|
-
try {
|
|
307
|
-
const config = await this.configStore.load();
|
|
308
|
-
const resolved = resolveStartOrder(config.services, bundle.services);
|
|
309
|
-
const inBundle = new Set(bundle.services);
|
|
310
|
-
return resolved.filter((serviceName) => inBundle.has(serviceName));
|
|
311
|
-
}
|
|
312
|
-
catch {
|
|
313
|
-
return bundle.services.slice();
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Wait until a dependency looks ready before starting services that depend on
|
|
318
|
-
* it. A service with a port is "ready" once that port is bound; portless
|
|
319
|
-
* services have no probe, so we return immediately. Times out (warning, not
|
|
320
|
-
* error) so a slow/never-binding dependency can't wedge a bundle start.
|
|
321
|
-
*/
|
|
322
|
-
async waitForServiceReady(name, timeoutMs = 15000) {
|
|
323
|
-
const service = await this.getService(name).catch(() => undefined);
|
|
324
|
-
if (!service?.port)
|
|
325
|
-
return;
|
|
326
|
-
const deadline = Date.now() + timeoutMs;
|
|
327
|
-
while (Date.now() < deadline) {
|
|
328
|
-
if (this.runtimes.get(name)?.status.state === "exited")
|
|
329
|
-
return;
|
|
330
|
-
if (!(await isPortAvailable(service.port)))
|
|
331
|
-
return; // port bound → ready
|
|
332
|
-
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
333
|
-
}
|
|
334
|
-
this.appendTimeline({
|
|
335
|
-
kind: "service.health",
|
|
336
|
-
service: name,
|
|
337
|
-
severity: "warning",
|
|
338
|
-
title: `${name} did not become ready in ${Math.round(timeoutMs / 1000)}s`,
|
|
339
|
-
detail: `Port ${service.port} never came up; starting dependents anyway.`,
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
async restartBundle(name) {
|
|
343
|
-
await this.stopBundle(name);
|
|
344
|
-
return this.startBundle(name);
|
|
345
|
-
}
|
|
346
|
-
async stopAll() {
|
|
347
|
-
await Promise.all([...this.runtimes.keys()].map((name) => this.stopService(name)));
|
|
348
|
-
await this.flushWrites();
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Resolves once every log/timeline write started so far has settled. Exit
|
|
352
|
-
* handlers append after the child is gone, so without this a caller that
|
|
353
|
-
* tears down the log directory right after `stopAll()` races those writes.
|
|
354
|
-
*/
|
|
355
|
-
async flushWrites() {
|
|
356
|
-
while (this.pendingWrites.size > 0) {
|
|
357
|
-
await Promise.all([...this.pendingWrites]);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
killAllSync(signal = "SIGTERM") {
|
|
361
|
-
for (const runtime of this.runtimes.values()) {
|
|
362
|
-
if (!runtime.child || runtime.child.exitCode !== null)
|
|
363
|
-
continue;
|
|
364
|
-
signalProcessTree(runtime.child, signal);
|
|
365
|
-
}
|
|
366
|
-
// Drop this session's entries synchronously; the async exit handlers above
|
|
367
|
-
// may not run before the host process exits.
|
|
368
|
-
this.registry?.removeOwnedBy(process.pid);
|
|
369
|
-
}
|
|
370
|
-
installShutdownHandlers() {
|
|
371
|
-
let firing = false;
|
|
372
|
-
const handle = (signal) => () => {
|
|
373
|
-
if (firing)
|
|
374
|
-
return;
|
|
375
|
-
firing = true;
|
|
376
|
-
this.killAllSync("SIGTERM");
|
|
377
|
-
// Re-raise the signal with default behavior so the host exits.
|
|
378
|
-
setTimeout(() => process.kill(process.pid, signal), 50);
|
|
379
|
-
};
|
|
380
|
-
const onExit = () => this.killAllSync("SIGTERM");
|
|
381
|
-
const sigint = handle("SIGINT");
|
|
382
|
-
const sigterm = handle("SIGTERM");
|
|
383
|
-
const sighup = handle("SIGHUP");
|
|
384
|
-
process.once("SIGINT", sigint);
|
|
385
|
-
process.once("SIGTERM", sigterm);
|
|
386
|
-
process.once("SIGHUP", sighup);
|
|
387
|
-
process.once("exit", onExit);
|
|
388
|
-
return () => {
|
|
389
|
-
process.removeListener("SIGINT", sigint);
|
|
390
|
-
process.removeListener("SIGTERM", sigterm);
|
|
391
|
-
process.removeListener("SIGHUP", sighup);
|
|
392
|
-
process.removeListener("exit", onExit);
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
status() {
|
|
396
|
-
const services = {};
|
|
397
|
-
for (const [name, runtime] of this.runtimes.entries()) {
|
|
398
|
-
services[name] = { ...runtime.status };
|
|
399
|
-
}
|
|
400
|
-
this.mergeRegistry(services);
|
|
401
|
-
return { services };
|
|
402
|
-
}
|
|
403
|
-
async statusWithResources() {
|
|
404
|
-
const services = {};
|
|
405
|
-
for (const [name, runtime] of this.runtimes.entries()) {
|
|
406
|
-
const status = { ...runtime.status };
|
|
407
|
-
if (status.pid && status.state === "running") {
|
|
408
|
-
status.processTree = await readProcessTree(status.pid);
|
|
409
|
-
}
|
|
410
|
-
status.inspector = this.inspectorStatus(runtime);
|
|
411
|
-
services[name] = status;
|
|
412
|
-
}
|
|
413
|
-
this.mergeRegistry(services);
|
|
414
|
-
for (const status of Object.values(services)) {
|
|
415
|
-
if (status.pid && status.state === "running" && !status.processTree) {
|
|
416
|
-
status.processTree = await readProcessTree(status.pid);
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
return { services };
|
|
420
|
-
}
|
|
421
|
-
/**
|
|
422
|
-
* Fold in services started by sibling sessions. A registry entry wins only
|
|
423
|
-
* when this session has no running view of that service, so a locally-owned
|
|
424
|
-
* "running" status is never overwritten by the shared snapshot.
|
|
425
|
-
*/
|
|
426
|
-
mergeRegistry(services) {
|
|
427
|
-
if (!this.registry)
|
|
428
|
-
return;
|
|
429
|
-
for (const entry of this.registry.list()) {
|
|
430
|
-
const local = services[entry.name];
|
|
431
|
-
if (!local || local.state !== "running") {
|
|
432
|
-
services[entry.name] = registryEntryToStatus(entry);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
async startDockerComposeService(name, service) {
|
|
437
|
-
const target = toDockerTarget(name, service);
|
|
438
|
-
const info = await startDockerService(target);
|
|
439
|
-
const status = {
|
|
440
|
-
name,
|
|
441
|
-
state: "running",
|
|
442
|
-
kind: "docker-compose",
|
|
443
|
-
startedAt: new Date().toISOString(),
|
|
444
|
-
containerId: info.containerId,
|
|
445
|
-
};
|
|
446
|
-
this.runtimes.set(name, { status, stopping: false });
|
|
447
|
-
this.appendTimeline({
|
|
448
|
-
kind: "service.lifecycle",
|
|
449
|
-
service: name,
|
|
450
|
-
severity: "info",
|
|
451
|
-
title: `${name} started`,
|
|
452
|
-
data: { containerId: info.containerId },
|
|
453
|
-
});
|
|
454
|
-
return { ...status };
|
|
455
|
-
}
|
|
456
|
-
async stopDockerComposeService(name, runtime) {
|
|
457
|
-
const service = await this.getService(name);
|
|
458
|
-
runtime.stopping = true;
|
|
459
|
-
await stopDockerService(toDockerTarget(name, service));
|
|
460
|
-
const stopped = {
|
|
461
|
-
...runtime.status,
|
|
462
|
-
state: "stopped",
|
|
463
|
-
exitedAt: new Date().toISOString(),
|
|
464
|
-
};
|
|
465
|
-
runtime.status = stopped;
|
|
466
|
-
this.appendTimeline({
|
|
467
|
-
kind: "service.lifecycle",
|
|
468
|
-
service: name,
|
|
469
|
-
severity: "info",
|
|
470
|
-
title: `${name} stopped`,
|
|
471
|
-
});
|
|
472
|
-
return { ...stopped };
|
|
473
|
-
}
|
|
474
|
-
async readDockerServiceLogs(name, tail = 120) {
|
|
475
|
-
const service = await this.getService(name);
|
|
476
|
-
if (resolveKind(service) !== "docker-compose") {
|
|
477
|
-
throw new Error(`Service "${name}" is not a docker-compose service.`);
|
|
478
|
-
}
|
|
479
|
-
return readDockerServiceLogs(toDockerTarget(name, service), tail);
|
|
480
|
-
}
|
|
481
|
-
async readDockerServiceStatus(name) {
|
|
482
|
-
const service = await this.getService(name);
|
|
483
|
-
if (resolveKind(service) !== "docker-compose") {
|
|
484
|
-
throw new Error(`Service "${name}" is not a docker-compose service.`);
|
|
485
|
-
}
|
|
486
|
-
return readDockerServiceStatus(toDockerTarget(name, service));
|
|
487
|
-
}
|
|
488
|
-
async getService(name) {
|
|
489
|
-
const config = await this.configStore.load();
|
|
490
|
-
const service = config.services.find((item) => item.name === name);
|
|
491
|
-
if (!service) {
|
|
492
|
-
throw new Error(`Service "${name}" is not registered.`);
|
|
493
|
-
}
|
|
494
|
-
return service;
|
|
495
|
-
}
|
|
496
|
-
async getBundle(name) {
|
|
497
|
-
const config = await this.configStore.load();
|
|
498
|
-
const bundle = config.bundles.find((item) => item.name === name);
|
|
499
|
-
if (!bundle) {
|
|
500
|
-
throw new Error(`Bundle "${name}" is not registered.`);
|
|
501
|
-
}
|
|
502
|
-
return bundle;
|
|
503
|
-
}
|
|
504
|
-
captureStream(service, stream, readable) {
|
|
505
|
-
if (!readable) {
|
|
506
|
-
return;
|
|
507
|
-
}
|
|
508
|
-
let buffer = "";
|
|
509
|
-
readable.on("data", (chunk) => {
|
|
510
|
-
buffer += chunk.toString();
|
|
511
|
-
const lines = buffer.split(/\r?\n/);
|
|
512
|
-
buffer = lines.pop() ?? "";
|
|
513
|
-
for (const line of lines) {
|
|
514
|
-
if (line.length > 0) {
|
|
515
|
-
const url = localUrlFromLine(line);
|
|
516
|
-
if (url) {
|
|
517
|
-
const runtime = this.runtimes.get(service);
|
|
518
|
-
if (runtime) {
|
|
519
|
-
runtime.status = { ...runtime.status, url };
|
|
520
|
-
this.registry?.update(service, { url });
|
|
521
|
-
void this.maybeStartInspector(service);
|
|
522
|
-
}
|
|
523
|
-
this.appendTimeline({
|
|
524
|
-
kind: "service.port",
|
|
525
|
-
service,
|
|
526
|
-
severity: "info",
|
|
527
|
-
title: `${service} reported ${url}`,
|
|
528
|
-
detail: url,
|
|
529
|
-
});
|
|
530
|
-
}
|
|
531
|
-
this.trackWrite(this.logStore.append(service, stream, line));
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
});
|
|
535
|
-
readable.on("end", () => {
|
|
536
|
-
if (buffer.length > 0) {
|
|
537
|
-
this.trackWrite(this.logStore.append(service, stream, buffer));
|
|
538
|
-
buffer = "";
|
|
539
|
-
}
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
appendTimeline(event) {
|
|
543
|
-
if (!this.timelineStore)
|
|
544
|
-
return;
|
|
545
|
-
this.trackWrite(this.timelineStore.append(event));
|
|
546
|
-
}
|
|
547
|
-
/**
|
|
548
|
-
* Register a fire-and-forget log/timeline write so `flushWrites()` can wait
|
|
549
|
-
* for it. These are telemetry about an operation, not the operation itself,
|
|
550
|
-
* so a failed write is dropped rather than escalated into an unhandled
|
|
551
|
-
* rejection that would take down the daemon (or fail an unrelated test).
|
|
552
|
-
*/
|
|
553
|
-
trackWrite(write) {
|
|
554
|
-
const pending = write.then(() => undefined, () => undefined);
|
|
555
|
-
this.pendingWrites.add(pending);
|
|
556
|
-
void pending.then(() => this.pendingWrites.delete(pending));
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
function resolveKind(service) {
|
|
560
|
-
return service.kind ?? "local";
|
|
561
|
-
}
|
|
562
|
-
function registryEntryToStatus(entry) {
|
|
563
|
-
return {
|
|
564
|
-
name: entry.name,
|
|
565
|
-
state: "running",
|
|
566
|
-
kind: entry.kind,
|
|
567
|
-
pid: entry.pid,
|
|
568
|
-
url: entry.url,
|
|
569
|
-
host: entry.host,
|
|
570
|
-
startedAt: entry.startedAt,
|
|
571
|
-
};
|
|
572
|
-
}
|
|
573
|
-
/**
|
|
574
|
-
* Stop a process by pid when we hold no ChildProcess handle for it (it was
|
|
575
|
-
* spawned by another session). Signals the whole process group, then escalates
|
|
576
|
-
* to SIGKILL if it has not exited within the timeout.
|
|
577
|
-
*/
|
|
578
|
-
async function stopByPid(pid, pgid, timeoutMs) {
|
|
579
|
-
signalPid(pid, pgid, "SIGTERM");
|
|
580
|
-
const deadline = Date.now() + timeoutMs;
|
|
581
|
-
while (Date.now() < deadline) {
|
|
582
|
-
if (!isPidAlive(pid))
|
|
583
|
-
return;
|
|
584
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
585
|
-
}
|
|
586
|
-
signalPid(pid, pgid, "SIGKILL");
|
|
587
|
-
}
|
|
588
|
-
function signalPid(pid, pgid, signal) {
|
|
589
|
-
const group = pgid ?? pid;
|
|
590
|
-
try {
|
|
591
|
-
// Negative pid signals the whole process group (detached spawn → pgid===pid).
|
|
592
|
-
process.kill(-group, signal);
|
|
593
|
-
}
|
|
594
|
-
catch (error) {
|
|
595
|
-
if (error.code === "ESRCH")
|
|
596
|
-
return;
|
|
597
|
-
try {
|
|
598
|
-
process.kill(pid, signal);
|
|
599
|
-
}
|
|
600
|
-
catch {
|
|
601
|
-
// ignore
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
function toDockerTarget(name, service) {
|
|
606
|
-
if (!service.cwd || !service.composeService) {
|
|
607
|
-
throw new Error(`Service "${name}" is missing docker-compose cwd or composeService.`);
|
|
608
|
-
}
|
|
609
|
-
return {
|
|
610
|
-
cwd: service.cwd,
|
|
611
|
-
composeFile: service.composeFile,
|
|
612
|
-
composeService: service.composeService,
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
async function spawnService(name, service, kind) {
|
|
616
|
-
if (kind === "ssh") {
|
|
617
|
-
if (!service.host || !service.cwd || !service.command) {
|
|
618
|
-
throw new Error(`Service "${name}" is missing ssh host, cwd, or command.`);
|
|
619
|
-
}
|
|
620
|
-
const [bin, args] = createSshCommand({
|
|
621
|
-
host: service.host,
|
|
622
|
-
cwd: service.cwd,
|
|
623
|
-
command: service.command,
|
|
624
|
-
env: service.env,
|
|
625
|
-
});
|
|
626
|
-
return spawn(bin, args, {
|
|
627
|
-
env: { ...process.env },
|
|
628
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
629
|
-
detached: true,
|
|
630
|
-
});
|
|
631
|
-
}
|
|
632
|
-
if (!service.command || !service.cwd) {
|
|
633
|
-
throw new Error(`Service "${name}" is missing command or cwd.`);
|
|
634
|
-
}
|
|
635
|
-
const envFile = await readEnvFile(envFilePath(service.cwd));
|
|
636
|
-
const fileEnv = envFile.exists
|
|
637
|
-
? Object.fromEntries(entriesFromLines(envFile.lines).map((entry) => [entry.key, entry.value]))
|
|
638
|
-
: {};
|
|
639
|
-
const directArgs = service.args;
|
|
640
|
-
return spawn(service.command, directArgs ?? [], {
|
|
641
|
-
cwd: service.cwd,
|
|
642
|
-
// Load the conventional .env next to the service, while allowing values
|
|
643
|
-
// configured explicitly in NoMoreIDE to override it.
|
|
644
|
-
env: { ...process.env, ...fileEnv, ...service.env },
|
|
645
|
-
shell: directArgs === undefined,
|
|
646
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
647
|
-
detached: true,
|
|
648
|
-
});
|
|
649
|
-
}
|
|
650
|
-
function localUrlFromLine(line) {
|
|
651
|
-
return line.match(/https?:\/\/(?:localhost|127\.0\.0\.1):\d+\/?/)?.[0];
|
|
652
|
-
}
|
|
653
|
-
function portFromUrl(url) {
|
|
654
|
-
if (!url)
|
|
655
|
-
return undefined;
|
|
656
|
-
const match = url.match(/:(\d+)/);
|
|
657
|
-
return match ? Number(match[1]) : undefined;
|
|
658
|
-
}
|
|
659
|
-
async function stopChild(child, timeoutMs) {
|
|
660
|
-
if (child.exitCode !== null || child.signalCode !== null) {
|
|
661
|
-
return;
|
|
662
|
-
}
|
|
663
|
-
await new Promise((resolve) => {
|
|
664
|
-
let resolved = false;
|
|
665
|
-
const finish = () => {
|
|
666
|
-
if (!resolved) {
|
|
667
|
-
resolved = true;
|
|
668
|
-
clearTimeout(timer);
|
|
669
|
-
resolve();
|
|
670
|
-
}
|
|
671
|
-
};
|
|
672
|
-
const timer = setTimeout(() => {
|
|
673
|
-
signalProcessTree(child, "SIGKILL");
|
|
674
|
-
finish();
|
|
675
|
-
}, timeoutMs);
|
|
676
|
-
child.once("exit", finish);
|
|
677
|
-
signalProcessTree(child, "SIGTERM");
|
|
678
|
-
});
|
|
679
|
-
}
|
|
680
|
-
async function killHolder(holder) {
|
|
681
|
-
const target = holder.pgid ? -holder.pgid : holder.pid;
|
|
682
|
-
try {
|
|
683
|
-
process.kill(target, "SIGTERM");
|
|
684
|
-
}
|
|
685
|
-
catch (error) {
|
|
686
|
-
const code = error.code;
|
|
687
|
-
if (code !== "ESRCH")
|
|
688
|
-
throw error;
|
|
689
|
-
}
|
|
690
|
-
// Give the process a moment to exit cleanly before escalating.
|
|
691
|
-
for (let i = 0; i < 20; i += 1) {
|
|
692
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
693
|
-
try {
|
|
694
|
-
process.kill(holder.pid, 0);
|
|
695
|
-
}
|
|
696
|
-
catch {
|
|
697
|
-
return;
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
try {
|
|
701
|
-
process.kill(target, "SIGKILL");
|
|
702
|
-
}
|
|
703
|
-
catch {
|
|
704
|
-
// ignore
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
async function waitForPortFree(port, timeoutMs) {
|
|
708
|
-
const deadline = Date.now() + timeoutMs;
|
|
709
|
-
while (Date.now() < deadline) {
|
|
710
|
-
if (await isPortAvailable(port))
|
|
711
|
-
return true;
|
|
712
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
713
|
-
}
|
|
714
|
-
return isPortAvailable(port);
|
|
715
|
-
}
|
|
716
|
-
function signalProcessTree(child, signal) {
|
|
717
|
-
const pid = child.pid;
|
|
718
|
-
if (!pid)
|
|
719
|
-
return;
|
|
720
|
-
try {
|
|
721
|
-
// Negative PID = signal the whole process group whose leader is `pid`.
|
|
722
|
-
// The service was spawned with detached: true so child.pid === PGID.
|
|
723
|
-
process.kill(-pid, signal);
|
|
724
|
-
}
|
|
725
|
-
catch (error) {
|
|
726
|
-
const code = error.code;
|
|
727
|
-
if (code === "ESRCH")
|
|
728
|
-
return;
|
|
729
|
-
// Fall back to signaling the direct child if the group is gone.
|
|
730
|
-
try {
|
|
731
|
-
child.kill(signal);
|
|
732
|
-
}
|
|
733
|
-
catch {
|
|
734
|
-
// ignore
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
//# sourceMappingURL=process-manager.js.map
|