@pellux/goodvibes-tui 0.18.11 → 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 +22 -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,443 +0,0 @@
|
|
|
1
|
-
import type { Tool } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
-
import type {
|
|
3
|
-
ChannelAccountLifecycleAction,
|
|
4
|
-
ChannelAccountLifecycleResult,
|
|
5
|
-
ChannelAccountRecord,
|
|
6
|
-
ChannelActorAuthorizationRequest,
|
|
7
|
-
ChannelActorAuthorizationResult,
|
|
8
|
-
ChannelCapabilityDescriptor,
|
|
9
|
-
ChannelConversationKind,
|
|
10
|
-
ChannelDirectoryEntry,
|
|
11
|
-
ChannelDirectoryQueryOptions,
|
|
12
|
-
ChannelOperatorActionDescriptor,
|
|
13
|
-
ChannelResolvedTarget,
|
|
14
|
-
ChannelRenderRequest,
|
|
15
|
-
ChannelRenderResult,
|
|
16
|
-
ChannelSurface,
|
|
17
|
-
ChannelTargetResolveOptions,
|
|
18
|
-
ChannelToolDescriptor,
|
|
19
|
-
} from '@pellux/goodvibes-sdk/platform/channels/types';
|
|
20
|
-
import type { ChannelPlugin } from '@pellux/goodvibes-sdk/platform/channels/plugin-registry';
|
|
21
|
-
import type { ProviderRuntimeSurface } from '@pellux/goodvibes-sdk/platform/channels/provider-runtime';
|
|
22
|
-
import { buildBuiltinAccount, resolveBuiltinAccount } from '@pellux/goodvibes-sdk/platform/channels/builtin/accounts';
|
|
23
|
-
import {
|
|
24
|
-
buildBuiltinContractHooks,
|
|
25
|
-
editBuiltinAllowlist,
|
|
26
|
-
getBuiltinDoctorReport,
|
|
27
|
-
getBuiltinLifecycleState,
|
|
28
|
-
listBuiltinRepairActions,
|
|
29
|
-
migrateBuiltinLifecycle,
|
|
30
|
-
resolveBuiltinAllowlist,
|
|
31
|
-
} from '@pellux/goodvibes-sdk/platform/channels/builtin/contracts';
|
|
32
|
-
import {
|
|
33
|
-
listBuiltinCapabilities,
|
|
34
|
-
listBuiltinOperatorActions,
|
|
35
|
-
listBuiltinTools,
|
|
36
|
-
} from '@pellux/goodvibes-sdk/platform/channels/builtin/descriptors';
|
|
37
|
-
import { getBuiltinSetupSchema } from '@pellux/goodvibes-sdk/platform/channels/builtin/setup-schema';
|
|
38
|
-
import { registerBuiltinChannelPlugins } from '@pellux/goodvibes-sdk/platform/channels/builtin/plugins';
|
|
39
|
-
import type { BuiltinChannelRuntimeDeps, ManagedSurface } from '@pellux/goodvibes-sdk/platform/channels/builtin/shared';
|
|
40
|
-
import {
|
|
41
|
-
authorizeBuiltinActorAction,
|
|
42
|
-
runBuiltinAccountAction,
|
|
43
|
-
runBuiltinProviderApi,
|
|
44
|
-
} from '@pellux/goodvibes-sdk/platform/channels/builtin/account-actions';
|
|
45
|
-
import {
|
|
46
|
-
readConversationKind,
|
|
47
|
-
readDirectoryScope,
|
|
48
|
-
readLifecycleAction,
|
|
49
|
-
} from '@pellux/goodvibes-sdk/platform/channels/builtin/parsing';
|
|
50
|
-
import {
|
|
51
|
-
listBuiltinAgentTools,
|
|
52
|
-
notifyBuiltinApprovalViaRouter,
|
|
53
|
-
renderBuiltinChannelEvent,
|
|
54
|
-
} from '@pellux/goodvibes-sdk/platform/channels/builtin/rendering';
|
|
55
|
-
import { providerRuntimeStatus as providerRuntimeStatusForSurface } from '@pellux/goodvibes-sdk/platform/channels/builtin/surfaces';
|
|
56
|
-
import {
|
|
57
|
-
inferBuiltinTargetConversationKind,
|
|
58
|
-
lookupBuiltinDirectory,
|
|
59
|
-
parseBuiltinExplicitTarget,
|
|
60
|
-
resolveBuiltinParentConversationCandidates,
|
|
61
|
-
resolveBuiltinSessionTarget,
|
|
62
|
-
resolveBuiltinTarget,
|
|
63
|
-
} from '@pellux/goodvibes-sdk/platform/channels/builtin/targets';
|
|
64
|
-
|
|
65
|
-
export class BuiltinChannelRuntime {
|
|
66
|
-
constructor(private readonly deps: BuiltinChannelRuntimeDeps) {}
|
|
67
|
-
|
|
68
|
-
registerPlugins(): void {
|
|
69
|
-
registerBuiltinChannelPlugins({
|
|
70
|
-
deps: this.deps,
|
|
71
|
-
buildAccount: (surface) => this.buildAccount(surface),
|
|
72
|
-
resolveAccount: (surface, accountId) => this.resolveAccount(surface, accountId),
|
|
73
|
-
listCapabilities: (surface) => this.listCapabilities(surface),
|
|
74
|
-
listTools: (surface) => this.listTools(surface),
|
|
75
|
-
runTool: (surface, toolId, input) => this.runTool(surface, toolId, input),
|
|
76
|
-
listOperatorActions: (surface) => this.listOperatorActions(surface),
|
|
77
|
-
runOperatorAction: (surface, actionId, input) => this.runOperatorAction(surface, actionId, input),
|
|
78
|
-
buildContractHooks: (surface) => this.buildContractHooks(surface),
|
|
79
|
-
buildProductHooks: (surface) => this.buildProductHooks(surface),
|
|
80
|
-
lookupDirectory: (surface, query, options) => this.lookupDirectory(surface, query, options),
|
|
81
|
-
lookupRouteDirectory: (surface, query, options) => this.lookupRouteDirectory(surface, query, options),
|
|
82
|
-
notifyApprovalViaRouter: (surface, approval, binding) => this.notifyApprovalViaRouter(surface, approval, binding),
|
|
83
|
-
providerRuntimeStatus: (surface) => this.providerRuntimeStatus(surface),
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
private accountContext() {
|
|
88
|
-
return {
|
|
89
|
-
deps: this.deps,
|
|
90
|
-
providerRuntimeStatus: (surface: ProviderRuntimeSurface) => this.providerRuntimeStatus(surface),
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async buildAccount(surface: ChannelSurface): Promise<ChannelAccountRecord> {
|
|
95
|
-
return buildBuiltinAccount(this.accountContext(), surface);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
async resolveAccount(surface: ChannelSurface, accountId: string): Promise<ChannelAccountRecord | null> {
|
|
99
|
-
return resolveBuiltinAccount(this.accountContext(), surface, accountId);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
private contractContext() {
|
|
103
|
-
return {
|
|
104
|
-
deps: this.deps,
|
|
105
|
-
channelPolicy: this.deps.channelPolicy,
|
|
106
|
-
buildAccount: (surface: ChannelSurface) => this.buildAccount(surface),
|
|
107
|
-
resolveAccount: (surface: ChannelSurface, accountId: string) => this.resolveAccount(surface, accountId),
|
|
108
|
-
resolveTarget: (surface: ChannelSurface, options: ChannelTargetResolveOptions) => this.resolveTarget(surface, options),
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
async listCapabilities(surface: ChannelSurface): Promise<ChannelCapabilityDescriptor[]> {
|
|
113
|
-
const account = await this.buildAccount(surface);
|
|
114
|
-
const plugin = this.deps.channelPlugins.getBySurface(surface);
|
|
115
|
-
return listBuiltinCapabilities(surface, account, plugin?.capabilities ?? []);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
listOperatorActions(surface: ChannelSurface): ChannelOperatorActionDescriptor[] {
|
|
119
|
-
return listBuiltinOperatorActions(surface);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
listTools(surface: ChannelSurface): ChannelToolDescriptor[] {
|
|
123
|
-
return listBuiltinTools(surface);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
async runTool(surface: ChannelSurface, toolId: string, input?: Record<string, unknown>): Promise<unknown> {
|
|
127
|
-
const tool = this.listTools(surface).find((entry) => entry.id === toolId || entry.name === toolId);
|
|
128
|
-
if (!tool) return null;
|
|
129
|
-
const actionId = tool.actionIds[0];
|
|
130
|
-
if (!actionId) return null;
|
|
131
|
-
return this.runOperatorAction(surface, actionId, input);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async runOperatorAction(
|
|
135
|
-
surface: ChannelSurface,
|
|
136
|
-
actionId: string,
|
|
137
|
-
input?: Record<string, unknown>,
|
|
138
|
-
): Promise<unknown> {
|
|
139
|
-
if (actionId === 'inspect-account') {
|
|
140
|
-
const accountId = typeof input?.accountId === 'string' ? input.accountId : undefined;
|
|
141
|
-
return accountId ? this.resolveAccount(surface, accountId) : this.buildAccount(surface);
|
|
142
|
-
}
|
|
143
|
-
if (actionId === 'inspect-status') {
|
|
144
|
-
return this.deps.channelPlugins.listStatus().then((entries) => entries.find((entry) => entry.surface === surface) ?? null);
|
|
145
|
-
}
|
|
146
|
-
if (actionId === 'setup-schema') {
|
|
147
|
-
return this.getSetupSchema(surface);
|
|
148
|
-
}
|
|
149
|
-
if (actionId === 'doctor') {
|
|
150
|
-
const accountId = typeof input?.accountId === 'string' ? input.accountId : undefined;
|
|
151
|
-
return this.getDoctorReport(surface, accountId);
|
|
152
|
-
}
|
|
153
|
-
if (actionId === 'repair-actions') {
|
|
154
|
-
const accountId = typeof input?.accountId === 'string' ? input.accountId : undefined;
|
|
155
|
-
return this.listRepairActions(surface, accountId);
|
|
156
|
-
}
|
|
157
|
-
if (actionId === 'lifecycle-state') {
|
|
158
|
-
const accountId = typeof input?.accountId === 'string' ? input.accountId : undefined;
|
|
159
|
-
return this.getLifecycleState(surface, accountId);
|
|
160
|
-
}
|
|
161
|
-
if (actionId === 'migrate-lifecycle') {
|
|
162
|
-
const accountId = typeof input?.accountId === 'string' ? input.accountId : undefined;
|
|
163
|
-
return this.migrateLifecycle(surface, accountId, input);
|
|
164
|
-
}
|
|
165
|
-
if (actionId === 'list-directory') {
|
|
166
|
-
const scope = readDirectoryScope(input?.scope);
|
|
167
|
-
return this.deps.channelPlugins.queryDirectory(surface, {
|
|
168
|
-
query: typeof input?.query === 'string' ? input.query : undefined,
|
|
169
|
-
...(scope ? { scope } : {}),
|
|
170
|
-
groupId: typeof input?.groupId === 'string' ? input.groupId : undefined,
|
|
171
|
-
limit: typeof input?.limit === 'number' ? input.limit : undefined,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
if (actionId === 'list-capabilities') {
|
|
175
|
-
return this.listCapabilities(surface);
|
|
176
|
-
}
|
|
177
|
-
if (actionId === 'account-action') {
|
|
178
|
-
const action = readLifecycleAction(input?.action ?? input?.accountAction);
|
|
179
|
-
if (!action) {
|
|
180
|
-
return {
|
|
181
|
-
surface,
|
|
182
|
-
ok: false,
|
|
183
|
-
error: 'account-action requires a valid lifecycle action.',
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
return this.runAccountAction(
|
|
187
|
-
surface,
|
|
188
|
-
action,
|
|
189
|
-
typeof input?.accountId === 'string' ? input.accountId : undefined,
|
|
190
|
-
input,
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
if (actionId === 'resolve-target') {
|
|
194
|
-
const targetInput = typeof input?.target === 'string'
|
|
195
|
-
? input.target
|
|
196
|
-
: typeof input?.input === 'string'
|
|
197
|
-
? input.input
|
|
198
|
-
: typeof input?.query === 'string'
|
|
199
|
-
? input.query
|
|
200
|
-
: '';
|
|
201
|
-
if (targetInput.trim().length === 0) {
|
|
202
|
-
return {
|
|
203
|
-
surface,
|
|
204
|
-
ok: false,
|
|
205
|
-
error: 'resolve-target requires "target" or "input".',
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
const preferredKind = readConversationKind(input?.preferredKind);
|
|
209
|
-
return this.resolveTarget(surface, {
|
|
210
|
-
input: targetInput,
|
|
211
|
-
...(typeof input?.accountId === 'string' ? { accountId: input.accountId } : {}),
|
|
212
|
-
...(preferredKind ? { preferredKind } : {}),
|
|
213
|
-
...(typeof input?.threadId === 'string' ? { threadId: input.threadId } : {}),
|
|
214
|
-
...(typeof input?.createIfMissing === 'boolean' ? { createIfMissing: input.createIfMissing } : {}),
|
|
215
|
-
...(typeof input?.live === 'boolean' ? { live: input.live } : {}),
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
if (actionId === 'authorize-actor-action') {
|
|
219
|
-
const targetInput = typeof input?.target === 'string' ? input.target : undefined;
|
|
220
|
-
const target = targetInput
|
|
221
|
-
? await this.resolveTarget(surface, {
|
|
222
|
-
input: targetInput,
|
|
223
|
-
...(typeof input?.accountId === 'string' ? { accountId: input.accountId } : {}),
|
|
224
|
-
createIfMissing: true,
|
|
225
|
-
})
|
|
226
|
-
: undefined;
|
|
227
|
-
return this.authorizeActorAction(surface, {
|
|
228
|
-
actionId: typeof input?.actionId === 'string' ? input.actionId : 'unknown',
|
|
229
|
-
...(typeof input?.actorId === 'string' ? { actorId: input.actorId } : {}),
|
|
230
|
-
...(typeof input?.accountId === 'string' ? { accountId: input.accountId } : {}),
|
|
231
|
-
...(target ? { target } : {}),
|
|
232
|
-
metadata: {},
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
if (actionId === 'resolve-allowlist') {
|
|
236
|
-
return this.resolveAllowlist(surface, {
|
|
237
|
-
...(Array.isArray(input?.add) ? { add: input.add.filter((entry): entry is string => typeof entry === 'string') } : {}),
|
|
238
|
-
...(Array.isArray(input?.remove) ? { remove: input.remove.filter((entry): entry is string => typeof entry === 'string') } : {}),
|
|
239
|
-
...(input?.kind === 'user' || input?.kind === 'channel' || input?.kind === 'group' ? { kind: input.kind } : {}),
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
if (actionId === 'edit-allowlist') {
|
|
243
|
-
return this.editAllowlist(surface, {
|
|
244
|
-
...(Array.isArray(input?.add) ? { add: input.add.filter((entry): entry is string => typeof entry === 'string') } : {}),
|
|
245
|
-
...(Array.isArray(input?.remove) ? { remove: input.remove.filter((entry): entry is string => typeof entry === 'string') } : {}),
|
|
246
|
-
...(typeof input?.groupId === 'string' ? { groupId: input.groupId } : {}),
|
|
247
|
-
...(typeof input?.channelId === 'string' ? { channelId: input.channelId } : {}),
|
|
248
|
-
...(typeof input?.workspaceId === 'string' ? { workspaceId: input.workspaceId } : {}),
|
|
249
|
-
...(input?.kind === 'user' || input?.kind === 'channel' || input?.kind === 'group' ? { kind: input.kind } : {}),
|
|
250
|
-
...(typeof input?.metadata === 'object' && input.metadata !== null ? { metadata: input.metadata as Record<string, unknown> } : {}),
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
if (actionId === 'provider-api') {
|
|
254
|
-
return this.runProviderApi(surface, input);
|
|
255
|
-
}
|
|
256
|
-
return null;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
private buildContractHooks(surface: ChannelSurface): Pick<
|
|
260
|
-
ChannelPlugin,
|
|
261
|
-
| 'setupVersion'
|
|
262
|
-
| 'renderPolicy'
|
|
263
|
-
| 'getSetupSchema'
|
|
264
|
-
| 'doctor'
|
|
265
|
-
| 'listRepairActions'
|
|
266
|
-
| 'getLifecycleState'
|
|
267
|
-
| 'migrateLifecycle'
|
|
268
|
-
| 'resolveAllowlist'
|
|
269
|
-
| 'editAllowlist'
|
|
270
|
-
> {
|
|
271
|
-
return buildBuiltinContractHooks(this.contractContext(), surface);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
private getSetupSchema(surface: ChannelSurface) {
|
|
275
|
-
return getBuiltinSetupSchema(surface);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
private async listRepairActions(surface: ChannelSurface, accountId?: string) {
|
|
279
|
-
return listBuiltinRepairActions(this.contractContext(), surface, accountId);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
private async getDoctorReport(surface: ChannelSurface, accountId?: string) {
|
|
283
|
-
return getBuiltinDoctorReport(this.contractContext(), surface, accountId);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
private async getLifecycleState(surface: ChannelSurface, accountId?: string) {
|
|
287
|
-
return getBuiltinLifecycleState(this.contractContext(), surface, accountId);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
private async migrateLifecycle(
|
|
291
|
-
surface: ChannelSurface,
|
|
292
|
-
accountId?: string,
|
|
293
|
-
input?: Record<string, unknown>,
|
|
294
|
-
) {
|
|
295
|
-
return migrateBuiltinLifecycle(this.contractContext(), surface, accountId, input);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
private async resolveAllowlist(surface: ChannelSurface, input: Parameters<typeof resolveBuiltinAllowlist>[2]) {
|
|
299
|
-
return resolveBuiltinAllowlist(this.contractContext(), surface, input);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
private async editAllowlist(surface: ChannelSurface, input: Parameters<typeof editBuiltinAllowlist>[2]) {
|
|
303
|
-
return editBuiltinAllowlist(this.contractContext(), surface, input);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
private buildProductHooks(surface: ChannelSurface): Pick<
|
|
307
|
-
ChannelPlugin,
|
|
308
|
-
| 'runAccountAction'
|
|
309
|
-
| 'authorizeActorAction'
|
|
310
|
-
| 'parseExplicitTarget'
|
|
311
|
-
| 'inferTargetConversationKind'
|
|
312
|
-
| 'resolveTarget'
|
|
313
|
-
| 'resolveSessionTarget'
|
|
314
|
-
| 'resolveParentConversationCandidates'
|
|
315
|
-
| 'renderEvent'
|
|
316
|
-
| 'listAgentTools'
|
|
317
|
-
> {
|
|
318
|
-
return {
|
|
319
|
-
runAccountAction: (action, accountId, input) => this.runAccountAction(surface, action, accountId, input),
|
|
320
|
-
authorizeActorAction: (request) => this.authorizeActorAction(surface, request),
|
|
321
|
-
parseExplicitTarget: (input, options) => this.parseExplicitTarget(surface, input, options),
|
|
322
|
-
inferTargetConversationKind: (input, options) => this.inferTargetConversationKind(input, options),
|
|
323
|
-
resolveTarget: (options) => this.resolveTarget(surface, options),
|
|
324
|
-
resolveSessionTarget: (target) => this.resolveSessionTarget(target),
|
|
325
|
-
resolveParentConversationCandidates: (options) => this.resolveParentConversationCandidates(surface, options),
|
|
326
|
-
renderEvent: (request) => this.renderChannelEvent(surface, request),
|
|
327
|
-
listAgentTools: () => this.listAgentTools(surface),
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
private async renderChannelEvent(surface: ChannelSurface, request: ChannelRenderRequest): Promise<ChannelRenderResult> {
|
|
332
|
-
return renderBuiltinChannelEvent({
|
|
333
|
-
deps: this.deps,
|
|
334
|
-
listTools: (currentSurface) => this.listTools(currentSurface),
|
|
335
|
-
runTool: (currentSurface, toolId, input) => this.runTool(currentSurface, toolId, input),
|
|
336
|
-
}, surface, request);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
private async notifyApprovalViaRouter(
|
|
340
|
-
surface: ChannelSurface,
|
|
341
|
-
approval: Parameters<typeof notifyBuiltinApprovalViaRouter>[2],
|
|
342
|
-
binding: Parameters<typeof notifyBuiltinApprovalViaRouter>[3],
|
|
343
|
-
): Promise<void> {
|
|
344
|
-
await notifyBuiltinApprovalViaRouter({
|
|
345
|
-
deps: this.deps,
|
|
346
|
-
listTools: (currentSurface) => this.listTools(currentSurface),
|
|
347
|
-
runTool: (currentSurface, toolId, input) => this.runTool(currentSurface, toolId, input),
|
|
348
|
-
}, surface, approval, binding);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
private listAgentTools(surface: ChannelSurface): readonly Tool[] {
|
|
352
|
-
return listBuiltinAgentTools({
|
|
353
|
-
deps: this.deps,
|
|
354
|
-
listTools: (currentSurface) => this.listTools(currentSurface),
|
|
355
|
-
runTool: (currentSurface, toolId, input) => this.runTool(currentSurface, toolId, input),
|
|
356
|
-
}, surface);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
private async runAccountAction(
|
|
360
|
-
surface: ChannelSurface,
|
|
361
|
-
action: ChannelAccountLifecycleAction,
|
|
362
|
-
accountId?: string,
|
|
363
|
-
input?: Record<string, unknown>,
|
|
364
|
-
): Promise<ChannelAccountLifecycleResult> {
|
|
365
|
-
return runBuiltinAccountAction({
|
|
366
|
-
deps: this.deps,
|
|
367
|
-
buildAccount: (currentSurface) => this.buildAccount(currentSurface),
|
|
368
|
-
resolveAccount: (currentSurface, currentAccountId) => this.resolveAccount(currentSurface, currentAccountId),
|
|
369
|
-
}, surface, action, accountId, input);
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
private async authorizeActorAction(
|
|
373
|
-
surface: ChannelSurface,
|
|
374
|
-
request: ChannelActorAuthorizationRequest,
|
|
375
|
-
): Promise<ChannelActorAuthorizationResult> {
|
|
376
|
-
return authorizeBuiltinActorAction({
|
|
377
|
-
deps: this.deps,
|
|
378
|
-
buildAccount: (currentSurface) => this.buildAccount(currentSurface),
|
|
379
|
-
resolveAccount: (currentSurface, currentAccountId) => this.resolveAccount(currentSurface, currentAccountId),
|
|
380
|
-
}, surface, request);
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
private async runProviderApi(surface: ChannelSurface, input?: Record<string, unknown>): Promise<unknown> {
|
|
384
|
-
return runBuiltinProviderApi({
|
|
385
|
-
deps: this.deps,
|
|
386
|
-
buildAccount: (currentSurface) => this.buildAccount(currentSurface),
|
|
387
|
-
resolveAccount: (currentSurface, currentAccountId) => this.resolveAccount(currentSurface, currentAccountId),
|
|
388
|
-
}, surface, input);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
private parseExplicitTarget(
|
|
392
|
-
surface: ChannelSurface,
|
|
393
|
-
input: string,
|
|
394
|
-
options?: ChannelTargetResolveOptions,
|
|
395
|
-
): ChannelResolvedTarget | null {
|
|
396
|
-
return parseBuiltinExplicitTarget(surface, input, options);
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
private inferTargetConversationKind(
|
|
400
|
-
input: string,
|
|
401
|
-
options?: ChannelTargetResolveOptions,
|
|
402
|
-
): ChannelConversationKind {
|
|
403
|
-
return inferBuiltinTargetConversationKind(input, options);
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
private async resolveTarget(
|
|
407
|
-
surface: ChannelSurface,
|
|
408
|
-
options: ChannelTargetResolveOptions,
|
|
409
|
-
): Promise<ChannelResolvedTarget | null> {
|
|
410
|
-
return resolveBuiltinTarget({ deps: this.deps }, surface, options);
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
private async resolveParentConversationCandidates(
|
|
414
|
-
surface: ChannelSurface,
|
|
415
|
-
options: ChannelTargetResolveOptions,
|
|
416
|
-
): Promise<readonly ChannelResolvedTarget[]> {
|
|
417
|
-
return resolveBuiltinParentConversationCandidates({ deps: this.deps }, surface, options);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
private resolveSessionTarget(target: ChannelResolvedTarget): string {
|
|
421
|
-
return resolveBuiltinSessionTarget(target);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
private providerRuntimeStatus(surface: ProviderRuntimeSurface): unknown {
|
|
425
|
-
return providerRuntimeStatusForSurface(this.deps, surface);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
private async lookupDirectory(
|
|
429
|
-
surface: ManagedSurface,
|
|
430
|
-
query: string,
|
|
431
|
-
options?: ChannelDirectoryQueryOptions,
|
|
432
|
-
): Promise<ChannelDirectoryEntry[]> {
|
|
433
|
-
return lookupBuiltinDirectory({ deps: this.deps }, surface, query, options);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
private async lookupRouteDirectory(
|
|
437
|
-
surface: ManagedSurface,
|
|
438
|
-
query: string,
|
|
439
|
-
options?: ChannelDirectoryQueryOptions,
|
|
440
|
-
): Promise<ChannelDirectoryEntry[]> {
|
|
441
|
-
return lookupBuiltinDirectory({ deps: this.deps }, surface, query, { ...options, live: false });
|
|
442
|
-
}
|
|
443
|
-
}
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { ArtifactStore, type ArtifactAttachment, type ArtifactReference } from '@pellux/goodvibes-sdk/platform/artifacts/index';
|
|
2
|
-
import { ConfigManager } from '@pellux/goodvibes-sdk/platform/config/manager';
|
|
3
|
-
import { ServiceRegistry } from '../../config/service-registry.ts';
|
|
4
|
-
import type {
|
|
5
|
-
ChannelDeliveryRequest,
|
|
6
|
-
ChannelDeliveryResult,
|
|
7
|
-
ChannelDeliverySurfaceKind,
|
|
8
|
-
ChannelDeliveryTarget,
|
|
9
|
-
} from '@pellux/goodvibes-sdk/platform/channels/delivery/types';
|
|
10
|
-
|
|
11
|
-
export function resolveChannelDeliverySurfaceKind(
|
|
12
|
-
target: ChannelDeliveryTarget,
|
|
13
|
-
): ChannelDeliverySurfaceKind | undefined {
|
|
14
|
-
return target.surfaceKind ?? (target.kind === 'webhook' ? 'webhook' : undefined);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function titleFromBody(body: string): string {
|
|
18
|
-
const firstLine = body.split('\n').find((line) => line.trim().length > 0) ?? 'goodvibes automation';
|
|
19
|
-
return firstLine.slice(0, 80);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function success(responseId?: string): ChannelDeliveryResult {
|
|
23
|
-
return responseId === undefined ? {} : { responseId };
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function buildArtifactContentPath(artifactId: string): string {
|
|
27
|
-
return `/api/artifacts/${encodeURIComponent(artifactId)}/content`;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function buildArtifactContentUrl(configManager: ConfigManager, artifactId: string): string | undefined {
|
|
31
|
-
const baseUrl = String(configManager.get('controlPlane.baseUrl') ?? configManager.get('web.publicBaseUrl') ?? '').trim();
|
|
32
|
-
if (!baseUrl) return undefined;
|
|
33
|
-
return new URL(buildArtifactContentPath(artifactId), baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`).toString();
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export async function resolveAttachments(
|
|
37
|
-
request: ChannelDeliveryRequest,
|
|
38
|
-
artifactStore: ArtifactStore,
|
|
39
|
-
configManager: ConfigManager,
|
|
40
|
-
inlineLimitBytes?: number,
|
|
41
|
-
): Promise<ArtifactAttachment[]> {
|
|
42
|
-
const references = request.attachments ?? [];
|
|
43
|
-
const attachments: ArtifactAttachment[] = [];
|
|
44
|
-
for (const reference of references) {
|
|
45
|
-
attachments.push(await artifactStore.toAttachment(reference, {
|
|
46
|
-
contentUrl: buildArtifactContentUrl(configManager, reference.artifactId),
|
|
47
|
-
...(typeof inlineLimitBytes === 'number' ? { includeBase64IfSmallerThan: inlineLimitBytes } : {}),
|
|
48
|
-
}));
|
|
49
|
-
}
|
|
50
|
-
return attachments;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function appendAttachmentSummary(body: string, attachments: readonly ArtifactAttachment[]): string {
|
|
54
|
-
if (attachments.length === 0) return body;
|
|
55
|
-
const lines = attachments.map((attachment) => {
|
|
56
|
-
const target = attachment.contentUrl ?? attachment.contentPath;
|
|
57
|
-
const name = attachment.filename ?? attachment.label ?? attachment.artifactId;
|
|
58
|
-
return `- ${name} (${attachment.mimeType}, ${attachment.sizeBytes} bytes): ${target}`;
|
|
59
|
-
});
|
|
60
|
-
return `${body.trimEnd()}\n\nAttachments:\n${lines.join('\n')}`;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function trimForSurface(body: string, maxChars: number): string {
|
|
64
|
-
const normalized = body.replace(/\r\n/g, '\n').trim();
|
|
65
|
-
if (normalized.length <= maxChars) return normalized;
|
|
66
|
-
return `${normalized.slice(0, Math.max(0, maxChars - 3)).trimEnd()}...`;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export function firstNonEmpty(...values: Array<string | undefined | null>): string | undefined {
|
|
70
|
-
for (const value of values) {
|
|
71
|
-
if (typeof value === 'string' && value.trim().length > 0) return value.trim();
|
|
72
|
-
}
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export function normalizeBaseUrl(value: string): string {
|
|
77
|
-
return value.replace(/\/+$/, '');
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const msTeamsTokenCache = new Map<string, { readonly token: string; readonly expiresAt: number }>();
|
|
81
|
-
|
|
82
|
-
export async function resolveMSTeamsAccessToken(
|
|
83
|
-
configManager: ConfigManager,
|
|
84
|
-
serviceRegistry: ServiceRegistry,
|
|
85
|
-
): Promise<string> {
|
|
86
|
-
const appId = firstNonEmpty(
|
|
87
|
-
String(configManager.get('surfaces.msteams.appId') ?? ''),
|
|
88
|
-
process.env.MSTEAMS_APP_ID,
|
|
89
|
-
);
|
|
90
|
-
const appPassword = firstNonEmpty(
|
|
91
|
-
await serviceRegistry.resolveSecret('msteams', 'password'),
|
|
92
|
-
String(configManager.get('surfaces.msteams.appPassword') ?? ''),
|
|
93
|
-
process.env.MSTEAMS_APP_PASSWORD,
|
|
94
|
-
);
|
|
95
|
-
const tenantId = firstNonEmpty(
|
|
96
|
-
String(configManager.get('surfaces.msteams.tenantId') ?? ''),
|
|
97
|
-
process.env.MSTEAMS_TENANT_ID,
|
|
98
|
-
'botframework.com',
|
|
99
|
-
)!;
|
|
100
|
-
if (!appId) throw new Error('Missing Microsoft Teams app id');
|
|
101
|
-
if (!appPassword) throw new Error('Missing Microsoft Teams app password');
|
|
102
|
-
const cacheKey = `${tenantId}:${appId}`;
|
|
103
|
-
const cached = msTeamsTokenCache.get(cacheKey);
|
|
104
|
-
if (cached && cached.expiresAt > Date.now() + 60_000) {
|
|
105
|
-
return cached.token;
|
|
106
|
-
}
|
|
107
|
-
const body = new URLSearchParams({
|
|
108
|
-
grant_type: 'client_credentials',
|
|
109
|
-
client_id: appId,
|
|
110
|
-
client_secret: appPassword,
|
|
111
|
-
scope: 'https://api.botframework.com/.default',
|
|
112
|
-
});
|
|
113
|
-
const response = await fetch(`https://login.microsoftonline.com/${encodeURIComponent(tenantId)}/oauth2/v2.0/token`, {
|
|
114
|
-
method: 'POST',
|
|
115
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
116
|
-
body: body.toString(),
|
|
117
|
-
});
|
|
118
|
-
const payload = await requireOkResponse('Microsoft Teams token request failed', response);
|
|
119
|
-
const record = payload && typeof payload === 'object' ? payload as Record<string, unknown> : null;
|
|
120
|
-
const token = typeof record?.access_token === 'string' ? record.access_token.trim() : '';
|
|
121
|
-
const expiresIn = typeof record?.expires_in === 'number'
|
|
122
|
-
? record.expires_in
|
|
123
|
-
: typeof record?.expires_in === 'string'
|
|
124
|
-
? Number(record.expires_in)
|
|
125
|
-
: 300;
|
|
126
|
-
if (!token) throw new Error('Microsoft Teams token request did not return an access token');
|
|
127
|
-
msTeamsTokenCache.set(cacheKey, {
|
|
128
|
-
token,
|
|
129
|
-
expiresAt: Date.now() + Math.max(60, Number.isFinite(expiresIn) ? expiresIn : 300) * 1_000,
|
|
130
|
-
});
|
|
131
|
-
return token;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export function extractResponseId(payload: unknown): string | undefined {
|
|
135
|
-
if (!payload || typeof payload !== 'object') return undefined;
|
|
136
|
-
const record = payload as Record<string, unknown>;
|
|
137
|
-
const direct = record.id;
|
|
138
|
-
if (typeof direct === 'string' && direct.trim().length > 0) return direct.trim();
|
|
139
|
-
if (typeof direct === 'number' && Number.isFinite(direct)) return String(direct);
|
|
140
|
-
const name = record.name;
|
|
141
|
-
if (typeof name === 'string' && name.trim().length > 0) return name.trim();
|
|
142
|
-
const messageId = record.message_id;
|
|
143
|
-
if (typeof messageId === 'number' && Number.isFinite(messageId)) return String(messageId);
|
|
144
|
-
if (typeof messageId === 'string' && messageId.trim().length > 0) return messageId.trim();
|
|
145
|
-
const result = record.result;
|
|
146
|
-
if (result && typeof result === 'object') return extractResponseId(result);
|
|
147
|
-
return undefined;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
async function readResponsePayload(response: Response): Promise<unknown> {
|
|
151
|
-
const contentType = response.headers.get('content-type') ?? '';
|
|
152
|
-
if (contentType.includes('application/json')) {
|
|
153
|
-
try {
|
|
154
|
-
return await response.json();
|
|
155
|
-
} catch {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
try {
|
|
160
|
-
const text = await response.text();
|
|
161
|
-
return text.trim().length > 0 ? text : null;
|
|
162
|
-
} catch {
|
|
163
|
-
return null;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export async function requireOkResponse(label: string, response: Response): Promise<unknown> {
|
|
168
|
-
const payload = await readResponsePayload(response);
|
|
169
|
-
if (!response.ok) {
|
|
170
|
-
const detail = typeof payload === 'string'
|
|
171
|
-
? payload
|
|
172
|
-
: payload && typeof payload === 'object'
|
|
173
|
-
? JSON.stringify(payload)
|
|
174
|
-
: '';
|
|
175
|
-
throw new Error(`${label} HTTP ${response.status}${detail ? `: ${detail}` : ''}`);
|
|
176
|
-
}
|
|
177
|
-
return payload;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export async function postBridgePayload(
|
|
181
|
-
bridgeUrl: string,
|
|
182
|
-
payload: Record<string, unknown>,
|
|
183
|
-
options: {
|
|
184
|
-
readonly label: string;
|
|
185
|
-
readonly token?: string;
|
|
186
|
-
},
|
|
187
|
-
): Promise<string | undefined> {
|
|
188
|
-
const response = await fetch(bridgeUrl, {
|
|
189
|
-
method: 'POST',
|
|
190
|
-
headers: {
|
|
191
|
-
'Content-Type': 'application/json',
|
|
192
|
-
...(options.token ? { Authorization: `Bearer ${options.token}` } : {}),
|
|
193
|
-
'X-GoodVibes-Channel': String(payload.surface ?? 'bridge'),
|
|
194
|
-
},
|
|
195
|
-
body: JSON.stringify(payload),
|
|
196
|
-
});
|
|
197
|
-
const result = await requireOkResponse(options.label, response);
|
|
198
|
-
return extractResponseId(result) ?? bridgeUrl;
|
|
199
|
-
}
|