@aligndottech/connector-core 0.1.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/LICENSE +21 -0
- package/dist/fetchers/confluence.d.ts +9 -0
- package/dist/fetchers/confluence.d.ts.map +1 -0
- package/dist/fetchers/confluence.js +89 -0
- package/dist/fetchers/confluence.js.map +1 -0
- package/dist/fetchers/errors.d.ts +11 -0
- package/dist/fetchers/errors.d.ts.map +1 -0
- package/dist/fetchers/errors.js +15 -0
- package/dist/fetchers/errors.js.map +1 -0
- package/dist/fetchers/git.d.ts +23 -0
- package/dist/fetchers/git.d.ts.map +1 -0
- package/dist/fetchers/git.js +27 -0
- package/dist/fetchers/git.js.map +1 -0
- package/dist/fetchers/github.d.ts +9 -0
- package/dist/fetchers/github.d.ts.map +1 -0
- package/dist/fetchers/github.js +53 -0
- package/dist/fetchers/github.js.map +1 -0
- package/dist/fetchers/gitlab.d.ts +9 -0
- package/dist/fetchers/gitlab.d.ts.map +1 -0
- package/dist/fetchers/gitlab.js +33 -0
- package/dist/fetchers/gitlab.js.map +1 -0
- package/dist/fetchers/index.d.ts +20 -0
- package/dist/fetchers/index.d.ts.map +1 -0
- package/dist/fetchers/index.js +38 -0
- package/dist/fetchers/index.js.map +1 -0
- package/dist/fetchers/jira.d.ts +9 -0
- package/dist/fetchers/jira.d.ts.map +1 -0
- package/dist/fetchers/jira.js +73 -0
- package/dist/fetchers/jira.js.map +1 -0
- package/dist/fetchers/linear.d.ts +9 -0
- package/dist/fetchers/linear.d.ts.map +1 -0
- package/dist/fetchers/linear.js +71 -0
- package/dist/fetchers/linear.js.map +1 -0
- package/dist/fetchers/notion.d.ts +9 -0
- package/dist/fetchers/notion.d.ts.map +1 -0
- package/dist/fetchers/notion.js +85 -0
- package/dist/fetchers/notion.js.map +1 -0
- package/dist/fetchers/slack.d.ts +10 -0
- package/dist/fetchers/slack.d.ts.map +1 -0
- package/dist/fetchers/slack.js +103 -0
- package/dist/fetchers/slack.js.map +1 -0
- package/dist/fetchers/teams.d.ts +10 -0
- package/dist/fetchers/teams.d.ts.map +1 -0
- package/dist/fetchers/teams.js +76 -0
- package/dist/fetchers/teams.js.map +1 -0
- package/dist/fetchers/util/git.d.ts +22 -0
- package/dist/fetchers/util/git.d.ts.map +1 -0
- package/dist/fetchers/util/git.js +50 -0
- package/dist/fetchers/util/git.js.map +1 -0
- package/dist/fetchers/zoom.d.ts +9 -0
- package/dist/fetchers/zoom.d.ts.map +1 -0
- package/dist/fetchers/zoom.js +72 -0
- package/dist/fetchers/zoom.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/CommandParser.d.ts +69 -0
- package/dist/parsers/CommandParser.d.ts.map +1 -0
- package/dist/parsers/CommandParser.js +233 -0
- package/dist/parsers/CommandParser.js.map +1 -0
- package/dist/services/GatewayClient.d.ts +147 -0
- package/dist/services/GatewayClient.d.ts.map +1 -0
- package/dist/services/GatewayClient.js +411 -0
- package/dist/services/GatewayClient.js.map +1 -0
- package/dist/services/StreamingResponseConsumer.d.ts +28 -0
- package/dist/services/StreamingResponseConsumer.d.ts.map +1 -0
- package/dist/services/StreamingResponseConsumer.js +58 -0
- package/dist/services/StreamingResponseConsumer.js.map +1 -0
- package/dist/services/TelemetryClient.d.ts +116 -0
- package/dist/services/TelemetryClient.d.ts.map +1 -0
- package/dist/services/TelemetryClient.js +234 -0
- package/dist/services/TelemetryClient.js.map +1 -0
- package/dist/testing/MockGatewayClient.d.ts +51 -0
- package/dist/testing/MockGatewayClient.d.ts.map +1 -0
- package/dist/testing/MockGatewayClient.js +84 -0
- package/dist/testing/MockGatewayClient.js.map +1 -0
- package/dist/testing/fixtures.d.ts +49 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +59 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/tiers/capabilities.d.ts +18 -0
- package/dist/tiers/capabilities.d.ts.map +1 -0
- package/dist/tiers/capabilities.js +99 -0
- package/dist/tiers/capabilities.js.map +1 -0
- package/dist/types/fetcher.d.ts +59 -0
- package/dist/types/fetcher.d.ts.map +1 -0
- package/dist/types/fetcher.js +15 -0
- package/dist/types/fetcher.js.map +1 -0
- package/dist/types/flow.d.ts +190 -0
- package/dist/types/flow.d.ts.map +1 -0
- package/dist/types/flow.js +24 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +707 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/requestContext.d.ts +42 -0
- package/dist/utils/requestContext.d.ts.map +1 -0
- package/dist/utils/requestContext.js +56 -0
- package/dist/utils/requestContext.js.map +1 -0
- package/dist/utils/validation.d.ts +25 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +31 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../types/fetcher.js';
|
|
2
|
+
/**
|
|
3
|
+
* Read-only personal Notion fetcher: pages the integration can see, with body
|
|
4
|
+
* text from their child blocks. Author = the page creator ("who to talk to").
|
|
5
|
+
*/
|
|
6
|
+
export declare class NotionFetcher implements ConnectorFetcher {
|
|
7
|
+
fetch(opts: ConnectorFetcherOptions): Promise<FetcherItem[]>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=notion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notion.d.ts","sourceRoot":"","sources":["../../src/fetchers/notion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAsDlG;;;GAGG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IAC9C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CA+CnE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { fetch } from 'undici';
|
|
2
|
+
/** Resolve a Notion user id to a name (cached). Degrades to undefined on failure. */
|
|
3
|
+
function makeNotionUserResolver(headers) {
|
|
4
|
+
const cache = new Map();
|
|
5
|
+
return async (userId) => {
|
|
6
|
+
if (!userId)
|
|
7
|
+
return undefined;
|
|
8
|
+
if (cache.has(userId))
|
|
9
|
+
return cache.get(userId) ?? undefined;
|
|
10
|
+
try {
|
|
11
|
+
const res = await fetch(`https://api.notion.com/v1/users/${userId}`, { headers });
|
|
12
|
+
if (!res.ok) {
|
|
13
|
+
cache.set(userId, null);
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const u = (await res.json());
|
|
17
|
+
const resolved = u.name ? { name: u.name, ...(u.person?.email ? { email: u.person.email } : {}) } : null;
|
|
18
|
+
cache.set(userId, resolved);
|
|
19
|
+
return resolved ?? undefined;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
cache.set(userId, null);
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function extractPageTitle(page) {
|
|
28
|
+
return (page.properties?.title?.title?.[0]?.plain_text ??
|
|
29
|
+
page.properties?.Name?.title?.[0]?.plain_text ??
|
|
30
|
+
'Untitled');
|
|
31
|
+
}
|
|
32
|
+
function extractBlockText(block) {
|
|
33
|
+
const content = block[block.type];
|
|
34
|
+
return (content?.rich_text ?? []).map((t) => t.plain_text ?? '').join('');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read-only personal Notion fetcher: pages the integration can see, with body
|
|
38
|
+
* text from their child blocks. Author = the page creator ("who to talk to").
|
|
39
|
+
*/
|
|
40
|
+
export class NotionFetcher {
|
|
41
|
+
async fetch(opts) {
|
|
42
|
+
const headers = {
|
|
43
|
+
Authorization: `Bearer ${opts.token}`,
|
|
44
|
+
'Notion-Version': '2022-06-28',
|
|
45
|
+
'Content-Type': 'application/json',
|
|
46
|
+
};
|
|
47
|
+
const limit = opts.limit ?? 50;
|
|
48
|
+
const searchRes = await fetch('https://api.notion.com/v1/search', {
|
|
49
|
+
method: 'POST',
|
|
50
|
+
headers,
|
|
51
|
+
body: JSON.stringify({ filter: { value: 'page', property: 'object' }, page_size: limit }),
|
|
52
|
+
});
|
|
53
|
+
if (!searchRes.ok) {
|
|
54
|
+
throw new Error(`Notion API failed (${searchRes.status}). Check your integration token.`);
|
|
55
|
+
}
|
|
56
|
+
const data = (await searchRes.json());
|
|
57
|
+
const resolveUser = makeNotionUserResolver(headers);
|
|
58
|
+
const items = [];
|
|
59
|
+
for (const page of data.results) {
|
|
60
|
+
const title = extractPageTitle(page);
|
|
61
|
+
const pageUrl = page.url ?? `https://notion.so/${page.id.replace(/-/g, '')}`;
|
|
62
|
+
const author = await resolveUser(page.created_by?.id);
|
|
63
|
+
let bodyText = '';
|
|
64
|
+
try {
|
|
65
|
+
const blocksRes = await fetch(`https://api.notion.com/v1/blocks/${page.id}/children?page_size=50`, { headers });
|
|
66
|
+
if (blocksRes.ok) {
|
|
67
|
+
const blocks = (await blocksRes.json());
|
|
68
|
+
bodyText = blocks.results.map(extractBlockText).filter(Boolean).join('\n');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
/* skip block fetch errors */
|
|
73
|
+
}
|
|
74
|
+
items.push({
|
|
75
|
+
source_url: pageUrl,
|
|
76
|
+
platform: 'notion',
|
|
77
|
+
raw_text: [title, bodyText].filter(Boolean).join('\n\n').slice(0, 3000),
|
|
78
|
+
title,
|
|
79
|
+
...(author ? { author } : {}),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return items;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=notion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notion.js","sourceRoot":"","sources":["../../src/fetchers/notion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../types/fetcher.js';
|
|
2
|
+
/**
|
|
3
|
+
* Read-only personal Slack fetcher: threaded conversations (>=2 replies) the
|
|
4
|
+
* token can see, within `daysBack`. Author = the thread starter. A delay between
|
|
5
|
+
* channels keeps under Slack's Tier-2 rate limit (override via `interChannelDelayMs`).
|
|
6
|
+
*/
|
|
7
|
+
export declare class SlackFetcher implements ConnectorFetcher {
|
|
8
|
+
fetch(opts: ConnectorFetcherOptions): Promise<FetcherItem[]>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=slack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/fetchers/slack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAwDlG;;;;GAIG;AACH,qBAAa,YAAa,YAAW,gBAAgB;IAC7C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CA2DnE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { fetch } from 'undici';
|
|
2
|
+
async function slackGet(endpoint, token, params = {}) {
|
|
3
|
+
const qs = new URLSearchParams(params);
|
|
4
|
+
const res = await fetch(`https://slack.com/api/${endpoint}?${qs}`, {
|
|
5
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
6
|
+
});
|
|
7
|
+
const data = (await res.json());
|
|
8
|
+
if (!data.ok)
|
|
9
|
+
throw new Error(`Slack API error on ${endpoint}: ${data.error}`);
|
|
10
|
+
return data;
|
|
11
|
+
}
|
|
12
|
+
/** Resolve a Slack user id to a display name (cached - one users.info call per unique user). */
|
|
13
|
+
function makeUserResolver(token) {
|
|
14
|
+
const cache = new Map();
|
|
15
|
+
return async (userId) => {
|
|
16
|
+
if (!userId)
|
|
17
|
+
return undefined;
|
|
18
|
+
if (cache.has(userId))
|
|
19
|
+
return cache.get(userId) ?? undefined;
|
|
20
|
+
try {
|
|
21
|
+
const data = await slackGet('users.info', token, { user: userId });
|
|
22
|
+
const u = (data.user ?? {});
|
|
23
|
+
const name = u.profile?.real_name || u.real_name || u.profile?.display_name || u.name || userId;
|
|
24
|
+
const resolved = {
|
|
25
|
+
name,
|
|
26
|
+
...(u.name ? { handle: u.name } : {}),
|
|
27
|
+
...(u.profile?.email ? { email: u.profile.email } : {}),
|
|
28
|
+
};
|
|
29
|
+
cache.set(userId, resolved);
|
|
30
|
+
return resolved;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
cache.set(userId, null); // don't retry a failed lookup
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Read-only personal Slack fetcher: threaded conversations (>=2 replies) the
|
|
40
|
+
* token can see, within `daysBack`. Author = the thread starter. A delay between
|
|
41
|
+
* channels keeps under Slack's Tier-2 rate limit (override via `interChannelDelayMs`).
|
|
42
|
+
*/
|
|
43
|
+
export class SlackFetcher {
|
|
44
|
+
async fetch(opts) {
|
|
45
|
+
const limit = opts.limit ?? 50;
|
|
46
|
+
const daysBack = opts.daysBack ?? 90;
|
|
47
|
+
const delayMs = opts.interChannelDelayMs ?? 3000;
|
|
48
|
+
const oldest = String(Math.floor(Date.now() / 1000) - daysBack * 86400);
|
|
49
|
+
await slackGet('auth.test', opts.token);
|
|
50
|
+
const chanData = await slackGet('conversations.list', opts.token, {
|
|
51
|
+
types: 'public_channel,private_channel',
|
|
52
|
+
exclude_archived: 'true',
|
|
53
|
+
limit: '100',
|
|
54
|
+
});
|
|
55
|
+
const channels = chanData.channels ?? [];
|
|
56
|
+
const resolveUser = makeUserResolver(opts.token);
|
|
57
|
+
const items = [];
|
|
58
|
+
for (let channelIndex = 0; channelIndex < channels.length; channelIndex++) {
|
|
59
|
+
const channel = channels[channelIndex];
|
|
60
|
+
if (items.length >= limit)
|
|
61
|
+
break;
|
|
62
|
+
try {
|
|
63
|
+
if (channelIndex > 0 && delayMs > 0)
|
|
64
|
+
await new Promise((r) => setTimeout(r, delayMs));
|
|
65
|
+
const hist = await slackGet('conversations.history', opts.token, {
|
|
66
|
+
channel: channel.id,
|
|
67
|
+
oldest,
|
|
68
|
+
limit: '100',
|
|
69
|
+
});
|
|
70
|
+
const messages = hist.messages ?? [];
|
|
71
|
+
const threads = messages.filter((m) => (m.reply_count ?? 0) >= 2);
|
|
72
|
+
for (const thread of threads) {
|
|
73
|
+
if (items.length >= limit)
|
|
74
|
+
break;
|
|
75
|
+
try {
|
|
76
|
+
const replies = await slackGet('conversations.replies', opts.token, {
|
|
77
|
+
channel: channel.id,
|
|
78
|
+
ts: thread.ts,
|
|
79
|
+
});
|
|
80
|
+
const allMsgs = replies.messages ?? [];
|
|
81
|
+
const text = allMsgs.map((m) => m.text ?? '').join('\n');
|
|
82
|
+
const author = await resolveUser(allMsgs[0]?.user ?? thread.user);
|
|
83
|
+
items.push({
|
|
84
|
+
source_url: `https://slack.com/archives/${channel.id}/p${thread.ts.replace('.', '')}`,
|
|
85
|
+
platform: 'slack',
|
|
86
|
+
raw_text: `[#${channel.name}] Thread:\n${text}`,
|
|
87
|
+
title: (thread.text ?? `Thread in #${channel.name}`).slice(0, 80),
|
|
88
|
+
...(author ? { author } : {}),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
/* skip individual thread errors */
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
/* skip channels that are inaccessible */
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return items;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/fetchers/slack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../types/fetcher.js';
|
|
2
|
+
/**
|
|
3
|
+
* Read-only personal Teams fetcher: recent channel messages (+replies) across the
|
|
4
|
+
* caller's joined teams. Author = the message author. Needs admin-consented
|
|
5
|
+
* ChannelMessage.Read.All.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TeamsFetcher implements ConnectorFetcher {
|
|
8
|
+
fetch(opts: ConnectorFetcherOptions): Promise<FetcherItem[]>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=teams.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/fetchers/teams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAmDlG;;;;GAIG;AACH,qBAAa,YAAa,YAAW,gBAAgB;IAC7C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CA6CnE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { fetch } from 'undici';
|
|
2
|
+
function stripHtml(html) {
|
|
3
|
+
return html.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
|
|
4
|
+
}
|
|
5
|
+
async function graphGet(path, token) {
|
|
6
|
+
const res = await fetch(`https://graph.microsoft.com/v1.0${path}`, {
|
|
7
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
8
|
+
});
|
|
9
|
+
if (!res.ok) {
|
|
10
|
+
const err = (await res.json().catch(() => ({})));
|
|
11
|
+
const code = err.error?.code ?? '';
|
|
12
|
+
if (res.status === 403 || code.includes('Authorization') || code.includes('Consent')) {
|
|
13
|
+
throw new Error('Teams requires admin consent for ChannelMessage.Read.All. ' +
|
|
14
|
+
'Ask your Microsoft 365 admin to grant consent, or see: ' +
|
|
15
|
+
'https://entra.microsoft.com/#view/Microsoft_AAD_IAM/ConsentPoliciesMenuBlade');
|
|
16
|
+
}
|
|
17
|
+
throw new Error(`Microsoft Graph API error ${res.status} on ${path}: ${err.error?.message ?? 'unknown'}`);
|
|
18
|
+
}
|
|
19
|
+
return res.json();
|
|
20
|
+
}
|
|
21
|
+
function extractText(body) {
|
|
22
|
+
if (!body?.content)
|
|
23
|
+
return '';
|
|
24
|
+
return body.contentType === 'html' ? stripHtml(body.content) : body.content;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Read-only personal Teams fetcher: recent channel messages (+replies) across the
|
|
28
|
+
* caller's joined teams. Author = the message author. Needs admin-consented
|
|
29
|
+
* ChannelMessage.Read.All.
|
|
30
|
+
*/
|
|
31
|
+
export class TeamsFetcher {
|
|
32
|
+
async fetch(opts) {
|
|
33
|
+
const limit = opts.limit ?? 50;
|
|
34
|
+
const teams = await graphGet('/me/joinedTeams', opts.token);
|
|
35
|
+
const items = [];
|
|
36
|
+
for (const team of teams.value) {
|
|
37
|
+
if (items.length >= limit)
|
|
38
|
+
break;
|
|
39
|
+
const channels = await graphGet(`/teams/${team.id}/channels`, opts.token);
|
|
40
|
+
for (const channel of channels.value) {
|
|
41
|
+
if (items.length >= limit)
|
|
42
|
+
break;
|
|
43
|
+
try {
|
|
44
|
+
const msgs = await graphGet(`/teams/${team.id}/channels/${channel.id}/messages?$top=10`, opts.token);
|
|
45
|
+
for (const msg of msgs.value) {
|
|
46
|
+
if (items.length >= limit)
|
|
47
|
+
break;
|
|
48
|
+
const mainText = extractText(msg.body);
|
|
49
|
+
const replyTexts = (msg.replies ?? []).map((r) => extractText(r.body)).filter(Boolean);
|
|
50
|
+
const raw_text = [
|
|
51
|
+
`[${team.displayName} > #${channel.displayName}]`,
|
|
52
|
+
msg.subject ? `Subject: ${msg.subject}` : '',
|
|
53
|
+
mainText,
|
|
54
|
+
...replyTexts,
|
|
55
|
+
]
|
|
56
|
+
.filter(Boolean)
|
|
57
|
+
.join('\n');
|
|
58
|
+
const fromName = msg.from?.user?.displayName;
|
|
59
|
+
items.push({
|
|
60
|
+
source_url: msg.webUrl ?? 'https://teams.microsoft.com',
|
|
61
|
+
platform: 'teams',
|
|
62
|
+
raw_text,
|
|
63
|
+
title: (msg.subject ?? mainText).slice(0, 80) || `Message in ${team.displayName}`,
|
|
64
|
+
...(fromName ? { author: { name: fromName } } : {}),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
/* skip inaccessible channels */
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return items;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=teams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.js","sourceRoot":"","sources":["../../src/fetchers/teams.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure git helpers (no process I/O) used by the GitFetcher. The actual
|
|
3
|
+
* `git log` / `git remote` calls are injected via {@link GitCommitSource} so
|
|
4
|
+
* connector-core stays free of execa/child_process.
|
|
5
|
+
*/
|
|
6
|
+
export interface GitCommit {
|
|
7
|
+
sha: string;
|
|
8
|
+
subject: string;
|
|
9
|
+
body?: string;
|
|
10
|
+
author?: string;
|
|
11
|
+
date?: string;
|
|
12
|
+
filesChanged?: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build a web URL for a commit from the origin remote URL (GitHub/GitLab,
|
|
16
|
+
* ssh/https/git protocols). Uses linear string ops (indexOf + anchored strips)
|
|
17
|
+
* rather than backtracking regexes to stay ReDoS-safe on untrusted input.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildCommitUrl(remoteUrl: string | null | undefined, sha: string): string;
|
|
20
|
+
/** Render a commit as the raw text we ingest. */
|
|
21
|
+
export declare function formatCommitAsText(commit: GitCommit, commitUrl?: string): string;
|
|
22
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/fetchers/util/git.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAoBxF;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAUhF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure git helpers (no process I/O) used by the GitFetcher. The actual
|
|
3
|
+
* `git log` / `git remote` calls are injected via {@link GitCommitSource} so
|
|
4
|
+
* connector-core stays free of execa/child_process.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Build a web URL for a commit from the origin remote URL (GitHub/GitLab,
|
|
8
|
+
* ssh/https/git protocols). Uses linear string ops (indexOf + anchored strips)
|
|
9
|
+
* rather than backtracking regexes to stay ReDoS-safe on untrusted input.
|
|
10
|
+
*/
|
|
11
|
+
export function buildCommitUrl(remoteUrl, sha) {
|
|
12
|
+
if (!remoteUrl)
|
|
13
|
+
return `git://commit/${sha}`;
|
|
14
|
+
// Path = everything after "<host>", minus the leading separator and any
|
|
15
|
+
// trailing ".git". Both replaces are anchored (^ / $) so they run in linear time.
|
|
16
|
+
const pathAfter = (host) => {
|
|
17
|
+
const idx = remoteUrl.indexOf(host);
|
|
18
|
+
if (idx < 0)
|
|
19
|
+
return null;
|
|
20
|
+
const rest = remoteUrl
|
|
21
|
+
.slice(idx + host.length)
|
|
22
|
+
.replace(/^[:/]+/, '')
|
|
23
|
+
.replace(/\.git$/, '');
|
|
24
|
+
return rest || null;
|
|
25
|
+
};
|
|
26
|
+
const gh = pathAfter('github.com');
|
|
27
|
+
if (gh)
|
|
28
|
+
return `https://github.com/${gh}/commit/${sha}`;
|
|
29
|
+
const gl = pathAfter('gitlab.com');
|
|
30
|
+
if (gl)
|
|
31
|
+
return `https://gitlab.com/${gl}/-/commit/${sha}`;
|
|
32
|
+
return `git://commit/${sha}`;
|
|
33
|
+
}
|
|
34
|
+
/** Render a commit as the raw text we ingest. */
|
|
35
|
+
export function formatCommitAsText(commit, commitUrl) {
|
|
36
|
+
const parts = [commit.subject];
|
|
37
|
+
if (commit.body)
|
|
38
|
+
parts.push(commit.body);
|
|
39
|
+
if (commit.author)
|
|
40
|
+
parts.push(`Author: ${commit.author}`);
|
|
41
|
+
if (commit.date)
|
|
42
|
+
parts.push(`Date: ${commit.date}`);
|
|
43
|
+
if (commit.filesChanged?.length) {
|
|
44
|
+
parts.push(`Files changed:\n${commit.filesChanged.join('\n')}`);
|
|
45
|
+
}
|
|
46
|
+
if (commitUrl)
|
|
47
|
+
parts.push(`URL: ${commitUrl}`);
|
|
48
|
+
return parts.join('\n\n');
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/fetchers/util/git.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAoC,EAAE,GAAW;IAC9E,IAAI,CAAC,SAAS;QAAE,OAAO,gBAAgB,GAAG,EAAE,CAAC;IAE7C,wEAAwE;IACxE,kFAAkF;IAClF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAiB,EAAE;QAChD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,SAAS;aACnB,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;aACxB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;aACrB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzB,OAAO,IAAI,IAAI,IAAI,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IACnC,IAAI,EAAE;QAAE,OAAO,sBAAsB,EAAE,WAAW,GAAG,EAAE,CAAC;IACxD,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IACnC,IAAI,EAAE;QAAE,OAAO,sBAAsB,EAAE,aAAa,GAAG,EAAE,CAAC;IAC1D,OAAO,gBAAgB,GAAG,EAAE,CAAC;AAC/B,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAkB;IACtE,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../types/fetcher.js';
|
|
2
|
+
/**
|
|
3
|
+
* Read-only personal Zoom fetcher: cloud-recording transcripts (VTT), parsed to
|
|
4
|
+
* plain text. Author = the meeting host. `uuid` (single meeting) rides on opts.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ZoomFetcher implements ConnectorFetcher {
|
|
7
|
+
fetch(opts: ConnectorFetcherOptions): Promise<FetcherItem[]>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=zoom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../src/fetchers/zoom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAgDlG;;;GAGG;AACH,qBAAa,WAAY,YAAW,gBAAgB;IAC5C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAyCnE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { fetch } from 'undici';
|
|
2
|
+
function parseWebVtt(vtt) {
|
|
3
|
+
return vtt
|
|
4
|
+
.split('\n')
|
|
5
|
+
.filter((line) => line.trim() !== '' &&
|
|
6
|
+
line.trim() !== 'WEBVTT' &&
|
|
7
|
+
!/^\d+$/.test(line.trim()) &&
|
|
8
|
+
!line.includes(' --> '))
|
|
9
|
+
.join(' ')
|
|
10
|
+
.replace(/\s+/g, ' ')
|
|
11
|
+
.trim();
|
|
12
|
+
}
|
|
13
|
+
function encodeMeetingUuid(uuid) {
|
|
14
|
+
const encoded = encodeURIComponent(uuid);
|
|
15
|
+
return uuid.includes('//') ? encodeURIComponent(encoded) : encoded;
|
|
16
|
+
}
|
|
17
|
+
async function zoomGet(path, token) {
|
|
18
|
+
const res = await fetch(`https://api.zoom.us/v2${path}`, {
|
|
19
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
20
|
+
});
|
|
21
|
+
if (!res.ok) {
|
|
22
|
+
const err = (await res.json().catch(() => ({})));
|
|
23
|
+
throw new Error(`Zoom API error ${res.status}: ${err.message ?? 'unknown'}`);
|
|
24
|
+
}
|
|
25
|
+
return res.json();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Read-only personal Zoom fetcher: cloud-recording transcripts (VTT), parsed to
|
|
29
|
+
* plain text. Author = the meeting host. `uuid` (single meeting) rides on opts.
|
|
30
|
+
*/
|
|
31
|
+
export class ZoomFetcher {
|
|
32
|
+
async fetch(opts) {
|
|
33
|
+
const limit = opts.limit ?? 30;
|
|
34
|
+
const uuid = opts.uuid;
|
|
35
|
+
const path = uuid ? `/meetings/${encodeMeetingUuid(uuid)}/recordings` : `/users/me/recordings?page_size=30`;
|
|
36
|
+
const data = await zoomGet(path, opts.token);
|
|
37
|
+
const meetings = data.meetings ?? [];
|
|
38
|
+
const items = [];
|
|
39
|
+
for (const meeting of meetings) {
|
|
40
|
+
if (items.length >= limit)
|
|
41
|
+
break;
|
|
42
|
+
const vttFile = (meeting.recording_files ?? []).find((f) => f.file_type === 'TRANSCRIPT' && f.status === 'completed');
|
|
43
|
+
if (!vttFile)
|
|
44
|
+
continue;
|
|
45
|
+
try {
|
|
46
|
+
const vttRes = await fetch(`${vttFile.download_url}?access_token=${opts.token}`);
|
|
47
|
+
if (!vttRes.ok)
|
|
48
|
+
continue;
|
|
49
|
+
const vttText = await vttRes.text();
|
|
50
|
+
const transcript = parseWebVtt(vttText);
|
|
51
|
+
if (!transcript)
|
|
52
|
+
continue;
|
|
53
|
+
const date = meeting.start_time.slice(0, 10);
|
|
54
|
+
const host = meeting.host_email
|
|
55
|
+
? { name: meeting.host_email.split('@')[0], email: meeting.host_email }
|
|
56
|
+
: undefined;
|
|
57
|
+
items.push({
|
|
58
|
+
source_url: `https://zoom.us/recording/${encodeMeetingUuid(meeting.uuid)}`,
|
|
59
|
+
platform: 'zoom',
|
|
60
|
+
raw_text: `[${meeting.topic} - ${date}]\n${transcript}`.slice(0, 4000),
|
|
61
|
+
title: `${meeting.topic} (${date})`.slice(0, 80),
|
|
62
|
+
...(host ? { author: host } : {}),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
/* skip recordings with inaccessible transcripts */
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return items;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=zoom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoom.js","sourceRoot":"","sources":["../../src/fetchers/zoom.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aligndottech/connector-core
|
|
3
|
+
*
|
|
4
|
+
* The lightweight, open foundation for Align connectors: the read contract
|
|
5
|
+
* (`ConnectorFetcher`), normalized item types, read-only fetcher implementations,
|
|
6
|
+
* the gateway client, parsers, and tier definitions. No server dependencies -
|
|
7
|
+
* safe to depend on from the Align CLI.
|
|
8
|
+
*
|
|
9
|
+
* Server-side plumbing (Express app, MCP handler, webhooks, OTel) lives in
|
|
10
|
+
* `@aligndottech/connector-server`. Decision-capture engines remain proprietary.
|
|
11
|
+
*/
|
|
12
|
+
export * from './types/index.js';
|
|
13
|
+
export type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem, FetcherPage, DecisionAuthor, } from './types/fetcher.js';
|
|
14
|
+
export { FETCHERS, GitHubFetcher, GitLabFetcher, JiraFetcher, ConfluenceFetcher, SlackFetcher, TeamsFetcher, ZoomFetcher, LinearFetcher, NotionFetcher, GitFetcher, buildCommitUrl, formatCommitAsText, FetcherAuthError, type GitCommitSource, type GitCommit, } from './fetchers/index.js';
|
|
15
|
+
export { getContext, tryGetContext, runWithContext, runWithContextAsync, extractBearer, getBearer, type BaseRequestContext, } from './utils/requestContext.js';
|
|
16
|
+
export { UUID_REGEX, isValidUUID, assertValidUUID } from './utils/validation.js';
|
|
17
|
+
export { CommandParser, CommandHelpText } from './parsers/CommandParser.js';
|
|
18
|
+
export { GatewayClient, type GatewayClientConfig, type JiraCredentials, } from './services/GatewayClient.js';
|
|
19
|
+
export { consumeStreamWithProgressiveUpdates, type MessageUpdater, type StreamConsumerOptions, } from './services/StreamingResponseConsumer.js';
|
|
20
|
+
export { TelemetryClient, createTelemetryClient, type TelemetryClientConfig, type TelemetryEvent, type TelemetryCategory, type TelemetryPlatform, } from './services/TelemetryClient.js';
|
|
21
|
+
export { CONNECTOR_TIERS, TIER_CAPABILITIES, getTierCapabilities, type TierCapabilities, } from './tiers/capabilities.js';
|
|
22
|
+
export { NoOpDecisionFlowStateRepository, type PlatformMessage, type DecisionAlertFormatter, type MessagePoster, type DecisionFlowConversationState, type DecisionFlowCommand, type IDecisionFlowStateRepository, type IMultiDecisionStateRepository, type IConversationStateRepository, type IDecisionFlowService, type IMultiDecisionFlowService, type IConversationFlowService, type MultiDecisionFlowResult, type ConnectorTier, type ConnectorCapabilities, type TranscriptAnalysisResult, type DecisionCaptureResult, } from './types/flow.js';
|
|
23
|
+
export { MockGatewayClient } from './testing/MockGatewayClient.js';
|
|
24
|
+
export { fixtures } from './testing/fixtures.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,QAAQ,EACR,aAAa,EACb,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,SAAS,GACf,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG5E,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mCAAmC,EACnC,KAAK,cAAc,EACnB,KAAK,qBAAqB,GAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,+BAA+B,EAC/B,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC3B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aligndottech/connector-core
|
|
3
|
+
*
|
|
4
|
+
* The lightweight, open foundation for Align connectors: the read contract
|
|
5
|
+
* (`ConnectorFetcher`), normalized item types, read-only fetcher implementations,
|
|
6
|
+
* the gateway client, parsers, and tier definitions. No server dependencies -
|
|
7
|
+
* safe to depend on from the Align CLI.
|
|
8
|
+
*
|
|
9
|
+
* Server-side plumbing (Express app, MCP handler, webhooks, OTel) lives in
|
|
10
|
+
* `@aligndottech/connector-server`. Decision-capture engines remain proprietary.
|
|
11
|
+
*/
|
|
12
|
+
// Shared types
|
|
13
|
+
export * from './types/index.js';
|
|
14
|
+
// Canonical read-only fetchers (one implementation per provider, shared by the
|
|
15
|
+
// CLI personal import and the paid discover scan).
|
|
16
|
+
export { FETCHERS, GitHubFetcher, GitLabFetcher, JiraFetcher, ConfluenceFetcher, SlackFetcher, TeamsFetcher, ZoomFetcher, LinearFetcher, NotionFetcher, GitFetcher, buildCommitUrl, formatCommitAsText, FetcherAuthError, } from './fetchers/index.js';
|
|
17
|
+
// Utils
|
|
18
|
+
export { getContext, tryGetContext, runWithContext, runWithContextAsync, extractBearer, getBearer, } from './utils/requestContext.js';
|
|
19
|
+
export { UUID_REGEX, isValidUUID, assertValidUUID } from './utils/validation.js';
|
|
20
|
+
// Parsers
|
|
21
|
+
export { CommandParser, CommandHelpText } from './parsers/CommandParser.js';
|
|
22
|
+
// Services (light)
|
|
23
|
+
export { GatewayClient, } from './services/GatewayClient.js';
|
|
24
|
+
export { consumeStreamWithProgressiveUpdates, } from './services/StreamingResponseConsumer.js';
|
|
25
|
+
export { TelemetryClient, createTelemetryClient, } from './services/TelemetryClient.js';
|
|
26
|
+
// Tiers
|
|
27
|
+
export { CONNECTOR_TIERS, TIER_CAPABILITIES, getTierCapabilities, } from './tiers/capabilities.js';
|
|
28
|
+
// Decision-flow interfaces (contributor-implemented; engine stays proprietary)
|
|
29
|
+
export { NoOpDecisionFlowStateRepository, } from './types/flow.js';
|
|
30
|
+
// Testing utilities
|
|
31
|
+
export { MockGatewayClient } from './testing/MockGatewayClient.js';
|
|
32
|
+
export { fixtures } from './testing/fixtures.js';
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAe;AACf,cAAc,kBAAkB,CAAC;AAWjC,+EAA+E;AAC/E,mDAAmD;AACnD,OAAO,EACL,QAAQ,EACR,aAAa,EACb,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAE7B,QAAQ;AACR,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,SAAS,GAEV,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEjF,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE5E,mBAAmB;AACnB,OAAO,EACL,aAAa,GAGd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mCAAmC,GAGpC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,eAAe,EACf,qBAAqB,GAKtB,MAAM,+BAA+B,CAAC;AAEvC,QAAQ;AACR,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AAEjC,+EAA+E;AAC/E,OAAO,EACL,+BAA+B,GAiBhC,MAAM,iBAAiB,CAAC;AAEzB,oBAAoB;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC"}
|