@aligndottech/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -0
  3. package/dist/commands/capture.d.ts +3 -0
  4. package/dist/commands/capture.d.ts.map +1 -0
  5. package/dist/commands/capture.js +74 -0
  6. package/dist/commands/capture.js.map +1 -0
  7. package/dist/commands/check.d.ts +3 -0
  8. package/dist/commands/check.d.ts.map +1 -0
  9. package/dist/commands/check.js +94 -0
  10. package/dist/commands/check.js.map +1 -0
  11. package/dist/commands/connector/index.d.ts +3 -0
  12. package/dist/commands/connector/index.d.ts.map +1 -0
  13. package/dist/commands/connector/index.js +145 -0
  14. package/dist/commands/connector/index.js.map +1 -0
  15. package/dist/commands/decisions/index.d.ts +3 -0
  16. package/dist/commands/decisions/index.d.ts.map +1 -0
  17. package/dist/commands/decisions/index.js +91 -0
  18. package/dist/commands/decisions/index.js.map +1 -0
  19. package/dist/commands/dev/index.d.ts +3 -0
  20. package/dist/commands/dev/index.d.ts.map +1 -0
  21. package/dist/commands/dev/index.js +226 -0
  22. package/dist/commands/dev/index.js.map +1 -0
  23. package/dist/commands/drift.d.ts +3 -0
  24. package/dist/commands/drift.d.ts.map +1 -0
  25. package/dist/commands/drift.js +51 -0
  26. package/dist/commands/drift.js.map +1 -0
  27. package/dist/commands/env.d.ts +3 -0
  28. package/dist/commands/env.d.ts.map +1 -0
  29. package/dist/commands/env.js +28 -0
  30. package/dist/commands/env.js.map +1 -0
  31. package/dist/commands/import/confluence.d.ts +3 -0
  32. package/dist/commands/import/confluence.d.ts.map +1 -0
  33. package/dist/commands/import/confluence.js +43 -0
  34. package/dist/commands/import/confluence.js.map +1 -0
  35. package/dist/commands/import/git.d.ts +3 -0
  36. package/dist/commands/import/git.d.ts.map +1 -0
  37. package/dist/commands/import/git.js +59 -0
  38. package/dist/commands/import/git.js.map +1 -0
  39. package/dist/commands/import/github.d.ts +3 -0
  40. package/dist/commands/import/github.d.ts.map +1 -0
  41. package/dist/commands/import/github.js +36 -0
  42. package/dist/commands/import/github.js.map +1 -0
  43. package/dist/commands/import/gitlab.d.ts +3 -0
  44. package/dist/commands/import/gitlab.d.ts.map +1 -0
  45. package/dist/commands/import/gitlab.js +37 -0
  46. package/dist/commands/import/gitlab.js.map +1 -0
  47. package/dist/commands/import/jira.d.ts +3 -0
  48. package/dist/commands/import/jira.d.ts.map +1 -0
  49. package/dist/commands/import/jira.js +43 -0
  50. package/dist/commands/import/jira.js.map +1 -0
  51. package/dist/commands/import/linear.d.ts +3 -0
  52. package/dist/commands/import/linear.d.ts.map +1 -0
  53. package/dist/commands/import/linear.js +36 -0
  54. package/dist/commands/import/linear.js.map +1 -0
  55. package/dist/commands/import/notion.d.ts +3 -0
  56. package/dist/commands/import/notion.d.ts.map +1 -0
  57. package/dist/commands/import/notion.js +41 -0
  58. package/dist/commands/import/notion.js.map +1 -0
  59. package/dist/commands/import/slack.d.ts +3 -0
  60. package/dist/commands/import/slack.d.ts.map +1 -0
  61. package/dist/commands/import/slack.js +46 -0
  62. package/dist/commands/import/slack.js.map +1 -0
  63. package/dist/commands/import.d.ts +3 -0
  64. package/dist/commands/import.d.ts.map +1 -0
  65. package/dist/commands/import.js +285 -0
  66. package/dist/commands/import.js.map +1 -0
  67. package/dist/commands/links.d.ts +3 -0
  68. package/dist/commands/links.d.ts.map +1 -0
  69. package/dist/commands/links.js +59 -0
  70. package/dist/commands/links.js.map +1 -0
  71. package/dist/commands/login.d.ts +3 -0
  72. package/dist/commands/login.d.ts.map +1 -0
  73. package/dist/commands/login.js +90 -0
  74. package/dist/commands/login.js.map +1 -0
  75. package/dist/commands/mcp.d.ts +3 -0
  76. package/dist/commands/mcp.d.ts.map +1 -0
  77. package/dist/commands/mcp.js +162 -0
  78. package/dist/commands/mcp.js.map +1 -0
  79. package/dist/commands/search.d.ts +3 -0
  80. package/dist/commands/search.d.ts.map +1 -0
  81. package/dist/commands/search.js +42 -0
  82. package/dist/commands/search.js.map +1 -0
  83. package/dist/commands/spaces.d.ts +3 -0
  84. package/dist/commands/spaces.d.ts.map +1 -0
  85. package/dist/commands/spaces.js +39 -0
  86. package/dist/commands/spaces.js.map +1 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +43 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/lib/config.d.ts +18 -0
  92. package/dist/lib/config.d.ts.map +1 -0
  93. package/dist/lib/config.js +49 -0
  94. package/dist/lib/config.js.map +1 -0
  95. package/dist/lib/env-resolver.d.ts +5 -0
  96. package/dist/lib/env-resolver.d.ts.map +1 -0
  97. package/dist/lib/env-resolver.js +14 -0
  98. package/dist/lib/env-resolver.js.map +1 -0
  99. package/dist/lib/fetchers/confluence.d.ts +8 -0
  100. package/dist/lib/fetchers/confluence.d.ts.map +1 -0
  101. package/dist/lib/fetchers/confluence.js +27 -0
  102. package/dist/lib/fetchers/confluence.js.map +1 -0
  103. package/dist/lib/fetchers/github.d.ts +6 -0
  104. package/dist/lib/fetchers/github.d.ts.map +1 -0
  105. package/dist/lib/fetchers/github.js +43 -0
  106. package/dist/lib/fetchers/github.js.map +1 -0
  107. package/dist/lib/fetchers/gitlab.d.ts +7 -0
  108. package/dist/lib/fetchers/gitlab.d.ts.map +1 -0
  109. package/dist/lib/fetchers/gitlab.js +24 -0
  110. package/dist/lib/fetchers/gitlab.js.map +1 -0
  111. package/dist/lib/fetchers/jira.d.ts +8 -0
  112. package/dist/lib/fetchers/jira.d.ts.map +1 -0
  113. package/dist/lib/fetchers/jira.js +45 -0
  114. package/dist/lib/fetchers/jira.js.map +1 -0
  115. package/dist/lib/fetchers/linear.d.ts +6 -0
  116. package/dist/lib/fetchers/linear.d.ts.map +1 -0
  117. package/dist/lib/fetchers/linear.js +58 -0
  118. package/dist/lib/fetchers/linear.js.map +1 -0
  119. package/dist/lib/fetchers/notion.d.ts +6 -0
  120. package/dist/lib/fetchers/notion.d.ts.map +1 -0
  121. package/dist/lib/fetchers/notion.js +47 -0
  122. package/dist/lib/fetchers/notion.js.map +1 -0
  123. package/dist/lib/fetchers/slack.d.ts +7 -0
  124. package/dist/lib/fetchers/slack.d.ts.map +1 -0
  125. package/dist/lib/fetchers/slack.js +62 -0
  126. package/dist/lib/fetchers/slack.js.map +1 -0
  127. package/dist/lib/gateway-client.d.ts +205 -0
  128. package/dist/lib/gateway-client.d.ts.map +1 -0
  129. package/dist/lib/gateway-client.js +187 -0
  130. package/dist/lib/gateway-client.js.map +1 -0
  131. package/dist/lib/git.d.ts +23 -0
  132. package/dist/lib/git.d.ts.map +1 -0
  133. package/dist/lib/git.js +92 -0
  134. package/dist/lib/git.js.map +1 -0
  135. package/dist/lib/personal-import.d.ts +8 -0
  136. package/dist/lib/personal-import.d.ts.map +1 -0
  137. package/dist/lib/personal-import.js +64 -0
  138. package/dist/lib/personal-import.js.map +1 -0
  139. package/dist/lib/process.d.ts +7 -0
  140. package/dist/lib/process.d.ts.map +1 -0
  141. package/dist/lib/process.js +48 -0
  142. package/dist/lib/process.js.map +1 -0
  143. package/dist/lib/resolve-env.d.ts +3 -0
  144. package/dist/lib/resolve-env.d.ts.map +1 -0
  145. package/dist/lib/resolve-env.js +13 -0
  146. package/dist/lib/resolve-env.js.map +1 -0
  147. package/dist/lib/table.d.ts +7 -0
  148. package/dist/lib/table.d.ts.map +1 -0
  149. package/dist/lib/table.js +16 -0
  150. package/dist/lib/table.js.map +1 -0
  151. package/dist/types.d.ts +4 -0
  152. package/dist/types.d.ts.map +1 -0
  153. package/dist/types.js +25 -0
  154. package/dist/types.js.map +1 -0
  155. package/package.json +43 -0
@@ -0,0 +1,43 @@
1
+ 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);
42
+ }
43
+ //# sourceMappingURL=github.js.map
@@ -0,0 +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"}
@@ -0,0 +1,7 @@
1
+ import type { PersonalImportItem } from '../personal-import.js';
2
+ export declare function fetchGitLabItems(opts: {
3
+ token: string;
4
+ domain?: string;
5
+ limit?: number;
6
+ }): Promise<PersonalImportItem[]>;
7
+ //# sourceMappingURL=gitlab.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,24 @@
1
+ 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);
23
+ }
24
+ //# sourceMappingURL=gitlab.js.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ import type { PersonalImportItem } from '../personal-import.js';
2
+ export declare function fetchJiraItems(opts: {
3
+ email: string;
4
+ token: string;
5
+ domain: string;
6
+ limit?: number;
7
+ }): Promise<PersonalImportItem[]>;
8
+ //# sourceMappingURL=jira.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/jira.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA2BhE,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsChC"}
@@ -0,0 +1,45 @@
1
+ function extractAdfText(adf) {
2
+ if (!adf)
3
+ return '';
4
+ return (adf.content ?? [])
5
+ .flatMap(block => (block.content ?? []).map(inline => inline.text ?? ''))
6
+ .join(' ')
7
+ .trim();
8
+ }
9
+ export async function fetchJiraItems(opts) {
10
+ const base = `https://${opts.domain}`;
11
+ const auth = Buffer.from(`${opts.email}:${opts.token}`).toString('base64');
12
+ const headers = { Authorization: `Basic ${auth}`, Accept: 'application/json' };
13
+ const limit = opts.limit ?? 100;
14
+ const jql = 'assignee = currentUser() OR reporter = currentUser() ORDER BY updated DESC';
15
+ const url = `${base}/rest/api/3/search?jql=${encodeURIComponent(jql)}&maxResults=${limit}&fields=summary,description,comment,status,key`;
16
+ const res = await fetch(url, { headers });
17
+ if (!res.ok) {
18
+ const text = await res.text();
19
+ throw new Error(`Jira API failed (${res.status}): ${text.slice(0, 200)}`);
20
+ }
21
+ const data = await res.json();
22
+ return data.issues.map(issue => {
23
+ const comments = (issue.fields.comment?.comments ?? [])
24
+ .slice(-3)
25
+ .map(c => {
26
+ const text = extractAdfText(c.body);
27
+ return `${c.author?.displayName ?? 'Unknown'}: ${text}`;
28
+ })
29
+ .filter(c => c.trim().length > 0)
30
+ .join('\n');
31
+ const desc = extractAdfText(issue.fields.description);
32
+ return {
33
+ source_url: `${base}/browse/${issue.key}`,
34
+ platform: 'jira',
35
+ raw_text: [
36
+ `[${issue.key}] ${issue.fields.summary}`,
37
+ desc,
38
+ issue.fields.status?.name ? `Status: ${issue.fields.status.name}` : '',
39
+ comments ? `Comments:\n${comments}` : '',
40
+ ].filter(Boolean).join('\n\n'),
41
+ title: `[${issue.key}] ${issue.fields.summary}`,
42
+ };
43
+ });
44
+ }
45
+ //# sourceMappingURL=jira.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../../src/lib/fetchers/jira.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { PersonalImportItem } from '../personal-import.js';
2
+ export declare function fetchLinearItems(opts: {
3
+ token: string;
4
+ limit?: number;
5
+ }): Promise<PersonalImportItem[]>;
6
+ //# sourceMappingURL=linear.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,58 @@
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
+ }`;
18
+ 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);
57
+ }
58
+ //# sourceMappingURL=linear.js.map
@@ -0,0 +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"}
@@ -0,0 +1,6 @@
1
+ import type { PersonalImportItem } from '../personal-import.js';
2
+ export declare function fetchNotionItems(opts: {
3
+ token: string;
4
+ limit?: number;
5
+ }): Promise<PersonalImportItem[]>;
6
+ //# sourceMappingURL=notion.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,47 @@
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
+ }
10
+ 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;
46
+ }
47
+ //# sourceMappingURL=notion.js.map
@@ -0,0 +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"}
@@ -0,0 +1,7 @@
1
+ import type { PersonalImportItem } from '../personal-import.js';
2
+ export declare function fetchSlackItems(opts: {
3
+ token: string;
4
+ limit?: number;
5
+ daysBack?: number;
6
+ }): Promise<PersonalImportItem[]>;
7
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,62 @@
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
+ 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;
61
+ }
62
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/lib/fetchers/slack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ import type { EnvironmentConfig } from './config.js';
2
+ export interface ConnectorInfo {
3
+ key: string;
4
+ name: string;
5
+ status: 'active' | 'inactive' | 'error';
6
+ configured: boolean;
7
+ description?: string;
8
+ }
9
+ export interface ConnectorHealth {
10
+ status: 'healthy' | 'unhealthy' | 'unknown';
11
+ connector: string;
12
+ }
13
+ export interface CapturedDecision {
14
+ id: string;
15
+ title: string;
16
+ summary: string;
17
+ platform: string;
18
+ status?: string;
19
+ ai?: {
20
+ risks?: string[];
21
+ actions?: Array<{
22
+ text: string;
23
+ }>;
24
+ decisions?: string[];
25
+ };
26
+ }
27
+ export interface SearchResults {
28
+ results: Array<{
29
+ id: string;
30
+ title: string;
31
+ summary: string;
32
+ status: string;
33
+ similarity?: number;
34
+ }>;
35
+ count: number;
36
+ strategy: 'semantic' | 'keyword';
37
+ }
38
+ export interface AlignmentResult {
39
+ status: 'aligned' | 'conflicting' | 'no-context';
40
+ confidence: number;
41
+ relevant_decisions: Array<{
42
+ id: string;
43
+ title: string;
44
+ summary: string;
45
+ similarity: number;
46
+ }>;
47
+ conflicts?: Array<{
48
+ decision_id: string;
49
+ title: string;
50
+ reason: string;
51
+ severity: 'warning' | 'critical';
52
+ suggested_resolution?: string;
53
+ }>;
54
+ message: string;
55
+ }
56
+ export interface WhoAmI {
57
+ user: {
58
+ id: string;
59
+ email: string;
60
+ role: string;
61
+ };
62
+ tenant: {
63
+ id: string;
64
+ name: string;
65
+ };
66
+ }
67
+ export interface ImportJob {
68
+ id: string;
69
+ connector_key: string;
70
+ status: string;
71
+ progress: {
72
+ items_processed: number;
73
+ suggestions_created: number;
74
+ };
75
+ created_at: string;
76
+ }
77
+ export interface ScanRun {
78
+ id: string;
79
+ status: string;
80
+ connectors: string[];
81
+ progress: {
82
+ jobs_total: number;
83
+ jobs_completed: number;
84
+ total_suggestions: number;
85
+ };
86
+ created_at: string;
87
+ }
88
+ export interface Suggestion {
89
+ id: string;
90
+ suggested_title: string;
91
+ confidence: number;
92
+ status: string;
93
+ }
94
+ export interface Space {
95
+ id: string;
96
+ name: string;
97
+ slug: string;
98
+ space_type: string;
99
+ }
100
+ export interface DecisionLink {
101
+ id: string;
102
+ relation: string;
103
+ from_decision: {
104
+ id: string;
105
+ title: string;
106
+ };
107
+ to_decision: {
108
+ id: string;
109
+ title: string;
110
+ };
111
+ confidence: number;
112
+ }
113
+ export interface DriftItem {
114
+ decision_id: string;
115
+ title: string;
116
+ drift_severity: string;
117
+ drift_summary: string;
118
+ checked_at: string;
119
+ }
120
+ export interface BatchIngestItem {
121
+ source_url: string;
122
+ platform: string;
123
+ raw_text: string;
124
+ title?: string;
125
+ }
126
+ export interface BatchIngestResult {
127
+ snapshots: Array<{
128
+ id: string;
129
+ title: string;
130
+ summary: string;
131
+ analysis?: {
132
+ relatedDecisions: Array<{
133
+ id: string;
134
+ title: string;
135
+ relationship: string;
136
+ confidence: number;
137
+ }>;
138
+ };
139
+ }>;
140
+ }
141
+ export declare class GatewayError extends Error {
142
+ readonly statusCode: number;
143
+ constructor(message: string, statusCode: number);
144
+ }
145
+ export declare function createGatewayClient(env: EnvironmentConfig): {
146
+ whoami(): Promise<WhoAmI>;
147
+ listConnectors(): Promise<ConnectorInfo[]>;
148
+ getConnectorHealth(key: string): Promise<ConnectorHealth>;
149
+ startOAuth(key: string): Promise<{
150
+ authUrl: string;
151
+ }>;
152
+ disableConnector(key: string): Promise<void>;
153
+ captureDecision(input: string, platform: string): Promise<CapturedDecision>;
154
+ searchDecisions(q: string, limit?: number): Promise<SearchResults>;
155
+ listDecisions(params?: Record<string, string | number | boolean>): Promise<CapturedDecision[]>;
156
+ getDecision(id: string): Promise<CapturedDecision & {
157
+ external_references: unknown[];
158
+ spaces: unknown[];
159
+ }>;
160
+ checkAlignment(diff: string, context?: string): Promise<AlignmentResult>;
161
+ checkDrift(decisionId: string, content: string, sourceType?: string): Promise<unknown>;
162
+ getImpact(decisionId: string): Promise<unknown>;
163
+ getConflicts(): Promise<unknown>;
164
+ bulkStartImport(connectors: string[], config?: Record<string, unknown>): Promise<{
165
+ scan_run_id: string;
166
+ jobs: Array<{
167
+ id: string;
168
+ connector_key: string;
169
+ }>;
170
+ }>;
171
+ startImportJob(connector: string, config: Record<string, unknown>): Promise<{
172
+ id: string;
173
+ }>;
174
+ getScanRun(scanRunId: string): Promise<{
175
+ status: string;
176
+ progress: {
177
+ jobs_total: number;
178
+ jobs_completed: number;
179
+ total_suggestions: number;
180
+ };
181
+ }>;
182
+ listImportJobs(filters?: {
183
+ status?: string;
184
+ connector?: string;
185
+ }): Promise<ImportJob[]>;
186
+ listScanRuns(): Promise<ScanRun[]>;
187
+ listSuggestions(jobId?: string, status?: string): Promise<Suggestion[]>;
188
+ bulkApproveSuggestions(ids: string[]): Promise<{
189
+ created_decisions: number;
190
+ async?: false;
191
+ } | {
192
+ async: true;
193
+ job_id: string;
194
+ stream_url?: string;
195
+ }>;
196
+ listSpaces(): Promise<Space[]>;
197
+ listDecisionLinks(filters?: {
198
+ relation?: string;
199
+ decision_id?: string;
200
+ }): Promise<DecisionLink[]>;
201
+ getDriftSummary(): Promise<DriftItem[]>;
202
+ ingestBatch(items: BatchIngestItem[]): Promise<BatchIngestResult>;
203
+ getStreamUrl(jobId: string): string;
204
+ };
205
+ //# sourceMappingURL=gateway-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-client.d.ts","sourceRoot":"","sources":["../../src/lib/gateway-client.ts"],"names":[],"mappings":"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"}