@pellux/goodvibes-tui 0.18.10 → 0.18.12
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/CHANGELOG.md +56 -0
- package/README.md +1 -1
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +2 -2
- package/src/core/conversation-rendering.ts +2 -2
- package/src/core/conversation.ts +5 -5
- package/src/core/orchestrator.ts +13 -11
- package/src/daemon/facade-composition.ts +8 -8
- package/src/daemon/facade.ts +8 -8
- package/src/daemon/types.ts +3 -3
- package/src/input/command-registry.ts +3 -3
- package/src/input/commands/session-content.ts +2 -2
- package/src/input/commands/session-workflow.ts +1 -1
- package/src/input/handler-feed.ts +1 -1
- package/src/input/session-picker-modal.ts +1 -1
- package/src/panels/builtin/agent.ts +1 -0
- package/src/panels/builtin/operations.ts +1 -0
- package/src/panels/builtin/session.ts +1 -1
- package/src/panels/builtin/shared.ts +2 -2
- package/src/panels/context-visualizer-panel.ts +4 -1
- package/src/panels/provider-health-domains.ts +5 -1
- package/src/panels/provider-health-panel.ts +5 -1
- package/src/panels/session-browser-panel.ts +1 -1
- package/src/panels/token-budget-panel.ts +6 -2
- package/src/plugins/loader.ts +2 -2
- package/src/runtime/bootstrap-command-context.ts +3 -3
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +2 -2
- package/src/runtime/bootstrap-hook-bridge.ts +1 -1
- package/src/runtime/bootstrap-shell.ts +1 -1
- package/src/runtime/bootstrap.ts +5 -4
- package/src/runtime/services.ts +2 -2
- package/src/runtime/ui-read-models-observability-security.ts +2 -2
- package/src/runtime/ui-read-models-observability-system.ts +1 -1
- package/src/runtime/ui-service-queries.ts +1 -1
- package/src/tools/index.ts +1 -1
- package/src/version.ts +1 -1
- package/src/acp/connection.ts +0 -447
- package/src/acp/index.ts +0 -7
- package/src/acp/manager.ts +0 -1
- package/src/adapters/bluebubbles/index.ts +0 -127
- package/src/adapters/discord/index.ts +0 -297
- package/src/adapters/github/index.ts +0 -73
- package/src/adapters/google-chat/index.ts +0 -119
- package/src/adapters/imessage/index.ts +0 -92
- package/src/adapters/index.ts +0 -15
- package/src/adapters/matrix/index.ts +0 -116
- package/src/adapters/mattermost/index.ts +0 -151
- package/src/adapters/msteams/index.ts +0 -180
- package/src/adapters/ntfy/index.ts +0 -118
- package/src/adapters/signal/index.ts +0 -92
- package/src/adapters/slack/index.ts +0 -323
- package/src/adapters/telegram/index.ts +0 -160
- package/src/adapters/types.ts +0 -97
- package/src/adapters/webhook/index.ts +0 -178
- package/src/adapters/whatsapp/index.ts +0 -135
- package/src/agents/message-bus-core.ts +0 -312
- package/src/agents/message-bus.ts +0 -2
- package/src/agents/orchestrator-prompts.ts +0 -351
- package/src/agents/orchestrator-runner.ts +0 -668
- package/src/agents/orchestrator.ts +0 -438
- package/src/agents/session.ts +0 -108
- package/src/agents/worktree.ts +0 -153
- package/src/agents/wrfc-config.ts +0 -47
- package/src/agents/wrfc-controller.ts +0 -747
- package/src/agents/wrfc-gate-runtime.ts +0 -75
- package/src/agents/wrfc-reporting.ts +0 -284
- package/src/agents/wrfc-runtime-events.ts +0 -150
- package/src/agents/wrfc-types.ts +0 -67
- package/src/automation/delivery-manager.ts +0 -368
- package/src/automation/index.ts +0 -72
- package/src/automation/manager-runtime-delivery.ts +0 -139
- package/src/automation/manager-runtime-events.ts +0 -131
- package/src/automation/manager-runtime-execution.ts +0 -511
- package/src/automation/manager-runtime-helpers.ts +0 -433
- package/src/automation/manager-runtime-job-mutations.ts +0 -175
- package/src/automation/manager-runtime-reconcile.ts +0 -148
- package/src/automation/manager-runtime-scheduling.ts +0 -189
- package/src/automation/manager-runtime-sync.ts +0 -54
- package/src/automation/manager-runtime.ts +0 -721
- package/src/automation/manager.ts +0 -10
- package/src/automation/service.ts +0 -242
- package/src/channels/builtin/account-actions.ts +0 -490
- package/src/channels/builtin/accounts.ts +0 -433
- package/src/channels/builtin/contracts.ts +0 -405
- package/src/channels/builtin/plugins.ts +0 -308
- package/src/channels/builtin/rendering.ts +0 -174
- package/src/channels/builtin/setup-schema.ts +0 -504
- package/src/channels/builtin/shared.ts +0 -96
- package/src/channels/builtin/surfaces.ts +0 -57
- package/src/channels/builtin/targets.ts +0 -693
- package/src/channels/builtin-runtime.ts +0 -443
- package/src/channels/delivery/shared.ts +0 -199
- package/src/channels/delivery/strategies-bridge.ts +0 -246
- package/src/channels/delivery/strategies-core.ts +0 -299
- package/src/channels/delivery/strategies-enterprise.ts +0 -178
- package/src/channels/delivery/types.ts +0 -59
- package/src/channels/delivery-router.ts +0 -127
- package/src/channels/index.ts +0 -77
- package/src/channels/plugin-registry.ts +0 -551
- package/src/channels/provider-runtime.ts +0 -330
- package/src/channels/reply-pipeline.ts +0 -522
- package/src/channels/route-manager.ts +0 -340
- package/src/channels/surface-registry.ts +0 -186
- package/src/config/helper-model.ts +0 -1
- package/src/config/manager.ts +0 -8
- package/src/config/subscription-auth.ts +0 -31
- package/src/config/tool-llm.ts +0 -110
- package/src/control-plane/approval-broker.ts +0 -351
- package/src/control-plane/gateway.ts +0 -1
- package/src/control-plane/index.ts +0 -54
- package/src/control-plane/media-contract-schemas.ts +0 -1
- package/src/control-plane/method-catalog-admin.ts +0 -1
- package/src/control-plane/method-catalog-channels.ts +0 -1
- package/src/control-plane/method-catalog-control-automation.ts +0 -1
- package/src/control-plane/method-catalog-control-core.ts +0 -1
- package/src/control-plane/method-catalog-control.ts +0 -1
- package/src/control-plane/method-catalog-events.ts +0 -1
- package/src/control-plane/method-catalog-knowledge.ts +0 -1
- package/src/control-plane/method-catalog-media.ts +0 -1
- package/src/control-plane/method-catalog-runtime.ts +0 -1
- package/src/control-plane/method-catalog-shared.ts +0 -1
- package/src/control-plane/method-catalog.ts +0 -1
- package/src/control-plane/operator-contract-schemas-admin.ts +0 -1
- package/src/control-plane/operator-contract-schemas-channels.ts +0 -1
- package/src/control-plane/operator-contract-schemas-control.ts +0 -1
- package/src/control-plane/operator-contract-schemas-domains.ts +0 -1
- package/src/control-plane/operator-contract-schemas-knowledge.ts +0 -1
- package/src/control-plane/operator-contract-schemas-media.ts +0 -1
- package/src/control-plane/operator-contract-schemas-permissions.ts +0 -1
- package/src/control-plane/operator-contract-schemas-remote.ts +0 -1
- package/src/control-plane/operator-contract-schemas-runtime.ts +0 -1
- package/src/control-plane/operator-contract-schemas-shared.ts +0 -1
- package/src/control-plane/operator-contract-schemas-telemetry.ts +0 -1
- package/src/control-plane/operator-contract-schemas.ts +0 -1
- package/src/control-plane/operator-contract.ts +0 -165
- package/src/control-plane/session-broker.ts +0 -780
- package/src/core/compaction-sections.ts +0 -492
- package/src/core/compaction-types.ts +0 -147
- package/src/core/context-compaction.ts +0 -542
- package/src/core/conversation-compaction.ts +0 -68
- package/src/core/conversation-diff.ts +0 -55
- package/src/core/conversation-utils.ts +0 -72
- package/src/core/event-replay.ts +0 -287
- package/src/core/orchestrator-context-runtime.ts +0 -407
- package/src/core/orchestrator-follow-up-runtime.ts +0 -134
- package/src/core/orchestrator-runtime.ts +0 -132
- package/src/core/orchestrator-tool-runtime.ts +0 -468
- package/src/core/orchestrator-turn-helpers.ts +0 -355
- package/src/core/orchestrator-turn-loop.ts +0 -443
- package/src/core/plan-command-handler.ts +0 -169
- package/src/core/transcript-events/classify.ts +0 -95
- package/src/core/transcript-events/index.ts +0 -15
- package/src/daemon/control-plane.ts +0 -522
- package/src/daemon/helpers.ts +0 -74
- package/src/daemon/http/router-route-contexts.ts +0 -370
- package/src/daemon/http/router.ts +0 -531
- package/src/daemon/http-listener.ts +0 -301
- package/src/daemon/index.ts +0 -1
- package/src/daemon/server.ts +0 -1
- package/src/daemon/service-manager.ts +0 -413
- package/src/daemon/surface-actions.ts +0 -183
- package/src/daemon/surface-delivery.ts +0 -530
- package/src/daemon/transport-events.ts +0 -110
- package/src/export/markdown.ts +0 -213
- package/src/export/session-export.ts +0 -1
- package/src/git/index.ts +0 -1
- package/src/git/service.ts +0 -414
- package/src/hooks/chain-engine.ts +0 -414
- package/src/hooks/dispatcher.ts +0 -414
- package/src/hooks/hook-api.ts +0 -170
- package/src/hooks/index.ts +0 -48
- package/src/hooks/runners/agent.ts +0 -93
- package/src/hooks/runners/prompt.ts +0 -69
- package/src/hooks/workbench.ts +0 -360
- package/src/integrations/index.ts +0 -42
- package/src/integrations/notifier.ts +0 -206
- package/src/integrations/webhooks.ts +0 -1
- package/src/knowledge/consolidation.ts +0 -346
- package/src/knowledge/graphql.ts +0 -324
- package/src/knowledge/index.ts +0 -60
- package/src/knowledge/ingest-compile.ts +0 -386
- package/src/knowledge/ingest-context.ts +0 -18
- package/src/knowledge/ingest-inputs.ts +0 -387
- package/src/knowledge/ingest.ts +0 -1
- package/src/knowledge/internal.ts +0 -257
- package/src/knowledge/knowledge-api.ts +0 -432
- package/src/knowledge/lint.ts +0 -121
- package/src/knowledge/memory-sync.ts +0 -62
- package/src/knowledge/packet.ts +0 -370
- package/src/knowledge/scheduling.ts +0 -283
- package/src/knowledge/service.ts +0 -715
- package/src/mcp/client.ts +0 -383
- package/src/mcp/index.ts +0 -12
- package/src/mcp/mcp-api.ts +0 -90
- package/src/mcp/registry.ts +0 -1
- package/src/media/builtin-image-understanding.ts +0 -303
- package/src/media/builtin-providers.ts +0 -26
- package/src/media/index.ts +0 -18
- package/src/multimodal/index.ts +0 -13
- package/src/multimodal/service.ts +0 -492
- package/src/permissions/briefs/build.ts +0 -88
- package/src/permissions/manager.ts +0 -1
- package/src/plugins/api.ts +0 -383
- package/src/plugins/manager.ts +0 -481
- package/src/profiles/shape.ts +0 -58
- package/src/providers/amazon-bedrock-mantle.ts +0 -50
- package/src/providers/amazon-bedrock.ts +0 -61
- package/src/providers/anthropic-compat.ts +0 -373
- package/src/providers/anthropic-sdk-provider.ts +0 -230
- package/src/providers/anthropic-vertex.ts +0 -59
- package/src/providers/anthropic.ts +0 -469
- package/src/providers/auto-register.ts +0 -417
- package/src/providers/builtin-catalog.ts +0 -326
- package/src/providers/builtin-registry.ts +0 -575
- package/src/providers/cache-planner.ts +0 -258
- package/src/providers/capabilities.ts +0 -1
- package/src/providers/custom-loader.ts +0 -425
- package/src/providers/discovered-compat.ts +0 -7
- package/src/providers/discovered-factory.ts +0 -61
- package/src/providers/discovered-traits.ts +0 -138
- package/src/providers/gemini.ts +0 -462
- package/src/providers/github-copilot.ts +0 -254
- package/src/providers/index.ts +0 -1
- package/src/providers/interface.ts +0 -185
- package/src/providers/llama-cpp.ts +0 -402
- package/src/providers/lm-studio-helpers.ts +0 -367
- package/src/providers/lm-studio.ts +0 -484
- package/src/providers/model-catalog-cache.ts +0 -221
- package/src/providers/model-catalog-notifications.ts +0 -97
- package/src/providers/model-catalog-synthetic.ts +0 -202
- package/src/providers/model-catalog.ts +0 -211
- package/src/providers/model-limits.ts +0 -1
- package/src/providers/ollama.ts +0 -469
- package/src/providers/openai-codex.ts +0 -472
- package/src/providers/openai-compat.ts +0 -615
- package/src/providers/openai.ts +0 -231
- package/src/providers/optimizer.ts +0 -1
- package/src/providers/provider-api.ts +0 -1
- package/src/providers/registry-helpers.ts +0 -34
- package/src/providers/registry-models.ts +0 -77
- package/src/providers/registry-types.ts +0 -67
- package/src/providers/registry.ts +0 -1
- package/src/providers/runtime-metadata.ts +0 -149
- package/src/providers/runtime-snapshot.ts +0 -130
- package/src/providers/synthetic.ts +0 -561
- package/src/providers/tier-prompts.ts +0 -84
- package/src/providers/tool-formats.ts +0 -414
- package/src/runtime/auth/inspection.ts +0 -125
- package/src/runtime/bootstrap-background.ts +0 -157
- package/src/runtime/bootstrap-helpers.ts +0 -88
- package/src/runtime/bootstrap-runtime-events.ts +0 -254
- package/src/runtime/bootstrap-services.ts +0 -197
- package/src/runtime/compaction/index.ts +0 -1
- package/src/runtime/compaction/lifecycle.ts +0 -1
- package/src/runtime/compaction/manager.ts +0 -474
- package/src/runtime/compaction/quality-score.ts +0 -1
- package/src/runtime/compaction/resume-repair.ts +0 -1
- package/src/runtime/compaction/strategies/autocompact.ts +0 -1
- package/src/runtime/compaction/strategies/boundary-commit.ts +0 -1
- package/src/runtime/compaction/strategies/collapse.ts +0 -1
- package/src/runtime/compaction/strategies/index.ts +0 -1
- package/src/runtime/compaction/strategies/microcompact.ts +0 -1
- package/src/runtime/compaction/strategies/reactive.ts +0 -1
- package/src/runtime/compaction/types.ts +0 -1
- package/src/runtime/ecosystem/recommendations.ts +0 -117
- package/src/runtime/emitters/agents.ts +0 -96
- package/src/runtime/emitters/automation.ts +0 -112
- package/src/runtime/emitters/communication.ts +0 -53
- package/src/runtime/emitters/compaction.ts +0 -161
- package/src/runtime/emitters/control-plane.ts +0 -65
- package/src/runtime/emitters/deliveries.ts +0 -65
- package/src/runtime/emitters/forensics.ts +0 -17
- package/src/runtime/emitters/index.ts +0 -59
- package/src/runtime/emitters/knowledge.ts +0 -129
- package/src/runtime/emitters/mcp.ts +0 -95
- package/src/runtime/emitters/ops.ts +0 -163
- package/src/runtime/emitters/orchestration.ts +0 -87
- package/src/runtime/emitters/permissions.ts +0 -98
- package/src/runtime/emitters/planner.ts +0 -23
- package/src/runtime/emitters/plugins.ts +0 -78
- package/src/runtime/emitters/providers.ts +0 -30
- package/src/runtime/emitters/routes.ts +0 -57
- package/src/runtime/emitters/security.ts +0 -53
- package/src/runtime/emitters/session.ts +0 -93
- package/src/runtime/emitters/surfaces.ts +0 -57
- package/src/runtime/emitters/tasks.ts +0 -69
- package/src/runtime/emitters/tools.ts +0 -140
- package/src/runtime/emitters/transport.ts +0 -78
- package/src/runtime/emitters/turn.ts +0 -155
- package/src/runtime/emitters/ui.ts +0 -57
- package/src/runtime/emitters/watchers.ts +0 -57
- package/src/runtime/emitters/workflows.ts +0 -79
- package/src/runtime/eval/index.ts +0 -48
- package/src/runtime/eval/runner.ts +0 -163
- package/src/runtime/eval/suites.ts +0 -264
- package/src/runtime/events/domain-map.ts +0 -148
- package/src/runtime/events/index.ts +0 -1
- package/src/runtime/events/turn.ts +0 -1
- package/src/runtime/events/workflows.ts +0 -1
- package/src/runtime/forensics/collector.ts +0 -693
- package/src/runtime/forensics/index.ts +0 -23
- package/src/runtime/foundation-clients.ts +0 -78
- package/src/runtime/foundation-services.ts +0 -96
- package/src/runtime/guidance.ts +0 -183
- package/src/runtime/health/effect-handlers.ts +0 -189
- package/src/runtime/health/index.ts +0 -70
- package/src/runtime/health/wiring.ts +0 -115
- package/src/runtime/integration/helpers.ts +0 -640
- package/src/runtime/lifecycle.ts +0 -107
- package/src/runtime/mcp/index.ts +0 -68
- package/src/runtime/mcp/manager.ts +0 -513
- package/src/runtime/network/inbound.ts +0 -131
- package/src/runtime/network/index.ts +0 -30
- package/src/runtime/network/outbound.ts +0 -292
- package/src/runtime/network/shared.ts +0 -82
- package/src/runtime/operator-client.ts +0 -235
- package/src/runtime/ops/control-plane.ts +0 -363
- package/src/runtime/ops/index.ts +0 -122
- package/src/runtime/ops/playbooks/index.ts +0 -10
- package/src/runtime/ops/playbooks/session-unrecoverable.ts +0 -196
- package/src/runtime/ops/playbooks/stuck-turn.ts +0 -197
- package/src/runtime/ops/runtime-context.ts +0 -100
- package/src/runtime/ops-api.ts +0 -27
- package/src/runtime/orchestration/spawn-policy.ts +0 -83
- package/src/runtime/peer-client.ts +0 -404
- package/src/runtime/perf/index.ts +0 -57
- package/src/runtime/perf/slo-collector.ts +0 -375
- package/src/runtime/permissions/index.ts +0 -190
- package/src/runtime/permissions/policy-runtime.ts +0 -1
- package/src/runtime/permissions/preflight.ts +0 -101
- package/src/runtime/permissions/rule-suggestions.ts +0 -36
- package/src/runtime/plugins/hot-reload.ts +0 -221
- package/src/runtime/plugins/index.ts +0 -84
- package/src/runtime/plugins/lifecycle.ts +0 -95
- package/src/runtime/plugins/manager.ts +0 -474
- package/src/runtime/plugins/manifest.ts +0 -167
- package/src/runtime/plugins/quarantine.ts +0 -202
- package/src/runtime/plugins/trust.ts +0 -291
- package/src/runtime/plugins/types.ts +0 -205
- package/src/runtime/provider-accounts/registry.ts +0 -326
- package/src/runtime/remote/distributed-runtime-contract-schemas.ts +0 -386
- package/src/runtime/remote/index.ts +0 -488
- package/src/runtime/remote/runner-registry.ts +0 -438
- package/src/runtime/remote/supervisor.ts +0 -70
- package/src/runtime/runtime-hook-api.ts +0 -5
- package/src/runtime/runtime-knowledge-api.ts +0 -14
- package/src/runtime/runtime-mcp-api.ts +0 -5
- package/src/runtime/runtime-ops-api.ts +0 -86
- package/src/runtime/runtime-provider-api.ts +0 -18
- package/src/runtime/session-maintenance.ts +0 -188
- package/src/runtime/session-persistence.ts +0 -288
- package/src/runtime/session-return-context.ts +0 -195
- package/src/runtime/settings/control-plane-store.ts +0 -258
- package/src/runtime/settings/control-plane.ts +0 -599
- package/src/runtime/shell-command-extensions.ts +0 -54
- package/src/runtime/shell-command-ops.ts +0 -207
- package/src/runtime/shell-command-platform.ts +0 -47
- package/src/runtime/shell-command-services.ts +0 -143
- package/src/runtime/shell-command-workspace.ts +0 -31
- package/src/runtime/tasks/adapters/acp-adapter.ts +0 -211
- package/src/runtime/tasks/adapters/agent-adapter.ts +0 -208
- package/src/runtime/tasks/adapters/index.ts +0 -16
- package/src/runtime/tasks/adapters/process-adapter.ts +0 -214
- package/src/runtime/tasks/adapters/scheduler-adapter.ts +0 -193
- package/src/runtime/tasks/index.ts +0 -68
- package/src/runtime/tasks/manager.ts +0 -415
- package/src/runtime/telemetry/api-helpers.ts +0 -517
- package/src/runtime/telemetry/api.ts +0 -768
- package/src/runtime/telemetry/index.ts +0 -178
- package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +0 -440
- package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +0 -200
- package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +0 -18
- package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +0 -204
- package/src/runtime/telemetry/instrumentation/domain-bridge.ts +0 -125
- package/src/runtime/telemetry/instrumentation/index.ts +0 -67
- package/src/runtime/tools/context.ts +0 -114
- package/src/runtime/tools/index.ts +0 -46
- package/src/runtime/tools/phased-executor.ts +0 -448
- package/src/runtime/tools/phases/budget.ts +0 -130
- package/src/runtime/tools/phases/execute.ts +0 -69
- package/src/runtime/tools/phases/index.ts +0 -13
- package/src/runtime/tools/phases/map-output.ts +0 -98
- package/src/runtime/tools/phases/permission.ts +0 -133
- package/src/runtime/tools/phases/posthook.ts +0 -57
- package/src/runtime/tools/phases/prehook.ts +0 -68
- package/src/runtime/tools/phases/validate.ts +0 -53
- package/src/runtime/transports/direct.ts +0 -73
- package/src/runtime/transports/http-helpers.ts +0 -218
- package/src/runtime/transports/http-types.ts +0 -364
- package/src/runtime/transports/http.ts +0 -629
- package/src/runtime/transports/realtime.ts +0 -50
- package/src/runtime/transports/remote-events.ts +0 -16
- package/src/runtime/transports/shared.ts +0 -39
- package/src/runtime/transports/ui-runtime-events.ts +0 -35
- package/src/runtime/ui-events.ts +0 -46
- package/src/runtime/worktree/registry.ts +0 -252
- package/src/sessions/manager.ts +0 -14
- package/src/state/file-watcher.ts +0 -294
- package/src/state/index.ts +0 -56
- package/src/state/knowledge-injection.ts +0 -214
- package/src/state/memory-embedding-http.ts +0 -642
- package/src/state/memory-embeddings.ts +0 -312
- package/src/state/memory-ingest.ts +0 -132
- package/src/state/memory-registry.ts +0 -111
- package/src/state/memory-store-helpers.ts +0 -160
- package/src/state/memory-store.ts +0 -728
- package/src/state/memory-vector-store.ts +0 -418
- package/src/templates/manager.ts +0 -187
- package/src/tools/agent/index.ts +0 -610
- package/src/tools/agent/manager.ts +0 -476
- package/src/tools/analyze/git-modes.ts +0 -380
- package/src/tools/analyze/index.ts +0 -128
- package/src/tools/channel/agent-tools.ts +0 -16
- package/src/tools/channel/index.ts +0 -268
- package/src/tools/control/index.ts +0 -90
- package/src/tools/edit/core.ts +0 -619
- package/src/tools/edit/index.ts +0 -4
- package/src/tools/edit/phased.ts +0 -33
- package/src/tools/fetch/index.ts +0 -3
- package/src/tools/fetch/phased.ts +0 -34
- package/src/tools/fetch/runtime.ts +0 -499
- package/src/tools/mcp/index.ts +0 -190
- package/src/tools/remote-trigger/index.ts +0 -130
- package/src/tools/shared/auto-heal.ts +0 -282
- package/src/tools/state/index.ts +0 -688
- package/src/tools/web-search/index.ts +0 -38
- package/src/tools/write/index.ts +0 -604
- package/src/tools/write/phased.ts +0 -41
- package/src/types/generated/foundation-client-types.ts +0 -22
- package/src/watchers/index.ts +0 -11
- package/src/watchers/registry.ts +0 -517
- package/src/web-search/index.ts +0 -26
- package/src/web-search/provider-registry.ts +0 -64
- package/src/web-search/providers/brave.ts +0 -100
- package/src/web-search/providers/duckduckgo.ts +0 -270
- package/src/web-search/providers/exa.ts +0 -77
- package/src/web-search/providers/firecrawl.ts +0 -90
- package/src/web-search/providers/perplexity.ts +0 -86
- package/src/web-search/providers/searxng.ts +0 -88
- package/src/web-search/providers/shared.ts +0 -249
- package/src/web-search/providers/tavily.ts +0 -90
- package/src/web-search/service.ts +0 -142
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config/manager';
|
|
3
|
-
import { getDefaultInboundCertPaths, inspectPrivateKeyPermissions, resolvePathFromGoodVibesRoot } from '@pellux/goodvibes-sdk/platform/runtime/network/shared';
|
|
4
|
-
|
|
5
|
-
export type InboundTlsMode = 'off' | 'proxy' | 'direct';
|
|
6
|
-
export type InboundServerSurface = 'controlPlane' | 'httpListener';
|
|
7
|
-
|
|
8
|
-
export interface InboundTlsSnapshot {
|
|
9
|
-
readonly surface: InboundServerSurface;
|
|
10
|
-
readonly host: string;
|
|
11
|
-
readonly port: number;
|
|
12
|
-
readonly mode: InboundTlsMode;
|
|
13
|
-
readonly scheme: 'http' | 'https';
|
|
14
|
-
readonly trustProxy: boolean;
|
|
15
|
-
readonly certFile?: string;
|
|
16
|
-
readonly keyFile?: string;
|
|
17
|
-
readonly usingDefaultPaths: boolean;
|
|
18
|
-
readonly ready: boolean;
|
|
19
|
-
readonly errors: readonly string[];
|
|
20
|
-
readonly keyPermissions?: {
|
|
21
|
-
readonly available: boolean;
|
|
22
|
-
readonly safe?: boolean;
|
|
23
|
-
readonly mode?: string;
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface ResolvedInboundTlsContext extends InboundTlsSnapshot {
|
|
28
|
-
readonly tls?: Bun.TLSOptions;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function readMode(configManager: ConfigManager, surface: InboundServerSurface): InboundTlsMode {
|
|
32
|
-
return surface === 'controlPlane'
|
|
33
|
-
? configManager.get('controlPlane.tls.mode')
|
|
34
|
-
: configManager.get('httpListener.tls.mode');
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function readTrustProxy(configManager: ConfigManager, surface: InboundServerSurface): boolean {
|
|
38
|
-
return surface === 'controlPlane'
|
|
39
|
-
? Boolean(configManager.get('controlPlane.trustProxy'))
|
|
40
|
-
: Boolean(configManager.get('httpListener.trustProxy'));
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function readHost(configManager: ConfigManager, surface: InboundServerSurface): string {
|
|
44
|
-
return String(surface === 'controlPlane'
|
|
45
|
-
? configManager.get('controlPlane.host')
|
|
46
|
-
: configManager.get('httpListener.host'));
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function readPort(configManager: ConfigManager, surface: InboundServerSurface): number {
|
|
50
|
-
return Number(surface === 'controlPlane'
|
|
51
|
-
? configManager.get('controlPlane.port')
|
|
52
|
-
: configManager.get('httpListener.port'));
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function readConfiguredCertPath(configManager: ConfigManager, surface: InboundServerSurface): string | null {
|
|
56
|
-
return resolvePathFromGoodVibesRoot(
|
|
57
|
-
surface === 'controlPlane'
|
|
58
|
-
? configManager.get('controlPlane.tls.certFile')
|
|
59
|
-
: configManager.get('httpListener.tls.certFile'),
|
|
60
|
-
configManager,
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function readConfiguredKeyPath(configManager: ConfigManager, surface: InboundServerSurface): string | null {
|
|
65
|
-
return resolvePathFromGoodVibesRoot(
|
|
66
|
-
surface === 'controlPlane'
|
|
67
|
-
? configManager.get('controlPlane.tls.keyFile')
|
|
68
|
-
: configManager.get('httpListener.tls.keyFile'),
|
|
69
|
-
configManager,
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function inspectInboundTls(configManager: ConfigManager, surface: InboundServerSurface): InboundTlsSnapshot {
|
|
74
|
-
const mode = readMode(configManager, surface);
|
|
75
|
-
const trustProxy = readTrustProxy(configManager, surface);
|
|
76
|
-
const host = readHost(configManager, surface);
|
|
77
|
-
const port = readPort(configManager, surface);
|
|
78
|
-
if (mode !== 'direct') {
|
|
79
|
-
return {
|
|
80
|
-
surface,
|
|
81
|
-
host,
|
|
82
|
-
port,
|
|
83
|
-
mode,
|
|
84
|
-
scheme: mode === 'proxy' ? 'https' : 'http',
|
|
85
|
-
trustProxy,
|
|
86
|
-
usingDefaultPaths: false,
|
|
87
|
-
ready: true,
|
|
88
|
-
errors: [],
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const defaults = getDefaultInboundCertPaths(configManager);
|
|
93
|
-
const certFile = readConfiguredCertPath(configManager, surface) ?? defaults.certFile;
|
|
94
|
-
const keyFile = readConfiguredKeyPath(configManager, surface) ?? defaults.keyFile;
|
|
95
|
-
const usingDefaultPaths = certFile === defaults.certFile && keyFile === defaults.keyFile;
|
|
96
|
-
const errors: string[] = [];
|
|
97
|
-
if (!existsSync(certFile)) errors.push(`Certificate file not found: ${certFile}`);
|
|
98
|
-
if (!existsSync(keyFile)) errors.push(`Private key file not found: ${keyFile}`);
|
|
99
|
-
const keyPermissions = inspectPrivateKeyPermissions(keyFile);
|
|
100
|
-
return {
|
|
101
|
-
surface,
|
|
102
|
-
host,
|
|
103
|
-
port,
|
|
104
|
-
mode,
|
|
105
|
-
scheme: 'https',
|
|
106
|
-
trustProxy,
|
|
107
|
-
certFile,
|
|
108
|
-
keyFile,
|
|
109
|
-
usingDefaultPaths,
|
|
110
|
-
ready: errors.length === 0,
|
|
111
|
-
errors,
|
|
112
|
-
keyPermissions,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export function resolveInboundTlsContext(configManager: ConfigManager, surface: InboundServerSurface): ResolvedInboundTlsContext {
|
|
117
|
-
const snapshot = inspectInboundTls(configManager, surface);
|
|
118
|
-
if (snapshot.mode !== 'direct') return snapshot;
|
|
119
|
-
if (!snapshot.ready || !snapshot.certFile || !snapshot.keyFile) {
|
|
120
|
-
throw new Error(
|
|
121
|
-
`${surface} direct TLS is enabled but certificate files are not ready: ${snapshot.errors.join('; ')}`,
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
return {
|
|
125
|
-
...snapshot,
|
|
126
|
-
tls: {
|
|
127
|
-
cert: Bun.file(snapshot.certFile),
|
|
128
|
-
key: Bun.file(snapshot.keyFile),
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export type {
|
|
2
|
-
InboundServerSurface,
|
|
3
|
-
InboundTlsMode,
|
|
4
|
-
InboundTlsSnapshot,
|
|
5
|
-
ResolvedInboundTlsContext,
|
|
6
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/network/inbound';
|
|
7
|
-
export {
|
|
8
|
-
inspectInboundTls,
|
|
9
|
-
resolveInboundTlsContext,
|
|
10
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/network/inbound';
|
|
11
|
-
export type {
|
|
12
|
-
OutboundTlsSnapshot,
|
|
13
|
-
OutboundTrustMode,
|
|
14
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/network/outbound';
|
|
15
|
-
export {
|
|
16
|
-
applyOutboundTlsToFetchInit,
|
|
17
|
-
createNetworkFetch,
|
|
18
|
-
GlobalNetworkTransportInstaller,
|
|
19
|
-
inspectOutboundTls,
|
|
20
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/network/outbound';
|
|
21
|
-
export {
|
|
22
|
-
extractForwardedClientIp,
|
|
23
|
-
getDefaultCertDirectory,
|
|
24
|
-
getDefaultInboundCertPaths,
|
|
25
|
-
getGoodVibesRootDir,
|
|
26
|
-
inspectPrivateKeyPermissions,
|
|
27
|
-
isLocalHostname,
|
|
28
|
-
readPemEntriesFromDirectory,
|
|
29
|
-
resolvePathFromGoodVibesRoot,
|
|
30
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/network/shared';
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { getCACertificates } from 'node:tls';
|
|
3
|
-
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config/manager';
|
|
4
|
-
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
5
|
-
import { isLocalHostname, readPemEntriesFromDirectory, resolvePathFromGoodVibesRoot } from '@pellux/goodvibes-sdk/platform/runtime/network/shared';
|
|
6
|
-
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
7
|
-
|
|
8
|
-
export type OutboundTrustMode = 'bundled' | 'bundled+custom' | 'custom';
|
|
9
|
-
|
|
10
|
-
type FetchTlsOptions = Bun.TLSOptions & {
|
|
11
|
-
checkServerIdentity?: NonNullable<import('node:tls').ConnectionOptions['checkServerIdentity']>;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
type FetchInitWithTls = RequestInit & {
|
|
15
|
-
tls?: FetchTlsOptions;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export interface OutboundTlsSnapshot {
|
|
19
|
-
readonly mode: OutboundTrustMode;
|
|
20
|
-
readonly allowInsecureLocalhost: boolean;
|
|
21
|
-
readonly customCaFile?: string;
|
|
22
|
-
readonly customCaDir?: string;
|
|
23
|
-
readonly customCaEntryCount: number;
|
|
24
|
-
readonly effectiveCaStrategy: 'bun-default' | 'bundled+custom' | 'custom';
|
|
25
|
-
readonly errors: readonly string[];
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
interface ResolvedOutboundTlsContext {
|
|
29
|
-
readonly snapshot: OutboundTlsSnapshot;
|
|
30
|
-
readonly caEntries?: readonly string[];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const NETWORK_FETCH_WRAPPER = Symbol.for('goodvibes.network.fetch-wrapper');
|
|
34
|
-
const NETWORK_FETCH_MANAGER = Symbol.for('goodvibes.network.fetch-manager');
|
|
35
|
-
|
|
36
|
-
type WrappedNetworkFetch = typeof globalThis.fetch & {
|
|
37
|
-
[NETWORK_FETCH_WRAPPER]?: true;
|
|
38
|
-
[NETWORK_FETCH_MANAGER]?: GlobalNetworkTransportInstaller;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
function readMode(configManager: ConfigManager): OutboundTrustMode {
|
|
42
|
-
return configManager.get('network.outboundTls.mode');
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function readAllowInsecureLocalhost(configManager: ConfigManager): boolean {
|
|
46
|
-
return Boolean(configManager.get('network.outboundTls.allowInsecureLocalhost'));
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function readCustomCaFile(configManager: ConfigManager): string | null {
|
|
50
|
-
return resolvePathFromGoodVibesRoot(configManager.get('network.outboundTls.customCaFile'), configManager);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function readCustomCaDir(configManager: ConfigManager): string | null {
|
|
54
|
-
return resolvePathFromGoodVibesRoot(configManager.get('network.outboundTls.customCaDir'), configManager);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function loadCustomCaEntries(configManager: ConfigManager): {
|
|
58
|
-
readonly entries: readonly string[];
|
|
59
|
-
readonly errors: readonly string[];
|
|
60
|
-
readonly customCaFile?: string;
|
|
61
|
-
readonly customCaDir?: string;
|
|
62
|
-
} {
|
|
63
|
-
const errors: string[] = [];
|
|
64
|
-
const entries: string[] = [];
|
|
65
|
-
const customCaFile = readCustomCaFile(configManager);
|
|
66
|
-
const customCaDir = readCustomCaDir(configManager);
|
|
67
|
-
|
|
68
|
-
if (customCaFile) {
|
|
69
|
-
if (existsSync(customCaFile)) {
|
|
70
|
-
entries.push(readFileSync(customCaFile, 'utf-8'));
|
|
71
|
-
} else {
|
|
72
|
-
errors.push(`Custom CA file not found: ${customCaFile}`);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (customCaDir) {
|
|
77
|
-
if (existsSync(customCaDir)) {
|
|
78
|
-
for (const path of readPemEntriesFromDirectory(customCaDir)) {
|
|
79
|
-
entries.push(readFileSync(path, 'utf-8'));
|
|
80
|
-
}
|
|
81
|
-
} else {
|
|
82
|
-
errors.push(`Custom CA directory not found: ${customCaDir}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return {
|
|
87
|
-
entries,
|
|
88
|
-
errors,
|
|
89
|
-
...(customCaFile ? { customCaFile } : {}),
|
|
90
|
-
...(customCaDir ? { customCaDir } : {}),
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function getBundledCaEntries(): readonly string[] {
|
|
95
|
-
return getCACertificates('bundled');
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export function inspectOutboundTls(configManager: ConfigManager): OutboundTlsSnapshot {
|
|
99
|
-
const mode = readMode(configManager);
|
|
100
|
-
const allowInsecureLocalhost = readAllowInsecureLocalhost(configManager);
|
|
101
|
-
const custom = loadCustomCaEntries(configManager);
|
|
102
|
-
return {
|
|
103
|
-
mode,
|
|
104
|
-
allowInsecureLocalhost,
|
|
105
|
-
...(custom.customCaFile ? { customCaFile: custom.customCaFile } : {}),
|
|
106
|
-
...(custom.customCaDir ? { customCaDir: custom.customCaDir } : {}),
|
|
107
|
-
customCaEntryCount: custom.entries.length,
|
|
108
|
-
effectiveCaStrategy: mode === 'bundled'
|
|
109
|
-
? 'bun-default'
|
|
110
|
-
: mode === 'bundled+custom'
|
|
111
|
-
? 'bundled+custom'
|
|
112
|
-
: 'custom',
|
|
113
|
-
errors: custom.errors,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function resolveOutboundTlsContext(configManager: ConfigManager): ResolvedOutboundTlsContext {
|
|
118
|
-
const snapshot = inspectOutboundTls(configManager);
|
|
119
|
-
const custom = loadCustomCaEntries(configManager);
|
|
120
|
-
const caEntries = snapshot.mode === 'bundled'
|
|
121
|
-
? undefined
|
|
122
|
-
: snapshot.mode === 'bundled+custom'
|
|
123
|
-
? [...getBundledCaEntries(), ...custom.entries]
|
|
124
|
-
: [...custom.entries];
|
|
125
|
-
return { snapshot, ...(caEntries ? { caEntries } : {}) };
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function extractRequestUrl(input: RequestInfo | URL): URL | null {
|
|
129
|
-
try {
|
|
130
|
-
if (typeof input === 'string') return new URL(input);
|
|
131
|
-
if (input instanceof URL) return input;
|
|
132
|
-
if (typeof Request !== 'undefined' && input instanceof Request) return new URL(input.url);
|
|
133
|
-
return null;
|
|
134
|
-
} catch {
|
|
135
|
-
return null;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function extractRequestMethod(input: RequestInfo | URL, init?: RequestInit): string {
|
|
140
|
-
if (init?.method) return init.method.toUpperCase();
|
|
141
|
-
if (typeof Request !== 'undefined' && input instanceof Request) return input.method.toUpperCase();
|
|
142
|
-
return 'GET';
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
function extractHeaderValue(headers: HeadersInit | undefined, name: string): string | undefined {
|
|
146
|
-
if (!headers) return undefined;
|
|
147
|
-
if (headers instanceof Headers) return headers.get(name) ?? undefined;
|
|
148
|
-
if (Array.isArray(headers)) {
|
|
149
|
-
const loweredName = name.toLowerCase();
|
|
150
|
-
const match = headers.find(([key]) => key.toLowerCase() === loweredName);
|
|
151
|
-
return match?.[1];
|
|
152
|
-
}
|
|
153
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
154
|
-
if (key.toLowerCase() !== name.toLowerCase()) continue;
|
|
155
|
-
if (Array.isArray(value)) return value.join(', ');
|
|
156
|
-
return value;
|
|
157
|
-
}
|
|
158
|
-
return undefined;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
function shouldTraceProviderRequest(url: URL, method: string): boolean {
|
|
162
|
-
if (method !== 'POST') return false;
|
|
163
|
-
return (
|
|
164
|
-
url.pathname.endsWith('/chat/completions') ||
|
|
165
|
-
url.pathname.endsWith('/responses') ||
|
|
166
|
-
url.pathname.endsWith('/messages')
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
async function executeNetworkFetch(
|
|
171
|
-
fetchImpl: typeof globalThis.fetch,
|
|
172
|
-
input: RequestInfo | URL,
|
|
173
|
-
init: RequestInit | undefined,
|
|
174
|
-
configManager: ConfigManager,
|
|
175
|
-
): Promise<Response> {
|
|
176
|
-
const nextInit = applyOutboundTlsToFetchInit(input, init, configManager);
|
|
177
|
-
const url = extractRequestUrl(input);
|
|
178
|
-
const method = extractRequestMethod(input, nextInit);
|
|
179
|
-
const shouldTrace = url ? shouldTraceProviderRequest(url, method) : false;
|
|
180
|
-
|
|
181
|
-
if (shouldTrace && url) {
|
|
182
|
-
logger.debug('Outbound provider request', {
|
|
183
|
-
method,
|
|
184
|
-
host: url.host,
|
|
185
|
-
path: url.pathname,
|
|
186
|
-
contentType: extractHeaderValue(nextInit.headers, 'content-type'),
|
|
187
|
-
contentLength: extractHeaderValue(nextInit.headers, 'content-length'),
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
try {
|
|
192
|
-
const response = await fetchImpl(input, nextInit);
|
|
193
|
-
if (shouldTrace && url) {
|
|
194
|
-
logger.debug('Outbound provider response', {
|
|
195
|
-
method,
|
|
196
|
-
host: url.host,
|
|
197
|
-
path: url.pathname,
|
|
198
|
-
status: response.status,
|
|
199
|
-
requestId: response.headers.get('x-request-id') ?? response.headers.get('request-id') ?? undefined,
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
return response;
|
|
203
|
-
} catch (error) {
|
|
204
|
-
if (shouldTrace && url) {
|
|
205
|
-
logger.error('Outbound provider request failed', {
|
|
206
|
-
method,
|
|
207
|
-
host: url.host,
|
|
208
|
-
path: url.pathname,
|
|
209
|
-
error: summarizeError(error),
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
throw error;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
export function applyOutboundTlsToFetchInit(
|
|
217
|
-
input: RequestInfo | URL,
|
|
218
|
-
init: RequestInit | undefined,
|
|
219
|
-
configManager: ConfigManager,
|
|
220
|
-
): FetchInitWithTls {
|
|
221
|
-
const url = extractRequestUrl(input);
|
|
222
|
-
const nextInit = { ...(init ?? {}) } as FetchInitWithTls;
|
|
223
|
-
if (!url || url.protocol !== 'https:') return nextInit;
|
|
224
|
-
|
|
225
|
-
const context = resolveOutboundTlsContext(configManager);
|
|
226
|
-
const existingTls = nextInit.tls ?? {};
|
|
227
|
-
const nextTls: FetchTlsOptions = { ...existingTls };
|
|
228
|
-
|
|
229
|
-
if (context.snapshot.mode === 'custom' && !nextTls.ca && (!context.caEntries || context.caEntries.length === 0)) {
|
|
230
|
-
throw new Error(
|
|
231
|
-
'network.outboundTls.mode is custom, but no custom CA entries were loaded. Configure network.outboundTls.customCaFile or network.outboundTls.customCaDir.',
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
if (!nextTls.ca && context.caEntries && context.caEntries.length > 0) {
|
|
236
|
-
nextTls.ca = [...context.caEntries];
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
if (
|
|
240
|
-
context.snapshot.allowInsecureLocalhost
|
|
241
|
-
&& nextTls.rejectUnauthorized === undefined
|
|
242
|
-
&& isLocalHostname(url.hostname)
|
|
243
|
-
) {
|
|
244
|
-
nextTls.rejectUnauthorized = false;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return Object.keys(nextTls).length > 0
|
|
248
|
-
? { ...nextInit, tls: nextTls }
|
|
249
|
-
: nextInit;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
export function createNetworkFetch(
|
|
253
|
-
fetchImpl: typeof globalThis.fetch,
|
|
254
|
-
configManager: ConfigManager,
|
|
255
|
-
): typeof globalThis.fetch {
|
|
256
|
-
const wrapped = (async (input: RequestInfo | URL, init?: RequestInit) =>
|
|
257
|
-
executeNetworkFetch(fetchImpl, input, init, configManager)) as typeof globalThis.fetch;
|
|
258
|
-
Object.assign(wrapped, fetchImpl);
|
|
259
|
-
return wrapped;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
export class GlobalNetworkTransportInstaller {
|
|
263
|
-
private originalFetchRef: typeof globalThis.fetch | null = null;
|
|
264
|
-
private configManager: ConfigManager | null = null;
|
|
265
|
-
|
|
266
|
-
setConfigManager(configManager: ConfigManager): void {
|
|
267
|
-
this.configManager = configManager;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
install(configManager: ConfigManager): void {
|
|
271
|
-
const currentFetch = globalThis.fetch as WrappedNetworkFetch;
|
|
272
|
-
if (currentFetch[NETWORK_FETCH_MANAGER]) {
|
|
273
|
-
currentFetch[NETWORK_FETCH_MANAGER]!.setConfigManager(configManager);
|
|
274
|
-
logger.debug('Updated global network transport', { ...inspectOutboundTls(configManager) });
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
this.configManager = configManager;
|
|
279
|
-
this.originalFetchRef = globalThis.fetch.bind(globalThis);
|
|
280
|
-
const wrapped = (async (input: RequestInfo | URL, init?: RequestInit) => {
|
|
281
|
-
if (!this.originalFetchRef || !this.configManager) {
|
|
282
|
-
throw new Error('Global network transport is not initialized correctly.');
|
|
283
|
-
}
|
|
284
|
-
return executeNetworkFetch(this.originalFetchRef, input, init, this.configManager);
|
|
285
|
-
}) as WrappedNetworkFetch;
|
|
286
|
-
Object.assign(wrapped, globalThis.fetch);
|
|
287
|
-
wrapped[NETWORK_FETCH_WRAPPER] = true;
|
|
288
|
-
wrapped[NETWORK_FETCH_MANAGER] = this;
|
|
289
|
-
globalThis.fetch = wrapped;
|
|
290
|
-
logger.debug('Installed global network transport', { ...inspectOutboundTls(configManager) });
|
|
291
|
-
}
|
|
292
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
-
import { basename, dirname, extname, isAbsolute, join, resolve } from 'node:path';
|
|
3
|
-
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config/manager';
|
|
4
|
-
|
|
5
|
-
const PEM_EXTENSIONS = new Set(['.pem', '.crt', '.cer']);
|
|
6
|
-
|
|
7
|
-
type NetworkRootConfig = Pick<ConfigManager, 'getControlPlaneConfigDir'>;
|
|
8
|
-
|
|
9
|
-
export function getGoodVibesRootDir(configManager: NetworkRootConfig): string {
|
|
10
|
-
const configuredDir = configManager.getControlPlaneConfigDir();
|
|
11
|
-
return resolve(configuredDir);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function getDefaultCertDirectory(configManager: NetworkRootConfig): string {
|
|
15
|
-
return join(getGoodVibesRootDir(configManager), 'certs');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function getDefaultInboundCertPaths(configManager: NetworkRootConfig): {
|
|
19
|
-
readonly certFile: string;
|
|
20
|
-
readonly keyFile: string;
|
|
21
|
-
} {
|
|
22
|
-
const certDir = getDefaultCertDirectory(configManager);
|
|
23
|
-
return {
|
|
24
|
-
certFile: join(certDir, 'fullchain.pem'),
|
|
25
|
-
keyFile: join(certDir, 'privkey.pem'),
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function resolvePathFromGoodVibesRoot(
|
|
30
|
-
value: string | null | undefined,
|
|
31
|
-
configManager: NetworkRootConfig,
|
|
32
|
-
): string | null {
|
|
33
|
-
const trimmed = value?.trim();
|
|
34
|
-
if (!trimmed) return null;
|
|
35
|
-
return isAbsolute(trimmed)
|
|
36
|
-
? trimmed
|
|
37
|
-
: resolve(getGoodVibesRootDir(configManager), trimmed);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function readPemEntriesFromDirectory(path: string): string[] {
|
|
41
|
-
if (!existsSync(path)) return [];
|
|
42
|
-
return readdirSync(path, { withFileTypes: true })
|
|
43
|
-
.filter((entry) => entry.isFile() && PEM_EXTENSIONS.has(extname(entry.name).toLowerCase()))
|
|
44
|
-
.map((entry) => join(path, entry.name))
|
|
45
|
-
.sort((a, b) => a.localeCompare(b));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function isLocalHostname(hostname: string): boolean {
|
|
49
|
-
const normalized = hostname.trim().toLowerCase();
|
|
50
|
-
return normalized === 'localhost'
|
|
51
|
-
|| normalized === '127.0.0.1'
|
|
52
|
-
|| normalized === '::1'
|
|
53
|
-
|| normalized === '[::1]';
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function extractForwardedClientIp(req: Request, trustProxy: boolean): string | undefined {
|
|
57
|
-
if (!trustProxy) return undefined;
|
|
58
|
-
const forwarded = req.headers.get('x-forwarded-for');
|
|
59
|
-
if (forwarded) {
|
|
60
|
-
const first = forwarded.split(',').map((value) => value.trim()).find(Boolean);
|
|
61
|
-
if (first) return first;
|
|
62
|
-
}
|
|
63
|
-
const realIp = req.headers.get('x-real-ip')?.trim();
|
|
64
|
-
return realIp ? realIp : undefined;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function inspectPrivateKeyPermissions(path: string): {
|
|
68
|
-
readonly available: boolean;
|
|
69
|
-
readonly safe?: boolean;
|
|
70
|
-
readonly mode?: string;
|
|
71
|
-
} {
|
|
72
|
-
if (!existsSync(path) || process.platform === 'win32') {
|
|
73
|
-
return { available: false };
|
|
74
|
-
}
|
|
75
|
-
const stat = statSync(path);
|
|
76
|
-
const mode = stat.mode & 0o777;
|
|
77
|
-
return {
|
|
78
|
-
available: true,
|
|
79
|
-
safe: (mode & 0o077) === 0,
|
|
80
|
-
mode: `0${mode.toString(8)}`,
|
|
81
|
-
};
|
|
82
|
-
}
|