@channelfactory/cliend 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cliend.d.ts +3 -0
- package/dist/bin/cliend.d.ts.map +1 -0
- package/dist/bin/cliend.js +7 -0
- package/dist/bin/cliend.js.map +1 -0
- package/dist/src/auth/auth-manager.d.ts +16 -0
- package/dist/src/auth/auth-manager.d.ts.map +1 -0
- package/dist/src/auth/auth-manager.js +135 -0
- package/dist/src/auth/auth-manager.js.map +1 -0
- package/dist/src/auth/credentials-store.d.ts +12 -0
- package/dist/src/auth/credentials-store.d.ts.map +1 -0
- package/dist/src/auth/credentials-store.js +95 -0
- package/dist/src/auth/credentials-store.js.map +1 -0
- package/dist/src/auth/local-server.d.ts +14 -0
- package/dist/src/auth/local-server.d.ts.map +1 -0
- package/dist/src/auth/local-server.js +49 -0
- package/dist/src/auth/local-server.js.map +1 -0
- package/dist/src/config/config-manager.d.ts +11 -0
- package/dist/src/config/config-manager.d.ts.map +1 -0
- package/dist/src/config/config-manager.js +102 -0
- package/dist/src/config/config-manager.js.map +1 -0
- package/dist/src/config/config.schema.d.ts +276 -0
- package/dist/src/config/config.schema.d.ts.map +1 -0
- package/dist/src/config/config.schema.js +46 -0
- package/dist/src/config/config.schema.js.map +1 -0
- package/dist/src/config/defaults.d.ts +3 -0
- package/dist/src/config/defaults.d.ts.map +1 -0
- package/dist/src/config/defaults.js +46 -0
- package/dist/src/config/defaults.js.map +1 -0
- package/dist/src/core/context-builder.d.ts +6 -0
- package/dist/src/core/context-builder.d.ts.map +1 -0
- package/dist/src/core/context-builder.js +55 -0
- package/dist/src/core/context-builder.js.map +1 -0
- package/dist/src/core/fan-out-executor.d.ts +16 -0
- package/dist/src/core/fan-out-executor.d.ts.map +1 -0
- package/dist/src/core/fan-out-executor.js +55 -0
- package/dist/src/core/fan-out-executor.js.map +1 -0
- package/dist/src/core/judge.d.ts +15 -0
- package/dist/src/core/judge.d.ts.map +1 -0
- package/dist/src/core/judge.js +133 -0
- package/dist/src/core/judge.js.map +1 -0
- package/dist/src/core/orchestrator.d.ts +19 -0
- package/dist/src/core/orchestrator.d.ts.map +1 -0
- package/dist/src/core/orchestrator.js +76 -0
- package/dist/src/core/orchestrator.js.map +1 -0
- package/dist/src/errors/auth-error.d.ts +16 -0
- package/dist/src/errors/auth-error.d.ts.map +1 -0
- package/dist/src/errors/auth-error.js +30 -0
- package/dist/src/errors/auth-error.js.map +1 -0
- package/dist/src/errors/base-error.d.ts +13 -0
- package/dist/src/errors/base-error.d.ts.map +1 -0
- package/dist/src/errors/base-error.js +13 -0
- package/dist/src/errors/base-error.js.map +1 -0
- package/dist/src/errors/error-handler.d.ts +7 -0
- package/dist/src/errors/error-handler.d.ts.map +1 -0
- package/dist/src/errors/error-handler.js +20 -0
- package/dist/src/errors/error-handler.js.map +1 -0
- package/dist/src/errors/integration-error.d.ts +20 -0
- package/dist/src/errors/integration-error.d.ts.map +1 -0
- package/dist/src/errors/integration-error.js +29 -0
- package/dist/src/errors/integration-error.js.map +1 -0
- package/dist/src/errors/provider-error.d.ts +23 -0
- package/dist/src/errors/provider-error.d.ts.map +1 -0
- package/dist/src/errors/provider-error.js +49 -0
- package/dist/src/errors/provider-error.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/atlassian/jira-client.d.ts +16 -0
- package/dist/src/integrations/atlassian/jira-client.d.ts.map +1 -0
- package/dist/src/integrations/atlassian/jira-client.js +100 -0
- package/dist/src/integrations/atlassian/jira-client.js.map +1 -0
- package/dist/src/integrations/atlassian/oauth.d.ts +2 -0
- package/dist/src/integrations/atlassian/oauth.d.ts.map +1 -0
- package/dist/src/integrations/atlassian/oauth.js +3 -0
- package/dist/src/integrations/atlassian/oauth.js.map +1 -0
- package/dist/src/integrations/atlassian/rovo-client.d.ts +13 -0
- package/dist/src/integrations/atlassian/rovo-client.d.ts.map +1 -0
- package/dist/src/integrations/atlassian/rovo-client.js +17 -0
- package/dist/src/integrations/atlassian/rovo-client.js.map +1 -0
- package/dist/src/integrations/atlassian/token-store.d.ts +2 -0
- package/dist/src/integrations/atlassian/token-store.d.ts.map +1 -0
- package/dist/src/integrations/atlassian/token-store.js +3 -0
- package/dist/src/integrations/atlassian/token-store.js.map +1 -0
- package/dist/src/integrations/bitbucket/bitbucket-client.d.ts +23 -0
- package/dist/src/integrations/bitbucket/bitbucket-client.d.ts.map +1 -0
- package/dist/src/integrations/bitbucket/bitbucket-client.js +58 -0
- package/dist/src/integrations/bitbucket/bitbucket-client.js.map +1 -0
- package/dist/src/integrations/bitbucket/obsidian-reader.d.ts +21 -0
- package/dist/src/integrations/bitbucket/obsidian-reader.d.ts.map +1 -0
- package/dist/src/integrations/bitbucket/obsidian-reader.js +85 -0
- package/dist/src/integrations/bitbucket/obsidian-reader.js.map +1 -0
- package/dist/src/providers/chatgpt.provider.d.ts +17 -0
- package/dist/src/providers/chatgpt.provider.d.ts.map +1 -0
- package/dist/src/providers/chatgpt.provider.js +66 -0
- package/dist/src/providers/chatgpt.provider.js.map +1 -0
- package/dist/src/providers/claude.provider.d.ts +17 -0
- package/dist/src/providers/claude.provider.d.ts.map +1 -0
- package/dist/src/providers/claude.provider.js +70 -0
- package/dist/src/providers/claude.provider.js.map +1 -0
- package/dist/src/providers/codex.provider.d.ts +17 -0
- package/dist/src/providers/codex.provider.d.ts.map +1 -0
- package/dist/src/providers/codex.provider.js +64 -0
- package/dist/src/providers/codex.provider.js.map +1 -0
- package/dist/src/providers/provider-registry.d.ts +10 -0
- package/dist/src/providers/provider-registry.d.ts.map +1 -0
- package/dist/src/providers/provider-registry.js +29 -0
- package/dist/src/providers/provider-registry.js.map +1 -0
- package/dist/src/providers/provider.interface.d.ts +10 -0
- package/dist/src/providers/provider.interface.d.ts.map +1 -0
- package/dist/src/providers/provider.interface.js +2 -0
- package/dist/src/providers/provider.interface.js.map +1 -0
- package/dist/src/repl/command-registry.d.ts +25 -0
- package/dist/src/repl/command-registry.d.ts.map +1 -0
- package/dist/src/repl/command-registry.js +19 -0
- package/dist/src/repl/command-registry.js.map +1 -0
- package/dist/src/repl/commands/auth.d.ts +3 -0
- package/dist/src/repl/commands/auth.d.ts.map +1 -0
- package/dist/src/repl/commands/auth.js +17 -0
- package/dist/src/repl/commands/auth.js.map +1 -0
- package/dist/src/repl/commands/config.d.ts +3 -0
- package/dist/src/repl/commands/config.d.ts.map +1 -0
- package/dist/src/repl/commands/config.js +39 -0
- package/dist/src/repl/commands/config.js.map +1 -0
- package/dist/src/repl/commands/help.d.ts +3 -0
- package/dist/src/repl/commands/help.d.ts.map +1 -0
- package/dist/src/repl/commands/help.js +33 -0
- package/dist/src/repl/commands/help.js.map +1 -0
- package/dist/src/repl/commands/memory.d.ts +3 -0
- package/dist/src/repl/commands/memory.d.ts.map +1 -0
- package/dist/src/repl/commands/memory.js +30 -0
- package/dist/src/repl/commands/memory.js.map +1 -0
- package/dist/src/repl/commands/obsidian.d.ts +3 -0
- package/dist/src/repl/commands/obsidian.d.ts.map +1 -0
- package/dist/src/repl/commands/obsidian.js +30 -0
- package/dist/src/repl/commands/obsidian.js.map +1 -0
- package/dist/src/repl/commands/sessions.d.ts +5 -0
- package/dist/src/repl/commands/sessions.d.ts.map +1 -0
- package/dist/src/repl/commands/sessions.js +77 -0
- package/dist/src/repl/commands/sessions.js.map +1 -0
- package/dist/src/repl/commands/status.d.ts +3 -0
- package/dist/src/repl/commands/status.d.ts.map +1 -0
- package/dist/src/repl/commands/status.js +32 -0
- package/dist/src/repl/commands/status.js.map +1 -0
- package/dist/src/repl/commands/ticket.d.ts +3 -0
- package/dist/src/repl/commands/ticket.d.ts.map +1 -0
- package/dist/src/repl/commands/ticket.js +38 -0
- package/dist/src/repl/commands/ticket.js.map +1 -0
- package/dist/src/repl/input-parser.d.ts +13 -0
- package/dist/src/repl/input-parser.d.ts.map +1 -0
- package/dist/src/repl/input-parser.js +25 -0
- package/dist/src/repl/input-parser.js.map +1 -0
- package/dist/src/repl/repl.d.ts +34 -0
- package/dist/src/repl/repl.d.ts.map +1 -0
- package/dist/src/repl/repl.js +180 -0
- package/dist/src/repl/repl.js.map +1 -0
- package/dist/src/session/history.d.ts +8 -0
- package/dist/src/session/history.d.ts.map +1 -0
- package/dist/src/session/history.js +26 -0
- package/dist/src/session/history.js.map +1 -0
- package/dist/src/session/memory-manager.d.ts +20 -0
- package/dist/src/session/memory-manager.d.ts.map +1 -0
- package/dist/src/session/memory-manager.js +65 -0
- package/dist/src/session/memory-manager.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +15 -0
- package/dist/src/session/session-manager.d.ts.map +1 -0
- package/dist/src/session/session-manager.js +139 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session/session.d.ts +31 -0
- package/dist/src/session/session.d.ts.map +1 -0
- package/dist/src/session/session.js +49 -0
- package/dist/src/session/session.js.map +1 -0
- package/dist/src/types/ai-response.d.ts +40 -0
- package/dist/src/types/ai-response.d.ts.map +1 -0
- package/dist/src/types/ai-response.js +2 -0
- package/dist/src/types/ai-response.js.map +1 -0
- package/dist/src/types/config.d.ts +51 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +2 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/context.d.ts +18 -0
- package/dist/src/types/context.d.ts.map +1 -0
- package/dist/src/types/context.js +2 -0
- package/dist/src/types/context.js.map +1 -0
- package/dist/src/types/message.d.ts +13 -0
- package/dist/src/types/message.d.ts.map +1 -0
- package/dist/src/types/message.js +2 -0
- package/dist/src/types/message.js.map +1 -0
- package/dist/src/types/session.d.ts +30 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +2 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/ticket.d.ts +18 -0
- package/dist/src/types/ticket.d.ts.map +1 -0
- package/dist/src/types/ticket.js +2 -0
- package/dist/src/types/ticket.js.map +1 -0
- package/dist/src/ui/logger.d.ts +3 -0
- package/dist/src/ui/logger.d.ts.map +1 -0
- package/dist/src/ui/logger.js +10 -0
- package/dist/src/ui/logger.js.map +1 -0
- package/dist/src/ui/output-formatter.d.ts +4 -0
- package/dist/src/ui/output-formatter.d.ts.map +1 -0
- package/dist/src/ui/output-formatter.js +52 -0
- package/dist/src/ui/output-formatter.js.map +1 -0
- package/dist/src/ui/prompt-line.d.ts +2 -0
- package/dist/src/ui/prompt-line.d.ts.map +1 -0
- package/dist/src/ui/prompt-line.js +4 -0
- package/dist/src/ui/prompt-line.js.map +1 -0
- package/dist/src/ui/spinner.d.ts +3 -0
- package/dist/src/ui/spinner.d.ts.map +1 -0
- package/dist/src/ui/spinner.js +5 -0
- package/dist/src/ui/spinner.js.map +1 -0
- package/dist/src/ui/welcome.d.ts +2 -0
- package/dist/src/ui/welcome.d.ts.map +1 -0
- package/dist/src/ui/welcome.js +14 -0
- package/dist/src/ui/welcome.js.map +1 -0
- package/dist/src/utils/crypto.d.ts +2 -0
- package/dist/src/utils/crypto.d.ts.map +1 -0
- package/dist/src/utils/crypto.js +3 -0
- package/dist/src/utils/crypto.js.map +1 -0
- package/dist/src/utils/http-client.d.ts +8 -0
- package/dist/src/utils/http-client.d.ts.map +1 -0
- package/dist/src/utils/http-client.js +36 -0
- package/dist/src/utils/http-client.js.map +1 -0
- package/dist/src/utils/retry.d.ts +7 -0
- package/dist/src/utils/retry.d.ts.map +1 -0
- package/dist/src/utils/retry.js +23 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/validation.d.ts +9 -0
- package/dist/src/utils/validation.d.ts.map +1 -0
- package/dist/src/utils/validation.js +19 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { AuthManager } from '../../auth/auth-manager.js';
|
|
2
|
+
import { JiraApiError } from '../../errors/integration-error.js';
|
|
3
|
+
const API_BASE = 'https://api.atlassian.com';
|
|
4
|
+
export class JiraClient {
|
|
5
|
+
config;
|
|
6
|
+
logger;
|
|
7
|
+
authManager;
|
|
8
|
+
constructor(config, logger) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
this.authManager = new AuthManager(config, logger);
|
|
12
|
+
}
|
|
13
|
+
async getIssue(issueKey) {
|
|
14
|
+
const cloudId = await this.getCloudId();
|
|
15
|
+
const url = `${API_BASE}/ex/jira/${cloudId}/rest/api/3/issue/${issueKey}`;
|
|
16
|
+
const response = await this.request(url);
|
|
17
|
+
if (response.status === 404) {
|
|
18
|
+
throw JiraApiError.issueNotFound(issueKey);
|
|
19
|
+
}
|
|
20
|
+
if (response.status === 403) {
|
|
21
|
+
throw JiraApiError.forbidden(issueKey);
|
|
22
|
+
}
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new JiraApiError('JIRA_API_ERROR', `Jira API returned ${response.status}`, `Failed to fetch ${issueKey}. Status: ${response.status}`);
|
|
25
|
+
}
|
|
26
|
+
const data = (await response.json());
|
|
27
|
+
return this.mapIssue(data);
|
|
28
|
+
}
|
|
29
|
+
async getCloudId() {
|
|
30
|
+
if (this.config.atlassian.cloudId) {
|
|
31
|
+
return this.config.atlassian.cloudId;
|
|
32
|
+
}
|
|
33
|
+
const token = await this.authManager.getAccessToken();
|
|
34
|
+
const response = await fetch(`${API_BASE}/oauth/token/accessible-resources`, {
|
|
35
|
+
headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' },
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
throw new JiraApiError('JIRA_CLOUD_ID_ERROR', 'Failed to fetch accessible resources', 'Could not determine Atlassian Cloud ID. Set it in config.');
|
|
39
|
+
}
|
|
40
|
+
const resources = (await response.json());
|
|
41
|
+
if (resources.length === 0) {
|
|
42
|
+
throw new JiraApiError('JIRA_NO_RESOURCES', 'No accessible resources found', 'No Atlassian sites accessible with current auth. Check permissions.');
|
|
43
|
+
}
|
|
44
|
+
const cloudId = resources[0].id;
|
|
45
|
+
this.logger.info({ cloudId, site: resources[0].name }, 'Resolved Cloud ID');
|
|
46
|
+
return cloudId;
|
|
47
|
+
}
|
|
48
|
+
async request(url) {
|
|
49
|
+
const token = await this.authManager.getAccessToken();
|
|
50
|
+
return fetch(url, {
|
|
51
|
+
headers: {
|
|
52
|
+
Authorization: `Bearer ${token}`,
|
|
53
|
+
Accept: 'application/json',
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
mapIssue(data) {
|
|
58
|
+
const fields = data.fields;
|
|
59
|
+
return {
|
|
60
|
+
key: data.key,
|
|
61
|
+
summary: fields.summary ?? '',
|
|
62
|
+
description: this.extractText(fields.description),
|
|
63
|
+
status: fields.status?.name ?? 'Unknown',
|
|
64
|
+
type: fields.issuetype?.name ?? 'Unknown',
|
|
65
|
+
priority: fields.priority?.name ?? 'Medium',
|
|
66
|
+
assignee: fields.assignee?.displayName,
|
|
67
|
+
labels: fields.labels ?? [],
|
|
68
|
+
acceptanceCriteria: this.extractCustomField(fields, 'acceptance criteria'),
|
|
69
|
+
projectKey: data.key.split('-')[0],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
extractText(doc) {
|
|
73
|
+
if (!doc || typeof doc !== 'object')
|
|
74
|
+
return '';
|
|
75
|
+
// Atlassian Document Format — extract text content recursively
|
|
76
|
+
const adf = doc;
|
|
77
|
+
if (!adf.content)
|
|
78
|
+
return '';
|
|
79
|
+
return adf.content
|
|
80
|
+
.flatMap((block) => block.content?.map((inline) => inline.text ?? '') ?? [])
|
|
81
|
+
.join(' ')
|
|
82
|
+
.trim();
|
|
83
|
+
}
|
|
84
|
+
extractCustomField(fields, label) {
|
|
85
|
+
// Search custom fields for acceptance criteria
|
|
86
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
87
|
+
if (key.startsWith('customfield_') && typeof value === 'string' && value.length > 0) {
|
|
88
|
+
// Heuristic: return the first non-empty custom field that looks like AC
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
if (key.startsWith('customfield_') && value && typeof value === 'object') {
|
|
92
|
+
const text = this.extractText(value);
|
|
93
|
+
if (text)
|
|
94
|
+
return text;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=jira-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-client.js","sourceRoot":"","sources":["../../../../src/integrations/atlassian/jira-client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AAE7C,MAAM,OAAO,UAAU;IAIF;IACA;IAJF,WAAW,CAAc;IAE1C,YACmB,MAAiB,EACjB,MAAc;QADd,WAAM,GAAN,MAAM,CAAW;QACjB,WAAM,GAAN,MAAM,CAAQ;QAE/B,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,QAAQ,YAAY,OAAO,qBAAqB,QAAQ,EAAE,CAAC;QAE1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,qBAAqB,QAAQ,CAAC,MAAM,EAAE,EACtC,mBAAmB,QAAQ,aAAa,QAAQ,CAAC,MAAM,EAAE,CAC1D,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;QACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QACvC,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,mCAAmC,EAAE;YAC3E,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SAC1E,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,YAAY,CACpB,qBAAqB,EACrB,sCAAsC,EACtC,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmC,CAAC;QAC5E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,YAAY,CACpB,mBAAmB,EACnB,+BAA+B,EAC/B,qEAAqE,CACtE,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC5E,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,GAAW;QAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC,GAAG,EAAE;YAChB,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,MAAM,EAAE,kBAAkB;aAC3B;SACF,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,IAAkB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC;YACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,SAAS;YACxC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,SAAS;YACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ;YAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW;YACtC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;YAC3B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC;YAC1E,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACnC,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,GAAY;QAC9B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC/C,+DAA+D;QAC/D,MAAM,GAAG,GAAG,GAAkE,CAAC;QAC/E,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,OAAO;aACf,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;aAC3E,IAAI,CAAC,GAAG,CAAC;aACT,IAAI,EAAE,CAAC;IACZ,CAAC;IAEO,kBAAkB,CAAC,MAA+B,EAAE,KAAa;QACvE,+CAA+C;QAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpF,wEAAwE;gBACxE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACzE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC;YACxB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../../src/integrations/atlassian/oauth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../../src/integrations/atlassian/oauth.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Logger } from 'pino';
|
|
2
|
+
import type { AppConfig } from '../../types/config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Rovo client — future-proofing for Atlassian Rovo AI integration.
|
|
5
|
+
* Currently a placeholder; will be implemented when Rovo MCP API stabilizes.
|
|
6
|
+
*/
|
|
7
|
+
export declare class RovoClient {
|
|
8
|
+
private readonly _config;
|
|
9
|
+
private readonly _logger;
|
|
10
|
+
constructor(_config: AppConfig, _logger: Logger);
|
|
11
|
+
search(_query: string): Promise<unknown[]>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=rovo-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rovo-client.d.ts","sourceRoot":"","sources":["../../../../src/integrations/atlassian/rovo-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;GAGG;AACH,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,MAAM;IAG5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAIjD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rovo client — future-proofing for Atlassian Rovo AI integration.
|
|
3
|
+
* Currently a placeholder; will be implemented when Rovo MCP API stabilizes.
|
|
4
|
+
*/
|
|
5
|
+
export class RovoClient {
|
|
6
|
+
_config;
|
|
7
|
+
_logger;
|
|
8
|
+
constructor(_config, _logger) {
|
|
9
|
+
this._config = _config;
|
|
10
|
+
this._logger = _logger;
|
|
11
|
+
}
|
|
12
|
+
async search(_query) {
|
|
13
|
+
// TODO: Implement Rovo search via MCP or REST API
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=rovo-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rovo-client.js","sourceRoot":"","sources":["../../../../src/integrations/atlassian/rovo-client.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,UAAU;IAEF;IACA;IAFnB,YACmB,OAAkB,EAClB,OAAe;QADf,YAAO,GAAP,OAAO,CAAW;QAClB,YAAO,GAAP,OAAO,CAAQ;IAC/B,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,kDAAkD;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../../../src/integrations/atlassian/token-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../../../../src/integrations/atlassian/token-store.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Logger } from 'pino';
|
|
2
|
+
import type { AppConfig } from '../../types/config.js';
|
|
3
|
+
export interface BitbucketFile {
|
|
4
|
+
path: string;
|
|
5
|
+
type: 'commit_file' | 'commit_directory';
|
|
6
|
+
size?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class BitbucketClient {
|
|
9
|
+
private readonly config;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private readonly authManager;
|
|
12
|
+
constructor(config: AppConfig, logger: Logger);
|
|
13
|
+
/**
|
|
14
|
+
* List files at a given path in the repository.
|
|
15
|
+
*/
|
|
16
|
+
listFiles(path: string): Promise<BitbucketFile[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Read the raw content of a file.
|
|
19
|
+
*/
|
|
20
|
+
readFile(filePath: string): Promise<string>;
|
|
21
|
+
private request;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=bitbucket-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitbucket-client.d.ts","sourceRoot":"","sources":["../../../../src/integrations/bitbucket/bitbucket-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMvD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,GAAG,kBAAkB,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,eAAe;IAIxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;gBAGvB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM;IAKjC;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAqBvD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAiBnC,OAAO;CAetB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { AuthManager } from '../../auth/auth-manager.js';
|
|
2
|
+
import { BitbucketApiError } from '../../errors/integration-error.js';
|
|
3
|
+
const API_BASE = 'https://api.bitbucket.org/2.0';
|
|
4
|
+
export class BitbucketClient {
|
|
5
|
+
config;
|
|
6
|
+
logger;
|
|
7
|
+
authManager;
|
|
8
|
+
constructor(config, logger) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
this.authManager = new AuthManager(config, logger);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* List files at a given path in the repository.
|
|
15
|
+
*/
|
|
16
|
+
async listFiles(path) {
|
|
17
|
+
const { workspace, repoSlug, branch } = this.config.bitbucket;
|
|
18
|
+
const url = `${API_BASE}/repositories/${workspace}/${repoSlug}/src/${branch}/${path}`;
|
|
19
|
+
const response = await this.request(url);
|
|
20
|
+
if (response.status === 404) {
|
|
21
|
+
throw BitbucketApiError.repoNotFound(workspace, repoSlug);
|
|
22
|
+
}
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new BitbucketApiError('BITBUCKET_API_ERROR', `Bitbucket API returned ${response.status}`, `Failed to list files at ${path}. Status: ${response.status}`);
|
|
25
|
+
}
|
|
26
|
+
const data = (await response.json());
|
|
27
|
+
return data.values ?? [];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Read the raw content of a file.
|
|
31
|
+
*/
|
|
32
|
+
async readFile(filePath) {
|
|
33
|
+
const { workspace, repoSlug, branch } = this.config.bitbucket;
|
|
34
|
+
const url = `${API_BASE}/repositories/${workspace}/${repoSlug}/src/${branch}/${filePath}`;
|
|
35
|
+
const response = await this.request(url);
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw new BitbucketApiError('BITBUCKET_FILE_NOT_FOUND', `Could not read ${filePath}: ${response.status}`, `Failed to read file ${filePath} from Bitbucket.`);
|
|
38
|
+
}
|
|
39
|
+
return response.text();
|
|
40
|
+
}
|
|
41
|
+
async request(url) {
|
|
42
|
+
try {
|
|
43
|
+
const token = await this.authManager.getAccessToken();
|
|
44
|
+
return fetch(url, {
|
|
45
|
+
headers: {
|
|
46
|
+
Authorization: `Bearer ${token}`,
|
|
47
|
+
Accept: 'application/json',
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// If auth fails, try without auth (public repos)
|
|
53
|
+
this.logger.debug('Auth failed for Bitbucket, trying unauthenticated');
|
|
54
|
+
return fetch(url, { headers: { Accept: 'application/json' } });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=bitbucket-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitbucket-client.js","sourceRoot":"","sources":["../../../../src/integrations/bitbucket/bitbucket-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AAQjD,MAAM,OAAO,eAAe;IAIP;IACA;IAJF,WAAW,CAAc;IAE1C,YACmB,MAAiB,EACjB,MAAc;QADd,WAAM,GAAN,MAAM,CAAW;QACjB,WAAM,GAAN,MAAM,CAAQ;QAE/B,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAC9D,MAAM,GAAG,GAAG,GAAG,QAAQ,iBAAiB,SAAS,IAAI,QAAQ,QAAQ,MAAM,IAAI,IAAI,EAAE,CAAC;QAEtF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,iBAAiB,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,iBAAiB,CACzB,qBAAqB,EACrB,0BAA0B,QAAQ,CAAC,MAAM,EAAE,EAC3C,2BAA2B,IAAI,aAAa,QAAQ,CAAC,MAAM,EAAE,CAC9D,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgC,CAAC;QACpE,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAC9D,MAAM,GAAG,GAAG,GAAG,QAAQ,iBAAiB,SAAS,IAAI,QAAQ,QAAQ,MAAM,IAAI,QAAQ,EAAE,CAAC;QAE1F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,iBAAiB,CACzB,0BAA0B,EAC1B,kBAAkB,QAAQ,KAAK,QAAQ,CAAC,MAAM,EAAE,EAChD,uBAAuB,QAAQ,kBAAkB,CAClD,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,GAAW;QAC/B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC,GAAG,EAAE;gBAChB,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,KAAK,EAAE;oBAChC,MAAM,EAAE,kBAAkB;iBAC3B;aACF,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;YACjD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Logger } from 'pino';
|
|
2
|
+
import type { AppConfig } from '../../types/config.js';
|
|
3
|
+
import type { ObsidianDocument } from '../../types/context.js';
|
|
4
|
+
export declare class ObsidianReader {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private readonly bitbucket;
|
|
7
|
+
private readonly basePath;
|
|
8
|
+
constructor(config: AppConfig, logger: Logger);
|
|
9
|
+
/**
|
|
10
|
+
* Fetch all markdown files from the Obsidian vault in Bitbucket.
|
|
11
|
+
*/
|
|
12
|
+
fetchAll(): Promise<ObsidianDocument[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Fetch docs and filter by relevance to a search query (ticket summary, labels, etc.).
|
|
15
|
+
*/
|
|
16
|
+
fetchRelevant(query: string, maxDocs?: number): Promise<ObsidianDocument[]>;
|
|
17
|
+
private parseDocument;
|
|
18
|
+
private extractTitle;
|
|
19
|
+
private rankByRelevance;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=obsidian-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian-reader.d.ts","sourceRoot":"","sources":["../../../../src/integrations/bitbucket/obsidian-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,qBAAa,cAAc;IAMvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAGhC,MAAM,EAAE,SAAS,EACA,MAAM,EAAE,MAAM;IAMjC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAsB7C;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAK5E,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,eAAe;CA4BxB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import matter from 'gray-matter';
|
|
2
|
+
import { BitbucketClient } from './bitbucket-client.js';
|
|
3
|
+
export class ObsidianReader {
|
|
4
|
+
logger;
|
|
5
|
+
bitbucket;
|
|
6
|
+
basePath;
|
|
7
|
+
constructor(config, logger) {
|
|
8
|
+
this.logger = logger;
|
|
9
|
+
this.bitbucket = new BitbucketClient(config, logger);
|
|
10
|
+
this.basePath = config.bitbucket.obsidianPath;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Fetch all markdown files from the Obsidian vault in Bitbucket.
|
|
14
|
+
*/
|
|
15
|
+
async fetchAll() {
|
|
16
|
+
const files = await this.bitbucket.listFiles(this.basePath);
|
|
17
|
+
const mdFiles = files.filter((f) => f.type === 'commit_file' && f.path.endsWith('.md'));
|
|
18
|
+
this.logger.info({ count: mdFiles.length }, 'Found Obsidian markdown files');
|
|
19
|
+
const docs = [];
|
|
20
|
+
for (const file of mdFiles) {
|
|
21
|
+
try {
|
|
22
|
+
const content = await this.bitbucket.readFile(file.path);
|
|
23
|
+
const parsed = this.parseDocument(file.path, content);
|
|
24
|
+
docs.push(parsed);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
this.logger.warn({ path: file.path, err: error }, 'Failed to read Obsidian doc');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return docs;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetch docs and filter by relevance to a search query (ticket summary, labels, etc.).
|
|
34
|
+
*/
|
|
35
|
+
async fetchRelevant(query, maxDocs = 5) {
|
|
36
|
+
const allDocs = await this.fetchAll();
|
|
37
|
+
return this.rankByRelevance(allDocs, query).slice(0, maxDocs);
|
|
38
|
+
}
|
|
39
|
+
parseDocument(path, raw) {
|
|
40
|
+
const { data: frontmatter, content } = matter(raw);
|
|
41
|
+
const title = this.extractTitle(path, content, frontmatter);
|
|
42
|
+
return {
|
|
43
|
+
path,
|
|
44
|
+
title,
|
|
45
|
+
content,
|
|
46
|
+
frontmatter: frontmatter,
|
|
47
|
+
relevanceScore: 0,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
extractTitle(path, content, frontmatter) {
|
|
51
|
+
// Priority: frontmatter title > first H1 > filename
|
|
52
|
+
if (typeof frontmatter.title === 'string')
|
|
53
|
+
return frontmatter.title;
|
|
54
|
+
const h1Match = content.match(/^#\s+(.+)$/m);
|
|
55
|
+
if (h1Match)
|
|
56
|
+
return h1Match[1];
|
|
57
|
+
const filename = path.split('/').pop() ?? path;
|
|
58
|
+
return filename.replace('.md', '').replace(/[-_]/g, ' ');
|
|
59
|
+
}
|
|
60
|
+
rankByRelevance(docs, query) {
|
|
61
|
+
const queryWords = query.toLowerCase().split(/\s+/);
|
|
62
|
+
for (const doc of docs) {
|
|
63
|
+
let score = 0;
|
|
64
|
+
const searchable = `${doc.title} ${doc.content} ${JSON.stringify(doc.frontmatter)}`.toLowerCase();
|
|
65
|
+
for (const word of queryWords) {
|
|
66
|
+
if (word.length < 3)
|
|
67
|
+
continue;
|
|
68
|
+
const matches = (searchable.match(new RegExp(word, 'g')) ?? []).length;
|
|
69
|
+
score += matches;
|
|
70
|
+
}
|
|
71
|
+
// Boost docs with relevant frontmatter tags
|
|
72
|
+
const tags = doc.frontmatter.tags;
|
|
73
|
+
if (Array.isArray(tags)) {
|
|
74
|
+
for (const tag of tags) {
|
|
75
|
+
if (typeof tag === 'string' && queryWords.some((w) => tag.toLowerCase().includes(w))) {
|
|
76
|
+
score += 5;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
doc.relevanceScore = score;
|
|
81
|
+
}
|
|
82
|
+
return docs.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=obsidian-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian-reader.js","sourceRoot":"","sources":["../../../../src/integrations/bitbucket/obsidian-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IAIProvider } from './provider.interface.js';
|
|
2
|
+
import type { ConversationMessage } from '../types/message.js';
|
|
3
|
+
import type { AIProviderResponse } from '../types/ai-response.js';
|
|
4
|
+
import type { AssembledContext } from '../types/context.js';
|
|
5
|
+
import type { ProviderConfig } from '../types/config.js';
|
|
6
|
+
export declare class ChatGPTProvider implements IAIProvider {
|
|
7
|
+
private readonly config;
|
|
8
|
+
readonly name = "ChatGPT";
|
|
9
|
+
private client;
|
|
10
|
+
private abortController;
|
|
11
|
+
constructor(config: ProviderConfig);
|
|
12
|
+
isAvailable(): Promise<boolean>;
|
|
13
|
+
execute(context: AssembledContext, history: ConversationMessage[]): Promise<AIProviderResponse>;
|
|
14
|
+
abort(): void;
|
|
15
|
+
private buildMessages;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=chatgpt.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatgpt.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/chatgpt.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,qBAAa,eAAgB,YAAW,WAAW;IAKrC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,eAAe,CAAgC;gBAE1B,MAAM,EAAE,cAAc;IAE7C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CACX,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,mBAAmB,EAAE,GAC7B,OAAO,CAAC,kBAAkB,CAAC;IA8C9B,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
export class ChatGPTProvider {
|
|
3
|
+
config;
|
|
4
|
+
name = 'ChatGPT';
|
|
5
|
+
client = null;
|
|
6
|
+
abortController = null;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
async isAvailable() {
|
|
11
|
+
return this.config.enabled && !!this.config.apiKey;
|
|
12
|
+
}
|
|
13
|
+
async execute(context, history) {
|
|
14
|
+
const start = Date.now();
|
|
15
|
+
try {
|
|
16
|
+
if (!this.client) {
|
|
17
|
+
this.client = new OpenAI({ apiKey: this.config.apiKey });
|
|
18
|
+
}
|
|
19
|
+
this.abortController = new AbortController();
|
|
20
|
+
const messages = this.buildMessages(context, history);
|
|
21
|
+
const response = await this.client.chat.completions.create({
|
|
22
|
+
model: this.config.model ?? 'gpt-4o',
|
|
23
|
+
messages,
|
|
24
|
+
max_tokens: 8192,
|
|
25
|
+
}, { signal: this.abortController.signal });
|
|
26
|
+
const text = response.choices[0]?.message?.content ?? '';
|
|
27
|
+
return {
|
|
28
|
+
providerName: this.name,
|
|
29
|
+
success: true,
|
|
30
|
+
output: {
|
|
31
|
+
code: text,
|
|
32
|
+
explanation: '',
|
|
33
|
+
},
|
|
34
|
+
latencyMs: Date.now() - start,
|
|
35
|
+
tokenUsage: {
|
|
36
|
+
inputTokens: response.usage?.prompt_tokens ?? 0,
|
|
37
|
+
outputTokens: response.usage?.completion_tokens ?? 0,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return {
|
|
43
|
+
providerName: this.name,
|
|
44
|
+
success: false,
|
|
45
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
46
|
+
latencyMs: Date.now() - start,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
abort() {
|
|
51
|
+
this.abortController?.abort();
|
|
52
|
+
}
|
|
53
|
+
buildMessages(context, history) {
|
|
54
|
+
const messages = [
|
|
55
|
+
{ role: 'system', content: context.prompt },
|
|
56
|
+
];
|
|
57
|
+
for (const msg of history) {
|
|
58
|
+
if (msg.role === 'user' || msg.role === 'assistant') {
|
|
59
|
+
messages.push({ role: msg.role, content: msg.content });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
messages.push({ role: 'user', content: context.userMessage });
|
|
63
|
+
return messages;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=chatgpt.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatgpt.provider.js","sourceRoot":"","sources":["../../../src/providers/chatgpt.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IAIProvider } from './provider.interface.js';
|
|
2
|
+
import type { ConversationMessage } from '../types/message.js';
|
|
3
|
+
import type { AIProviderResponse } from '../types/ai-response.js';
|
|
4
|
+
import type { AssembledContext } from '../types/context.js';
|
|
5
|
+
import type { ProviderConfig } from '../types/config.js';
|
|
6
|
+
export declare class ClaudeProvider implements IAIProvider {
|
|
7
|
+
private readonly config;
|
|
8
|
+
readonly name = "Claude";
|
|
9
|
+
private client;
|
|
10
|
+
private abortController;
|
|
11
|
+
constructor(config: ProviderConfig);
|
|
12
|
+
isAvailable(): Promise<boolean>;
|
|
13
|
+
execute(context: AssembledContext, history: ConversationMessage[]): Promise<AIProviderResponse>;
|
|
14
|
+
abort(): void;
|
|
15
|
+
private buildMessages;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=claude.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/claude.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,qBAAa,cAAe,YAAW,WAAW;IAKpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,eAAe,CAAgC;gBAE1B,MAAM,EAAE,cAAc;IAE7C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CACX,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,mBAAmB,EAAE,GAC7B,OAAO,CAAC,kBAAkB,CAAC;IAkD9B,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,aAAa;CAkBtB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
export class ClaudeProvider {
|
|
3
|
+
config;
|
|
4
|
+
name = 'Claude';
|
|
5
|
+
client = null;
|
|
6
|
+
abortController = null;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
async isAvailable() {
|
|
11
|
+
return this.config.enabled && !!this.config.apiKey;
|
|
12
|
+
}
|
|
13
|
+
async execute(context, history) {
|
|
14
|
+
const start = Date.now();
|
|
15
|
+
try {
|
|
16
|
+
if (!this.client) {
|
|
17
|
+
this.client = new Anthropic({ apiKey: this.config.apiKey });
|
|
18
|
+
}
|
|
19
|
+
this.abortController = new AbortController();
|
|
20
|
+
const messages = this.buildMessages(context, history);
|
|
21
|
+
const response = await this.client.messages.create({
|
|
22
|
+
model: this.config.model ?? 'claude-sonnet-4-6',
|
|
23
|
+
max_tokens: 8192,
|
|
24
|
+
system: context.prompt,
|
|
25
|
+
messages,
|
|
26
|
+
}, { signal: this.abortController.signal });
|
|
27
|
+
const text = response.content
|
|
28
|
+
.filter((block) => block.type === 'text')
|
|
29
|
+
.map((block) => block.text)
|
|
30
|
+
.join('\n');
|
|
31
|
+
return {
|
|
32
|
+
providerName: this.name,
|
|
33
|
+
success: true,
|
|
34
|
+
output: {
|
|
35
|
+
code: text,
|
|
36
|
+
explanation: '',
|
|
37
|
+
},
|
|
38
|
+
latencyMs: Date.now() - start,
|
|
39
|
+
tokenUsage: {
|
|
40
|
+
inputTokens: response.usage.input_tokens,
|
|
41
|
+
outputTokens: response.usage.output_tokens,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return {
|
|
47
|
+
providerName: this.name,
|
|
48
|
+
success: false,
|
|
49
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
50
|
+
latencyMs: Date.now() - start,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
abort() {
|
|
55
|
+
this.abortController?.abort();
|
|
56
|
+
}
|
|
57
|
+
buildMessages(context, history) {
|
|
58
|
+
const messages = [];
|
|
59
|
+
// Include conversation history
|
|
60
|
+
for (const msg of history) {
|
|
61
|
+
if (msg.role === 'user' || msg.role === 'assistant') {
|
|
62
|
+
messages.push({ role: msg.role, content: msg.content });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Add current message
|
|
66
|
+
messages.push({ role: 'user', content: context.userMessage });
|
|
67
|
+
return messages;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=claude.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.provider.js","sourceRoot":"","sources":["../../../src/providers/claude.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IAIProvider } from './provider.interface.js';
|
|
2
|
+
import type { ConversationMessage } from '../types/message.js';
|
|
3
|
+
import type { AIProviderResponse } from '../types/ai-response.js';
|
|
4
|
+
import type { AssembledContext } from '../types/context.js';
|
|
5
|
+
import type { ProviderConfig } from '../types/config.js';
|
|
6
|
+
export declare class CodexProvider implements IAIProvider {
|
|
7
|
+
private readonly config;
|
|
8
|
+
readonly name = "Codex";
|
|
9
|
+
private client;
|
|
10
|
+
private abortController;
|
|
11
|
+
constructor(config: ProviderConfig);
|
|
12
|
+
isAvailable(): Promise<boolean>;
|
|
13
|
+
execute(context: AssembledContext, history: ConversationMessage[]): Promise<AIProviderResponse>;
|
|
14
|
+
abort(): void;
|
|
15
|
+
private buildMessages;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=codex.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/codex.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,qBAAa,aAAc,YAAW,WAAW;IAKnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,eAAe,CAAgC;gBAE1B,MAAM,EAAE,cAAc;IAE7C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CACX,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,mBAAmB,EAAE,GAC7B,OAAO,CAAC,kBAAkB,CAAC;IA8C9B,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,aAAa;CAetB"}
|