@aligndottech/cli 0.1.3 → 0.2.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 (122) hide show
  1. package/README.md +151 -54
  2. package/dist/commands/check.d.ts.map +1 -1
  3. package/dist/commands/check.js +108 -0
  4. package/dist/commands/check.js.map +1 -1
  5. package/dist/commands/links.js +1 -1
  6. package/dist/commands/links.js.map +1 -1
  7. package/dist/commands/local.d.ts +3 -0
  8. package/dist/commands/local.d.ts.map +1 -0
  9. package/dist/commands/local.js +71 -0
  10. package/dist/commands/local.js.map +1 -0
  11. package/dist/commands/login.d.ts.map +1 -1
  12. package/dist/commands/login.js +4 -54
  13. package/dist/commands/login.js.map +1 -1
  14. package/dist/commands/mcp.d.ts +2 -0
  15. package/dist/commands/mcp.d.ts.map +1 -1
  16. package/dist/commands/mcp.js +32 -11
  17. package/dist/commands/mcp.js.map +1 -1
  18. package/dist/commands/setup.d.ts.map +1 -1
  19. package/dist/commands/setup.js +583 -199
  20. package/dist/commands/setup.js.map +1 -1
  21. package/dist/commands/why.d.ts.map +1 -1
  22. package/dist/commands/why.js +46 -4
  23. package/dist/commands/why.js.map +1 -1
  24. package/dist/index.js +3 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/advisory-dedup.d.ts +3 -0
  27. package/dist/lib/advisory-dedup.d.ts.map +1 -0
  28. package/dist/lib/advisory-dedup.js +44 -0
  29. package/dist/lib/advisory-dedup.js.map +1 -0
  30. package/dist/lib/agent-rules.d.ts +10 -0
  31. package/dist/lib/agent-rules.d.ts.map +1 -0
  32. package/dist/lib/agent-rules.js +137 -0
  33. package/dist/lib/agent-rules.js.map +1 -0
  34. package/dist/lib/config.d.ts +4 -1
  35. package/dist/lib/config.d.ts.map +1 -1
  36. package/dist/lib/config.js +11 -0
  37. package/dist/lib/config.js.map +1 -1
  38. package/dist/lib/fetchers/confluence.d.ts +2 -0
  39. package/dist/lib/fetchers/confluence.d.ts.map +1 -1
  40. package/dist/lib/fetchers/confluence.js +10 -32
  41. package/dist/lib/fetchers/confluence.js.map +1 -1
  42. package/dist/lib/fetchers/git.d.ts +2 -0
  43. package/dist/lib/fetchers/git.d.ts.map +1 -1
  44. package/dist/lib/fetchers/git.js +5 -12
  45. package/dist/lib/fetchers/git.js.map +1 -1
  46. package/dist/lib/fetchers/github.d.ts +1 -0
  47. package/dist/lib/fetchers/github.d.ts.map +1 -1
  48. package/dist/lib/fetchers/github.js +3 -40
  49. package/dist/lib/fetchers/github.js.map +1 -1
  50. package/dist/lib/fetchers/gitlab.d.ts +1 -0
  51. package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
  52. package/dist/lib/fetchers/gitlab.js +3 -21
  53. package/dist/lib/fetchers/gitlab.js.map +1 -1
  54. package/dist/lib/fetchers/jira.d.ts +2 -0
  55. package/dist/lib/fetchers/jira.d.ts.map +1 -1
  56. package/dist/lib/fetchers/jira.js +10 -51
  57. package/dist/lib/fetchers/jira.js.map +1 -1
  58. package/dist/lib/fetchers/linear.d.ts +1 -0
  59. package/dist/lib/fetchers/linear.d.ts.map +1 -1
  60. package/dist/lib/fetchers/linear.js +3 -55
  61. package/dist/lib/fetchers/linear.js.map +1 -1
  62. package/dist/lib/fetchers/notion.d.ts +1 -0
  63. package/dist/lib/fetchers/notion.d.ts.map +1 -1
  64. package/dist/lib/fetchers/notion.js +3 -44
  65. package/dist/lib/fetchers/notion.js.map +1 -1
  66. package/dist/lib/fetchers/slack.d.ts +1 -0
  67. package/dist/lib/fetchers/slack.d.ts.map +1 -1
  68. package/dist/lib/fetchers/slack.js +3 -59
  69. package/dist/lib/fetchers/slack.js.map +1 -1
  70. package/dist/lib/fetchers/teams.d.ts +1 -0
  71. package/dist/lib/fetchers/teams.d.ts.map +1 -1
  72. package/dist/lib/fetchers/teams.js +3 -59
  73. package/dist/lib/fetchers/teams.js.map +1 -1
  74. package/dist/lib/fetchers/zoom.d.ts +1 -0
  75. package/dist/lib/fetchers/zoom.d.ts.map +1 -1
  76. package/dist/lib/fetchers/zoom.js +3 -57
  77. package/dist/lib/fetchers/zoom.js.map +1 -1
  78. package/dist/lib/format-date.d.ts +7 -0
  79. package/dist/lib/format-date.d.ts.map +1 -0
  80. package/dist/lib/format-date.js +26 -0
  81. package/dist/lib/format-date.js.map +1 -0
  82. package/dist/lib/gateway-client.d.ts +9 -8
  83. package/dist/lib/gateway-client.d.ts.map +1 -1
  84. package/dist/lib/gateway-client.js +28 -3
  85. package/dist/lib/gateway-client.js.map +1 -1
  86. package/dist/lib/hook-payload.d.ts +20 -0
  87. package/dist/lib/hook-payload.d.ts.map +1 -0
  88. package/dist/lib/hook-payload.js +30 -0
  89. package/dist/lib/hook-payload.js.map +1 -0
  90. package/dist/lib/local-db.d.ts +51 -0
  91. package/dist/lib/local-db.d.ts.map +1 -0
  92. package/dist/lib/local-db.js +89 -0
  93. package/dist/lib/local-db.js.map +1 -0
  94. package/dist/lib/local-embeddings.d.ts +3 -0
  95. package/dist/lib/local-embeddings.d.ts.map +1 -0
  96. package/dist/lib/local-embeddings.js +20 -0
  97. package/dist/lib/local-embeddings.js.map +1 -0
  98. package/dist/lib/local-gateway-client.d.ts +98 -0
  99. package/dist/lib/local-gateway-client.d.ts.map +1 -0
  100. package/dist/lib/local-gateway-client.js +151 -0
  101. package/dist/lib/local-gateway-client.js.map +1 -0
  102. package/dist/lib/local-mode.d.ts +7 -0
  103. package/dist/lib/local-mode.d.ts.map +1 -0
  104. package/dist/lib/local-mode.js +39 -0
  105. package/dist/lib/local-mode.js.map +1 -0
  106. package/dist/lib/local-relationship-classifier.d.ts +14 -0
  107. package/dist/lib/local-relationship-classifier.d.ts.map +1 -0
  108. package/dist/lib/local-relationship-classifier.js +100 -0
  109. package/dist/lib/local-relationship-classifier.js.map +1 -0
  110. package/dist/lib/login-flow.d.ts +5 -0
  111. package/dist/lib/login-flow.d.ts.map +1 -0
  112. package/dist/lib/login-flow.js +64 -0
  113. package/dist/lib/login-flow.js.map +1 -0
  114. package/dist/lib/personal-import.d.ts +4 -0
  115. package/dist/lib/personal-import.d.ts.map +1 -1
  116. package/dist/lib/personal-import.js +133 -27
  117. package/dist/lib/personal-import.js.map +1 -1
  118. package/package.json +27 -15
  119. package/dist/lib/why-normalise.d.ts +0 -2
  120. package/dist/lib/why-normalise.d.ts.map +0 -1
  121. package/dist/lib/why-normalise.js +0 -39
  122. package/dist/lib/why-normalise.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"confluence.js","sourceRoot":"","sources":["../../../src/lib/fetchers/confluence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAO1C;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO;QAClB,CAAC,CAAC,2CAA2C,IAAI,CAAC,OAAO,OAAO;QAChE,CAAC,CAAC,WAAW,IAAI,CAAC,MAAM,OAAO,CAAC;IAClC,MAAM,OAAO,GAA2B,OAAO;QAC7C,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACvE,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAE5H,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,kBAAkB,CAAC,oEAAoE,CAAC,CAAC;IACrG,MAAM,GAAG,GAAG,GAAG,IAAI,gCAAgC,GAAG,UAAU,KAAK,8BAA8B,CAAC;IAEpG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,sCAAsC,EAAE,CAAC,CAAC;IAC5I,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAmC,CAAC;IAE/D,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,kFAAkF;QAClF,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,2CAA2C,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;QACpI,MAAM,OAAO,GAAG,GAAG,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QAC/D,OAAO;YACL,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7D,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"confluence.js","sourceRoot":"","sources":["../../../src/lib/fetchers/confluence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD;qFACqF;AACrF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAO1C;IACC,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,iBAAiB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnD,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,6 @@
1
1
  import type { PersonalImportItem } from '../personal-import.js';
2
+ /** Read-only local-git import. The canonical GitFetcher in connector-core is
3
+ * pure; the CLI injects the actual git I/O (log/remote) here. */
2
4
  export declare function fetchGitItems(opts: {
3
5
  limit: number;
4
6
  }): Promise<PersonalImportItem[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/git.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAY1F"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE;kEACkE;AAClE,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE1F"}
@@ -1,15 +1,8 @@
1
- import { buildCommitUrl, formatCommitAsText, getCommitHistory, getRemoteUrl } from '../git.js';
1
+ import { GitFetcher } from '@aligndottech/connector-core';
2
+ import { getCommitHistory, getRemoteUrl } from '../git.js';
3
+ /** Read-only local-git import. The canonical GitFetcher in connector-core is
4
+ * pure; the CLI injects the actual git I/O (log/remote) here. */
2
5
  export async function fetchGitItems(opts) {
3
- const commits = await getCommitHistory({ limit: opts.limit });
4
- const remoteUrl = await getRemoteUrl();
5
- return commits.map(c => {
6
- const url = buildCommitUrl(remoteUrl, c.sha);
7
- return {
8
- source_url: url,
9
- platform: 'git',
10
- raw_text: formatCommitAsText(c, url),
11
- title: c.subject,
12
- };
13
- });
6
+ return new GitFetcher({ getCommitHistory, getRemoteUrl }).fetch({ token: '', limit: opts.limit });
14
7
  }
15
8
  //# sourceMappingURL=git.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/lib/fetchers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG/F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAuB;IACzD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACrB,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO;YACL,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,KAAc;YACxB,QAAQ,EAAE,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC;YACpC,KAAK,EAAE,CAAC,CAAC,OAAO;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/lib/fetchers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG3D;kEACkE;AAClE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAuB;IACzD,OAAO,IAAI,UAAU,CAAC,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACpG,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { PersonalImportItem } from '../personal-import.js';
2
+ /** Read-only personal GitHub import (canonical fetcher in connector-core). */
2
3
  export declare function fetchGitHubItems(opts: {
3
4
  token: string;
4
5
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAmDhC"}
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/github.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,43 +1,6 @@
1
+ import { GitHubFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal GitHub import (canonical fetcher in connector-core). */
1
3
  export async function fetchGitHubItems(opts) {
2
- const headers = {
3
- Authorization: `Bearer ${opts.token}`,
4
- Accept: 'application/vnd.github+json',
5
- 'X-GitHub-Api-Version': '2022-11-28',
6
- };
7
- const userRes = await fetch('https://api.github.com/user', { headers });
8
- if (!userRes.ok)
9
- throw new Error(`GitHub auth failed (${userRes.status}). Check your token has 'repo' scope.`);
10
- const user = await userRes.json();
11
- const limit = opts.limit ?? 100;
12
- const items = [];
13
- const prRes = await fetch(`https://api.github.com/search/issues?q=author:${user.login}+type:pr+is:merged&sort=updated&per_page=${Math.min(limit, 50)}`, { headers });
14
- if (prRes.ok) {
15
- const data = await prRes.json();
16
- for (const pr of data.items) {
17
- const repo = pr.repository_url.replace('https://api.github.com/repos/', '');
18
- items.push({
19
- source_url: pr.html_url,
20
- platform: 'github',
21
- raw_text: `${pr.title}\n\n${pr.body ?? ''}\n\nStatus: ${pr.state}\nRepo: ${repo}`.trim(),
22
- title: pr.title,
23
- });
24
- }
25
- }
26
- if (items.length < limit) {
27
- const remaining = Math.min(limit - items.length, 50);
28
- const issueRes = await fetch(`https://api.github.com/search/issues?q=commenter:${user.login}+type:issue&sort=updated&per_page=${remaining}`, { headers });
29
- if (issueRes.ok) {
30
- const data = await issueRes.json();
31
- for (const issue of data.items) {
32
- items.push({
33
- source_url: issue.html_url,
34
- platform: 'github',
35
- raw_text: `${issue.title}\n\n${issue.body ?? ''}\n\nStatus: ${issue.state}`.trim(),
36
- title: issue.title,
37
- });
38
- }
39
- }
40
- }
41
- return items.slice(0, limit);
4
+ return new GitHubFetcher().fetch(opts);
42
5
  }
43
6
  //# sourceMappingURL=github.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/lib/fetchers/github.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAGtC;IACC,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;QACrC,MAAM,EAAE,6BAA6B;QACrC,sBAAsB,EAAE,YAAY;KACrC,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,6BAA6B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,MAAM,uCAAuC,CAAC,CAAC;IAC/G,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAuB,CAAC;IAEvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAChC,MAAM,KAAK,GAAyB,EAAE,CAAC;IAEvC,MAAM,KAAK,GAAG,MAAM,KAAK,CACvB,iDAAiD,IAAI,CAAC,KAAK,4CAA4C,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAC5H,EAAE,OAAO,EAAE,CACZ,CAAC;IACF,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,EAAuH,CAAC;QACrJ,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC;gBACT,UAAU,EAAE,EAAE,CAAC,QAAQ;gBACvB,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,eAAe,EAAE,CAAC,KAAK,WAAW,IAAI,EAAE,CAAC,IAAI,EAAE;gBACxF,KAAK,EAAE,EAAE,CAAC,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,oDAAoD,IAAI,CAAC,KAAK,qCAAqC,SAAS,EAAE,EAC9G,EAAE,OAAO,EAAE,CACZ,CAAC;QACF,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA+F,CAAC;YAChI,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC;oBACT,UAAU,EAAE,KAAK,CAAC,QAAQ;oBAC1B,QAAQ,EAAE,QAAQ;oBAClB,QAAQ,EAAE,GAAG,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,IAAI,IAAI,EAAE,eAAe,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE;oBAClF,KAAK,EAAE,KAAK,CAAC,KAAK;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/lib/fetchers/github.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 GitLab import (canonical fetcher in connector-core). */
2
3
  export declare function fetchGitLabItems(opts: {
3
4
  token: string;
4
5
  domain?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/gitlab.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA4BhC"}
1
+ {"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/gitlab.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,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAE9H"}
@@ -1,24 +1,6 @@
1
+ import { GitLabFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal GitLab import (canonical fetcher in connector-core). */
1
3
  export async function fetchGitLabItems(opts) {
2
- const base = `https://${opts.domain ?? 'gitlab.com'}/api/v4`;
3
- const headers = { Authorization: `Bearer ${opts.token}` };
4
- const userRes = await fetch(`${base}/user`, { headers });
5
- if (!userRes.ok)
6
- throw new Error(`GitLab auth failed (${userRes.status}). Check your token has 'read_api' scope.`);
7
- const user = await userRes.json();
8
- const limit = opts.limit ?? 100;
9
- const items = [];
10
- const mrRes = await fetch(`${base}/merge_requests?author_id=${user.id}&state=merged&per_page=${Math.min(limit, 50)}&order_by=updated_at`, { headers });
11
- if (mrRes.ok) {
12
- const mrs = await mrRes.json();
13
- for (const mr of mrs) {
14
- items.push({
15
- source_url: mr.web_url,
16
- platform: 'gitlab',
17
- raw_text: `${mr.title}\n\n${mr.description ?? ''}\n\nStatus: ${mr.state}`.trim(),
18
- title: mr.title,
19
- });
20
- }
21
- }
22
- return items.slice(0, limit);
4
+ return new GitLabFetcher().fetch(opts);
23
5
  }
24
6
  //# sourceMappingURL=gitlab.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../../src/lib/fetchers/gitlab.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAItC;IACC,MAAM,IAAI,GAAG,WAAW,IAAI,CAAC,MAAM,IAAI,YAAY,SAAS,CAAC;IAC7D,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IAE1D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,MAAM,2CAA2C,CAAC,CAAC;IACnH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAoB,CAAC;IAEpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAChC,MAAM,KAAK,GAAyB,EAAE,CAAC;IAEvC,MAAM,KAAK,GAAG,MAAM,KAAK,CACvB,GAAG,IAAI,6BAA6B,IAAI,CAAC,EAAE,0BAA0B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,EAC9G,EAAE,OAAO,EAAE,CACZ,CAAC;IACF,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,EAA0F,CAAC;QACvH,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC;gBACT,UAAU,EAAE,EAAE,CAAC,OAAO;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC,WAAW,IAAI,EAAE,eAAe,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE;gBAChF,KAAK,EAAE,EAAE,CAAC,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../../src/lib/fetchers/gitlab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAwD;IAC7F,OAAO,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import type { PersonalImportItem } from '../personal-import.js';
2
+ /** Read-only personal Jira import. Delegates to the canonical fetcher in
3
+ * @aligndottech/connector-core; maps its auth error to the CLI's reconnect flow. */
2
4
  export declare function fetchJiraItems(opts: {
3
5
  token: string;
4
6
  cloudId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/jira.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA2BhE,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAgDhC"}
1
+ {"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/jira.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE;qFACqF;AACrF,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAOhC"}
@@ -1,56 +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 url = `${base}/rest/api/3/search?jql=${encodeURIComponent(jql)}&maxResults=${limit}&fields=summary,description,comment,status,key`;
21
- const res = await fetch(url, { headers });
22
- if (!res.ok) {
23
- if (res.status === 401 || res.status === 403)
24
- throw new AuthExpiredError('Jira');
25
- const text = await res.text();
26
- 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;
27
13
  }
28
- const data = await res.json();
29
- // For OAuth mode use the human site base URL (e.g. https://company.atlassian.net)
30
- const browseBase = isOAuth
31
- ? (opts.siteBase ?? `https://api.atlassian.com/ex/jira/${opts.cloudId}`)
32
- : base;
33
- return data.issues.map(issue => {
34
- const comments = (issue.fields.comment?.comments ?? [])
35
- .slice(-3)
36
- .map(c => {
37
- const text = extractAdfText(c.body);
38
- return `${c.author?.displayName ?? 'Unknown'}: ${text}`;
39
- })
40
- .filter(c => c.trim().length > 0)
41
- .join('\n');
42
- const desc = extractAdfText(issue.fields.description);
43
- return {
44
- source_url: `${browseBase}/browse/${issue.key}`,
45
- platform: 'jira',
46
- raw_text: [
47
- `[${issue.key}] ${issue.fields.summary}`,
48
- desc,
49
- issue.fields.status?.name ? `Status: ${issue.fields.status.name}` : '',
50
- comments ? `Comments:\n${comments}` : '',
51
- ].filter(Boolean).join('\n\n'),
52
- title: `[${issue.key}] ${issue.fields.summary}`,
53
- };
54
- });
55
14
  }
56
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;AA+BhE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuChC"}
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,58 +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
- comments { nodes { body user { name } } }
11
- }
12
- }
13
- createdIssues(first: $first, orderBy: updatedAt) {
14
- nodes { id title description url state { name } team { name } }
15
- }
16
- }
17
- }`;
1
+ import { LinearFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal Linear import (canonical fetcher in connector-core). */
18
3
  export async function fetchLinearItems(opts) {
19
- const limit = opts.limit ?? 50;
20
- const res = await fetch(LINEAR_GQL, {
21
- method: 'POST',
22
- headers: { Authorization: `Bearer ${opts.token}`, 'Content-Type': 'application/json' },
23
- body: JSON.stringify({ query: ISSUES_QUERY, variables: { first: limit } }),
24
- });
25
- if (!res.ok)
26
- throw new Error(`Linear API failed (${res.status}). Check your personal API token.`);
27
- const data = await res.json();
28
- if (data.errors?.length)
29
- throw new Error(data.errors[0].message);
30
- const seen = new Set();
31
- const items = [];
32
- const allIssues = [
33
- ...(data.data.viewer.assignedIssues?.nodes ?? []),
34
- ...(data.data.viewer.createdIssues?.nodes ?? []),
35
- ];
36
- for (const issue of allIssues) {
37
- if (seen.has(issue.id))
38
- continue;
39
- seen.add(issue.id);
40
- const comments = (issue.comments?.nodes ?? [])
41
- .map(c => `${c.user?.name ?? 'Unknown'}: ${c.body}`)
42
- .join('\n');
43
- items.push({
44
- source_url: issue.url,
45
- platform: 'linear',
46
- raw_text: [
47
- issue.title,
48
- issue.description ?? '',
49
- issue.team?.name ? `Team: ${issue.team.name}` : '',
50
- issue.state?.name ? `Status: ${issue.state.name}` : '',
51
- comments ? `Comments:\n${comments}` : '',
52
- ].filter(Boolean).join('\n\n'),
53
- title: issue.title,
54
- });
55
- }
56
- return items.slice(0, limit);
4
+ return new LinearFetcher().fetch(opts);
57
5
  }
58
6
  //# sourceMappingURL=linear.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../src/lib/fetchers/linear.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,gCAAgC,CAAC;AAEpD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;EAenB,CAAC;AAYH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAGtC;IACC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;QAClC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QACtF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;KAC3E,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,mCAAmC,CAAC,CAAC;IAClG,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA8J,CAAC;IAC1L,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG;QAChB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC;KACjD,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,SAAS;QACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;aAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;aACnD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,KAAK,CAAC,GAAG;YACrB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE;gBACR,KAAK,CAAC,KAAK;gBACX,KAAK,CAAC,WAAW,IAAI,EAAE;gBACvB,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;gBAClD,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;gBACtD,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;aACzC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC"}
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;AA8BhE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuChC"}
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,47 +1,6 @@
1
- function extractPageTitle(page) {
2
- return (page.properties?.title?.title?.[0]?.plain_text ??
3
- page.properties?.Name?.title?.[0]?.plain_text ??
4
- 'Untitled');
5
- }
6
- function extractBlockText(block) {
7
- const content = block[block.type];
8
- return (content?.rich_text ?? []).map(t => t.plain_text ?? '').join('');
9
- }
1
+ import { NotionFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal Notion import (canonical fetcher in connector-core). */
10
3
  export async function fetchNotionItems(opts) {
11
- const headers = {
12
- Authorization: `Bearer ${opts.token}`,
13
- 'Notion-Version': '2022-06-28',
14
- 'Content-Type': 'application/json',
15
- };
16
- const limit = opts.limit ?? 50;
17
- const searchRes = await fetch('https://api.notion.com/v1/search', {
18
- method: 'POST',
19
- headers,
20
- body: JSON.stringify({ filter: { value: 'page', property: 'object' }, page_size: limit }),
21
- });
22
- if (!searchRes.ok)
23
- throw new Error(`Notion API failed (${searchRes.status}). Check your integration token.`);
24
- const data = await searchRes.json();
25
- const items = [];
26
- for (const page of data.results) {
27
- const title = extractPageTitle(page);
28
- const pageUrl = page.url ?? `https://notion.so/${page.id.replace(/-/g, '')}`;
29
- let bodyText = '';
30
- try {
31
- const blocksRes = await fetch(`https://api.notion.com/v1/blocks/${page.id}/children?page_size=50`, { headers });
32
- if (blocksRes.ok) {
33
- const blocks = await blocksRes.json();
34
- bodyText = blocks.results.map(extractBlockText).filter(Boolean).join('\n');
35
- }
36
- }
37
- catch { /* skip block fetch errors */ }
38
- items.push({
39
- source_url: pageUrl,
40
- platform: 'notion',
41
- raw_text: [title, bodyText].filter(Boolean).join('\n\n').slice(0, 3000),
42
- title,
43
- });
44
- }
45
- return items;
4
+ return new NotionFetcher().fetch(opts);
46
5
  }
47
6
  //# sourceMappingURL=notion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notion.js","sourceRoot":"","sources":["../../../src/lib/fetchers/notion.ts"],"names":[],"mappings":"AAiBA,SAAS,gBAAgB,CAAC,IAAgB;IACxC,OAAO,CACL,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU;QAC9C,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU;QAC7C,UAAU,CACX,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAkB;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAA+D,CAAC;IAChG,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAGtC;IACC,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;QACrC,gBAAgB,EAAE,YAAY;QAC9B,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAE/B,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,kCAAkC,EAAE;QAChE,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;KAC1F,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,CAAC,MAAM,kCAAkC,CAAC,CAAC;IAC7G,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,EAA+B,CAAC;IAEjE,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,qBAAqB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QAE7E,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,oCAAoC,IAAI,CAAC,EAAE,wBAAwB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAChH,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAgC,CAAC;gBACpE,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;QAEzC,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;YACvE,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
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;AAuBhE,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,CAmDhC"}
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,62 +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
- }
1
+ import { SlackFetcher } from '@aligndottech/connector-core';
2
+ /** Read-only personal Slack import (canonical fetcher in connector-core). */
11
3
  export async function fetchSlackItems(opts) {
12
- const limit = opts.limit ?? 50;
13
- const daysBack = opts.daysBack ?? 90;
14
- const oldest = String(Math.floor(Date.now() / 1000) - daysBack * 86400);
15
- await slackGet('auth.test', opts.token);
16
- const chanData = await slackGet('conversations.list', opts.token, {
17
- types: 'public_channel,private_channel',
18
- exclude_archived: 'true',
19
- limit: '100',
20
- });
21
- const channels = chanData.channels ?? [];
22
- const items = [];
23
- for (let channelIndex = 0; channelIndex < channels.length; channelIndex++) {
24
- const channel = channels[channelIndex];
25
- if (items.length >= limit)
26
- break;
27
- try {
28
- // 3-second delay between channels to stay under Tier 2 rate limit (20 req/min)
29
- if (channelIndex > 0)
30
- await new Promise(r => setTimeout(r, 3000));
31
- const hist = await slackGet('conversations.history', opts.token, {
32
- channel: channel.id,
33
- oldest,
34
- limit: '100',
35
- });
36
- const messages = hist.messages ?? [];
37
- const threads = messages.filter(m => (m.reply_count ?? 0) >= 2);
38
- for (const thread of threads) {
39
- if (items.length >= limit)
40
- break;
41
- try {
42
- const replies = await slackGet('conversations.replies', opts.token, {
43
- channel: channel.id,
44
- ts: thread.ts,
45
- });
46
- const allMsgs = replies.messages ?? [];
47
- const text = allMsgs.map(m => m.text ?? '').join('\n');
48
- items.push({
49
- source_url: `https://slack.com/archives/${channel.id}/p${thread.ts.replace('.', '')}`,
50
- platform: 'slack',
51
- raw_text: `[#${channel.name}] Thread:\n${text}`,
52
- title: (thread.text ?? `Thread in #${channel.name}`).slice(0, 80),
53
- });
54
- }
55
- catch { /* skip individual thread errors */ }
56
- }
57
- }
58
- catch { /* skip channels that are inaccessible */ }
59
- }
60
- return items;
4
+ return new SlackFetcher().fetch(opts);
61
5
  }
62
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;AAyChE,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuChC"}
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,62 +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
- items.push({
50
- source_url: msg.webUrl ?? 'https://teams.microsoft.com',
51
- platform: 'teams',
52
- raw_text,
53
- title: (msg.subject ?? mainText).slice(0, 80) || `Message in ${team.displayName}`,
54
- });
55
- }
56
- }
57
- catch { /* skip inaccessible channels */ }
58
- }
59
- }
60
- return items;
4
+ return new TeamsFetcher().fetch(opts);
61
5
  }
62
6
  //# sourceMappingURL=teams.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"teams.js","sourceRoot":"","sources":["../../../src/lib/fetchers/teams.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC;AAaD,KAAK,UAAU,QAAQ,CAAI,IAAY,EAAE,KAAa;IACpD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mCAAmC,IAAI,EAAE,EAAE;QACjE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;KAC9C,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAoD,CAAC;QAClG,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;QACnC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACrF,MAAM,IAAI,KAAK,CACb,4DAA4D;gBAC5D,yDAAyD;gBACzD,8EAA8E,CAC/E,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,OAAO,IAAI,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;AAED,SAAS,WAAW,CAAC,IAAkC;IACrD,IAAI,CAAC,IAAI,EAAE,OAAO;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,IAAI,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAGrC;IACC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAyB,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACpF,MAAM,KAAK,GAAyB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;QACjC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,UAAU,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CACzC,CAAC;QACF,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;gBAAE,MAAM;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CACzB,UAAU,IAAI,CAAC,EAAE,aAAa,OAAO,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,KAAK,CACxE,CAAC;gBACF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;wBAAE,MAAM;oBACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACvC,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACrF,MAAM,QAAQ,GAAG;wBACf,IAAI,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,WAAW,GAAG;wBACjD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;wBAC5C,QAAQ;wBACR,GAAG,UAAU;qBACd,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAE7B,KAAK,CAAC,IAAI,CAAC;wBACT,UAAU,EAAE,GAAG,CAAC,MAAM,IAAI,6BAA6B;wBACvD,QAAQ,EAAE,OAAO;wBACjB,QAAQ;wBACR,KAAK,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,cAAc,IAAI,CAAC,WAAW,EAAE;qBAClF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
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;AA8ChE,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,CAmChC"}
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"}