runwork 0.13.4 → 0.14.0
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/bundled-types/core-endpoints.d.ts +16 -4
- package/dist/agents/claude-desktop-plugin-tree.js +23 -8
- package/dist/agents/claude-desktop.js +6 -3
- package/dist/agents/codex.js +15 -7
- package/dist/api/client.d.ts +5 -0
- package/dist/api/client.js +8 -0
- package/dist/commands/__tests__/mcp-entries.test.d.ts +1 -0
- package/dist/commands/__tests__/mcp-entries.test.js +48 -0
- package/dist/commands/mcp-entries.d.ts +13 -0
- package/dist/commands/mcp-entries.js +26 -0
- package/dist/commands/sync.js +6 -10
- package/dist/generated/bundled-types.js +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/types.d.ts +3 -0
- package/package.json +1 -1
|
@@ -10,9 +10,16 @@ import { z } from 'zod';
|
|
|
10
10
|
import type { Hono } from 'hono';
|
|
11
11
|
type ZodSchema = z.ZodType<any, any, any>;
|
|
12
12
|
/**
|
|
13
|
-
* Authentication
|
|
13
|
+
* Authentication requirement declared by an endpoint definition.
|
|
14
14
|
*/
|
|
15
15
|
export type EndpointAuthType = 'apiKey' | 'public';
|
|
16
|
+
/**
|
|
17
|
+
* Caller principal type resolved by the platform and passed via the
|
|
18
|
+
* `X-Public-Endpoint-Auth-Type` header. `user` and `workspace_key` are
|
|
19
|
+
* authenticated principals the platform has already authorized; `api_key`
|
|
20
|
+
* additionally carries a validated key id; `none` is unauthenticated.
|
|
21
|
+
*/
|
|
22
|
+
export type EndpointPrincipalType = 'none' | 'api_key' | 'workspace_key' | 'user';
|
|
16
23
|
/**
|
|
17
24
|
* HTTP methods supported by endpoints
|
|
18
25
|
*/
|
|
@@ -53,10 +60,14 @@ export interface EndpointContext<TQuery = Record<string, unknown>, TBody = unkno
|
|
|
53
60
|
* Authentication information passed to handlers
|
|
54
61
|
*/
|
|
55
62
|
export interface EndpointAuthInfo {
|
|
56
|
-
/** Authentication
|
|
63
|
+
/** Authentication requirement declared by the endpoint */
|
|
57
64
|
type: EndpointAuthType;
|
|
58
|
-
/**
|
|
65
|
+
/** Resolved caller principal type (api_key, workspace_key, user, none) */
|
|
66
|
+
principalType?: EndpointPrincipalType;
|
|
67
|
+
/** API key ID (if authenticated with an API key) */
|
|
59
68
|
apiKeyId?: string;
|
|
69
|
+
/** User ID (if authenticated as a workspace member) */
|
|
70
|
+
userId?: string;
|
|
60
71
|
/** Scopes granted to the API key */
|
|
61
72
|
scopes?: string[];
|
|
62
73
|
/** Whether request is authenticated */
|
|
@@ -112,8 +123,9 @@ export declare function isEndpointDefinition(entry: unknown): entry is EndpointD
|
|
|
112
123
|
export interface ParsedEndpointRequest {
|
|
113
124
|
endpointId: string;
|
|
114
125
|
appId: string;
|
|
115
|
-
authType:
|
|
126
|
+
authType: EndpointPrincipalType;
|
|
116
127
|
apiKeyId?: string;
|
|
128
|
+
userId?: string;
|
|
117
129
|
scopes?: string[];
|
|
118
130
|
}
|
|
119
131
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { chmodSync, mkdirSync, rmSync, existsSync, writeFileSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
-
import { appendTokenToUrl, buildSkillMd } from './types.js';
|
|
3
|
+
import { appendTokenToUrl, buildSkillMd, RUNWORK_WORKSPACE_MCP_NAME } from './types.js';
|
|
4
4
|
import { SESSION_START_HOOK_SCRIPT } from './session-start-hook.js';
|
|
5
5
|
/**
|
|
6
6
|
* Write <destDir>/.claude-plugin/plugin.json.
|
|
@@ -24,13 +24,28 @@ export function writePluginMcpConfig(destDir, mcpServers) {
|
|
|
24
24
|
mkdirSync(destDir, { recursive: true });
|
|
25
25
|
const mcpEntries = {};
|
|
26
26
|
for (const server of mcpServers) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
if (server.name === RUNWORK_WORKSPACE_MCP_NAME) {
|
|
28
|
+
// Preserve the exact, known-working behavior for the Runwork connector: embed
|
|
29
|
+
// the workspace key in the URL, no headers field. Claude Desktop's native
|
|
30
|
+
// connector did not reliably honor request headers here, which is why the token
|
|
31
|
+
// lives in the URL — do NOT change this.
|
|
32
|
+
const token = server.headers?.Authorization?.replace(/^Bearer\s+/i, '');
|
|
33
|
+
mcpEntries[server.name] = {
|
|
34
|
+
type: 'http',
|
|
35
|
+
url: token ? appendTokenToUrl(server.url, token) : server.url,
|
|
36
|
+
...(server.description ? { description: server.description } : {}),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Third-party servers: forward the auth header map (same .mcp.json schema
|
|
41
|
+
// claude-code uses). Their secrets must NEVER be placed in the URL.
|
|
42
|
+
mcpEntries[server.name] = {
|
|
43
|
+
type: 'http',
|
|
44
|
+
url: server.url,
|
|
45
|
+
...(server.headers ? { headers: server.headers } : {}),
|
|
46
|
+
...(server.description ? { description: server.description } : {}),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
34
49
|
}
|
|
35
50
|
writeFileSync(join(destDir, '.mcp.json'), JSON.stringify({ mcpServers: mcpEntries }, null, 2));
|
|
36
51
|
}
|
|
@@ -189,12 +189,15 @@ export class ClaudeDesktopAdapter {
|
|
|
189
189
|
// For cowork connectors, embed the auth token in the URL query string.
|
|
190
190
|
// This lets Claude Desktop connect without requiring the user to go through
|
|
191
191
|
// an OAuth flow or manually click "Connect" in the Connectors UI.
|
|
192
|
-
// Write to claude_desktop_config.json via mcp-remote (chat mode fallback)
|
|
192
|
+
// Write to claude_desktop_config.json via mcp-remote (chat mode fallback).
|
|
193
|
+
// Forward every auth header (Authorization, X-Api-Key, etc.) as a --header arg.
|
|
193
194
|
const entries = {};
|
|
194
195
|
for (const s of servers) {
|
|
195
196
|
const args = ['mcp-remote', s.url];
|
|
196
|
-
if (s.headers
|
|
197
|
-
|
|
197
|
+
if (s.headers) {
|
|
198
|
+
for (const [name, value] of Object.entries(s.headers)) {
|
|
199
|
+
args.push('--header', `${name}:${value}`);
|
|
200
|
+
}
|
|
198
201
|
}
|
|
199
202
|
entries[s.name] = {
|
|
200
203
|
command: 'npx',
|
package/dist/agents/codex.js
CHANGED
|
@@ -45,15 +45,23 @@ export class CodexAdapter {
|
|
|
45
45
|
delete mcpServers[key];
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
// Add new entries (sanitize names to match Codex's ^[a-zA-Z0-9_-]+$ requirement)
|
|
48
|
+
// Add new entries (sanitize names to match Codex's ^[a-zA-Z0-9_-]+$ requirement).
|
|
49
49
|
for (const s of servers) {
|
|
50
50
|
const safeName = s.name.replace(/[^a-zA-Z0-9_-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
const entry = { url: s.url };
|
|
52
|
+
if (s.name === RUNWORK_WORKSPACE_MCP_NAME) {
|
|
53
|
+
// Preserve the known-working behavior: embed the workspace key in the URL.
|
|
54
|
+
// Codex's header-based auth was historically unreliable here, so do NOT change it.
|
|
55
|
+
const token = s.headers?.Authorization?.replace(/^Bearer\s+/i, '');
|
|
56
|
+
if (token)
|
|
57
|
+
entry.url = appendTokenToUrl(s.url, token);
|
|
58
|
+
}
|
|
59
|
+
else if (s.headers && Object.keys(s.headers).length > 0) {
|
|
60
|
+
// External servers: forward headers via Codex's documented http_headers field
|
|
61
|
+
// (static literal values). These had no prior working path, so this is additive.
|
|
62
|
+
entry.http_headers = s.headers;
|
|
63
|
+
}
|
|
64
|
+
mcpServers[safeName] = entry;
|
|
57
65
|
}
|
|
58
66
|
mkdirSync(join(configPath, '..'), { recursive: true });
|
|
59
67
|
writeFileSync(configPath, stringify(parsed));
|
package/dist/api/client.d.ts
CHANGED
|
@@ -141,6 +141,11 @@ export declare class ApiClient {
|
|
|
141
141
|
transport: 'sse' | 'streamable-http';
|
|
142
142
|
}): Promise<McpServerConfig>;
|
|
143
143
|
removeMcpServer(workspaceId: string, serverId: string): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Resolve decrypted auth headers for header-auth MCP servers, scoped to the
|
|
146
|
+
* authenticated user (their own + workspace-wide credentials). Keyed by server id.
|
|
147
|
+
*/
|
|
148
|
+
resolveMcpCredentials(workspaceId: string): Promise<Record<string, Record<string, string>>>;
|
|
144
149
|
searchCommunitySkills(query: string, limit?: number, includeContent?: boolean): Promise<{
|
|
145
150
|
query: string;
|
|
146
151
|
count: number;
|
package/dist/api/client.js
CHANGED
|
@@ -194,6 +194,14 @@ export class ApiClient {
|
|
|
194
194
|
async removeMcpServer(workspaceId, serverId) {
|
|
195
195
|
await this.request(`/api/workspaces/${workspaceId}/mcp-servers/${serverId}`, { method: 'DELETE' });
|
|
196
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Resolve decrypted auth headers for header-auth MCP servers, scoped to the
|
|
199
|
+
* authenticated user (their own + workspace-wide credentials). Keyed by server id.
|
|
200
|
+
*/
|
|
201
|
+
async resolveMcpCredentials(workspaceId) {
|
|
202
|
+
const res = await this.request(`/api/workspaces/${workspaceId}/mcp-credentials/resolved`);
|
|
203
|
+
return res.data.servers;
|
|
204
|
+
}
|
|
197
205
|
// --- Community Marketplace ---
|
|
198
206
|
async searchCommunitySkills(query, limit = 10, includeContent = false) {
|
|
199
207
|
const res = await this.request(`/api/community/skills/search?q=${encodeURIComponent(query)}&limit=${limit}&include_content=${includeContent}`);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { buildExternalMcpEntries } from '../mcp-entries.js';
|
|
3
|
+
const PLATFORM_KEY = 'rk_ws_live_supersecretplatformkey';
|
|
4
|
+
function server(overrides) {
|
|
5
|
+
return {
|
|
6
|
+
id: 'srv-1',
|
|
7
|
+
name: 'example',
|
|
8
|
+
url: 'https://mcp.example.com',
|
|
9
|
+
transport: 'streamable-http',
|
|
10
|
+
enabled: true,
|
|
11
|
+
addedAt: 0,
|
|
12
|
+
addedBy: 'user-1',
|
|
13
|
+
...overrides,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
describe('buildExternalMcpEntries', () => {
|
|
17
|
+
it('never injects the Runwork platform key onto external entries', () => {
|
|
18
|
+
const entries = buildExternalMcpEntries([
|
|
19
|
+
server({ id: 'a', authType: 'header' }),
|
|
20
|
+
server({ id: 'b', authType: 'oauth' }),
|
|
21
|
+
server({ id: 'c', authType: 'none' }),
|
|
22
|
+
server({ id: 'd' }), // authType unset
|
|
23
|
+
], { a: { Authorization: 'Bearer user-token' } });
|
|
24
|
+
// Regression: the platform key must not appear anywhere in the output.
|
|
25
|
+
expect(JSON.stringify(entries)).not.toContain(PLATFORM_KEY);
|
|
26
|
+
});
|
|
27
|
+
it('injects resolved per-server headers for header-auth servers', () => {
|
|
28
|
+
const entries = buildExternalMcpEntries([server({ id: 'a', authType: 'header' })], { a: { Authorization: 'Bearer tok', 'X-Api-Key': 'key123' } });
|
|
29
|
+
expect(entries[0].headers).toEqual({ Authorization: 'Bearer tok', 'X-Api-Key': 'key123' });
|
|
30
|
+
});
|
|
31
|
+
it('emits no auth header for oauth servers (local agent runs its own flow)', () => {
|
|
32
|
+
const entries = buildExternalMcpEntries([server({ id: 'a', authType: 'oauth' })], { a: { Authorization: 'Bearer should-not-be-used' } });
|
|
33
|
+
expect(entries[0].headers).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
it('emits no auth header for none/unset servers', () => {
|
|
36
|
+
const entries = buildExternalMcpEntries([server({ id: 'a', authType: 'none' }), server({ id: 'b' })], {});
|
|
37
|
+
expect(entries[0].headers).toBeUndefined();
|
|
38
|
+
expect(entries[1].headers).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
it('omits headers when a header-auth server has no resolved credentials', () => {
|
|
41
|
+
const entries = buildExternalMcpEntries([server({ id: 'a', authType: 'header' })], {});
|
|
42
|
+
expect(entries[0].headers).toBeUndefined();
|
|
43
|
+
});
|
|
44
|
+
it('skips disabled servers', () => {
|
|
45
|
+
const entries = buildExternalMcpEntries([server({ id: 'a', enabled: false })], {});
|
|
46
|
+
expect(entries).toHaveLength(0);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { McpServerConfig } from '../types.js';
|
|
2
|
+
import type { McpServerEntry } from '../agents/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Build local-agent MCP entries for external (third-party) servers added to the
|
|
5
|
+
* workspace. Auth handling by `authType`:
|
|
6
|
+
* - 'header': inject the user's resolved per-server headers (decrypted server-side).
|
|
7
|
+
* - 'oauth': emit no auth header so the local agent runs its own browser flow.
|
|
8
|
+
* - 'none'/unset: no auth header.
|
|
9
|
+
*
|
|
10
|
+
* Critically, external entries never receive the Runwork platform API key. That key
|
|
11
|
+
* belongs only on the Runwork workspace-tools entry, which is added separately.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildExternalMcpEntries(mcpServers: McpServerConfig[], resolvedCredentials: Record<string, Record<string, string>>): McpServerEntry[];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { RUNWORK_MCP_PREFIX } from '../agents/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build local-agent MCP entries for external (third-party) servers added to the
|
|
4
|
+
* workspace. Auth handling by `authType`:
|
|
5
|
+
* - 'header': inject the user's resolved per-server headers (decrypted server-side).
|
|
6
|
+
* - 'oauth': emit no auth header so the local agent runs its own browser flow.
|
|
7
|
+
* - 'none'/unset: no auth header.
|
|
8
|
+
*
|
|
9
|
+
* Critically, external entries never receive the Runwork platform API key. That key
|
|
10
|
+
* belongs only on the Runwork workspace-tools entry, which is added separately.
|
|
11
|
+
*/
|
|
12
|
+
export function buildExternalMcpEntries(mcpServers, resolvedCredentials) {
|
|
13
|
+
return mcpServers
|
|
14
|
+
.filter(s => s.enabled)
|
|
15
|
+
.map(s => {
|
|
16
|
+
const resolved = s.authType === 'header' ? resolvedCredentials[s.id] : undefined;
|
|
17
|
+
const headers = resolved && Object.keys(resolved).length > 0 ? resolved : undefined;
|
|
18
|
+
return {
|
|
19
|
+
name: `${RUNWORK_MCP_PREFIX}${s.name}`,
|
|
20
|
+
url: s.url,
|
|
21
|
+
transport: s.transport,
|
|
22
|
+
...(headers ? { headers } : {}),
|
|
23
|
+
description: `Runwork MCP server: ${s.name}. Provides tools for interacting with this workspace resource.`,
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|
package/dist/commands/sync.js
CHANGED
|
@@ -7,6 +7,7 @@ import { ApiClient } from '../api/client.js';
|
|
|
7
7
|
import { getAdapterBySlug, detectAgents } from '../agents/detect.js';
|
|
8
8
|
import { CodexAdapter } from '../agents/codex.js';
|
|
9
9
|
import { RUNWORK_MCP_PREFIX, RUNWORK_WORKSPACE_MCP_NAME } from '../agents/types.js';
|
|
10
|
+
import { buildExternalMcpEntries } from './mcp-entries.js';
|
|
10
11
|
import { RUNWORK_AGENT_DEFAULTS, AGENT_DEFAULTS_SCHEMA_VERSION } from '../agents/default-config.js';
|
|
11
12
|
import { resolveAgentDefaults } from '../agents/defaults-merge.js';
|
|
12
13
|
import { collectTelemetryEvents, printTelemetryVerbose, summarizeTelemetryForDryRun, } from './sync-telemetry.js';
|
|
@@ -135,7 +136,7 @@ export async function syncFromState(state, statePath, credentials, opts) {
|
|
|
135
136
|
}
|
|
136
137
|
console.log(' Fetching workspace data...');
|
|
137
138
|
// Fetch latest data (includeContent=true gets all skill content in one request)
|
|
138
|
-
const [allSkills, mcpServers, externalSkills, registries, connectedIntegrations] = await Promise.all([
|
|
139
|
+
const [allSkills, mcpServers, externalSkills, registries, connectedIntegrations, resolvedMcpCredentials] = await Promise.all([
|
|
139
140
|
client.listWorkspaceSkills(state.workspaceId, true),
|
|
140
141
|
client.listMcpServers(state.workspaceId),
|
|
141
142
|
client.listExternalSkills(state.workspaceId),
|
|
@@ -143,6 +144,9 @@ export async function syncFromState(state, statePath, credentials, opts) {
|
|
|
143
144
|
client.listConnectedIntegrations(state.workspaceId)
|
|
144
145
|
.then(list => list.map(i => i.canonicalId ?? i.integrationId))
|
|
145
146
|
.catch(() => []),
|
|
147
|
+
// Decrypted auth headers for header-auth servers, scoped to this user.
|
|
148
|
+
// Tolerate older backends that lack the endpoint.
|
|
149
|
+
client.resolveMcpCredentials(state.workspaceId).catch(() => ({})),
|
|
146
150
|
]);
|
|
147
151
|
const appCount = allSkills.filter(s => s.type === 'app').length;
|
|
148
152
|
const parts = [];
|
|
@@ -167,15 +171,7 @@ export async function syncFromState(state, statePath, credentials, opts) {
|
|
|
167
171
|
}
|
|
168
172
|
// Build MCP entries (pull-only)
|
|
169
173
|
const baseUrl = credentials.baseUrl || 'https://runwork.ai';
|
|
170
|
-
const mcpEntries = mcpServers
|
|
171
|
-
.filter(s => s.enabled)
|
|
172
|
-
.map(s => ({
|
|
173
|
-
name: `${RUNWORK_MCP_PREFIX}${s.name}`,
|
|
174
|
-
url: s.url,
|
|
175
|
-
transport: s.transport,
|
|
176
|
-
headers: { Authorization: `Bearer ${credentials.apiKey}` },
|
|
177
|
-
description: `Runwork MCP server: ${s.name}. Provides tools for interacting with this workspace resource.`,
|
|
178
|
-
}));
|
|
174
|
+
const mcpEntries = buildExternalMcpEntries(mcpServers, resolvedMcpCredentials);
|
|
179
175
|
mcpEntries.push({
|
|
180
176
|
name: RUNWORK_WORKSPACE_MCP_NAME,
|
|
181
177
|
url: `${baseUrl}/api/workspaces/${state.workspaceId}/mcp`,
|
|
@@ -37,7 +37,7 @@ export const BUNDLED_TYPES = {
|
|
|
37
37
|
"core-types.d.ts": "/**\n * This file defines default types provided by the platform.\n * DO NOT EDIT THIS FILE. You can define your own types in `shared/types.ts` file.\n */\nexport interface ApiResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n}\n/**\n * Response from a Nango action or sync trigger\n */\nexport interface NangoActionResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n /** True if error is due to missing integration connection (user hasn't connected yet) */\n isConnectionError?: boolean;\n /** True if error is due to insufficient permissions/scopes (401/403 from external API) */\n isPermissionError?: boolean;\n /** HTTP status code from the external API (if available) */\n statusCode?: number;\n}\n/**\n * Nango proxy request options - used for direct API calls through Nango\n */\nexport interface NangoProxyOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n endpoint: string;\n providerConfigKey: string;\n data?: Record<string, unknown>;\n headers?: Record<string, string>;\n params?: Record<string, string>;\n retries?: number;\n}\n/**\n * Metadata for a stored file\n */\nexport interface FileMetadata {\n id: string;\n key: string;\n name: string;\n size: number;\n contentType: string;\n uploadedAt: number;\n uploadedBy?: string;\n customMetadata?: Record<string, string>;\n}\n/**\n * Options for uploading a file\n */\nexport interface UploadOptions {\n key?: string;\n name?: string;\n contentType?: string;\n uploadedBy?: string;\n customMetadata?: Record<string, string>;\n}\n/**\n * Options for downloading a file\n */\nexport interface DownloadOptions {\n range?: {\n offset?: number;\n length?: number;\n };\n}\n/**\n * Options for listing files\n */\nexport interface ListFilesOptions {\n prefix?: string;\n limit?: number;\n cursor?: string;\n delimiter?: string;\n}\n/**\n * Result of listing files\n */\nexport interface ListFilesResult {\n files: FileMetadata[];\n cursor?: string;\n truncated: boolean;\n}\n/**\n * Request for generating a presigned URL\n */\nexport interface PresignedUrlRequest {\n appId: string;\n key: string;\n action: 'read' | 'write';\n contentType?: string;\n expiresIn?: number;\n}\n/**\n * Response containing a presigned URL\n */\nexport interface PresignedUrlResponse {\n url: string;\n expiresAt: number;\n}\n",
|
|
38
38
|
"core-workflow-types.d.ts": "/**\n * Workflow Types - Shared types for native workflow engine\n * DO NOT MODIFY THIS FILE - You may break the project functionality\n */\nimport type { Env } from './core-utils';\nimport type { IntegrationClient } from './core-integrations';\nexport type NativeWorkflowStatus = 'pending' | 'running' | 'sleeping' | 'waiting' | 'paused' | 'completed' | 'failed' | 'cancelled' | 'timedOut';\nexport type NativeStepStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped';\nexport type NativeStepType = 'do' | 'sleep' | 'sleepUntil' | 'waitEvent';\nexport interface NativeWorkflowError {\n code: string;\n message: string;\n stack?: string;\n retryable: boolean;\n}\nexport interface NativeStepAttempt {\n attemptNumber: number;\n startedAt: number;\n completedAt?: number;\n error?: NativeWorkflowError;\n}\nexport interface NativeStepExecution {\n id: string;\n name: string;\n type: NativeStepType;\n status: NativeStepStatus;\n input?: unknown;\n output?: unknown;\n error?: NativeWorkflowError;\n attempts: NativeStepAttempt[];\n maxRetries: number;\n startedAt?: number;\n completedAt?: number;\n timeoutMs?: number;\n sleepUntil?: number;\n eventType?: string;\n eventTimeoutAt?: number;\n}\nexport interface NativeWorkflowInstance {\n id: string;\n workflowName: string;\n status: NativeWorkflowStatus;\n input: unknown;\n output?: unknown;\n error?: NativeWorkflowError;\n createdAt: number;\n startedAt?: number;\n completedAt?: number;\n steps: NativeStepExecution[];\n currentStepId?: string;\n config: NativeWorkflowConfig;\n metadata?: Record<string, unknown>;\n}\nexport interface NativeWorkflowConfig {\n maxRetries: number;\n retryBackoffMs: number;\n stepTimeoutMs: number;\n workflowTimeoutMs: number;\n}\nexport declare const DEFAULT_WORKFLOW_CONFIG: NativeWorkflowConfig;\nexport interface NativeStepContext {\n /** Unique instance ID for this workflow execution */\n instanceId: string;\n /** Input passed when workflow was started */\n workflowInput: unknown;\n /** Results from previous steps */\n previousSteps: Record<string, {\n output: unknown;\n status: NativeStepStatus;\n }>;\n}\nexport interface WorkflowIndexEntry {\n instanceId: string;\n workflowName: string;\n status: NativeWorkflowStatus;\n createdAt: number;\n completedAt?: number;\n}\nexport interface ListWorkflowsOptions {\n workflowName?: string;\n status?: NativeWorkflowStatus;\n limit?: number;\n offset?: number;\n}\nexport interface ExecuteStepRequest {\n instanceId: string;\n stepId: string;\n stepName: string;\n workflowName: string;\n workflowInput: unknown;\n previousSteps: Record<string, {\n output: unknown;\n status: NativeStepStatus;\n }>;\n}\nexport interface ExecuteStepResponse {\n success: boolean;\n output?: unknown;\n error?: NativeWorkflowError;\n}\nexport interface PendingEvent {\n instanceId: string;\n stepId: string;\n eventType: string;\n waitingSince: number;\n timeoutAt?: number;\n}\nexport interface ReceivedEvent {\n type: string;\n payload: unknown;\n timestamp: number;\n}\n/**\n * Result returned by a workflow execution\n */\nexport interface WorkflowResult {\n success: boolean;\n [key: string]: unknown;\n}\n/**\n * Possible states of a workflow instance\n */\nexport type WorkflowStatus = 'queued' | 'running' | 'paused' | 'errored' | 'terminated' | 'complete' | 'waiting';\n/**\n * Information about a workflow instance\n */\nexport interface WorkflowInstanceInfo {\n id: string;\n workflowName: string;\n status: WorkflowStatus;\n params?: Record<string, unknown>;\n createdAt: number;\n startedAt?: number;\n completedAt?: number;\n error?: string;\n result?: WorkflowResult;\n}\n/**\n * Interface for WorkflowInstance DO stub methods\n * Used to type the DurableObjectStub without importing the class\n */\nexport interface WorkflowInstanceStub {\n create(workflowName: string, params: Record<string, unknown>, instanceId: string, config?: Partial<NativeWorkflowConfig>, metadata?: Record<string, unknown>): Promise<void>;\n getStatus(): Promise<NativeWorkflowInstance | null>;\n signal(eventType: string, payload: unknown): Promise<void>;\n pause(): Promise<void>;\n resume(): Promise<void>;\n cancel(): Promise<void>;\n}\n/**\n * Interface for WorkflowCoordinator DO stub methods\n * Used to type the DurableObjectStub without importing the class\n */\nexport interface WorkflowCoordinatorStub {\n create(workflowName: string, params: Record<string, unknown>, config?: Partial<NativeWorkflowConfig>, metadata?: Record<string, unknown>): Promise<string>;\n signal(instanceId: string, eventType: string, payload: unknown): Promise<void>;\n getInstanceInfo(instanceId: string): Promise<WorkflowInstanceInfo | null>;\n listInstances(options?: ListWorkflowsOptions): Promise<WorkflowInstanceInfo[]>;\n updateIndex(instanceId: string, workflowName: string, status: NativeWorkflowStatus): Promise<void>;\n pause(instanceId: string): Promise<void>;\n resume(instanceId: string): Promise<void>;\n cancel(instanceId: string): Promise<void>;\n}\n/**\n * Definition for a workflow handler\n */\nexport interface WorkflowDefinition<TParams = unknown, TResult = unknown> {\n /** Unique name for this workflow (kebab-case, e.g., \"order-fulfillment\") */\n name: string;\n /** Human-readable description of what this workflow does */\n description?: string;\n /** The workflow handler function */\n handler: (ctx: WorkflowContext<TParams>) => Promise<TResult>;\n /** Whether the workflow is enabled (default: true) */\n enabled?: boolean;\n}\n/**\n * Context passed to workflow handlers\n */\nexport interface WorkflowContext<TParams = unknown> {\n /** Environment bindings */\n env: Env;\n /** Unique instance ID for this workflow execution */\n instanceId: string;\n /** Parameters passed when workflow was started */\n params: TParams;\n /** Step utilities for durable execution */\n step: WorkflowStepUtilities;\n /** Integration client for external service calls */\n integrations: IntegrationClient;\n /** Logger for structured workflow logging */\n logger: WorkflowLogger;\n}\n/**\n * Step utilities for durable workflow execution\n */\nexport interface WorkflowStepUtilities {\n /** Execute a step with automatic retry and persistence */\n do<T>(name: string, fn: () => Promise<T>): Promise<T>;\n do<T>(name: string, options: StepOptions, fn: () => Promise<T>): Promise<T>;\n /** Sleep for a duration (e.g., '5 minutes', '1 hour', '24 hours') */\n sleep(name: string, duration: string): Promise<void>;\n /** Sleep until a specific timestamp */\n sleepUntil(name: string, timestamp: Date): Promise<void>;\n /** Wait for an external event */\n waitForEvent<T = unknown>(name: string, options?: WaitEventOptions): Promise<T>;\n}\n/**\n * Options for step execution\n */\nexport interface StepOptions {\n retries?: {\n limit: number;\n delay: string;\n backoff?: 'constant' | 'linear' | 'exponential';\n };\n timeout?: string;\n}\n/**\n * Options for waitForEvent\n */\nexport interface WaitEventOptions {\n type?: string;\n timeout?: string;\n}\n/**\n * Logger interface for workflow execution\n */\nexport interface WorkflowLogger {\n info(message: string, data?: Record<string, unknown>): void;\n warn(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n}\n/**\n * State of a registered workflow\n */\nexport interface WorkflowState {\n name: string;\n description?: string;\n enabled: boolean;\n activeInstances: number;\n totalRuns: number;\n lastRun: number | null;\n lastError?: string;\n}\n/**\n * Response from workflow status API\n */\nexport interface WorkflowStatusResponse {\n workflows: WorkflowState[];\n}\n",
|
|
39
39
|
"workflows.d.ts": "import type { WorkflowDefinition } from './core-workflow-types';\n/**\n * APP_WORKFLOWS - runtime accessor for registered workflow definitions.\n * Used by internal dynamic imports in core-workflow-cloudflare and core-workflow-instance.\n * This is a getter-backed constant so it always reflects the current registry state.\n */\nexport declare const APP_WORKFLOWS: WorkflowDefinition[];\nexport { triggerWorkflow, sendWorkflowEvent, getWorkflowStatus, workflowRoutes, } from './core-workflows';\nexport type { WorkflowResult, WorkflowStatus, WorkflowInstanceInfo, WorkflowDefinition, WorkflowContext, WorkflowStepUtilities, StepOptions, WaitEventOptions, WorkflowLogger, WorkflowState, WorkflowStatusResponse, } from './core-workflows';\nexport type { NativeWorkflowStatus, NativeStepStatus, NativeStepType, NativeWorkflowError, NativeStepAttempt, NativeStepExecution, NativeWorkflowInstance, NativeWorkflowConfig, NativeStepContext, WorkflowIndexEntry, ListWorkflowsOptions, ExecuteStepRequest, ExecuteStepResponse, PendingEvent, ReceivedEvent, WorkflowInstanceStub, WorkflowCoordinatorStub, } from './core-workflow-types';\nexport { DEFAULT_WORKFLOW_CONFIG } from './core-workflow-types';\nexport { WORKFLOW_INFRA_MODE } from './core-workflow-config';\nexport { WorkflowInstanceDO } from './core-workflow-instance';\nexport { WorkflowCoordinator } from './core-workflow-coordinator';\nexport { WorkflowPausedError, isWorkflowControlSignal } from './core-workflow-instance';\n",
|
|
40
|
-
"core-endpoints.d.ts": "/**\n * Core Public Endpoints Framework\n * DO NOT MODIFY THIS FILE - You may break the project functionality\n *\n * This module provides the infrastructure for exposing public API endpoints\n * that external systems can consume with API key authentication or public access.\n */\nimport { type Env } from './core-utils';\nimport { z } from 'zod';\nimport type { Hono } from 'hono';\ntype ZodSchema = z.ZodType<any, any, any>;\n/**\n * Authentication
|
|
40
|
+
"core-endpoints.d.ts": "/**\n * Core Public Endpoints Framework\n * DO NOT MODIFY THIS FILE - You may break the project functionality\n *\n * This module provides the infrastructure for exposing public API endpoints\n * that external systems can consume with API key authentication or public access.\n */\nimport { type Env } from './core-utils';\nimport { z } from 'zod';\nimport type { Hono } from 'hono';\ntype ZodSchema = z.ZodType<any, any, any>;\n/**\n * Authentication requirement declared by an endpoint definition.\n */\nexport type EndpointAuthType = 'apiKey' | 'public';\n/**\n * Caller principal type resolved by the platform and passed via the\n * `X-Public-Endpoint-Auth-Type` header. `user` and `workspace_key` are\n * authenticated principals the platform has already authorized; `api_key`\n * additionally carries a validated key id; `none` is unauthenticated.\n */\nexport type EndpointPrincipalType = 'none' | 'api_key' | 'workspace_key' | 'user';\n/**\n * HTTP methods supported by endpoints\n */\nexport type EndpointMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n/**\n * Schema definition for endpoint validation\n */\nexport interface EndpointSchema<TQuery = unknown, TBody = unknown, TResponse = unknown> {\n /** Query parameters schema */\n query?: ZodSchema;\n /** Request body schema (for POST/PUT/PATCH) */\n body?: ZodSchema;\n /** Response schema for documentation */\n response?: ZodSchema;\n}\n/**\n * Context provided to endpoint handlers\n */\nexport interface EndpointContext<TQuery = Record<string, unknown>, TBody = unknown> {\n /** Environment bindings */\n env: Env;\n /** Original request object */\n request: Request;\n /** Validated query parameters */\n query: TQuery;\n /** Validated request body (null for GET/DELETE) */\n body: TBody | null;\n /** Path parameters extracted from URL */\n params: Record<string, string>;\n /** Authentication information */\n auth: EndpointAuthInfo;\n /** Request headers */\n headers: Headers;\n /** Logger for endpoint operations */\n logger: EndpointLogger;\n}\n/**\n * Authentication information passed to handlers\n */\nexport interface EndpointAuthInfo {\n /** Authentication requirement declared by the endpoint */\n type: EndpointAuthType;\n /** Resolved caller principal type (api_key, workspace_key, user, none) */\n principalType?: EndpointPrincipalType;\n /** API key ID (if authenticated with an API key) */\n apiKeyId?: string;\n /** User ID (if authenticated as a workspace member) */\n userId?: string;\n /** Scopes granted to the API key */\n scopes?: string[];\n /** Whether request is authenticated */\n authenticated: boolean;\n}\n/**\n * Logger for endpoint operations\n */\nexport interface EndpointLogger {\n info(message: string, data?: Record<string, unknown>): void;\n warn(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n}\n/**\n * Metadata for endpoint documentation\n */\nexport interface EndpointMeta {\n /** Human-readable description */\n description?: string;\n /** Tags for grouping in documentation */\n tags?: string[];\n /** Deprecated flag */\n deprecated?: boolean;\n /** Deprecation message */\n deprecationMessage?: string;\n}\n/**\n * Public endpoint definition\n */\nexport interface EndpointDefinition<TQuery = Record<string, unknown>, TBody = unknown, TResponse = unknown> {\n /** URL path (e.g., '/v1/todos', '/users/:id') */\n path: string;\n /** HTTP method */\n method: EndpointMethod;\n /** Authentication requirement */\n auth: EndpointAuthType;\n /** Validation schemas */\n schema?: EndpointSchema<TQuery, TBody, TResponse>;\n /** Request handler */\n handler: EndpointHandler<TQuery, TBody, TResponse>;\n /** Endpoint metadata for documentation */\n meta?: EndpointMeta;\n}\n/**\n * Endpoint handler function type\n */\nexport type EndpointHandler<TQuery = Record<string, unknown>, TBody = unknown, TResponse = unknown> = (ctx: EndpointContext<TQuery, TBody>) => Promise<TResponse>;\n/** Type guard to distinguish EndpointDefinition from function-based route registrars */\nexport declare function isEndpointDefinition(entry: unknown): entry is EndpointDefinition;\n/**\n * Internal: Parsed endpoint info from request headers\n */\nexport interface ParsedEndpointRequest {\n endpointId: string;\n appId: string;\n authType: EndpointPrincipalType;\n apiKeyId?: string;\n userId?: string;\n scopes?: string[];\n}\n/**\n * Create a JSON response\n */\nexport declare function jsonResponse<T>(data: T, status?: number): Response;\n/**\n * Create an error response\n */\nexport declare function errorResponse(message: string, status?: number, code?: string): Response;\n/**\n * Convert Zod schema to JSON Schema for documentation\n * This is a simplified conversion that handles common cases\n */\nexport declare function zodToJsonSchema(schema: ZodSchema | undefined): Record<string, unknown> | undefined;\n/**\n * Endpoint router that matches requests to handlers\n */\nexport declare class EndpointRouter {\n private endpoints;\n /**\n * Register endpoints\n */\n register(endpoints: EndpointDefinition<unknown, unknown, unknown>[]): void;\n /**\n * Find endpoint matching the request\n */\n findEndpoint(method: string, path: string): {\n endpoint: EndpointDefinition<unknown, unknown, unknown>;\n params: Record<string, string>;\n } | null;\n /**\n * Get all registered endpoints for documentation\n */\n getAllEndpoints(): EndpointDefinition<unknown, unknown, unknown>[];\n}\n/**\n * Mount an EndpointDefinition as a native Hono route.\n *\n * Registers the endpoint at its natural path using the correct HTTP method,\n * with Zod validation for query/body schemas and full EndpointContext support.\n * This allows EndpointDefinition entries in APP_ROUTES to work as first-class\n * Hono routes with middleware, streaming, and WebSocket support intact.\n */\nexport declare function mountEndpointAsHonoRoute(app: Hono<{\n Bindings: Env;\n}>, endpoint: EndpointDefinition): void;\n/**\n * Handle an incoming public endpoint request.\n * Called by the platform when routing requests to the app.\n */\nexport declare function handleEndpointRequest<TQuery = unknown, TBody = unknown, TResponse = unknown>(request: Request, env: Env, endpoints: EndpointDefinition<TQuery, TBody, TResponse>[]): Promise<Response>;\n/**\n * Custom error for endpoint handlers\n * Use this to return specific HTTP status codes\n */\nexport declare class EndpointError extends Error {\n status: number;\n code?: string | undefined;\n constructor(message: string, status?: number, code?: string | undefined);\n static badRequest(message: string): EndpointError;\n static unauthorized(message?: string): EndpointError;\n static forbidden(message?: string): EndpointError;\n static notFound(message?: string): EndpointError;\n static conflict(message: string): EndpointError;\n}\n/**\n * Convert endpoint definition to registration data for workspace\n */\nexport declare function endpointToRegistration<TQuery = unknown, TBody = unknown, TResponse = unknown>(endpoint: EndpointDefinition<TQuery, TBody, TResponse>): {\n path: string;\n method: EndpointMethod;\n auth: EndpointAuthType;\n description?: string;\n tags?: string[];\n schema?: {\n query?: Record<string, unknown>;\n body?: Record<string, unknown>;\n response?: Record<string, unknown>;\n };\n};\nexport {};\n",
|
|
41
41
|
"core-utils.d.ts": "/**\n * Core Utilities\n * DO NOT MODIFY THIS FILE - You may break the project functionality\n *\n * This module provides:\n * - Env type: Environment bindings for Cloudflare Workers\n * - API helpers: Response utilities for Hono routes\n *\n * Entity System: See core-entities.ts\n * Workspace Context: See core-workspace.ts\n * Scheduler: See core-scheduler.ts\n */\nimport type { Context } from 'hono';\nimport type { EntityDO } from './core-entity-do';\nimport type { SchedulerDO } from './core-scheduler';\nimport type { BaseAgent } from './core-base-agent';\n/**\n * Environment bindings for Cloudflare Workers\n */\nexport interface Env {\n EntityDO: DurableObjectNamespace<EntityDO>;\n SchedulerDO: DurableObjectNamespace<SchedulerDO>;\n BaseAgent?: DurableObjectNamespace<BaseAgent>;\n WorkspaceObject?: DurableObjectNamespace;\n WorkflowInstance: DurableObjectNamespace;\n WorkflowCoordinator: DurableObjectNamespace;\n BUCKET?: R2Bucket;\n WORKSPACE_ID?: string;\n APP_ID?: string;\n APP_NAME?: string;\n WORKSPACE_API_URL?: string;\n WORKSPACE_API_BASE_URL?: string;\n WORKSPACE_API_KEY?: string;\n DEPLOYMENT_MODE?: 'preview' | 'production';\n VITE_DEPLOYMENT_MODE?: 'preview' | 'production';\n RUNWORK_AI_PROXY_URL?: string;\n RUNWORK_PROXY_TOKEN?: string;\n INTEGRATIONS_PROXY_URL?: string;\n ALLOWED_ORIGINS?: string;\n}\n/**\n * Return a successful JSON response.\n * Returns the data directly as the response body with 200 status.\n */\nexport declare const ok: <T>(c: Context, data: T) => Response & import(\"hono\").TypedResponse<{\n [x: string]: import(\"hono/utils/types\").JSONValue;\n}, import(\"hono/utils/http-status\").ContentfulStatusCode, \"json\">;\n/**\n * Return a 400 Bad Request response\n * Automatically logs the error for debugging in production logs\n */\nexport declare const bad: (c: Context, error: string) => Response & import(\"hono\").TypedResponse<{\n error: string;\n}, 400, \"json\">;\n/**\n * Return a 404 Not Found response\n * Automatically logs the error for debugging in production logs\n */\nexport declare const notFound: (c: Context, error?: string) => Response & import(\"hono\").TypedResponse<{\n error: string;\n}, 404, \"json\">;\n/**\n * Type guard for non-empty strings\n */\nexport declare const isStr: (s: unknown) => s is string;\n/**\n * Safely clone a value for Durable Object storage.\n * Strips non-serializable references (R2Bucket, D1Database, DO stubs, etc.)\n * that would cause structured clone to fail in ctx.storage.put().\n */\nexport declare function safeClone<T>(value: T, fallback?: T): T;\nexport declare function platformFetch(env: Env, url: string | URL, init?: RequestInit): Promise<Response>;\n/**\n * Workspace API fetch - routes workspace service requests through WorkspaceObject DO\n * for production WfP workers, avoiding 522 recursive invocation errors.\n *\n * Workers for Platforms workers cannot HTTP-fetch back to their dispatcher domain.\n * This routes through the WorkspaceObject DO binding in production, and falls back\n * to standard HTTP with x-workspace-key auth header in preview/sandbox.\n *\n * @param env - Environment with workspace bindings\n * @param path - Workspace API sub-path (e.g., '/ingest-event')\n * @param init - Standard fetch options\n */\nexport declare function workspaceApiFetch(env: Pick<Env, 'WORKSPACE_API_URL' | 'WORKSPACE_API_KEY' | 'WORKSPACE_ID' | 'DEPLOYMENT_MODE' | 'WorkspaceObject'>, path: string, init?: RequestInit): Promise<Response>;\n",
|
|
42
42
|
"vite.d.ts": "import { defineConfig, type Plugin } from \"vite\";\nexport interface RunworkPluginOptions {\n /**\n * Override the detected mode. By default, the plugin detects sandbox mode\n * when DEPLOYMENT_MODE or WORKSPACE_ID environment variables are present.\n */\n mode?: \"sandbox\" | \"local\";\n /**\n * Root directory of the project. Defaults to process.cwd().\n */\n root?: string;\n /**\n * Path aliases to configure. Defaults to { \"@\": \"./src\", \"@shared\": \"./shared\" }.\n */\n aliases?: Record<string, string>;\n /**\n * Whether to use JSON logging (pino) in sandbox mode.\n * Defaults to true when VITE_LOGGER_TYPE=json.\n */\n jsonLogger?: boolean;\n}\nexport declare function runwork(options?: RunworkPluginOptions): ReturnType<typeof defineConfig>;\nexport type { Plugin };\n",
|
|
43
43
|
"core-channels.d.ts": "/**\n * Core Channels\n * DO NOT MODIFY THIS FILE - You may break the project functionality\n *\n * This module provides:\n * - postToChannel(): Post rich markdown messages to workspace channels\n *\n * Channels are auto-created if they don't exist, with automatic app event filtering.\n * When running outside a workspace (standalone mode), calls are silently skipped.\n */\nexport interface PostToChannelParams {\n /** Channel name (e.g., \"#inventory-alerts\" or \"inventory-alerts\"). Auto-normalized: # stripped, lowercased, trimmed. */\n channel: string;\n /** Markdown message content */\n content: string;\n /** Optional structured metadata attached to the message */\n metadata?: Record<string, unknown>;\n}\ninterface ChannelEnv {\n WORKSPACE_API_URL?: string;\n WORKSPACE_API_KEY?: string;\n WORKSPACE_ID?: string;\n APP_ID?: string;\n APP_NAME?: string;\n DEPLOYMENT_MODE?: 'preview' | 'production';\n WorkspaceObject?: DurableObjectNamespace;\n}\n/**\n * Any context that supports waitUntil - compatible with both\n * ExecutionContext (Hono route handlers) and DurableObjectState (DOs).\n */\ntype WaitUntilContext = Pick<ExecutionContext, 'waitUntil'>;\n/**\n * Post a rich markdown message to a workspace channel.\n * Fire-and-forget: uses ctx.waitUntil so it doesn't block the response.\n * Silently skips if workspace env vars are not configured (standalone mode).\n *\n * Channels are auto-created on first use. The channel will automatically\n * include this app's system events via filter projection.\n */\nexport declare function postToChannel(ctx: WaitUntilContext, env: ChannelEnv, params: PostToChannelParams): void;\nexport {};\n",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.14.0";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by scripts/embed-types.ts -- do not edit
|
|
2
|
-
export const VERSION = "0.
|
|
2
|
+
export const VERSION = "0.14.0";
|
package/dist/types.d.ts
CHANGED
|
@@ -115,6 +115,7 @@ export interface ExternalSkillRegistration {
|
|
|
115
115
|
importedAt: number;
|
|
116
116
|
importedBy: string;
|
|
117
117
|
}
|
|
118
|
+
export type McpAuthType = 'none' | 'oauth' | 'header';
|
|
118
119
|
export interface McpServerConfig {
|
|
119
120
|
id: string;
|
|
120
121
|
name: string;
|
|
@@ -125,6 +126,8 @@ export interface McpServerConfig {
|
|
|
125
126
|
addedBy: string;
|
|
126
127
|
lastConnectedAt?: number;
|
|
127
128
|
toolCount?: number;
|
|
129
|
+
authType?: McpAuthType;
|
|
130
|
+
headerNames?: string[];
|
|
128
131
|
}
|
|
129
132
|
/**
|
|
130
133
|
* Per-agent state tracking baked-in default permission rules that the CLI
|
package/package.json
CHANGED