@hotmeshio/long-tail 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,230 +1,165 @@
1
1
  # Long Tail
2
2
 
3
- Long Tail treats uncertainty as part of the workflow — not as an error, but as an undiscovered pathway. When confidence is low, the task escalates. When a human can't fix it, AI triages with the tools at hand. When AI finds the fix, the solution is compiled into a deterministic workflow so the next occurrence runs automatically — no LLM, no human, no cost.
3
+ Durable workflows with IAM, Human in the Loop, and MCP tool orchestration. Backed by PostgreSQL.
4
4
 
5
- The system works because everything is treated as a **tool**.
5
+ ```bash
6
+ npm install @hotmeshio/long-tail
7
+ ```
6
8
 
7
- Activities, AI models, human reviewers, and compiled workflows all expose the same interface. A workflow doesn't need to know whether its next step is code, a model, or a person waiting on a screen. The protocol is the same. This is what makes handoffs seamless and what lets the system compose solutions from parts it already has.
9
+ ## Use Long Tail for
8
10
 
9
- ## Quick Start
11
+ - **Durable execution** — Your functions run as workflows and checkpoint to Postgres. If the process crashes, execution resumes from the last completed step.
12
+ - **Identity everywhere** — Workflows know who started them, whose credentials govern their execution, and what permissions are in play. IAM is not bolted on — it's woven into every activity call.
13
+ - **Human-in-the-loop** — When confidence is low, the workflow escalates. RBAC-scoped escalation chains route work to the right reviewer. Approval workflows, content review, document verification — the pattern is the same.
14
+ - **AI triage** — When human-in-the-loop teams can't resolve a request, AI takes over. Its tool calls are checkpointed. And when the fix works, it compiles into a deterministic pipeline for next time.
15
+ - **MCP tool orchestration** — Describe what you need. If you've registered the tools, the Pipeline Designer builds the workflow. Every compiled pipeline deploys as a reusable MCP tool.
10
16
 
11
- ```bash
12
- git clone https://github.com/hotmeshio/long-tail.git
13
- cd long-tail
14
- docker compose up -d --build
15
- ```
17
+ A dashboard, REST API, and live event stream ship with the package. Use what you need.
16
18
 
17
- Open [http://localhost:3000](http://localhost:3000) once healthy (~10s). Four workflows seed the dashboard.
19
+ ## Start
18
20
 
19
- | User | Password | Role |
20
- |------|----------|------|
21
- | `superadmin` | `l0ngt@1l` | superadmin |
22
- | `admin` | `l0ngt@1l` | admin |
23
- | `engineer` | `l0ngt@1l` | engineer |
24
- | `reviewer` | `l0ngt@1l` | reviewer |
21
+ Point at Postgres. Everything else is optional.
22
+
23
+ ```typescript
24
+ import { start } from '@hotmeshio/long-tail';
25
+ import * as myWorkflow from './workflows/my-workflow';
25
26
 
26
- To reset: `docker compose down -v && docker compose up -d --build`
27
+ const lt = await start({
28
+ database: { host: 'localhost', port: 5432, user: 'postgres', password: 'password', database: 'mydb' },
29
+ workers: [{ taskQueue: 'default', workflow: myWorkflow.reviewContent }],
30
+ auth: { secret: process.env.JWT_SECRET },
31
+ });
32
+ ```
27
33
 
28
- ## Write a Workflow
34
+ Dashboard at [http://localhost:3000](http://localhost:3000). The [boilerplate](https://github.com/hotmeshio/long-tail-boilerplate) has a working project with custom MCP servers, MinIO, and example workflows.
29
35
 
30
- A **workflow** is a deterministic function. It receives an envelope, makes decisions, and returns a result. If the process crashes mid-execution, the workflow replays from its last checkpoint — no work is lost, no step runs twice.
36
+ ## Write a Durable Workflow
31
37
 
32
- Register it with Long Tail and it becomes a **certified workflow**. The interceptor wraps every execution in an escalation chain: sub-workflows that would normally throw instead escalate, humans and AI collaborate to resolve, and the original workflow resumes with the answer. A certified workflow cannot silently fail every error is either handled or surfaced.
38
+ A workflow receives an envelope and returns a result. Each activity call checkpointsno work is lost, no step runs twice.
33
39
 
34
40
  ```typescript
35
41
  import { Durable } from '@hotmeshio/hotmesh';
36
- import type { LTEnvelope, LTReturn, LTEscalation } from '@hotmeshio/long-tail';
42
+ import type { LTEnvelope } from '@hotmeshio/long-tail';
37
43
  import * as activities from './activities';
38
44
 
39
- const { analyzeContent } = Durable.workflow.proxyActivities<typeof activities>({
40
- activities,
41
- });
42
-
43
- export async function reviewContent(
44
- envelope: LTEnvelope,
45
- ): Promise<LTReturn | LTEscalation> {
46
-
47
- // A resolved escalation re-enters here with the human's decision
48
- if (envelope.resolver) {
49
- return {
50
- type: 'return',
51
- data: {
52
- ...envelope.data,
53
- resolution: envelope.resolver,
54
- },
55
- };
56
- }
45
+ const { analyzeContent } = Durable.workflow.proxyActivities<typeof activities>({ activities });
57
46
 
47
+ export async function reviewContent(envelope: LTEnvelope) {
58
48
  const analysis = await analyzeContent(envelope.data.content);
59
49
 
60
50
  if (analysis.confidence >= 0.85) {
61
- return {
62
- type: 'return',
63
- data: { approved: true, analysis },
64
- };
51
+ return { type: 'return' as const, data: { approved: true, analysis } };
65
52
  }
66
53
 
67
- // Low confidence — escalate to a human reviewer
68
54
  return {
69
- type: 'escalation',
70
- data: {
71
- content: envelope.data.content,
72
- analysis,
73
- },
74
- message: `Review needed (confidence: ${analysis.confidence})`,
55
+ type: 'escalation' as const,
75
56
  role: 'reviewer',
57
+ message: `Review needed (confidence: ${analysis.confidence})`,
58
+ data: { content: envelope.data.content, analysis },
76
59
  };
77
60
  }
78
61
  ```
79
62
 
80
- Side effects — API calls, LLM invocations, database queries — live in **activity** functions. The `proxyActivities` call wraps them so the workflow engine can checkpoint each result. If a crash occurs, activities replay from cache rather than re-executing.
81
-
82
- ## Every Activity is a Tool
83
-
84
- The `proxyActivities` call in the workflow above does more than checkpoint `analyzeContent` — it also registers it as an **MCP tool**. The function you write is both a durable workflow step and a tool that any agent, workflow, or compiled pipeline can invoke.
85
-
86
- The same is true in reverse: register an MCP server and its tools become proxy activities automatically.
63
+ Activities are plain functions with side effects — API calls, LLM invocations, database queries. The `proxyActivities` call wraps them so the engine can checkpoint each result.
87
64
 
88
65
  ```typescript
89
- // This function is BOTH an activity AND a tool.
90
- // Called by a workflow via proxyActivities, it's checkpointed.
91
- // Exposed via MCP, it's discoverable by agents and other workflows.
92
- export async function classify(args: { content: string }) {
93
- const response = await llm.analyze(args.content);
94
- return { category: response.category, confidence: response.confidence };
66
+ // activities.ts
67
+ export async function analyzeContent(content: string) {
68
+ const result = await llm.classify(content);
69
+ return { confidence: result.confidence, flags: result.flags };
95
70
  }
96
71
  ```
97
72
 
98
- Humans are tools too. Long Tail exposes its escalation queue as an MCP server (`long-tail-human-queue`). Compiled workflows are tools. An agent can call a human the same way it calls a database. A human can kick a task to AI the same way they'd assign it to a colleague. The protocol doesn't care who's on either end.
99
-
100
- This uniformity is what makes the system composable — and it's what closes the loop from uncertainty to automation.
101
-
102
- See the [Architecture Guide](docs/architecture.md) for project structure, conventions, built-in servers, and tag-based tool discovery. See the [MCP Guide](docs/mcp.md) for server registration, tool calls, and the human queue protocol.
73
+ ## Certify a Workflow
103
74
 
104
- ## Workflow Function Registration and Startup
105
-
106
- Register and start. MCP Servers initialize, workers start, and the API listens. The only infrastructure is PostgreSQL.
107
-
108
- ```typescript
109
- import { start } from '@hotmeshio/long-tail';
110
- import * as myWorkflow from './workflows/my-workflow';
111
-
112
- const lt = await start({
113
- database: {
114
- host: 'localhost',
115
- port: 5432,
116
- user: 'postgres',
117
- password: 'password',
118
- database: 'mydb',
119
- },
120
- workers: [{
121
- taskQueue: 'my-queue',
122
- workflow: myWorkflow.reviewContent,
123
- }],
124
- });
75
+ Any durable workflow can be promoted to **certified** through the dashboard or API. A certified workflow gains interceptor guarantees: failures escalate instead of throwing, escalation chains route through roles, and every error is either handled or surfaced. It cannot silently fail.
125
76
 
126
- const handle = await lt.client.workflow.start({
127
- args: [{
128
- data: { content: 'Review this' },
129
- metadata: {},
130
- }],
131
- taskQueue: 'my-queue',
132
- workflowName: 'reviewContent',
133
- workflowId: `review-${Date.now()}`,
134
- });
77
+ ```bash
78
+ curl -X PUT http://localhost:3000/api/workflows/reviewContent/config \
79
+ -H "Authorization: Bearer $TOKEN" \
80
+ -d '{ "invocable": true, "task_queue": "default", "default_role": "reviewer" }'
135
81
  ```
136
82
 
137
- See the full [Workflows Guide](docs/workflows.md) for activities, the interceptor, escalation lifecycle, composition, and testing.
138
-
139
- ## How the System Evolves
83
+ De-certifying removes the interceptor. The workflow continues as a standard durable workflow — same code, different guarantees.
140
84
 
141
- The escalation in the workflow above — `{ type: 'escalation' }` — is where the system starts learning. Four layers work together, each one feeding the next.
85
+ ## Register an MCP Server
142
86
 
143
- ### 1. Escalation
87
+ Write an MCP server to expose your own tools. The `registerMcpTool` helper handles the SDK's type complexity.
144
88
 
145
- When AI isn't confident, the workflow returns `{ type: 'escalation' }`. The interceptor creates a record with full context — what the AI tried, what it saw, why it wasn't sure. A human claims the work through the dashboard or API, resolves it, and the workflow re-runs with their decision.
146
-
147
- ```
148
- POST /api/escalations/esc-abc123/resolve
149
- { "resolverPayload": { "approved": true, "notes": "Content is fine" } }
89
+ ```typescript
90
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
91
+ import { z } from 'zod';
92
+ import { registerMcpTool } from '@hotmeshio/long-tail';
93
+
94
+ export function createImageToolsServer(): McpServer {
95
+ const server = new McpServer({ name: 'image-tools', version: '1.0.0' });
96
+
97
+ registerMcpTool(server, 'resize_image', 'Resize an image.', {
98
+ path: z.string().describe('Path to the image'),
99
+ width: z.number().optional().describe('Target width'),
100
+ height: z.number().optional().describe('Target height'),
101
+ }, async (args: any) => ({
102
+ content: [{ type: 'text', text: JSON.stringify(await resize(args)) }],
103
+ }));
104
+
105
+ return server;
106
+ }
150
107
  ```
151
108
 
152
- Most escalations end here. The human had the judgment the AI lacked. But sometimes the human *can't* fix it — the problem isn't a judgment call, it's a process gap.
153
-
154
- ### 2. Triage
155
-
156
- An upside-down page, a document in the wrong language, a missing API credential — the human flags `needsTriage` with a hint, and an AI triage agent takes over.
157
-
158
- Because every activity is a tool, the triage agent already has what it needs. It queries the escalation history, discovers available tools by tag, and runs an agentic loop — rotate the page, re-extract data, call an external API, validate against a database. Every tool call is checkpointed. If the agent can't fix it either, it escalates to an engineer with a full diagnosis. The engineer might install a missing tool, fix a configuration, then send it back. The handoff is always bidirectional — human to AI, AI to human, human to different human — until the problem is resolved and the original workflow gets its answer.
109
+ Register it at startup and it appears in the dashboard:
159
110
 
160
- ### 3. Compilation — Dynamic to Deterministic
161
-
162
- Every dynamic execution — whether from triage, an MCP query, or any agentic workflow — produces a recording of which tools were called, in what order, with what data flow between them. The workflow compiler analyzes that recording and converts it into a deterministic YAML pipeline:
163
-
164
- ```
165
- Dynamic execution (LLM-driven) Compiled workflow (deterministic)
166
- navigate_to(url) step 1: navigate_to
167
- extract_links(page) → step 2: extract_links
168
- screenshot(link) × N step 3: screenshot (iterates over step 2 output)
111
+ ```typescript
112
+ const lt = await start({
113
+ // ...
114
+ mcp: {
115
+ serverFactories: { 'image-tools': createImageToolsServer },
116
+ },
117
+ });
169
118
  ```
170
119
 
171
- The compiler detects iteration patterns, traces data provenance between steps, classifies which inputs are dynamic (user-provided) versus fixed (implementation details), and generates a parameterized input schema. A dashboard wizard walks through the full lifecycle: review the original execution, profile the tool pipeline, configure inputs and tags, deploy, test side-by-side against the original, and verify end-to-end.
172
-
173
- The compiled workflow deploys as a new MCP tool — tagged for discovery, versioned, and invocable by any agent, workflow, or API call. See the [Compilation Pipeline Guide](docs/compilation.md) for a detailed walkthrough with screenshots.
120
+ ## Ask It Anything
174
121
 
175
- ### 4. Routing The Loop Closes
122
+ Once your tools are registered, the Pipeline Designer orchestrates them. Describe what you need in plain language:
176
123
 
177
- Once deployed, the system routes automatically. Every request passes through the `mcpQueryRouter`, which checks: has this problem been solved before?
124
+ > *"Log into localhost:3000 as superadmin, navigate to every page in the sidebar, and save a screenshot of each."*
178
125
 
179
- ```
180
- User prompt → Router → Discovery (FTS + tags) → LLM Judge (scope match?)
181
- │ │
182
- │ confidence ≥ 0.7 │ no match
183
- ▼ ▼
184
- mcpDeterministic mcpQuery
185
- (compiled YAML, no LLM) (dynamic, LLM agentic loop)
186
- ```
126
+ The system discovers the right MCP servers, calls the tools, chains the results. If it works, the compilation wizard converts the execution into a deterministic pipeline — parameterized inputs, typed schema, no LLM at runtime. It deploys as a new MCP tool that any workflow, agent, or API call can invoke.
187
127
 
188
- The deterministic path skips LLM reasoning entirely it extracts structured inputs from the prompt, maps them to the compiled workflow's schema, and executes the YAML pipeline directly. What took minutes with an LLM now runs in seconds. What cost tokens now costs nothing.
128
+ The inventory of compiled tools grows over time. The need for LLM reasoning shrinks. Problems that once required a human, then required an AI, eventually require neither.
189
129
 
190
- The dynamic path still works exactly as before — and every dynamic execution is a candidate for compilation. The system accumulates deterministic solutions over time. The inventory of tools grows. The need for LLM reasoning shrinks. Problems that once required a human, then required an AI, eventually require neither.
191
-
192
- ## Developer API
130
+ ## Full Configuration
193
131
 
194
132
  ```typescript
195
- import { start } from '@hotmeshio/long-tail';
196
-
197
133
  const lt = await start({
198
134
  database: { connectionString: process.env.DATABASE_URL },
199
- workers: [{ taskQueue: 'my-queue', workflow: myWorkflow.reviewContent }],
135
+ workers: [{ taskQueue: 'default', workflow: myWorkflow.reviewContent }],
200
136
 
201
137
  // Everything below is optional
202
- examples: true, // seed demo workflows
203
- mcp: { server: { enabled: true } }, // MCP server + clients
204
- escalation: { strategy: 'mcp' }, // AI triage on escalation
205
- auth: { secret: process.env.JWT_SECRET }, // JWT auth + IAM identity context
206
- telemetry: { honeycomb: { apiKey: process.env.HNY } }, // OpenTelemetry
207
- events: { nats: { url: 'nats://localhost:4222' } }, // real-time events
208
- logging: { pino: { level: 'info' } }, // structured logging
209
- maintenance: true, // scheduled cleanup
138
+ mcp: {
139
+ server: { enabled: true },
140
+ serverFactories: { 'my-tools': createMyToolsServer },
141
+ },
142
+ escalation: { strategy: 'mcp' },
143
+ auth: { secret: process.env.JWT_SECRET },
144
+ telemetry: { honeycomb: { apiKey: process.env.HNY } },
145
+ logging: { pino: { level: 'info' } },
146
+ maintenance: true,
210
147
  });
211
148
  ```
212
149
 
213
- Every cross-cutting concern follows the same pattern: implement a typed interface, register at startup, done. Every workflow executes with identity context — who initiated the request, which user or bot it runs as, and what credentials it holds. Escalations carry the same context, so reviewers see exactly who triggered the work and what permissions were in play. See the [Docs](#docs) section for the full list of guides.
214
-
215
150
  ## Deployment
216
151
 
217
- Two container types from the same codebase — one serves the API, the other executes workflows:
152
+ Two container types from the same codebase:
218
153
 
219
154
  ```typescript
220
- // api.ts — REST endpoints, no workflow execution
155
+ // api.ts — dashboard + REST API
221
156
  await start({ database: { connectionString: process.env.DATABASE_URL } });
222
157
 
223
158
  // worker.ts — workflow execution, no HTTP server
224
159
  await start({
225
160
  database: { connectionString: process.env.DATABASE_URL },
226
161
  server: { enabled: false },
227
- workers: [{ taskQueue: 'my-queue', workflow: reviewContent.reviewContent }],
162
+ workers: [{ taskQueue: 'default', workflow: reviewContent.reviewContent }],
228
163
  });
229
164
  ```
230
165
 
@@ -234,29 +169,39 @@ Both share PostgreSQL and scale independently. See [Cloud Deployment](docs/cloud
234
169
 
235
170
  | Guide | What it covers |
236
171
  |-------|---------------|
237
- | [Compilation Pipeline](docs/compilation.md) | Dynamic deterministic: full wizard walkthrough with screenshots |
238
- | [Workflows](docs/workflows.md) | Activities, interceptor, escalation lifecycle, composition, testing |
239
- | [Architecture](docs/architecture.md) | Project structure, conventions, built-in MCP servers, tag-based discovery |
240
- | [MCP](docs/mcp.md) | Server registration, tool calls, human queue, compiled workflows as tools |
241
- | [Escalation Strategies](docs/escalation-strategies.md) | Default, MCP triage, and custom escalation handlers |
242
- | [Cloud Deployment](docs/cloud.md) | AWS ECS, GCP Cloud Run, Docker configurations |
243
- | [Data Model](docs/data.md) | Database schema and tables |
244
- | [Contributing](docs/contributing.md) | Development setup and guidelines |
172
+ | [Workflows](docs/workflows.md) | Activities, interceptor, escalation lifecycle, composition |
173
+ | [IAM](docs/iam.md) | Identity propagation, service accounts, credential exchange |
174
+ | [Dashboard](docs/dashboard.md) | Navigation, key pages, event feed |
175
+ | [MCP](docs/mcp.md) | Server registration, tool calls, human queue |
176
+ | [Compilation](docs/compilation.md) | Dynamic deterministic pipeline wizard |
177
+ | [Escalation Strategies](docs/escalation-strategies.md) | Default, MCP triage, custom handlers |
178
+ | [Architecture](docs/architecture.md) | Project structure, conventions, discovery |
179
+ | [Cloud](docs/cloud.md) | AWS ECS, GCP Cloud Run, Docker |
180
+ | [Data Model](docs/data.md) | Database schema |
245
181
 
246
- ### Adapter Guides
182
+ **Adapters:** [Auth](docs/auth.md) · [Events](docs/events.md) · [Telemetry](docs/telemetry.md) · [Logging](docs/logging.md) · [Maintenance](docs/maintenance.md) · [OAuth](docs/oauth-and-delegation.md)
247
183
 
248
- [Auth](docs/auth.md) | [Events](docs/events.md) | [Telemetry](docs/telemetry.md) | [Logging](docs/logging.md) | [Maintenance](docs/maintenance.md)
184
+ **API:** [Workflows](docs/api/workflows.md) · [Tasks](docs/api/tasks.md) · [Escalations](docs/api/escalations.md) · [YAML Workflows](docs/api/yaml-workflows.md) · [Users](docs/api/users.md) · [Roles](docs/api/roles.md) · [Service Accounts](docs/api/service-accounts.md) · [MCP Servers](docs/api/mcp-servers.md) · [MCP Runs](docs/api/mcp-runs.md) · [Exports](docs/api/exports.md)
249
185
 
250
- ### API Reference
251
-
252
- [Workflows](docs/api/workflows.md) | [Tasks](docs/api/tasks.md) | [Escalations](docs/api/escalations.md) | [YAML Workflows](docs/api/yaml-workflows.md) | [Users](docs/api/users.md) | [Roles](docs/api/roles.md) | [MCP Servers](docs/api/mcp-servers.md) | [MCP Runs](docs/api/mcp-runs.md) | [Namespaces](docs/api/namespaces.md) | [Settings](docs/api/settings.md) | [Maintenance](docs/api/maintenance.md) | [DBA](docs/api/dba.md) | [Exports](docs/api/exports.md)
253
-
254
- ## Install
186
+ ## Contributing
255
187
 
256
188
  ```bash
257
- npm install @hotmeshio/long-tail @hotmeshio/hotmesh
189
+ git clone https://github.com/hotmeshio/long-tail.git
190
+ cd long-tail
191
+ docker compose up -d --build
258
192
  ```
259
193
 
194
+ Open [http://localhost:3000](http://localhost:3000). Example workflows seed the dashboard.
195
+
196
+ | User | Password | Role |
197
+ |------|----------|------|
198
+ | `superadmin` | `l0ngt@1l` | superadmin |
199
+ | `admin` | `l0ngt@1l` | admin |
200
+ | `engineer` | `l0ngt@1l` | engineer |
201
+ | `reviewer` | `l0ngt@1l` | reviewer |
202
+
203
+ See [Contributing](docs/contributing.md).
204
+
260
205
  ## License
261
206
 
262
207
  See [LICENSE](LICENSE).
package/build/index.d.ts CHANGED
@@ -33,5 +33,6 @@ export { McpEscalationStrategy } from './services/escalation-strategy/mcp';
33
33
  export { exampleWorkers, seedExamples } from './examples';
34
34
  export { getActivityIdentity } from './services/iam/activity';
35
35
  export { getToolContext } from './services/iam/context';
36
+ export { registerMcpTool } from './services/mcp/register-tool';
36
37
  export { getSystemWorkers, builtinMcpServerFactories } from './system';
37
38
  export { seedSystemMcpServers } from './system/seed';
package/build/index.js CHANGED
@@ -36,7 +36,7 @@ var __importStar = (this && this.__importStar) || (function () {
36
36
  };
37
37
  })();
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.seedSystemMcpServers = exports.builtinMcpServerFactories = exports.getSystemWorkers = exports.getToolContext = exports.getActivityIdentity = exports.seedExamples = exports.exampleWorkers = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishWorkflowEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.start = void 0;
39
+ exports.seedSystemMcpServers = exports.builtinMcpServerFactories = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = exports.seedExamples = exports.exampleWorkers = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.publishWorkflowEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.start = void 0;
40
40
  const config_1 = require("./modules/config");
41
41
  const logger_1 = require("./services/logger");
42
42
  const start_1 = require("./start");
@@ -109,6 +109,8 @@ var activity_1 = require("./services/iam/activity");
109
109
  Object.defineProperty(exports, "getActivityIdentity", { enumerable: true, get: function () { return activity_1.getActivityIdentity; } });
110
110
  var context_1 = require("./services/iam/context");
111
111
  Object.defineProperty(exports, "getToolContext", { enumerable: true, get: function () { return context_1.getToolContext; } });
112
+ var register_tool_1 = require("./services/mcp/register-tool");
113
+ Object.defineProperty(exports, "registerMcpTool", { enumerable: true, get: function () { return register_tool_1.registerMcpTool; } });
112
114
  var system_1 = require("./system");
113
115
  Object.defineProperty(exports, "getSystemWorkers", { enumerable: true, get: function () { return system_1.getSystemWorkers; } });
114
116
  Object.defineProperty(exports, "builtinMcpServerFactories", { enumerable: true, get: function () { return system_1.builtinMcpServerFactories; } });
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Register a tool on an McpServer, bypassing the SDK's generic type
3
+ * inference that causes TypeScript to OOM during compilation.
4
+ *
5
+ * The MCP SDK's .tool() signatures use deeply nested Zod generics
6
+ * that trigger unbounded type expansion in tsc. Routing through
7
+ * `any` avoids this. Runtime validation is unaffected — the SDK
8
+ * still validates inputs against the Zod schemas at call time.
9
+ */
10
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
11
+ export declare const registerMcpTool: (server: McpServer, ...args: any[]) => any;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /**
3
+ * Register a tool on an McpServer, bypassing the SDK's generic type
4
+ * inference that causes TypeScript to OOM during compilation.
5
+ *
6
+ * The MCP SDK's .tool() signatures use deeply nested Zod generics
7
+ * that trigger unbounded type expansion in tsc. Routing through
8
+ * `any` avoids this. Runtime validation is unaffected — the SDK
9
+ * still validates inputs against the Zod schemas at call time.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.registerMcpTool = void 0;
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ const registerMcpTool = (server, ...args) => server.tool(...args);
15
+ exports.registerMcpTool = registerMcpTool;
@@ -118,12 +118,16 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
118
118
  await mcp_1.mcpRegistry.connect();
119
119
  logger_1.loggerRegistry.info('[long-tail] MCP adapter connected');
120
120
  }
121
- // Register built-in MCP server factories from system/
121
+ // Register MCP server factories: built-in (from system/) + user-provided
122
122
  const { registerBuiltinServer } = await Promise.resolve().then(() => __importStar(require('../services/mcp/client')));
123
- for (const [name, factory] of Object.entries(builtinMcpServerFactories)) {
123
+ const allFactories = {
124
+ ...builtinMcpServerFactories,
125
+ ...(startConfig.mcp?.serverFactories ?? {}),
126
+ };
127
+ for (const [name, factory] of Object.entries(allFactories)) {
124
128
  registerBuiltinServer(name, factory);
125
129
  }
126
- logger_1.loggerRegistry.info(`[long-tail] ${Object.keys(builtinMcpServerFactories).length} MCP server factories registered`);
130
+ logger_1.loggerRegistry.info(`[long-tail] ${Object.keys(allFactories).length} MCP server factories registered`);
127
131
  // Register workers for active YAML (deterministic) workflows
128
132
  await yamlWorkflowWorkers.registerAllActiveWorkers();
129
133
  }
@@ -1 +1 @@
1
- {"root":["../index.ts","../vitest.config.ts","../vitest.integration.config.ts","../examples/index.ts","../examples/seed.ts","../examples/workers.ts","../examples/external-mcp-server/server.ts","../examples/types/envelopes.ts","../examples/types/index.ts","../examples/types/resolvers.ts","../examples/workflows/basic-echo/activities.ts","../examples/workflows/basic-echo/index.ts","../examples/workflows/kitchen-sink/activities.ts","../examples/workflows/kitchen-sink/index.ts","../examples/workflows/review-content/activities.ts","../examples/workflows/review-content/index.ts","../examples/workflows/review-content/types.ts","../modules/auth.ts","../modules/config.ts","../modules/defaults.ts","../modules/ltconfig.ts","../modules/maintenance.ts","../routes/auth.ts","../routes/bot-accounts.ts","../routes/controlplane.ts","../routes/dba.ts","../routes/delegation.ts","../routes/exports.ts","../routes/files.ts","../routes/index.ts","../routes/insight.ts","../routes/maintenance.ts","../routes/mcp-runs.ts","../routes/mcp.ts","../routes/namespaces.ts","../routes/oauth.ts","../routes/resolve.ts","../routes/roles.ts","../routes/settings.ts","../routes/tasks.ts","../routes/users.ts","../routes/escalations/bulk.ts","../routes/escalations/helpers.ts","../routes/escalations/index.ts","../routes/escalations/list.ts","../routes/escalations/resolve.ts","../routes/escalations/single.ts","../routes/workflows/config.ts","../routes/workflows/discovery.ts","../routes/workflows/index.ts","../routes/workflows/invocation.ts","../routes/yaml-workflows/crud.ts","../routes/yaml-workflows/deployment.ts","../routes/yaml-workflows/helpers.ts","../routes/yaml-workflows/index.ts","../routes/yaml-workflows/versions.ts","../scripts/process-helpers.ts","../scripts/process.ts","../scripts/token.ts","../services/dba.ts","../services/hotmesh-utils.ts","../services/workflow-invocation.ts","../services/auth/bot-api-key.ts","../services/auth/delegation.ts","../services/auth/service-token.ts","../services/config/cache.ts","../services/config/index.ts","../services/config/provider.ts","../services/config/read.ts","../services/config/sql.ts","../services/config/write.ts","../services/controlplane/index.ts","../services/controlplane/quorum-bridge.ts","../services/controlplane/sql.ts","../services/controlplane/types.ts","../services/cron/index.ts","../services/db/index.ts","../services/db/migrate.ts","../services/escalation/bulk.ts","../services/escalation/crud.ts","../services/escalation/index.ts","../services/escalation/queries.ts","../services/escalation/sql.ts","../services/escalation/types.ts","../services/escalation-strategy/default.ts","../services/escalation-strategy/index.ts","../services/escalation-strategy/mcp.ts","../services/events/index.ts","../services/events/memory.ts","../services/events/nats.ts","../services/events/publish.ts","../services/events/socketio.ts","../services/export/client.ts","../services/export/index.ts","../services/export/post-process.ts","../services/export/types.ts","../services/iam/activity.ts","../services/iam/bots.ts","../services/iam/context.ts","../services/iam/credentials.ts","../services/iam/envelope.ts","../services/iam/ephemeral.ts","../services/iam/index.ts","../services/iam/principal.ts","../services/iam/resolve.ts","../services/insight/index.ts","../services/insight/prompts.ts","../services/interceptor/activity-interceptor.ts","../services/interceptor/completion.ts","../services/interceptor/context.ts","../services/interceptor/escalation.ts","../services/interceptor/index.ts","../services/interceptor/lifecycle.ts","../services/interceptor/state.ts","../services/interceptor/types.ts","../services/interceptor/activities/config.ts","../services/interceptor/activities/escalation.ts","../services/interceptor/activities/index.ts","../services/interceptor/activities/task.ts","../services/interceptor/activities/workflow.ts","../services/llm/detect.ts","../services/llm/index.ts","../services/llm/translate.ts","../services/llm/types.ts","../services/llm/providers/anthropic.ts","../services/llm/providers/openai.ts","../services/logger/index.ts","../services/logger/pino.ts","../services/maintenance/index.ts","../services/mcp/adapter.ts","../services/mcp/db.ts","../services/mcp/index.ts","../services/mcp/server.ts","../services/mcp/sql.ts","../services/mcp/types.ts","../services/mcp/vision-server.ts","../services/mcp/workflow-compiler-server.ts","../services/mcp/workflow-server.ts","../services/mcp/client/connection.ts","../services/mcp/client/index.ts","../services/mcp/client/tools.ts","../services/mcp/db-server/index.ts","../services/mcp/db-server/schemas.ts","../services/mcp/db-server/tools.ts","../services/mcp/playwright-server/index.ts","../services/mcp/playwright-server/lifecycle.ts","../services/mcp/playwright-server/schemas.ts","../services/mcp/playwright-server/tools.ts","../services/mcp-runs/enrichment.ts","../services/mcp-runs/events.ts","../services/mcp-runs/execution-builder.ts","../services/mcp-runs/index.ts","../services/mcp-runs/queries.ts","../services/mcp-runs/sql.ts","../services/mcp-runs/types.ts","../services/namespace/index.ts","../services/namespace/sql.ts","../services/namespace/types.ts","../services/oauth/crypto.ts","../services/oauth/db.ts","../services/oauth/index.ts","../services/oauth/state.ts","../services/oauth/providers/anthropic.ts","../services/oauth/providers/github.ts","../services/oauth/providers/google.ts","../services/oauth/providers/index.ts","../services/oauth/providers/microsoft.ts","../services/oauth/providers/mock.ts","../services/oauth/providers/registry.ts","../services/oauth/providers/types.ts","../services/orchestrator/index.ts","../services/orchestrator/types.ts","../services/role/index.ts","../services/role/sql.ts","../services/role/types.ts","../services/storage/index.ts","../services/storage/local.ts","../services/storage/s3.ts","../services/storage/types.ts","../services/task/crud.ts","../services/task/index.ts","../services/task/process.ts","../services/task/resolve.ts","../services/task/sql.ts","../services/task/types.ts","../services/telemetry/honeycomb.ts","../services/telemetry/index.ts","../services/user/auth.ts","../services/user/crud.ts","../services/user/index.ts","../services/user/rbac.ts","../services/user/roles.ts","../services/user/sql.ts","../services/user/types.ts","../services/workers/registry.ts","../services/yaml-workflow/db-utils.ts","../services/yaml-workflow/db.ts","../services/yaml-workflow/deployer-helpers.ts","../services/yaml-workflow/deployer.ts","../services/yaml-workflow/generator.ts","../services/yaml-workflow/index.ts","../services/yaml-workflow/input-analyzer-helpers.ts","../services/yaml-workflow/input-analyzer.ts","../services/yaml-workflow/sql.ts","../services/yaml-workflow/types.ts","../services/yaml-workflow/pattern-detector/array-source.ts","../services/yaml-workflow/pattern-detector/collapse.ts","../services/yaml-workflow/pattern-detector/index.ts","../services/yaml-workflow/pattern-detector/run-detection.ts","../services/yaml-workflow/pattern-detector/types.ts","../services/yaml-workflow/pipeline/analyze.ts","../services/yaml-workflow/pipeline/extract-helpers.ts","../services/yaml-workflow/pipeline/extract.ts","../services/yaml-workflow/pipeline/prompts.ts","../services/yaml-workflow/pipeline/validate.ts","../services/yaml-workflow/pipeline/build/dag.ts","../services/yaml-workflow/pipeline/build/index.ts","../services/yaml-workflow/pipeline/build/iteration.ts","../services/yaml-workflow/pipeline/build/metadata.ts","../services/yaml-workflow/pipeline/build/transform.ts","../services/yaml-workflow/pipeline/build/utils.ts","../services/yaml-workflow/pipeline/build/wiring.ts","../services/yaml-workflow/pipeline/compile/index.ts","../services/yaml-workflow/pipeline/compile/llm-call.ts","../services/yaml-workflow/pipeline/compile/parse-plan.ts","../services/yaml-workflow/pipeline/compile/summarize.ts","../services/yaml-workflow/workers/callbacks.ts","../services/yaml-workflow/workers/events.ts","../services/yaml-workflow/workers/index.ts","../services/yaml-workflow/workers/register.ts","../services/yaml-workflow/workers/scope.ts","../start/adapters.ts","../start/config.ts","../start/index.ts","../start/server.ts","../start/workers.ts","../system/index.ts","../system/activities/claude-code.ts","../system/activities/file-storage.ts","../system/activities/http.ts","../system/activities/oauth.ts","../system/activities/triage/cache.ts","../system/activities/triage/context.ts","../system/activities/triage/discovery.ts","../system/activities/triage/index.ts","../system/activities/triage/llm.ts","../system/activities/triage/tools.ts","../system/mcp-servers/claude-code.ts","../system/mcp-servers/document-vision.ts","../system/mcp-servers/file-storage.ts","../system/mcp-servers/http-fetch.ts","../system/mcp-servers/human-queue.ts","../system/mcp-servers/oauth.ts","../system/mcp-servers/prompts.ts","../system/mcp-servers/workflow-compiler.ts","../system/mcp-servers/workflow.ts","../system/mcp-servers/db-query/index.ts","../system/mcp-servers/db-query/schemas.ts","../system/mcp-servers/db-query/tools.ts","../system/mcp-servers/playwright/browser-lifecycle.ts","../system/mcp-servers/playwright/index.ts","../system/mcp-servers/playwright/schemas.ts","../system/mcp-servers/playwright/tools-atomic.ts","../system/mcp-servers/playwright/tools-navigation.ts","../system/mcp-servers/playwright/tools-page-interaction.ts","../system/mcp-servers/playwright/tools-run-script.ts","../system/mcp-servers/playwright/types.ts","../system/mcp-servers/playwright-cli/helpers.ts","../system/mcp-servers/playwright-cli/index.ts","../system/mcp-servers/playwright-cli/schemas.ts","../system/mcp-servers/playwright-cli/tools-auth.ts","../system/mcp-servers/playwright-cli/tools-capture.ts","../system/seed/index.ts","../system/seed/server-definitions.ts","../system/seed/tool-manifests-browser.ts","../system/seed/tool-manifests-data.ts","../system/seed/tool-manifests-escalation.ts","../system/seed/tool-manifests-workflows.ts","../system/workflows/mcp-deterministic/activities.ts","../system/workflows/mcp-deterministic/index.ts","../system/workflows/mcp-query/index.ts","../system/workflows/mcp-query/prompts.ts","../system/workflows/mcp-query/strategy-advisors.ts","../system/workflows/mcp-query/types.ts","../system/workflows/mcp-query/activities/caches.ts","../system/workflows/mcp-query/activities/discovery.ts","../system/workflows/mcp-query/activities/index.ts","../system/workflows/mcp-query/activities/llm.ts","../system/workflows/mcp-query/activities/tool-executor.ts","../system/workflows/mcp-query/activities/tool-loader.ts","../system/workflows/mcp-query-router/activities.ts","../system/workflows/mcp-query-router/index.ts","../system/workflows/mcp-query-router/prompts.ts","../system/workflows/mcp-triage/index.ts","../system/workflows/mcp-triage/prompts.ts","../system/workflows/mcp-triage/response-builders.ts","../system/workflows/mcp-triage/response.ts","../system/workflows/mcp-triage/types.ts","../system/workflows/mcp-triage-deterministic/activities.ts","../system/workflows/mcp-triage-deterministic/index.ts","../system/workflows/mcp-triage-router/activities.ts","../system/workflows/mcp-triage-router/index.ts","../types/auth.ts","../types/config.ts","../types/delegation.ts","../types/discovery.ts","../types/envelope.ts","../types/escalation-strategy.ts","../types/escalation.ts","../types/events.ts","../types/export.ts","../types/express.d.ts","../types/index.ts","../types/logger.ts","../types/maintenance.ts","../types/mcp.ts","../types/oauth.ts","../types/startup.ts","../types/task.ts","../types/telemetry.ts","../types/tool-context.ts","../types/user.ts","../types/workflow.ts","../types/yaml-workflow.ts","../workers/index.ts"],"version":"5.9.3"}
1
+ {"root":["../index.ts","../vitest.config.ts","../vitest.integration.config.ts","../examples/index.ts","../examples/seed.ts","../examples/workers.ts","../examples/external-mcp-server/server.ts","../examples/types/envelopes.ts","../examples/types/index.ts","../examples/types/resolvers.ts","../examples/workflows/basic-echo/activities.ts","../examples/workflows/basic-echo/index.ts","../examples/workflows/kitchen-sink/activities.ts","../examples/workflows/kitchen-sink/index.ts","../examples/workflows/review-content/activities.ts","../examples/workflows/review-content/index.ts","../examples/workflows/review-content/types.ts","../modules/auth.ts","../modules/config.ts","../modules/defaults.ts","../modules/ltconfig.ts","../modules/maintenance.ts","../routes/auth.ts","../routes/bot-accounts.ts","../routes/controlplane.ts","../routes/dba.ts","../routes/delegation.ts","../routes/exports.ts","../routes/files.ts","../routes/index.ts","../routes/insight.ts","../routes/maintenance.ts","../routes/mcp-runs.ts","../routes/mcp.ts","../routes/namespaces.ts","../routes/oauth.ts","../routes/resolve.ts","../routes/roles.ts","../routes/settings.ts","../routes/tasks.ts","../routes/users.ts","../routes/escalations/bulk.ts","../routes/escalations/helpers.ts","../routes/escalations/index.ts","../routes/escalations/list.ts","../routes/escalations/resolve.ts","../routes/escalations/single.ts","../routes/workflows/config.ts","../routes/workflows/discovery.ts","../routes/workflows/index.ts","../routes/workflows/invocation.ts","../routes/yaml-workflows/crud.ts","../routes/yaml-workflows/deployment.ts","../routes/yaml-workflows/helpers.ts","../routes/yaml-workflows/index.ts","../routes/yaml-workflows/versions.ts","../scripts/process-helpers.ts","../scripts/process.ts","../scripts/token.ts","../services/dba.ts","../services/hotmesh-utils.ts","../services/workflow-invocation.ts","../services/auth/bot-api-key.ts","../services/auth/delegation.ts","../services/auth/service-token.ts","../services/config/cache.ts","../services/config/index.ts","../services/config/provider.ts","../services/config/read.ts","../services/config/sql.ts","../services/config/write.ts","../services/controlplane/index.ts","../services/controlplane/quorum-bridge.ts","../services/controlplane/sql.ts","../services/controlplane/types.ts","../services/cron/index.ts","../services/db/index.ts","../services/db/migrate.ts","../services/escalation/bulk.ts","../services/escalation/crud.ts","../services/escalation/index.ts","../services/escalation/queries.ts","../services/escalation/sql.ts","../services/escalation/types.ts","../services/escalation-strategy/default.ts","../services/escalation-strategy/index.ts","../services/escalation-strategy/mcp.ts","../services/events/index.ts","../services/events/memory.ts","../services/events/nats.ts","../services/events/publish.ts","../services/events/socketio.ts","../services/export/client.ts","../services/export/index.ts","../services/export/post-process.ts","../services/export/types.ts","../services/iam/activity.ts","../services/iam/bots.ts","../services/iam/context.ts","../services/iam/credentials.ts","../services/iam/envelope.ts","../services/iam/ephemeral.ts","../services/iam/index.ts","../services/iam/principal.ts","../services/iam/resolve.ts","../services/insight/index.ts","../services/insight/prompts.ts","../services/interceptor/activity-interceptor.ts","../services/interceptor/completion.ts","../services/interceptor/context.ts","../services/interceptor/escalation.ts","../services/interceptor/index.ts","../services/interceptor/lifecycle.ts","../services/interceptor/state.ts","../services/interceptor/types.ts","../services/interceptor/activities/config.ts","../services/interceptor/activities/escalation.ts","../services/interceptor/activities/index.ts","../services/interceptor/activities/task.ts","../services/interceptor/activities/workflow.ts","../services/llm/detect.ts","../services/llm/index.ts","../services/llm/translate.ts","../services/llm/types.ts","../services/llm/providers/anthropic.ts","../services/llm/providers/openai.ts","../services/logger/index.ts","../services/logger/pino.ts","../services/maintenance/index.ts","../services/mcp/adapter.ts","../services/mcp/db.ts","../services/mcp/index.ts","../services/mcp/register-tool.ts","../services/mcp/server.ts","../services/mcp/sql.ts","../services/mcp/types.ts","../services/mcp/vision-server.ts","../services/mcp/workflow-compiler-server.ts","../services/mcp/workflow-server.ts","../services/mcp/client/connection.ts","../services/mcp/client/index.ts","../services/mcp/client/tools.ts","../services/mcp/db-server/index.ts","../services/mcp/db-server/schemas.ts","../services/mcp/db-server/tools.ts","../services/mcp/playwright-server/index.ts","../services/mcp/playwright-server/lifecycle.ts","../services/mcp/playwright-server/schemas.ts","../services/mcp/playwright-server/tools.ts","../services/mcp-runs/enrichment.ts","../services/mcp-runs/events.ts","../services/mcp-runs/execution-builder.ts","../services/mcp-runs/index.ts","../services/mcp-runs/queries.ts","../services/mcp-runs/sql.ts","../services/mcp-runs/types.ts","../services/namespace/index.ts","../services/namespace/sql.ts","../services/namespace/types.ts","../services/oauth/crypto.ts","../services/oauth/db.ts","../services/oauth/index.ts","../services/oauth/state.ts","../services/oauth/providers/anthropic.ts","../services/oauth/providers/github.ts","../services/oauth/providers/google.ts","../services/oauth/providers/index.ts","../services/oauth/providers/microsoft.ts","../services/oauth/providers/mock.ts","../services/oauth/providers/registry.ts","../services/oauth/providers/types.ts","../services/orchestrator/index.ts","../services/orchestrator/types.ts","../services/role/index.ts","../services/role/sql.ts","../services/role/types.ts","../services/storage/index.ts","../services/storage/local.ts","../services/storage/s3.ts","../services/storage/types.ts","../services/task/crud.ts","../services/task/index.ts","../services/task/process.ts","../services/task/resolve.ts","../services/task/sql.ts","../services/task/types.ts","../services/telemetry/honeycomb.ts","../services/telemetry/index.ts","../services/user/auth.ts","../services/user/crud.ts","../services/user/index.ts","../services/user/rbac.ts","../services/user/roles.ts","../services/user/sql.ts","../services/user/types.ts","../services/workers/registry.ts","../services/yaml-workflow/db-utils.ts","../services/yaml-workflow/db.ts","../services/yaml-workflow/deployer-helpers.ts","../services/yaml-workflow/deployer.ts","../services/yaml-workflow/generator.ts","../services/yaml-workflow/index.ts","../services/yaml-workflow/input-analyzer-helpers.ts","../services/yaml-workflow/input-analyzer.ts","../services/yaml-workflow/sql.ts","../services/yaml-workflow/types.ts","../services/yaml-workflow/pattern-detector/array-source.ts","../services/yaml-workflow/pattern-detector/collapse.ts","../services/yaml-workflow/pattern-detector/index.ts","../services/yaml-workflow/pattern-detector/run-detection.ts","../services/yaml-workflow/pattern-detector/types.ts","../services/yaml-workflow/pipeline/analyze.ts","../services/yaml-workflow/pipeline/extract-helpers.ts","../services/yaml-workflow/pipeline/extract.ts","../services/yaml-workflow/pipeline/prompts.ts","../services/yaml-workflow/pipeline/validate.ts","../services/yaml-workflow/pipeline/build/dag.ts","../services/yaml-workflow/pipeline/build/index.ts","../services/yaml-workflow/pipeline/build/iteration.ts","../services/yaml-workflow/pipeline/build/metadata.ts","../services/yaml-workflow/pipeline/build/transform.ts","../services/yaml-workflow/pipeline/build/utils.ts","../services/yaml-workflow/pipeline/build/wiring.ts","../services/yaml-workflow/pipeline/compile/index.ts","../services/yaml-workflow/pipeline/compile/llm-call.ts","../services/yaml-workflow/pipeline/compile/parse-plan.ts","../services/yaml-workflow/pipeline/compile/summarize.ts","../services/yaml-workflow/workers/callbacks.ts","../services/yaml-workflow/workers/events.ts","../services/yaml-workflow/workers/index.ts","../services/yaml-workflow/workers/register.ts","../services/yaml-workflow/workers/scope.ts","../start/adapters.ts","../start/config.ts","../start/index.ts","../start/server.ts","../start/workers.ts","../system/index.ts","../system/activities/claude-code.ts","../system/activities/file-storage.ts","../system/activities/http.ts","../system/activities/oauth.ts","../system/activities/triage/cache.ts","../system/activities/triage/context.ts","../system/activities/triage/discovery.ts","../system/activities/triage/index.ts","../system/activities/triage/llm.ts","../system/activities/triage/tools.ts","../system/mcp-servers/claude-code.ts","../system/mcp-servers/document-vision.ts","../system/mcp-servers/file-storage.ts","../system/mcp-servers/http-fetch.ts","../system/mcp-servers/human-queue.ts","../system/mcp-servers/oauth.ts","../system/mcp-servers/prompts.ts","../system/mcp-servers/workflow-compiler.ts","../system/mcp-servers/workflow.ts","../system/mcp-servers/db-query/index.ts","../system/mcp-servers/db-query/schemas.ts","../system/mcp-servers/db-query/tools.ts","../system/mcp-servers/playwright/browser-lifecycle.ts","../system/mcp-servers/playwright/index.ts","../system/mcp-servers/playwright/schemas.ts","../system/mcp-servers/playwright/tools-atomic.ts","../system/mcp-servers/playwright/tools-navigation.ts","../system/mcp-servers/playwright/tools-page-interaction.ts","../system/mcp-servers/playwright/tools-run-script.ts","../system/mcp-servers/playwright/types.ts","../system/mcp-servers/playwright-cli/helpers.ts","../system/mcp-servers/playwright-cli/index.ts","../system/mcp-servers/playwright-cli/schemas.ts","../system/mcp-servers/playwright-cli/tools-auth.ts","../system/mcp-servers/playwright-cli/tools-capture.ts","../system/seed/index.ts","../system/seed/server-definitions.ts","../system/seed/tool-manifests-browser.ts","../system/seed/tool-manifests-data.ts","../system/seed/tool-manifests-escalation.ts","../system/seed/tool-manifests-workflows.ts","../system/workflows/mcp-deterministic/activities.ts","../system/workflows/mcp-deterministic/index.ts","../system/workflows/mcp-query/index.ts","../system/workflows/mcp-query/prompts.ts","../system/workflows/mcp-query/strategy-advisors.ts","../system/workflows/mcp-query/types.ts","../system/workflows/mcp-query/activities/caches.ts","../system/workflows/mcp-query/activities/discovery.ts","../system/workflows/mcp-query/activities/index.ts","../system/workflows/mcp-query/activities/llm.ts","../system/workflows/mcp-query/activities/tool-executor.ts","../system/workflows/mcp-query/activities/tool-loader.ts","../system/workflows/mcp-query-router/activities.ts","../system/workflows/mcp-query-router/index.ts","../system/workflows/mcp-query-router/prompts.ts","../system/workflows/mcp-triage/index.ts","../system/workflows/mcp-triage/prompts.ts","../system/workflows/mcp-triage/response-builders.ts","../system/workflows/mcp-triage/response.ts","../system/workflows/mcp-triage/types.ts","../system/workflows/mcp-triage-deterministic/activities.ts","../system/workflows/mcp-triage-deterministic/index.ts","../system/workflows/mcp-triage-router/activities.ts","../system/workflows/mcp-triage-router/index.ts","../types/auth.ts","../types/config.ts","../types/delegation.ts","../types/discovery.ts","../types/envelope.ts","../types/escalation-strategy.ts","../types/escalation.ts","../types/events.ts","../types/export.ts","../types/express.d.ts","../types/index.ts","../types/logger.ts","../types/maintenance.ts","../types/mcp.ts","../types/oauth.ts","../types/startup.ts","../types/task.ts","../types/telemetry.ts","../types/tool-context.ts","../types/user.ts","../types/workflow.ts","../types/yaml-workflow.ts","../workers/index.ts"],"version":"5.9.3"}
@@ -98,6 +98,11 @@ export interface LTStartConfig {
98
98
  };
99
99
  /** MCP server IDs to auto-connect on startup. */
100
100
  autoConnect?: string[];
101
+ /**
102
+ * Custom MCP server factories to register alongside the built-in ones.
103
+ * Key = server name, value = factory function returning an McpServer instance.
104
+ */
105
+ serverFactories?: Record<string, () => any>;
101
106
  /** Replace the built-in MCP adapter entirely. */
102
107
  adapter?: LTMcpAdapter;
103
108
  };
@@ -1,2 +1,2 @@
1
- declare const _default: import("vite").UserConfig;
1
+ declare const _default: UserConfig;
2
2
  export default _default;
@@ -1,2 +1,2 @@
1
- declare const _default: import("vite").UserConfig;
1
+ declare const _default: UserConfig;
2
2
  export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/long-tail",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",