@aligndottech/connector-core 0.5.0 → 0.6.1

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 (59) hide show
  1. package/dist/fetchers/confluence.d.ts +2 -1
  2. package/dist/fetchers/confluence.d.ts.map +1 -1
  3. package/dist/fetchers/confluence.js +14 -9
  4. package/dist/fetchers/confluence.js.map +1 -1
  5. package/dist/fetchers/errors.d.ts +43 -5
  6. package/dist/fetchers/errors.d.ts.map +1 -1
  7. package/dist/fetchers/errors.js +115 -6
  8. package/dist/fetchers/errors.js.map +1 -1
  9. package/dist/fetchers/git.d.ts +2 -1
  10. package/dist/fetchers/git.d.ts.map +1 -1
  11. package/dist/fetchers/git.js +8 -1
  12. package/dist/fetchers/git.js.map +1 -1
  13. package/dist/fetchers/github.d.ts +2 -1
  14. package/dist/fetchers/github.d.ts.map +1 -1
  15. package/dist/fetchers/github.js +12 -2
  16. package/dist/fetchers/github.js.map +1 -1
  17. package/dist/fetchers/gitlab.d.ts +4 -2
  18. package/dist/fetchers/gitlab.d.ts.map +1 -1
  19. package/dist/fetchers/gitlab.js +35 -5
  20. package/dist/fetchers/gitlab.js.map +1 -1
  21. package/dist/fetchers/index.d.ts +1 -1
  22. package/dist/fetchers/index.d.ts.map +1 -1
  23. package/dist/fetchers/index.js +1 -1
  24. package/dist/fetchers/index.js.map +1 -1
  25. package/dist/fetchers/jira.d.ts +2 -1
  26. package/dist/fetchers/jira.d.ts.map +1 -1
  27. package/dist/fetchers/jira.js +14 -11
  28. package/dist/fetchers/jira.js.map +1 -1
  29. package/dist/fetchers/linear.d.ts +2 -1
  30. package/dist/fetchers/linear.d.ts.map +1 -1
  31. package/dist/fetchers/linear.js +22 -4
  32. package/dist/fetchers/linear.js.map +1 -1
  33. package/dist/fetchers/notion.d.ts +4 -1
  34. package/dist/fetchers/notion.d.ts.map +1 -1
  35. package/dist/fetchers/notion.js +64 -30
  36. package/dist/fetchers/notion.js.map +1 -1
  37. package/dist/fetchers/slack.d.ts +12 -3
  38. package/dist/fetchers/slack.d.ts.map +1 -1
  39. package/dist/fetchers/slack.js +232 -30
  40. package/dist/fetchers/slack.js.map +1 -1
  41. package/dist/fetchers/teams.d.ts +2 -1
  42. package/dist/fetchers/teams.d.ts.map +1 -1
  43. package/dist/fetchers/teams.js +21 -4
  44. package/dist/fetchers/teams.js.map +1 -1
  45. package/dist/fetchers/util/time.d.ts +15 -0
  46. package/dist/fetchers/util/time.d.ts.map +1 -0
  47. package/dist/fetchers/util/time.js +24 -0
  48. package/dist/fetchers/util/time.js.map +1 -0
  49. package/dist/fetchers/zoom.d.ts +6 -1
  50. package/dist/fetchers/zoom.d.ts.map +1 -1
  51. package/dist/fetchers/zoom.js +105 -35
  52. package/dist/fetchers/zoom.js.map +1 -1
  53. package/dist/index.d.ts +2 -2
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/types/fetcher.d.ts +54 -0
  58. package/dist/types/fetcher.d.ts.map +1 -1
  59. package/package.json +1 -1
@@ -18,7 +18,7 @@ export { LinearFetcher } from './linear.js';
18
18
  export { NotionFetcher } from './notion.js';
19
19
  export { GitFetcher } from './git.js';
20
20
  export { buildCommitUrl, formatCommitAsText } from './util/git.js';
21
- export { FetcherAuthError } from './errors.js';
21
+ export { FetcherAuthError, providerError, providerErrorText } from './errors.js';
22
22
  /**
23
23
  * Registry of token-based read-only fetchers, keyed by platform. The CLI and the
24
24
  * gateway discover scan both resolve fetchers from here. `git` is not registered
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fetchers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAwC,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA2C;IAC9D,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;IACzC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;CAClC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fetchers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAwC,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EAAwB,MAAM,aAAa,CAAC;AAEvG;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA2C;IAC9D,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;IACzC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;CAClC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../types/fetcher.js';
1
+ import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem, FetchResult } from '../types/fetcher.js';
2
2
  /**
3
3
  * Read-only personal Jira fetcher: issues assigned to or reported by the caller.
4
4
  * OAuth (cloudId) or basic-auth (domain+email). Author = the issue reporter.
@@ -6,5 +6,6 @@ import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../
6
6
  */
7
7
  export declare class JiraFetcher implements ConnectorFetcher {
8
8
  fetch(opts: ConnectorFetcherOptions): Promise<FetcherItem[]>;
9
+ fetchWithReport(opts: ConnectorFetcherOptions): Promise<FetchResult>;
9
10
  }
10
11
  //# sourceMappingURL=jira.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../src/fetchers/jira.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA0BlG;;;;GAIG;AACH,qBAAa,WAAY,YAAW,gBAAgB;IAC5C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CA0EnE"}
1
+ {"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../src/fetchers/jira.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA4B/G;;;;GAIG;AACH,qBAAa,WAAY,YAAW,gBAAgB;IAC5C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI5D,eAAe,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;CAwE3E"}
@@ -1,5 +1,6 @@
1
1
  import { fetch } from 'undici';
2
- import { FetcherAuthError } from './errors.js';
2
+ import { providerError } from './errors.js';
3
+ import { toIsoOrUndefined } from './util/time.js';
3
4
  // Jira Cloud's /search/jql caps maxResults at 100 per request and paginates via nextPageToken.
4
5
  const JIRA_PAGE_MAX = 100;
5
6
  function extractAdfText(adf) {
@@ -17,6 +18,9 @@ function extractAdfText(adf) {
17
18
  */
18
19
  export class JiraFetcher {
19
20
  async fetch(opts) {
21
+ return (await this.fetchWithReport(opts)).items;
22
+ }
23
+ async fetchWithReport(opts) {
20
24
  const cloudId = opts.cloudId;
21
25
  const siteBase = opts.siteBase;
22
26
  const email = opts.email;
@@ -37,7 +41,8 @@ export class JiraFetcher {
37
41
  const body = {
38
42
  jql,
39
43
  maxResults: Math.min(limit - issues.length, JIRA_PAGE_MAX),
40
- fields: ['summary', 'description', 'status', 'key', 'reporter'],
44
+ // `created` must be asked for by name or the search API leaves it out.
45
+ fields: ['summary', 'description', 'status', 'key', 'reporter', 'created'],
41
46
  ...(nextPageToken ? { nextPageToken } : {}),
42
47
  };
43
48
  const res = await fetch(`${base}/rest/api/3/search/jql`, {
@@ -46,22 +51,18 @@ export class JiraFetcher {
46
51
  body: JSON.stringify(body),
47
52
  });
48
53
  if (!res.ok) {
49
- if (res.status === 401)
50
- throw new FetcherAuthError('Jira');
51
- if (res.status === 403) {
52
- throw new Error("Jira access denied (403): the token lacks Jira scopes or access. Re-auth won't help - " +
53
- "check the Atlassian app's Jira API permissions.");
54
- }
55
- const text = await res.text();
56
- throw new Error(`Jira API failed (${res.status}): ${text.slice(0, 200)}`);
54
+ throw await providerError('Jira', res, {
55
+ forbidden: "The token lacks Jira scopes or access. Re-auth won't help - check the Atlassian app's Jira API permissions.",
56
+ });
57
57
  }
58
58
  const data = (await res.json());
59
59
  issues.push(...(data.issues ?? []));
60
60
  nextPageToken = data.isLast ? undefined : data.nextPageToken;
61
61
  } while (nextPageToken && issues.length < limit);
62
62
  const browseBase = isOAuth ? (siteBase ?? `https://api.atlassian.com/ex/jira/${cloudId}`) : base;
63
- return issues.slice(0, limit).map((issue) => {
63
+ const items = issues.slice(0, limit).map((issue) => {
64
64
  const desc = extractAdfText(issue.fields.description);
65
+ const createdAt = toIsoOrUndefined(issue.fields.created);
65
66
  return {
66
67
  source_url: `${browseBase}/browse/${issue.key}`,
67
68
  platform: 'jira',
@@ -73,6 +74,7 @@ export class JiraFetcher {
73
74
  .filter(Boolean)
74
75
  .join('\n\n'),
75
76
  title: `[${issue.key}] ${issue.fields.summary}`,
77
+ ...(createdAt ? { created_at: createdAt } : {}),
76
78
  ...(issue.fields.reporter?.displayName
77
79
  ? {
78
80
  author: {
@@ -83,6 +85,7 @@ export class JiraFetcher {
83
85
  : {}),
84
86
  };
85
87
  });
88
+ return { items, report: { platform: 'jira', scanned: issues.length, requested: limit, skips: [] } };
86
89
  }
87
90
  }
88
91
  //# sourceMappingURL=jira.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../src/fetchers/jira.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../src/fetchers/jira.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
- import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../types/fetcher.js';
1
+ import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem, FetchResult } from '../types/fetcher.js';
2
2
  /**
3
3
  * Read-only personal Linear fetcher: the caller's assigned + created issues
4
4
  * (deduped). Author = the issue creator. Paginates each connection up to `limit`.
5
5
  */
6
6
  export declare class LinearFetcher implements ConnectorFetcher {
7
7
  fetch(opts: ConnectorFetcherOptions): Promise<FetcherItem[]>;
8
+ fetchWithReport(opts: ConnectorFetcherOptions): Promise<FetchResult>;
8
9
  }
9
10
  //# sourceMappingURL=linear.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/fetchers/linear.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAyDlG;;;GAGG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IAC9C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAqCnE"}
1
+ {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/fetchers/linear.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAuE/G;;;GAGG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IAC9C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI5D,eAAe,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;CAyC3E"}
@@ -1,12 +1,21 @@
1
1
  import { fetch } from 'undici';
2
+ import { toIsoOrUndefined } from './util/time.js';
3
+ import { providerError } from './errors.js';
2
4
  const LINEAR_GQL = 'https://api.linear.app/graphql';
3
5
  const LINEAR_PAGE_MAX = 100;
6
+ /**
7
+ * Comments per issue. Linear scores a query by the nodes it asks for and rejects a
8
+ * single query over 10,000 points with a bare HTTP 400: a page of 100 issues carrying
9
+ * the connection's default of 50 comments each is over that, and that is the shape
10
+ * of the first live Linear import on 2026-09-03. 20 keeps the page well under.
11
+ */
12
+ const LINEAR_COMMENTS_MAX = 20;
4
13
  const ISSUE_FIELDS = `
5
- id title description url
14
+ id title description url createdAt
6
15
  state { name }
7
16
  team { name }
8
17
  creator { name email }
9
- comments { nodes { body user { name } } }
18
+ comments(first: ${LINEAR_COMMENTS_MAX}) { nodes { body user { name } } }
10
19
  `;
11
20
  /** Page through one of the viewer's issue connections (assigned / created) up to `target`. */
12
21
  async function fetchConnection(token, field, target) {
@@ -24,8 +33,10 @@ async function fetchConnection(token, field, target) {
24
33
  headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
25
34
  body: JSON.stringify({ query, variables: { first: Math.min(target - out.length, LINEAR_PAGE_MAX), after } }),
26
35
  });
36
+ // Linear answers a bad or missing key with 401 and a refused REQUEST (invalid query,
37
+ // over the complexity limit) with 400; providerError keeps the two apart.
27
38
  if (!res.ok)
28
- throw new Error(`Linear API failed (${res.status}). Check your personal API token.`);
39
+ throw await providerError('Linear', res);
29
40
  const json = (await res.json());
30
41
  if (json.errors?.length)
31
42
  throw new Error(json.errors[0].message);
@@ -45,6 +56,9 @@ async function fetchConnection(token, field, target) {
45
56
  */
46
57
  export class LinearFetcher {
47
58
  async fetch(opts) {
59
+ return (await this.fetchWithReport(opts)).items;
60
+ }
61
+ async fetchWithReport(opts) {
48
62
  const limit = opts.limit ?? 50;
49
63
  const [assigned, created] = await Promise.all([
50
64
  fetchConnection(opts.token, 'assignedIssues', limit),
@@ -52,12 +66,15 @@ export class LinearFetcher {
52
66
  ]);
53
67
  const seen = new Set();
54
68
  const items = [];
69
+ let scanned = 0;
55
70
  for (const issue of [...assigned, ...created]) {
56
71
  if (items.length >= limit)
57
72
  break;
58
73
  if (seen.has(issue.id))
59
74
  continue;
60
75
  seen.add(issue.id);
76
+ scanned += 1;
77
+ const createdAt = toIsoOrUndefined(issue.createdAt);
61
78
  const comments = (issue.comments?.nodes ?? [])
62
79
  .map((c) => `${c.user?.name ?? 'Unknown'}: ${c.body}`)
63
80
  .join('\n');
@@ -74,12 +91,13 @@ export class LinearFetcher {
74
91
  .filter(Boolean)
75
92
  .join('\n\n'),
76
93
  title: issue.title,
94
+ ...(createdAt ? { created_at: createdAt } : {}),
77
95
  ...(issue.creator?.name
78
96
  ? { author: { name: issue.creator.name, ...(issue.creator.email ? { email: issue.creator.email } : {}) } }
79
97
  : {}),
80
98
  });
81
99
  }
82
- return items;
100
+ return { items, report: { platform: 'linear', scanned, requested: limit, skips: [] } };
83
101
  }
84
102
  }
85
103
  //# sourceMappingURL=linear.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/fetchers/linear.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/fetchers/linear.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,12 @@
1
- import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../types/fetcher.js';
1
+ import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem, FetchResult } from '../types/fetcher.js';
2
2
  /**
3
3
  * Read-only personal Notion fetcher: pages the integration can see, with body
4
4
  * text from their child blocks. Author = the page creator ("who to talk to").
5
+ * Pages the search with `start_cursor` while `has_more`, up to `limit`. A page
6
+ * whose blocks cannot be read is kept (title only) and counted into the report.
5
7
  */
6
8
  export declare class NotionFetcher implements ConnectorFetcher {
7
9
  fetch(opts: ConnectorFetcherOptions): Promise<FetcherItem[]>;
10
+ fetchWithReport(opts: ConnectorFetcherOptions): Promise<FetchResult>;
8
11
  }
9
12
  //# sourceMappingURL=notion.d.ts.map
@@ -1 +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"}
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,WAAW,EAAa,MAAM,qBAAqB,CAAC;AA6D1H;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IAC9C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI5D,eAAe,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;CAqE3E"}
@@ -1,4 +1,9 @@
1
1
  import { fetch } from 'undici';
2
+ import { toIsoOrUndefined } from './util/time.js';
3
+ import { providerError } from './errors.js';
4
+ // Notion's own per-page maximum for /v1/search. Before ALI-828 the read was one
5
+ // page sized to the limit, with the cursor Notion returned never sent back.
6
+ const NOTION_PAGE_MAX = 100;
2
7
  /** Resolve a Notion user id to a name (cached). Degrades to undefined on failure. */
3
8
  function makeNotionUserResolver(headers) {
4
9
  const cache = new Map();
@@ -36,50 +41,79 @@ function extractBlockText(block) {
36
41
  /**
37
42
  * Read-only personal Notion fetcher: pages the integration can see, with body
38
43
  * text from their child blocks. Author = the page creator ("who to talk to").
44
+ * Pages the search with `start_cursor` while `has_more`, up to `limit`. A page
45
+ * whose blocks cannot be read is kept (title only) and counted into the report.
39
46
  */
40
47
  export class NotionFetcher {
41
48
  async fetch(opts) {
49
+ return (await this.fetchWithReport(opts)).items;
50
+ }
51
+ async fetchWithReport(opts) {
42
52
  const headers = {
43
53
  Authorization: `Bearer ${opts.token}`,
44
54
  'Notion-Version': '2022-06-28',
45
55
  'Content-Type': 'application/json',
46
56
  };
47
57
  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
58
  const resolveUser = makeNotionUserResolver(headers);
58
59
  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
- }
60
+ let scanned = 0;
61
+ let bodiesUnreadable = 0;
62
+ let cursor;
63
+ do {
64
+ const searchRes = await fetch('https://api.notion.com/v1/search', {
65
+ method: 'POST',
66
+ headers,
67
+ body: JSON.stringify({
68
+ filter: { value: 'page', property: 'object' },
69
+ page_size: Math.min(limit - items.length, NOTION_PAGE_MAX),
70
+ ...(cursor ? { start_cursor: cursor } : {}),
71
+ }),
72
+ });
73
+ if (!searchRes.ok) {
74
+ throw await providerError('Notion', searchRes, {
75
+ forbidden: 'Share the pages with the integration: Notion lets an integration read only what it has been given.',
76
+ });
70
77
  }
71
- catch {
72
- /* skip block fetch errors */
78
+ const data = (await searchRes.json());
79
+ for (const page of data.results) {
80
+ if (items.length >= limit)
81
+ break;
82
+ scanned += 1;
83
+ const title = extractPageTitle(page);
84
+ const pageUrl = page.url ?? `https://notion.so/${page.id.replace(/-/g, '')}`;
85
+ const author = await resolveUser(page.created_by?.id);
86
+ const createdAt = toIsoOrUndefined(page.created_time);
87
+ let bodyText = '';
88
+ try {
89
+ const blocksRes = await fetch(`https://api.notion.com/v1/blocks/${page.id}/children?page_size=50`, { headers });
90
+ if (blocksRes.ok) {
91
+ const blocks = (await blocksRes.json());
92
+ bodyText = blocks.results.map(extractBlockText).filter(Boolean).join('\n');
93
+ }
94
+ else {
95
+ bodiesUnreadable += 1;
96
+ }
97
+ }
98
+ catch {
99
+ bodiesUnreadable += 1;
100
+ }
101
+ items.push({
102
+ source_url: pageUrl,
103
+ platform: 'notion',
104
+ raw_text: [title, bodyText].filter(Boolean).join('\n\n').slice(0, 3000),
105
+ title,
106
+ ...(createdAt ? { created_at: createdAt } : {}),
107
+ ...(author ? { author } : {}),
108
+ });
73
109
  }
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
- });
110
+ cursor = data.has_more ? (data.next_cursor ?? undefined) : undefined;
111
+ } while (cursor && items.length < limit);
112
+ const skips = [];
113
+ if (bodiesUnreadable > 0) {
114
+ skips.push({ kind: 'error', count: bodiesUnreadable, detail: 'pages whose body could not be read (kept, title only)' });
81
115
  }
82
- return items;
116
+ return { items, report: { platform: 'notion', scanned, requested: limit, skips } };
83
117
  }
84
118
  }
85
119
  //# sourceMappingURL=notion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notion.js","sourceRoot":"","sources":["../../src/fetchers/notion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notion.js","sourceRoot":"","sources":["../../src/fetchers/notion.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,19 @@
1
- import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../types/fetcher.js';
1
+ import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem, FetchResult } from '../types/fetcher.js';
2
2
  /**
3
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`).
4
+ * token can see, within `daysBack`, that hold at least one HUMAN message. Title
5
+ * and author come from the first human message, so a thread whose root was
6
+ * deleted or posted by a bot is still captured when a person spoke in it, and a
7
+ * thread made only of bot and system output is not captured at all.
8
+ *
9
+ * Channels, history and replies are all paged. Every bound (`maxChannels`,
10
+ * `maxHistoryPages`, `maxReplyPages`, `timeBudgetMs`) and every filter that
11
+ * fires is counted into the fetch report, so a thin result comes with its
12
+ * reason. A delay between channels keeps under Slack's Tier-2 rate limit
13
+ * (override via `interChannelDelayMs`).
6
14
  */
7
15
  export declare class SlackFetcher implements ConnectorFetcher {
8
16
  fetch(opts: ConnectorFetcherOptions): Promise<FetcherItem[]>;
17
+ fetchWithReport(opts: ConnectorFetcherOptions): Promise<FetchResult>;
9
18
  }
10
19
  //# sourceMappingURL=slack.d.ts.map
@@ -1 +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"}
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,WAAW,EAAa,MAAM,qBAAqB,CAAC;AAqL1H;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAa,YAAW,gBAAgB;IAC7C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI5D,eAAe,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;CAyJ3E"}