@aligndottech/cli 0.1.4 → 0.3.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.
Files changed (47) hide show
  1. package/dist/commands/setup.d.ts.map +1 -1
  2. package/dist/commands/setup.js +43 -17
  3. package/dist/commands/setup.js.map +1 -1
  4. package/dist/lib/fetchers/confluence.d.ts +2 -0
  5. package/dist/lib/fetchers/confluence.d.ts.map +1 -1
  6. package/dist/lib/fetchers/confluence.js +9 -77
  7. package/dist/lib/fetchers/confluence.js.map +1 -1
  8. package/dist/lib/fetchers/git.d.ts +2 -0
  9. package/dist/lib/fetchers/git.d.ts.map +1 -1
  10. package/dist/lib/fetchers/git.js +5 -14
  11. package/dist/lib/fetchers/git.js.map +1 -1
  12. package/dist/lib/fetchers/github.d.ts +1 -0
  13. package/dist/lib/fetchers/github.d.ts.map +1 -1
  14. package/dist/lib/fetchers/github.js +3 -42
  15. package/dist/lib/fetchers/github.js.map +1 -1
  16. package/dist/lib/fetchers/gitlab.d.ts +1 -0
  17. package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
  18. package/dist/lib/fetchers/gitlab.js +3 -21
  19. package/dist/lib/fetchers/gitlab.js.map +1 -1
  20. package/dist/lib/fetchers/jira.d.ts +2 -0
  21. package/dist/lib/fetchers/jira.d.ts.map +1 -1
  22. package/dist/lib/fetchers/jira.js +10 -55
  23. package/dist/lib/fetchers/jira.js.map +1 -1
  24. package/dist/lib/fetchers/linear.d.ts +1 -0
  25. package/dist/lib/fetchers/linear.d.ts.map +1 -1
  26. package/dist/lib/fetchers/linear.js +3 -60
  27. package/dist/lib/fetchers/linear.js.map +1 -1
  28. package/dist/lib/fetchers/notion.d.ts +1 -0
  29. package/dist/lib/fetchers/notion.d.ts.map +1 -1
  30. package/dist/lib/fetchers/notion.js +3 -73
  31. package/dist/lib/fetchers/notion.js.map +1 -1
  32. package/dist/lib/fetchers/slack.d.ts +1 -0
  33. package/dist/lib/fetchers/slack.d.ts.map +1 -1
  34. package/dist/lib/fetchers/slack.js +3 -85
  35. package/dist/lib/fetchers/slack.js.map +1 -1
  36. package/dist/lib/fetchers/teams.d.ts +1 -0
  37. package/dist/lib/fetchers/teams.d.ts.map +1 -1
  38. package/dist/lib/fetchers/teams.js +3 -62
  39. package/dist/lib/fetchers/teams.js.map +1 -1
  40. package/dist/lib/fetchers/zoom.d.ts +1 -0
  41. package/dist/lib/fetchers/zoom.d.ts.map +1 -1
  42. package/dist/lib/fetchers/zoom.js +3 -62
  43. package/dist/lib/fetchers/zoom.js.map +1 -1
  44. package/dist/lib/gateway-client.d.ts +2 -15
  45. package/dist/lib/gateway-client.d.ts.map +1 -1
  46. package/dist/lib/gateway-client.js.map +1 -1
  47. package/package.json +2 -1
@@ -1,60 +1,15 @@
1
+ import { FetcherAuthError, JiraFetcher } from '@aligndottech/connector-core';
1
2
  import { AuthExpiredError } from '../errors.js';
2
- function extractAdfText(adf) {
3
- if (!adf)
4
- return '';
5
- return (adf.content ?? [])
6
- .flatMap(block => (block.content ?? []).map(inline => inline.text ?? ''))
7
- .join(' ')
8
- .trim();
9
- }
3
+ /** Read-only personal Jira import. Delegates to the canonical fetcher in
4
+ * @aligndottech/connector-core; maps its auth error to the CLI's reconnect flow. */
10
5
  export async function fetchJiraItems(opts) {
11
- const isOAuth = Boolean(opts.cloudId);
12
- const base = isOAuth
13
- ? `https://api.atlassian.com/ex/jira/${opts.cloudId}`
14
- : `https://${opts.domain}`;
15
- const headers = isOAuth
16
- ? { Authorization: `Bearer ${opts.token}`, Accept: 'application/json' }
17
- : { Authorization: `Basic ${Buffer.from(`${opts.email}:${opts.token}`).toString('base64')}`, Accept: 'application/json' };
18
- const limit = opts.limit ?? 100;
19
- const jql = 'assignee = currentUser() OR reporter = currentUser() ORDER BY updated DESC';
20
- const res = await fetch(`${base}/rest/api/3/search/jql`, {
21
- method: 'POST',
22
- headers: { ...headers, 'Content-Type': 'application/json' },
23
- body: JSON.stringify({ jql, maxResults: limit, fields: ['summary', 'description', 'status', 'key', 'reporter'] }),
24
- });
25
- if (!res.ok) {
26
- // 401 = expired/revoked (re-auth helps). 403 = lacks Jira scopes / no access
27
- // (re-auth won't help) - don't trigger a reconnect loop.
28
- if (res.status === 401)
29
- throw new AuthExpiredError('Jira');
30
- if (res.status === 403) {
31
- throw new Error("Jira access denied (403): the token lacks Jira scopes or access. Re-auth won't help - " +
32
- "check the Atlassian app's Jira API permissions.");
33
- }
34
- const text = await res.text();
35
- throw new Error(`Jira API failed (${res.status}): ${text.slice(0, 200)}`);
6
+ try {
7
+ return await new JiraFetcher().fetch(opts);
8
+ }
9
+ catch (e) {
10
+ if (e instanceof FetcherAuthError)
11
+ throw new AuthExpiredError(e.connector);
12
+ throw e;
36
13
  }
37
- const data = await res.json();
38
- // For OAuth mode use the human site base URL (e.g. https://company.atlassian.net)
39
- const browseBase = isOAuth
40
- ? (opts.siteBase ?? `https://api.atlassian.com/ex/jira/${opts.cloudId}`)
41
- : base;
42
- return data.issues.map(issue => {
43
- const desc = extractAdfText(issue.fields.description);
44
- return {
45
- source_url: `${browseBase}/browse/${issue.key}`,
46
- platform: 'jira',
47
- raw_text: [
48
- `[${issue.key}] ${issue.fields.summary}`,
49
- desc,
50
- issue.fields.status?.name ? `Status: ${issue.fields.status.name}` : '',
51
- ].filter(Boolean).join('\n\n'),
52
- title: `[${issue.key}] ${issue.fields.summary}`,
53
- // Who to talk to (ALI-118): the issue reporter.
54
- ...(issue.fields.reporter?.displayName
55
- ? { author: { name: issue.fields.reporter.displayName, ...(issue.fields.reporter.emailAddress ? { email: issue.fields.reporter.emailAddress } : {}) } }
56
- : {}),
57
- };
58
- });
59
14
  }
60
15
  //# sourceMappingURL=jira.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../../src/lib/fetchers/jira.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../../src/lib/fetchers/jira.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD;qFACqF;AACrF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAOpC;IACC,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,gBAAgB;YAAE,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { PersonalImportItem } from '../personal-import.js';
2
+ /** Read-only personal Linear import (canonical fetcher in connector-core). */
2
3
  export declare function fetchLinearItems(opts: {
3
4
  token: string;
4
5
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/linear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAiChE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA2ChC"}
1
+ {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/linear.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,8EAA8E;AAC9E,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE7G"}
@@ -1,63 +1,6 @@
1
- const LINEAR_GQL = 'https://api.linear.app/graphql';
2
- const ISSUES_QUERY = `
3
- query PersonalIssues($first: Int!) {
4
- viewer {
5
- assignedIssues(first: $first, orderBy: updatedAt) {
6
- nodes {
7
- id title description url
8
- state { name }
9
- team { name }
10
- creator { name email }
11
- comments { nodes { body user { name } } }
12
- }
13
- }
14
- createdIssues(first: $first, orderBy: updatedAt) {
15
- nodes { id title description url state { name } team { name } creator { name email } }
16
- }
17
- }
18
- }`;
1
+ import { LinearFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal Linear import (canonical fetcher in connector-core). */
19
3
  export async function fetchLinearItems(opts) {
20
- const limit = opts.limit ?? 50;
21
- const res = await fetch(LINEAR_GQL, {
22
- method: 'POST',
23
- headers: { Authorization: `Bearer ${opts.token}`, 'Content-Type': 'application/json' },
24
- body: JSON.stringify({ query: ISSUES_QUERY, variables: { first: limit } }),
25
- });
26
- if (!res.ok)
27
- throw new Error(`Linear API failed (${res.status}). Check your personal API token.`);
28
- const data = await res.json();
29
- if (data.errors?.length)
30
- throw new Error(data.errors[0].message);
31
- const seen = new Set();
32
- const items = [];
33
- const allIssues = [
34
- ...(data.data.viewer.assignedIssues?.nodes ?? []),
35
- ...(data.data.viewer.createdIssues?.nodes ?? []),
36
- ];
37
- for (const issue of allIssues) {
38
- if (seen.has(issue.id))
39
- continue;
40
- seen.add(issue.id);
41
- const comments = (issue.comments?.nodes ?? [])
42
- .map(c => `${c.user?.name ?? 'Unknown'}: ${c.body}`)
43
- .join('\n');
44
- items.push({
45
- source_url: issue.url,
46
- platform: 'linear',
47
- raw_text: [
48
- issue.title,
49
- issue.description ?? '',
50
- issue.team?.name ? `Team: ${issue.team.name}` : '',
51
- issue.state?.name ? `Status: ${issue.state.name}` : '',
52
- comments ? `Comments:\n${comments}` : '',
53
- ].filter(Boolean).join('\n\n'),
54
- title: issue.title,
55
- // Who to talk to (ALI-118): the issue creator.
56
- ...(issue.creator?.name
57
- ? { author: { name: issue.creator.name, ...(issue.creator.email ? { email: issue.creator.email } : {}) } }
58
- : {}),
59
- });
60
- }
61
- return items.slice(0, limit);
4
+ return new LinearFetcher().fetch(opts);
62
5
  }
63
6
  //# sourceMappingURL=linear.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../src/lib/fetchers/linear.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../src/lib/fetchers/linear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAuC;IAC5E,OAAO,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { PersonalImportItem } from '../personal-import.js';
2
+ /** Read-only personal Notion import (canonical fetcher in connector-core). */
2
3
  export declare function fetchNotionItems(opts: {
3
4
  token: string;
4
5
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"notion.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/notion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAmDhE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA2ChC"}
1
+ {"version":3,"file":"notion.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/notion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,8EAA8E;AAC9E,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE7G"}
@@ -1,76 +1,6 @@
1
- /** Resolve a Notion user id to a name (cached). Degrades to undefined on failure. */
2
- function makeNotionUserResolver(headers) {
3
- const cache = new Map();
4
- return async (userId) => {
5
- if (!userId)
6
- return undefined;
7
- if (cache.has(userId))
8
- return cache.get(userId) ?? undefined;
9
- try {
10
- const res = await fetch(`https://api.notion.com/v1/users/${userId}`, { headers });
11
- if (!res.ok) {
12
- cache.set(userId, null);
13
- return undefined;
14
- }
15
- const u = (await res.json());
16
- const resolved = u.name ? { name: u.name, ...(u.person?.email ? { email: u.person.email } : {}) } : null;
17
- cache.set(userId, resolved);
18
- return resolved ?? undefined;
19
- }
20
- catch {
21
- cache.set(userId, null);
22
- return undefined;
23
- }
24
- };
25
- }
26
- function extractPageTitle(page) {
27
- return (page.properties?.title?.title?.[0]?.plain_text ??
28
- page.properties?.Name?.title?.[0]?.plain_text ??
29
- 'Untitled');
30
- }
31
- function extractBlockText(block) {
32
- const content = block[block.type];
33
- return (content?.rich_text ?? []).map(t => t.plain_text ?? '').join('');
34
- }
1
+ import { NotionFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal Notion import (canonical fetcher in connector-core). */
35
3
  export async function fetchNotionItems(opts) {
36
- const headers = {
37
- Authorization: `Bearer ${opts.token}`,
38
- 'Notion-Version': '2022-06-28',
39
- 'Content-Type': 'application/json',
40
- };
41
- const limit = opts.limit ?? 50;
42
- const searchRes = await fetch('https://api.notion.com/v1/search', {
43
- method: 'POST',
44
- headers,
45
- body: JSON.stringify({ filter: { value: 'page', property: 'object' }, page_size: limit }),
46
- });
47
- if (!searchRes.ok)
48
- throw new Error(`Notion API failed (${searchRes.status}). Check your integration token.`);
49
- const data = await searchRes.json();
50
- const resolveUser = makeNotionUserResolver(headers);
51
- const items = [];
52
- for (const page of data.results) {
53
- const title = extractPageTitle(page);
54
- const pageUrl = page.url ?? `https://notion.so/${page.id.replace(/-/g, '')}`;
55
- // Who to talk to (ALI-119): the page creator.
56
- const author = await resolveUser(page.created_by?.id);
57
- let bodyText = '';
58
- try {
59
- const blocksRes = await fetch(`https://api.notion.com/v1/blocks/${page.id}/children?page_size=50`, { headers });
60
- if (blocksRes.ok) {
61
- const blocks = await blocksRes.json();
62
- bodyText = blocks.results.map(extractBlockText).filter(Boolean).join('\n');
63
- }
64
- }
65
- catch { /* skip block fetch errors */ }
66
- items.push({
67
- source_url: pageUrl,
68
- platform: 'notion',
69
- raw_text: [title, bodyText].filter(Boolean).join('\n\n').slice(0, 3000),
70
- title,
71
- ...(author ? { author } : {}),
72
- });
73
- }
74
- return items;
4
+ return new NotionFetcher().fetch(opts);
75
5
  }
76
6
  //# sourceMappingURL=notion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notion.js","sourceRoot":"","sources":["../../../src/lib/fetchers/notion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notion.js","sourceRoot":"","sources":["../../../src/lib/fetchers/notion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAuC;IAC5E,OAAO,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { PersonalImportItem } from '../personal-import.js';
2
+ /** Read-only personal Slack import (canonical fetcher in connector-core). */
2
3
  export declare function fetchSlackItems(opts: {
3
4
  token: string;
4
5
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/slack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA4ChE,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuDhC"}
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/slack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,6EAA6E;AAC7E,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE/H"}
@@ -1,88 +1,6 @@
1
- async function slackGet(endpoint, token, params = {}) {
2
- const qs = new URLSearchParams(params);
3
- const res = await fetch(`https://slack.com/api/${endpoint}?${qs}`, {
4
- headers: { Authorization: `Bearer ${token}` },
5
- });
6
- const data = await res.json();
7
- if (!data.ok)
8
- throw new Error(`Slack API error on ${endpoint}: ${data.error}`);
9
- return data;
10
- }
11
- /** Resolve a Slack user id to a display name (cached - one users.info call per unique user). */
12
- function makeUserResolver(token) {
13
- const cache = new Map();
14
- return async (userId) => {
15
- if (!userId)
16
- return undefined;
17
- if (cache.has(userId))
18
- return cache.get(userId) ?? undefined;
19
- try {
20
- const data = await slackGet('users.info', token, { user: userId });
21
- const u = (data.user ?? {});
22
- const name = u.profile?.real_name || u.real_name || u.profile?.display_name || u.name || userId;
23
- const resolved = { name, ...(u.name ? { handle: u.name } : {}), ...(u.profile?.email ? { email: u.profile.email } : {}) };
24
- cache.set(userId, resolved);
25
- return resolved;
26
- }
27
- catch {
28
- cache.set(userId, null); // don't retry a failed lookup
29
- return undefined;
30
- }
31
- };
32
- }
1
+ import { SlackFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal Slack import (canonical fetcher in connector-core). */
33
3
  export async function fetchSlackItems(opts) {
34
- const limit = opts.limit ?? 50;
35
- const daysBack = opts.daysBack ?? 90;
36
- const oldest = String(Math.floor(Date.now() / 1000) - daysBack * 86400);
37
- await slackGet('auth.test', opts.token);
38
- const chanData = await slackGet('conversations.list', opts.token, {
39
- types: 'public_channel,private_channel',
40
- exclude_archived: 'true',
41
- limit: '100',
42
- });
43
- const channels = chanData.channels ?? [];
44
- const resolveUser = makeUserResolver(opts.token);
45
- const items = [];
46
- for (let channelIndex = 0; channelIndex < channels.length; channelIndex++) {
47
- const channel = channels[channelIndex];
48
- if (items.length >= limit)
49
- break;
50
- try {
51
- // 3-second delay between channels to stay under Tier 2 rate limit (20 req/min)
52
- if (channelIndex > 0)
53
- await new Promise(r => setTimeout(r, 3000));
54
- const hist = await slackGet('conversations.history', opts.token, {
55
- channel: channel.id,
56
- oldest,
57
- limit: '100',
58
- });
59
- const messages = hist.messages ?? [];
60
- const threads = messages.filter(m => (m.reply_count ?? 0) >= 2);
61
- for (const thread of threads) {
62
- if (items.length >= limit)
63
- break;
64
- try {
65
- const replies = await slackGet('conversations.replies', opts.token, {
66
- channel: channel.id,
67
- ts: thread.ts,
68
- });
69
- const allMsgs = replies.messages ?? [];
70
- const text = allMsgs.map(m => m.text ?? '').join('\n');
71
- // Who to talk to (ALI-118): the thread starter (original poster).
72
- const author = await resolveUser(allMsgs[0]?.user ?? thread.user);
73
- items.push({
74
- source_url: `https://slack.com/archives/${channel.id}/p${thread.ts.replace('.', '')}`,
75
- platform: 'slack',
76
- raw_text: `[#${channel.name}] Thread:\n${text}`,
77
- title: (thread.text ?? `Thread in #${channel.name}`).slice(0, 80),
78
- ...(author ? { author } : {}),
79
- });
80
- }
81
- catch { /* skip individual thread errors */ }
82
- }
83
- }
84
- catch { /* skip channels that are inaccessible */ }
85
- }
86
- return items;
4
+ return new SlackFetcher().fetch(opts);
87
5
  }
88
6
  //# sourceMappingURL=slack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/lib/fetchers/slack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/lib/fetchers/slack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAA0D;IAC9F,OAAO,IAAI,YAAY,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { PersonalImportItem } from '../personal-import.js';
2
+ /** Read-only personal Teams import (canonical fetcher in connector-core). */
2
3
  export declare function fetchTeamsItems(opts: {
3
4
  token: string;
4
5
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/teams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA0ChE,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA0ChC"}
1
+ {"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/teams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,6EAA6E;AAC7E,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE5G"}
@@ -1,65 +1,6 @@
1
- function stripHtml(html) {
2
- return html.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
3
- }
4
- async function graphGet(path, token) {
5
- const res = await fetch(`https://graph.microsoft.com/v1.0${path}`, {
6
- headers: { Authorization: `Bearer ${token}` },
7
- });
8
- if (!res.ok) {
9
- const err = await res.json().catch(() => ({}));
10
- const code = err.error?.code ?? '';
11
- if (res.status === 403 || code.includes('Authorization') || code.includes('Consent')) {
12
- throw new Error('Teams requires admin consent for ChannelMessage.Read.All. ' +
13
- 'Ask your Microsoft 365 admin to grant consent, or see: ' +
14
- 'https://entra.microsoft.com/#view/Microsoft_AAD_IAM/ConsentPoliciesMenuBlade');
15
- }
16
- throw new Error(`Microsoft Graph API error ${res.status} on ${path}: ${err.error?.message ?? 'unknown'}`);
17
- }
18
- return res.json();
19
- }
20
- function extractText(body) {
21
- if (!body?.content)
22
- return '';
23
- return body.contentType === 'html' ? stripHtml(body.content) : body.content;
24
- }
1
+ import { TeamsFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal Teams import (canonical fetcher in connector-core). */
25
3
  export async function fetchTeamsItems(opts) {
26
- const limit = opts.limit ?? 50;
27
- const teams = await graphGet('/me/joinedTeams', opts.token);
28
- const items = [];
29
- for (const team of teams.value) {
30
- if (items.length >= limit)
31
- break;
32
- const channels = await graphGet(`/teams/${team.id}/channels`, opts.token);
33
- for (const channel of channels.value) {
34
- if (items.length >= limit)
35
- break;
36
- try {
37
- const msgs = await graphGet(`/teams/${team.id}/channels/${channel.id}/messages?$top=10`, opts.token);
38
- for (const msg of msgs.value) {
39
- if (items.length >= limit)
40
- break;
41
- const mainText = extractText(msg.body);
42
- const replyTexts = (msg.replies ?? []).map(r => extractText(r.body)).filter(Boolean);
43
- const raw_text = [
44
- `[${team.displayName} > #${channel.displayName}]`,
45
- msg.subject ? `Subject: ${msg.subject}` : '',
46
- mainText,
47
- ...replyTexts,
48
- ].filter(Boolean).join('\n');
49
- const fromName = msg.from?.user?.displayName;
50
- items.push({
51
- source_url: msg.webUrl ?? 'https://teams.microsoft.com',
52
- platform: 'teams',
53
- raw_text,
54
- title: (msg.subject ?? mainText).slice(0, 80) || `Message in ${team.displayName}`,
55
- // Who to talk to (ALI-118): the message author.
56
- ...(fromName ? { author: { name: fromName } } : {}),
57
- });
58
- }
59
- }
60
- catch { /* skip inaccessible channels */ }
61
- }
62
- }
63
- return items;
4
+ return new TeamsFetcher().fetch(opts);
64
5
  }
65
6
  //# sourceMappingURL=teams.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"teams.js","sourceRoot":"","sources":["../../../src/lib/fetchers/teams.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"teams.js","sourceRoot":"","sources":["../../../src/lib/fetchers/teams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAuC;IAC3E,OAAO,IAAI,YAAY,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { PersonalImportItem } from '../personal-import.js';
2
+ /** Read-only personal Zoom import (canonical fetcher in connector-core). */
2
3
  export declare function fetchZoomItems(opts: {
3
4
  token: string;
4
5
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/zoom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA+ChE,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwChC"}
1
+ {"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/zoom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,4EAA4E;AAC5E,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE1H"}
@@ -1,65 +1,6 @@
1
- function parseWebVtt(vtt) {
2
- return vtt
3
- .split('\n')
4
- .filter(line => line.trim() !== '' &&
5
- line.trim() !== 'WEBVTT' &&
6
- !/^\d+$/.test(line.trim()) &&
7
- !line.includes(' --> '))
8
- .join(' ')
9
- .replace(/\s+/g, ' ')
10
- .trim();
11
- }
12
- function encodeMeetingUuid(uuid) {
13
- const encoded = encodeURIComponent(uuid);
14
- return uuid.includes('//') ? encodeURIComponent(encoded) : encoded;
15
- }
16
- async function zoomGet(path, token) {
17
- const res = await fetch(`https://api.zoom.us/v2${path}`, {
18
- headers: { Authorization: `Bearer ${token}` },
19
- });
20
- if (!res.ok) {
21
- const err = await res.json().catch(() => ({}));
22
- throw new Error(`Zoom API error ${res.status}: ${err.message ?? 'unknown'}`);
23
- }
24
- return res.json();
25
- }
1
+ import { ZoomFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal Zoom import (canonical fetcher in connector-core). */
26
3
  export async function fetchZoomItems(opts) {
27
- const limit = opts.limit ?? 30;
28
- const path = opts.uuid
29
- ? `/meetings/${encodeMeetingUuid(opts.uuid)}/recordings`
30
- : `/users/me/recordings?page_size=30`;
31
- const data = await zoomGet(path, opts.token);
32
- const meetings = data.meetings ?? [];
33
- const items = [];
34
- for (const meeting of meetings) {
35
- if (items.length >= limit)
36
- break;
37
- const vttFile = (meeting.recording_files ?? []).find(f => f.file_type === 'TRANSCRIPT' && f.status === 'completed');
38
- if (!vttFile)
39
- continue;
40
- try {
41
- const vttRes = await fetch(`${vttFile.download_url}?access_token=${opts.token}`);
42
- if (!vttRes.ok)
43
- continue;
44
- const vttText = await vttRes.text();
45
- const transcript = parseWebVtt(vttText);
46
- if (!transcript)
47
- continue;
48
- const date = meeting.start_time.slice(0, 10);
49
- // Who to talk to (ALI-119): the meeting host.
50
- const host = meeting.host_email
51
- ? { name: meeting.host_email.split('@')[0], email: meeting.host_email }
52
- : undefined;
53
- items.push({
54
- source_url: `https://zoom.us/recording/${encodeMeetingUuid(meeting.uuid)}`,
55
- platform: 'zoom',
56
- raw_text: `[${meeting.topic} - ${date}]\n${transcript}`.slice(0, 4000),
57
- title: `${meeting.topic} (${date})`.slice(0, 80),
58
- ...(host ? { author: host } : {}),
59
- });
60
- }
61
- catch { /* skip recordings with inaccessible transcripts */ }
62
- }
63
- return items;
4
+ return new ZoomFetcher().fetch(opts);
64
5
  }
65
6
  //# sourceMappingURL=zoom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zoom.js","sourceRoot":"","sources":["../../../src/lib/fetchers/zoom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zoom.js","sourceRoot":"","sources":["../../../src/lib/fetchers/zoom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAG3D,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAsD;IACzF,OAAO,IAAI,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC"}
@@ -122,20 +122,8 @@ export interface DriftItem {
122
122
  drift_summary: string;
123
123
  checked_at: string;
124
124
  }
125
- /** The human behind a decision - "who to talk to" (ALI-118). */
126
- export interface DecisionAuthor {
127
- name: string;
128
- handle?: string;
129
- email?: string;
130
- url?: string;
131
- }
132
- export interface BatchIngestItem {
133
- source_url: string;
134
- platform: string;
135
- raw_text: string;
136
- title?: string;
137
- author?: DecisionAuthor;
138
- }
125
+ import type { FetcherItem as BatchIngestItem, DecisionAuthor } from '@aligndottech/connector-core';
126
+ export type { DecisionAuthor, BatchIngestItem };
139
127
  export interface BatchIngestResult {
140
128
  snapshots: Array<{
141
129
  id: string;
@@ -229,5 +217,4 @@ declare function buildHttpGatewayClient(env: EnvironmentConfig): {
229
217
  getStreamUrl(jobId: string): string;
230
218
  };
231
219
  export declare function createGatewayClient(env: EnvironmentConfig): ReturnType<typeof buildHttpGatewayClient>;
232
- export {};
233
220
  //# sourceMappingURL=gateway-client.d.ts.map