plugin-git-manager 1.2.1 → 1.2.3
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/client/228.7588a0707cb3694a.js +9 -0
- package/dist/client/597.1698c0124e2f95ce.js +10 -0
- package/dist/client/906.bea20db91f34f5e6.js +10 -0
- package/dist/client/index.js +10 -1
- package/dist/externalVersion.js +15 -5
- package/dist/index.js +9 -0
- package/dist/locale/en-US.json +8 -1
- package/dist/locale/vi-VN.json +8 -1
- package/dist/server/actions/git-actions.js +43 -6
- package/dist/server/actions/gitlab-api.js +9 -0
- package/dist/server/actions/poller.js +9 -0
- package/dist/server/actions/review.js +9 -0
- package/dist/server/actions/role-permissions.js +145 -0
- package/dist/server/ai-tools.js +9 -0
- package/dist/server/collections/gitCodeReviews.js +9 -0
- package/dist/server/collections/gitRepositories.js +9 -0
- package/dist/server/collections/gitReviewFlows.js +9 -0
- package/dist/server/index.js +9 -0
- package/dist/server/migrations/20260508000000-add-auto-review-flow-id.js +9 -0
- package/dist/server/plugin.js +27 -1
- package/dist/server/poller.js +9 -0
- package/dist/server/utils/gitlab-url.js +9 -0
- package/dist/server/utils/redact.js +9 -0
- package/package.json +36 -36
- package/src/client/components/GitManagerSettings.tsx +1 -11
- package/src/client/components/RepositoryPermissions.tsx +130 -0
- package/src/client/index.tsx +36 -2
- package/src/locale/en-US.json +8 -1
- package/src/locale/vi-VN.json +8 -1
- package/src/server/__tests__/smoke.test.ts +17 -0
- package/src/server/actions/git-actions.ts +430 -430
- package/src/server/actions/role-permissions.ts +128 -0
- package/src/server/plugin.ts +46 -25
- package/dist/client/187.d5545b7cc8b90bfc.js +0 -1
- package/dist/client/ai-context.d.ts +0 -8
- package/dist/client/components/AIEmployeeSelect.d.ts +0 -13
- package/dist/client/components/CommitHistory.d.ts +0 -2
- package/dist/client/components/FileExplorer.d.ts +0 -2
- package/dist/client/components/GitManagerSettings.d.ts +0 -2
- package/dist/client/components/GitOperations.d.ts +0 -2
- package/dist/client/components/LLMModelSelect.d.ts +0 -10
- package/dist/client/components/LLMServiceSelect.d.ts +0 -9
- package/dist/client/components/MarkdownView.d.ts +0 -10
- package/dist/client/components/MergeRequests.d.ts +0 -2
- package/dist/client/components/PollingStatus.d.ts +0 -2
- package/dist/client/components/RepositoryConfig.d.ts +0 -2
- package/dist/client/components/ReviewFlows.d.ts +0 -2
- package/dist/client/components/ReviewHistory.d.ts +0 -4
- package/dist/client/components/RunReviewButton.d.ts +0 -31
- package/dist/client/context/GitManagerContext.d.ts +0 -26
- package/dist/client/index.d.ts +0 -5
- package/dist/client/locale.d.ts +0 -2
- package/dist/index.d.ts +0 -2
- package/dist/server/actions/git-actions.d.ts +0 -13
- package/dist/server/actions/gitlab-api.d.ts +0 -4
- package/dist/server/actions/poller.d.ts +0 -8
- package/dist/server/actions/review.d.ts +0 -40
- package/dist/server/ai-tools.d.ts +0 -10
- package/dist/server/collections/gitCodeReviews.d.ts +0 -2
- package/dist/server/collections/gitRepositories.d.ts +0 -2
- package/dist/server/collections/gitReviewFlows.d.ts +0 -2
- package/dist/server/index.d.ts +0 -2
- package/dist/server/migrations/20260508000000-add-auto-review-flow-id.d.ts +0 -6
- package/dist/server/plugin.d.ts +0 -12
- package/dist/server/poller.d.ts +0 -30
- package/dist/server/utils/gitlab-url.d.ts +0 -21
- package/dist/server/utils/redact.d.ts +0 -13
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
function getRecordValue(record: any, key: string) {
|
|
2
|
+
return record?.get ? record.get(key) : record?.[key];
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* GET gitManager:rolePermissions
|
|
7
|
+
* Returns parsed repository access permissions for a specific role.
|
|
8
|
+
*/
|
|
9
|
+
export async function rolePermissions(ctx: any, _next: () => Promise<void>) {
|
|
10
|
+
const currentRoles = Array.isArray(ctx.state?.currentRoles) ? ctx.state.currentRoles : [];
|
|
11
|
+
if (!currentRoles.includes('root')) {
|
|
12
|
+
const canAccessRoles = await ctx.app.acl.can({ roles: currentRoles, resource: 'roles', action: 'update' });
|
|
13
|
+
if (!canAccessRoles) return ctx.throw(403, 'Permission denied');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const roleName = ctx.action.params.roleName;
|
|
17
|
+
if (!roleName) return ctx.throw(400, 'roleName is required');
|
|
18
|
+
|
|
19
|
+
const resource = await ctx.db.getRepository('rolesResources').findOne({
|
|
20
|
+
filter: { roleName, name: 'gitRepositories' },
|
|
21
|
+
});
|
|
22
|
+
if (!resource) {
|
|
23
|
+
ctx.body = { data: { read: [], write: [] } };
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const actions = await ctx.db.getRepository('rolesResourcesActions').find({
|
|
27
|
+
filter: { rolesResourceId: getRecordValue(resource, 'id') },
|
|
28
|
+
appends: ['scope'],
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const result = { read: [], write: [] };
|
|
32
|
+
for (const action of actions) {
|
|
33
|
+
const actionData = action.toJSON ? action.toJSON() : action;
|
|
34
|
+
const actionName = actionData.name;
|
|
35
|
+
if (result[actionName]) {
|
|
36
|
+
const scopeRow = actionData.scope;
|
|
37
|
+
const scope = scopeRow?.scope || scopeRow;
|
|
38
|
+
try {
|
|
39
|
+
if (scope && scope.$and && scope.$and[0] && scope.$and[0].id) {
|
|
40
|
+
if (scope.$and[0].id.$in) {
|
|
41
|
+
result[actionName] = scope.$and[0].id.$in;
|
|
42
|
+
} else if (typeof scope.$and[0].id === 'number' || typeof scope.$and[0].id === 'string') {
|
|
43
|
+
result[actionName] = [scope.$and[0].id];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
} catch (e) {
|
|
47
|
+
// Unrecognized scope structure, skip
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
ctx.body = result;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* POST gitManager:updateRolePermissions
|
|
56
|
+
* Update Data Scopes in rolesResourcesActions for gitRepositories.
|
|
57
|
+
*/
|
|
58
|
+
export async function updateRolePermissions(ctx: any, _next: () => Promise<void>) {
|
|
59
|
+
const currentRoles = Array.isArray(ctx.state?.currentRoles) ? ctx.state.currentRoles : [];
|
|
60
|
+
if (!currentRoles.includes('root')) {
|
|
61
|
+
const canAccessRoles = await ctx.app.acl.can({ roles: currentRoles, resource: 'roles', action: 'update' });
|
|
62
|
+
if (!canAccessRoles) return ctx.throw(403, 'Permission denied');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const payload = ctx.action.params.values || ctx.request.body || {};
|
|
66
|
+
const roleName = payload.roleName || ctx.action.params.roleName;
|
|
67
|
+
const permissions = payload.values || {};
|
|
68
|
+
if (!roleName) return ctx.throw(400, 'roleName is required');
|
|
69
|
+
|
|
70
|
+
const resourceRepo = ctx.db.getRepository('rolesResources');
|
|
71
|
+
let resource = await resourceRepo.findOne({ filter: { roleName, name: 'gitRepositories' } });
|
|
72
|
+
if (!resource) {
|
|
73
|
+
resource = await resourceRepo.create({
|
|
74
|
+
values: { roleName, name: 'gitRepositories', usingActionsConfig: true },
|
|
75
|
+
});
|
|
76
|
+
} else if (!getRecordValue(resource, 'usingActionsConfig')) {
|
|
77
|
+
await resource.update({ usingActionsConfig: true });
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const rolesResourceId = getRecordValue(resource, 'id');
|
|
81
|
+
const actionsRepo = ctx.db.getRepository('rolesResourcesActions');
|
|
82
|
+
for (const actionName of ['read', 'write']) {
|
|
83
|
+
const ids = permissions[actionName] || [];
|
|
84
|
+
const action = await actionsRepo.findOne({
|
|
85
|
+
filter: { rolesResourceId, name: actionName },
|
|
86
|
+
appends: ['scope'],
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (ids.length === 0) {
|
|
90
|
+
// Remove the action if no ids allowed
|
|
91
|
+
if (action) await action.destroy();
|
|
92
|
+
} else {
|
|
93
|
+
const scopeJson = { $and: [{ id: { $in: ids } }] };
|
|
94
|
+
if (action) {
|
|
95
|
+
const actionData = action.toJSON ? action.toJSON() : action;
|
|
96
|
+
const actionScope = actionData.scope;
|
|
97
|
+
const actionScopeId = getRecordValue(actionScope, 'id') || actionData.scopeId || getRecordValue(action, 'scopeId');
|
|
98
|
+
if (actionScopeId) {
|
|
99
|
+
await ctx.db.getRepository('rolesResourcesScopes').update({
|
|
100
|
+
filterByTk: actionScopeId,
|
|
101
|
+
values: { scope: scopeJson },
|
|
102
|
+
});
|
|
103
|
+
} else {
|
|
104
|
+
const newScope = await ctx.db.getRepository('rolesResourcesScopes').create({
|
|
105
|
+
values: { scope: scopeJson },
|
|
106
|
+
});
|
|
107
|
+
await action.update({ scopeId: getRecordValue(newScope, 'id') });
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
const newScope = await ctx.db.getRepository('rolesResourcesScopes').create({
|
|
111
|
+
values: { scope: scopeJson },
|
|
112
|
+
});
|
|
113
|
+
await actionsRepo.create({
|
|
114
|
+
values: { rolesResourceId, name: actionName, scopeId: getRecordValue(newScope, 'id') },
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Force reload the ACL cache in memory for this resource
|
|
121
|
+
try {
|
|
122
|
+
await resource.writeToACL({ acl: ctx.app.acl });
|
|
123
|
+
} catch (e) {
|
|
124
|
+
ctx.logger?.warn?.('[git-manager] Failed to write resource to ACL memory cache:', e);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
ctx.body = { data: 'ok' };
|
|
128
|
+
}
|
package/src/server/plugin.ts
CHANGED
|
@@ -3,9 +3,10 @@ import { resolve } from 'path';
|
|
|
3
3
|
import { DataTypes } from 'sequelize';
|
|
4
4
|
import * as gitActions from './actions/git-actions';
|
|
5
5
|
import * as gitlabApi from './actions/gitlab-api';
|
|
6
|
-
import * as reviewActions from './actions/review';
|
|
7
|
-
import * as pollerActions from './actions/poller';
|
|
8
|
-
import
|
|
6
|
+
import * as reviewActions from './actions/review';
|
|
7
|
+
import * as pollerActions from './actions/poller';
|
|
8
|
+
import * as rolePermissionsActions from './actions/role-permissions';
|
|
9
|
+
import { recoverStuckReviews, registerReviewQueue, unregisterReviewQueue } from './actions/review';
|
|
9
10
|
import { registerGitReviewAiTools } from './ai-tools';
|
|
10
11
|
import { startPoller, stopPoller } from './poller';
|
|
11
12
|
|
|
@@ -57,6 +58,8 @@ export class PluginGitManagerServer extends Plugin {
|
|
|
57
58
|
reviewReject: reviewActions.reviewReject,
|
|
58
59
|
pollNow: pollerActions.pollNow,
|
|
59
60
|
pollerStatus: pollerActions.pollerStatus,
|
|
61
|
+
rolePermissions: rolePermissionsActions.rolePermissions,
|
|
62
|
+
updateRolePermissions: rolePermissionsActions.updateRolePermissions,
|
|
60
63
|
},
|
|
61
64
|
});
|
|
62
65
|
|
|
@@ -77,10 +80,10 @@ export class PluginGitManagerServer extends Plugin {
|
|
|
77
80
|
};
|
|
78
81
|
}
|
|
79
82
|
return next();
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
registerReviewQueue((this as any).app);
|
|
83
|
-
registerGitReviewAiTools((this as any).app);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
registerReviewQueue((this as any).app);
|
|
86
|
+
registerGitReviewAiTools((this as any).app);
|
|
84
87
|
|
|
85
88
|
(this as any).app.on('afterStart', async () => {
|
|
86
89
|
await ensureAutoReviewFlowSchema((this as any).app).catch(
|
|
@@ -92,14 +95,14 @@ export class PluginGitManagerServer extends Plugin {
|
|
|
92
95
|
);
|
|
93
96
|
startPoller((this as any).app);
|
|
94
97
|
});
|
|
95
|
-
(this as any).app.on('beforeStop', () => {
|
|
96
|
-
unregisterReviewQueue((this as any).app);
|
|
97
|
-
stopPoller();
|
|
98
|
-
});
|
|
99
|
-
(this as any).app.on('beforeDestroy', () => {
|
|
100
|
-
unregisterReviewQueue((this as any).app);
|
|
101
|
-
stopPoller();
|
|
102
|
-
});
|
|
98
|
+
(this as any).app.on('beforeStop', () => {
|
|
99
|
+
unregisterReviewQueue((this as any).app);
|
|
100
|
+
stopPoller();
|
|
101
|
+
});
|
|
102
|
+
(this as any).app.on('beforeDestroy', () => {
|
|
103
|
+
unregisterReviewQueue((this as any).app);
|
|
104
|
+
stopPoller();
|
|
105
|
+
});
|
|
103
106
|
|
|
104
107
|
// Read-only operations available to all plugin users
|
|
105
108
|
(this as any).app.acl.registerSnippet({
|
|
@@ -150,6 +153,24 @@ export class PluginGitManagerServer extends Plugin {
|
|
|
150
153
|
],
|
|
151
154
|
});
|
|
152
155
|
|
|
156
|
+
// Repositories config — CRUD on gitRepositories only (no operations)
|
|
157
|
+
(this as any).app.acl.registerSnippet({
|
|
158
|
+
name: `pm.${(this as any).name}.repositories`,
|
|
159
|
+
actions: [
|
|
160
|
+
'gitRepositories:*',
|
|
161
|
+
],
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Full management — all git manager actions
|
|
165
|
+
(this as any).app.acl.registerSnippet({
|
|
166
|
+
name: `pm.${(this as any).name}.manage`,
|
|
167
|
+
actions: [
|
|
168
|
+
`pm.${(this as any).name}.repositories`,
|
|
169
|
+
`pm.${(this as any).name}.read`,
|
|
170
|
+
`pm.${(this as any).name}.write`,
|
|
171
|
+
],
|
|
172
|
+
});
|
|
173
|
+
|
|
153
174
|
// Prevent overwriting PAT with obfuscated value on updates
|
|
154
175
|
(this as any).app.resourceManager.use(async (ctx, next) => {
|
|
155
176
|
if (ctx.action?.resourceName === 'gitRepositories' && ['create', 'update'].includes(ctx.action?.actionName)) {
|
|
@@ -191,16 +212,16 @@ export class PluginGitManagerServer extends Plugin {
|
|
|
191
212
|
await (this as any).app.db.getCollection('gitRepositories')?.sync();
|
|
192
213
|
}
|
|
193
214
|
|
|
194
|
-
async beforeDisable() {
|
|
195
|
-
unregisterReviewQueue((this as any).app);
|
|
196
|
-
stopPoller();
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
async beforeUnload() {
|
|
200
|
-
unregisterReviewQueue((this as any).app);
|
|
201
|
-
stopPoller();
|
|
202
|
-
}
|
|
203
|
-
}
|
|
215
|
+
async beforeDisable() {
|
|
216
|
+
unregisterReviewQueue((this as any).app);
|
|
217
|
+
stopPoller();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async beforeUnload() {
|
|
221
|
+
unregisterReviewQueue((this as any).app);
|
|
222
|
+
stopPoller();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
204
225
|
|
|
205
226
|
export async function ensureAutoReviewFlowSchema(app: any) {
|
|
206
227
|
const sequelize = app.db?.sequelize;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkplugin_git_manager=self.webpackChunkplugin_git_manager||[]).push([["187"],{922:function(e,t,n){n.r(t),n.d(t,{GitManagerSettings:function(){return to}});var r=n(156),l=n.n(r),a=n(721),o=n(482),i=n(772);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function u(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function s(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){u(a,r,l,o,i,"next",e)}function i(e){u(a,r,l,o,i,"throw",e)}o(void 0)})}}function d(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return c(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function m(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var p=(0,r.createContext)(null);function f(){return(0,r.useContext)(p)}var y=function(e){var t=e.children,n=(0,i.useAPIClient)(),a=d((0,r.useState)([]),2),o=a[0],c=a[1],u=d((0,r.useState)(null),2),f=u[0],y=u[1],h=d((0,r.useState)(!1),2),g=h[0],v=h[1],b=d((0,r.useState)([]),2),E=b[0],w=b[1],S=d((0,r.useState)(""),2),k=S[0],C=S[1],I=(0,r.useRef)(f);I.current=f;var x=(0,r.useCallback)(s(function(){var e,t,r,l;return m(this,function(a){switch(a.label){case 0:if(!(e=I.current)||"connected"!==e.status)return w([]),C(""),[2];a.label=1;case 1:return a.trys.push([1,3,,4]),[4,n.request({url:"gitManager:branches",params:{repositoryId:e.id}})];case 2:return(l=(null==(r=a.sent().data)||null==(t=r.data)?void 0:t.data)||(null==r?void 0:r.data))&&(w(l.all||[]),C(l.current||"")),[3,4];case 3:return a.sent(),w([]),C(""),[3,4];case 4:return[2]}})}),[n]),O=(0,r.useCallback)(s(function(){var e,t,r,l;return m(this,function(a){switch(a.label){case 0:v(!0),a.label=1;case 1:return a.trys.push([1,,3,4]),[4,n.request({url:"gitRepositories:list",params:{pageSize:100}})];case 2:return c(t=(null==(e=a.sent().data)?void 0:e.data)||[]),(r=I.current)&&(l=t.find(function(e){return e.id===r.id}))&&y(l),[3,4];case 3:return v(!1),[7];case 4:return[2]}})}),[n]);return l().createElement(p.Provider,{value:{repos:o,selectedRepo:f,loading:g,branches:E,currentBranch:k,setSelectedRepo:y,refreshRepos:O,refreshBranches:x}},t)};function h(){var e=(0,i.useApp)();return function(t,n){return e.i18n.t(t,function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({ns:["plugin-git-manager","client"]},n))}}function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function v(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function b(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){v(a,r,l,o,i,"next",e)}function i(e){v(a,r,l,o,i,"throw",e)}o(void 0)})}}function E(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return g(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return g(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function w(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var S=function(){var e,t,n,c=h(),u=(0,i.useAPIClient)(),s=f(),d=s.repos,m=s.refreshRepos,p=s.selectedRepo,y=s.setSelectedRepo,g=E((0,r.useState)(!1),2),v=g[0],S=g[1],k=E((0,r.useState)(null),2),C=k[0],I=k[1],x=E(a.Form.useForm(),1)[0],O=E((0,r.useState)(null),2),A=O[0],T=O[1],R=E((0,r.useState)([]),2),P=R[0],z=R[1],F=(0,r.useCallback)(b(function(){var e;return w(this,function(t){switch(t.label){case 0:return[4,u.request({url:"gitReviewFlows:list",params:{pageSize:100,filter:{enabled:!0,triggerMode:{$in:["onMergeRequestCreated","both"]}}}})];case 1:return z((null==(e=t.sent().data)?void 0:e.data)||[]),[2]}})}),[u]);(0,r.useEffect)(function(){F().catch(function(){})},[F]);var B=function(e){return P.filter(function(t){return t.repositoryId===e||null==t.repositoryId}).map(function(e){return{value:e.id,label:"".concat(e.name).concat(null==e.repositoryId?" (".concat(c("global"),")"):"")}})},j=(e=b(function(){var e,t;return w(this,function(n){switch(n.label){case 0:return[4,x.validateFields()];case 1:e=n.sent(),C&&(!e.pat||"••••••••"===e.pat)&&delete e.pat,n.label=2;case 2:if(n.trys.push([2,8,,9]),!C)return[3,4];return[4,u.request({url:"gitRepositories:update",method:"post",params:{filterByTk:C.id},data:e})];case 3:return n.sent(),a.message.success(c("Repository updated")),[3,6];case 4:return[4,u.request({url:"gitRepositories:create",method:"post",data:e})];case 5:n.sent(),a.message.success(c("Repository added")),n.label=6;case 6:return S(!1),I(null),x.resetFields(),[4,m()];case 7:return n.sent(),[3,9];case 8:return t=n.sent(),a.message.error((null==t?void 0:t.message)||c("Failed to save")),[3,9];case 9:return[2]}})}),function(){return e.apply(this,arguments)}),M=(t=b(function(e){return w(this,function(t){switch(t.label){case 0:return[4,u.request({url:"gitRepositories:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),(null==p?void 0:p.id)===e&&y(null),a.message.success(c("Deleted")),[4,m()];case 2:return t.sent(),[2]}})}),function(e){return t.apply(this,arguments)}),D=(n=b(function(e){var t,n,r,l,o;return w(this,function(i){switch(i.label){case 0:T("clone-".concat(e.id)),i.label=1;case 1:return i.trys.push([1,4,5,6]),[4,u.request({url:"gitManager:clone",method:"post",params:{repositoryId:e.id}})];case 2:return i.sent(),a.message.success(c("Clone successful")),[4,m()];case 3:return i.sent(),[3,6];case 4:return t=i.sent(),a.message.error((null==t||null==(o=t.response)||null==(l=o.data)||null==(r=l.errors)||null==(n=r[0])?void 0:n.message)||c("Clone failed")),[3,6];case 5:return T(null),[7];case 6:return[2]}})}),function(e){return n.apply(this,arguments)}),q=[{title:c("Repository Name"),dataIndex:"name",key:"name",render:function(e,t){return l().createElement("a",{onClick:function(){return y(t)}},e)}},{title:c("Repository URL"),dataIndex:"repoUrl",key:"repoUrl",ellipsis:!0},{title:c("Local Path"),dataIndex:"localPath",key:"localPath",ellipsis:!0},{title:c("Default Branch"),dataIndex:"defaultBranch",key:"defaultBranch",width:120},{title:l().createElement(a.Tooltip,{title:c("Auto-poll new merge requests every 5 minutes")},l().createElement(a.Space,{size:4},l().createElement(o.RobotOutlined,null),c("Auto Review"))),dataIndex:"autoReview",key:"autoReview",width:110,render:function(e,t){var n;return l().createElement(a.Switch,{size:"small",checked:!!e,onChange:(n=b(function(e){var n,r,l,o;return w(this,function(i){switch(i.label){case 0:return i.trys.push([0,3,,4]),r=B(t.id),[4,u.request({url:"gitRepositories:update",method:"post",params:{filterByTk:t.id},data:{autoReview:e,autoReviewFlowId:e&&!t.autoReviewFlowId?null!=(l=null==(n=r[0])?void 0:n.value)?l:null:t.autoReviewFlowId}})];case 1:return i.sent(),[4,m()];case 2:return i.sent(),[3,4];case 3:return o=i.sent(),a.message.error((null==o?void 0:o.message)||c("Failed to save")),[3,4];case 4:return[2]}})}),function(e){return n.apply(this,arguments)})})}},{title:c("Primary Auto Flow"),dataIndex:"autoReviewFlowId",key:"autoReviewFlowId",width:220,render:function(e,t){var n,r=B(t.id);return l().createElement(a.Select,{allowClear:!0,size:"small",style:{width:"100%"},disabled:!t.autoReview,placeholder:c("Select a flow"),value:e||void 0,options:r,notFoundContent:c("No matching flow available"),onChange:(n=b(function(e){var n;return w(this,function(r){switch(r.label){case 0:return r.trys.push([0,3,,4]),[4,u.request({url:"gitRepositories:update",method:"post",params:{filterByTk:t.id},data:{autoReviewFlowId:e||null}})];case 1:return r.sent(),[4,m()];case 2:return r.sent(),[3,4];case 3:return n=r.sent(),a.message.error((null==n?void 0:n.message)||c("Failed to save")),[3,4];case 4:return[2]}})}),function(e){return n.apply(this,arguments)})})}},{title:c("Status"),dataIndex:"status",key:"status",width:120,render:function(e){var t={connected:{color:"green",label:c("Connected")},error:{color:"red",label:c("Error")}}[e]||{color:"default",label:c("Disconnected")};return l().createElement(a.Tag,{color:t.color},t.label)}},{title:"",key:"actions",width:200,render:function(e,t){return l().createElement(a.Space,{size:"small"},"connected"!==t.status&&l().createElement(a.Button,{size:"small",icon:l().createElement(o.LinkOutlined,null),loading:A==="clone-".concat(t.id),onClick:function(){return D(t)}},c("Clone")),l().createElement(a.Button,{size:"small",onClick:function(){var e,n;I(t),x.setFieldsValue((e=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},t),n=n={pat:""},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}),e)),S(!0)}},c("Edit")),l().createElement(a.Popconfirm,{title:c("Delete this repository?"),onConfirm:function(){return M(t.id)}},l().createElement(a.Button,{size:"small",danger:!0,icon:l().createElement(o.DeleteOutlined,null)})))}}];return l().createElement("div",null,l().createElement("div",{style:{marginBottom:16}},l().createElement(a.Button,{type:"primary",icon:l().createElement(o.PlusOutlined,null),onClick:function(){I(null),x.resetFields(),S(!0)}},c("Add Repository"))),l().createElement(a.Table,{dataSource:d,columns:q,rowKey:"id",size:"small",pagination:!1,rowClassName:function(e){return(null==p?void 0:p.id)===e.id?"ant-table-row-selected":""}}),l().createElement(a.Modal,{title:C?c("Edit Repository"):c("Add Repository"),open:v,onOk:j,onCancel:function(){S(!1),I(null)},width:520},l().createElement(a.Form,{form:x,layout:"vertical",initialValues:{defaultBranch:"main"}},l().createElement(a.Form.Item,{name:"name",label:c("Repository Name"),rules:[{required:!0}]},l().createElement(a.Input,{placeholder:"my-project"})),l().createElement(a.Form.Item,{name:"repoUrl",label:c("Repository URL"),rules:[{required:!0}]},l().createElement(a.Input,{placeholder:"https://gitlab.com/user/repo.git"})),l().createElement(a.Form.Item,{name:"username",label:c("Username"),rules:[{required:!0}],extra:c("GitLab username for PAT authentication")},l().createElement(a.Input,{placeholder:"gitlab-username"})),l().createElement(a.Form.Item,{name:"localPath",label:c("Local Path"),rules:[{required:!0}]},l().createElement(a.Input,{placeholder:"my-project"})),l().createElement(a.Form.Item,{name:"pat",label:c("Personal Access Token"),rules:C?[]:[{required:!0}]},l().createElement(a.Input.Password,{placeholder:C?"Leave empty to keep current":"ghp_xxxx..."})),l().createElement(a.Form.Item,{name:"defaultBranch",label:c("Default Branch")},l().createElement(a.Input,{placeholder:"main"})),l().createElement(a.Form.Item,{name:"autoReviewFlowId",label:c("Primary Auto Review Flow"),extra:c("Only flows with automatic trigger modes are shown")},l().createElement(a.Select,{allowClear:!0,placeholder:c("Select a flow"),options:B(null==C?void 0:C.id),notFoundContent:c("No matching flow available")})))))};function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function C(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function I(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){C(a,r,l,o,i,"next",e)}function i(e){C(a,r,l,o,i,"throw",e)}o(void 0)})}}function x(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}function O(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function A(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return k(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function T(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var R=a.Typography.Text,P=a.Input.Search,z=a.theme.useToken,F={ts:l().createElement(o.CodeOutlined,{style:{color:"#3178c6"}}),tsx:l().createElement(o.CodeOutlined,{style:{color:"#3178c6"}}),js:l().createElement(o.CodeOutlined,{style:{color:"#f7df1e"}}),jsx:l().createElement(o.CodeOutlined,{style:{color:"#f7df1e"}}),json:l().createElement(o.CodeOutlined,{style:{color:"#5b5b5b"}}),md:l().createElement(o.FileMarkdownOutlined,{style:{color:"#083fa1"}}),html:l().createElement(o.Html5Outlined,{style:{color:"#e34c26"}}),css:l().createElement(o.FileTextOutlined,{style:{color:"#563d7c"}}),py:l().createElement(o.CodeOutlined,{style:{color:"#3572A5"}}),png:l().createElement(o.FileImageOutlined,{style:{color:"#a85e32"}}),jpg:l().createElement(o.FileImageOutlined,{style:{color:"#a85e32"}}),svg:l().createElement(o.FileImageOutlined,{style:{color:"#ffb13b"}})},B=function(){var e,t,n,c=h(),u=z().token,s=(0,i.useAPIClient)(),d=f(),m=d.selectedRepo,p=d.branches,y=d.currentBranch,g=d.refreshBranches,v=A((0,r.useState)([]),2),b=v[0],E=v[1],w=A((0,r.useState)(!1),2),S=w[0],k=w[1],C=A((0,r.useState)(null),2),B=C[0],j=C[1],M=A((0,r.useState)(null),2),D=M[0],q=M[1],L=A((0,r.useState)("HEAD"),2),U=L[0],N=L[1],H=A((0,r.useState)(""),2),W=H[0],_=H[1],G=A((0,r.useState)(""),2),$=G[0],K=G[1],V=A((0,r.useState)(!1),2),J=V[0],Q=V[1],X=(0,r.useCallback)(I(function(){var e,t,n,r,a=arguments;return T(this,function(i){switch(i.label){case 0:if(e=a.length>0&&void 0!==a[0]?a[0]:"",t=a.length>1&&void 0!==a[1]?a[1]:U,!m)return[2,[]];i.label=1;case 1:return i.trys.push([1,3,,4]),[4,s.request({url:"gitManager:fileTree",params:{repositoryId:m.id,ref:t,treePath:e}})];case 2:return[2,(Array.isArray(r=(null==(n=i.sent().data)?void 0:n.data)||n||[])?r:Array.isArray(null==r?void 0:r.data)?r.data:[]).map(function(e){return{key:e.path,title:l().createElement(R,{style:{fontSize:13}},e.name,"blob"===e.type&&e.size>0&&l().createElement(R,{type:"secondary",style:{fontSize:11,marginLeft:8}},e.size>1024?"".concat((e.size/1024).toFixed(1),"KB"):"".concat(e.size,"B"))),icon:function(e,t){if("tree"!==t){var n;return F[(null==(n=e.split(".").pop())?void 0:n.toLowerCase())||""]||l().createElement(o.FileOutlined,null)}}(e.name,e.type),isLeaf:"blob"===e.type,filePath:e.path,fileType:e.type}})];case 3:return console.warn("Failed to load file tree:",i.sent()),[2,[]];case 4:return[2]}})}),[s,m,U]),Y=(0,r.useCallback)(I(function(){return T(this,function(e){switch(e.label){case 0:k(!0),e.label=1;case 1:return e.trys.push([1,,3,4]),[4,X("",U)];case 2:return E(e.sent()),[3,4];case 3:return k(!1),[7];case 4:return[2]}})}),[X,U]);(0,r.useEffect)(function(){(null==m?void 0:m.status)==="connected"?(g(),j(null),q(null)):E([])},[m]),(0,r.useEffect)(function(){y&&"HEAD"===U&&N(y)},[y]),(0,r.useEffect)(function(){(null==m?void 0:m.status)==="connected"&&Y()},[U,m]);var Z=(e=I(function(e){var t;return T(this,function(n){switch(n.label){case 0:if(e.children)return[2];return[4,X(e.filePath,U)];case 1:return t=n.sent(),E(function(n){return function e(t,n,r){return t.map(function(t){return t.key===n?O(x({},t),{children:r}):t.children?O(x({},t),{children:e(t.children,n,r)}):t})}(n,e.key,t)}),[2]}})}),function(t){return e.apply(this,arguments)}),ee=(t=I(function(e,t){var n,r,l,a;return T(this,function(e){switch(e.label){case 0:if(!(n=t.node).isLeaf)return[2];Q(!0),q(n.filePath),e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,s.request({url:"gitManager:fileContent",params:{repositoryId:m.id,ref:U,filePath:n.filePath}})];case 2:return j((null==(a=(null==(l=e.sent().data)||null==(r=l.data)?void 0:r.data)||(null==l?void 0:l.data))?void 0:a.content)||""),[3,5];case 3:return e.sent(),j("// Failed to load file content"),[3,5];case 4:return Q(!1),[7];case 5:return[2]}})}),function(e,n){return t.apply(this,arguments)}),et=(0,r.useRef)();if((0,r.useEffect)(function(){return et.current=setTimeout(function(){return K(W)},300),function(){return clearTimeout(et.current)}},[W]),!m)return l().createElement(a.Empty,{description:c("No repository selected")});if("connected"!==m.status)return l().createElement(a.Empty,{description:c("Repository not cloned yet")});var en=$?function e(t,n){return t.map(function(t){if(t.children){var r=e(t.children,n);if(r.length>0)return O(x({},t),{children:r})}return(t.filePath||"").toLowerCase().includes(n)?t:null}).filter(Boolean)}(b,$.toLowerCase()):b;return l().createElement("div",{style:{display:"flex",height:"calc(100vh - 280px)",gap:0}},l().createElement("div",{style:{width:320,minWidth:280,borderRight:"1px solid ".concat(u.colorBorderSecondary),display:"flex",flexDirection:"column",background:u.colorBgContainer}},l().createElement("div",{style:{padding:"8px 12px",borderBottom:"1px solid ".concat(u.colorBorderSecondary)}},l().createElement(a.Space,{direction:"vertical",style:{width:"100%"},size:6},l().createElement(a.Select,{size:"small",style:{width:"100%"},value:U,onChange:function(e){N(e),j(null),q(null)},options:p.map(function(e){return{label:e,value:e}}),placeholder:"Branch"}),l().createElement(P,{size:"small",placeholder:"Filter files...",allowClear:!0,onChange:function(e){return _(e.target.value)}}))),l().createElement("div",{style:{flex:1,overflow:"auto",padding:"4px 0"}},S?l().createElement("div",{style:{textAlign:"center",padding:40}},l().createElement(a.Spin,null)):l().createElement(a.Tree,{showIcon:!0,treeData:en,loadData:Z,onSelect:ee,selectedKeys:D?[D]:[],style:{fontSize:13},blockNode:!0}))),l().createElement("div",{style:{flex:1,display:"flex",flexDirection:"column",background:u.colorBgLayout}},D?l().createElement(l().Fragment,null,l().createElement("div",{style:{padding:"6px 16px",borderBottom:"1px solid ".concat(u.colorBorderSecondary),background:u.colorBgContainer,display:"flex",alignItems:"center",gap:8}},l().createElement(a.Breadcrumb,{items:D.split("/").map(function(e,t,n){return{title:t===n.length-1?l().createElement(R,{strong:!0},e):e}})}),l().createElement(R,{type:"secondary",style:{marginLeft:"auto",fontSize:12}},{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",json:"json",md:"markdown",html:"html",css:"css",scss:"scss",py:"python",sh:"bash",yml:"yaml",yaml:"yaml",sql:"sql",xml:"xml",java:"java",go:"go",rs:"rust",rb:"ruby"}[(null==(n=D.split(".").pop())?void 0:n.toLowerCase())||""]||"text")),l().createElement("div",{style:{flex:1,overflow:"auto"}},J?l().createElement("div",{style:{textAlign:"center",padding:40}},l().createElement(a.Spin,null)):l().createElement("pre",{style:{margin:0,padding:16,fontSize:13,lineHeight:1.6,fontFamily:"'JetBrains Mono', 'Fira Code', 'Cascadia Code', Consolas, monospace",whiteSpace:"pre-wrap",wordBreak:"break-all",background:u.colorBgContainer,minHeight:"100%"}},(B||"").split("\n").map(function(e,t){return l().createElement("div",{key:t,style:{display:"flex"}},l().createElement("span",{style:{display:"inline-block",width:50,textAlign:"right",paddingRight:16,color:u.colorTextQuaternary,userSelect:"none",flexShrink:0}},t+1),l().createElement("span",{style:{flex:1}},e||" "))})))):l().createElement("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%"}},l().createElement(R,{type:"secondary"},"Select a file to view its content"))))},j=n(645);function M(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function D(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function q(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){D(a,r,l,o,i,"next",e)}function i(e){D(a,r,l,o,i,"throw",e)}o(void 0)})}}function L(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||U(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function U(e,t){if(e){if("string"==typeof e)return M(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return M(e,t)}}function N(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var H=function(e){var t,n,c,u,s=e.target,d=e.size,m=e.type,p=e.onTriggered,f=h(),y=(0,i.useAPIClient)(),g=(null==(c=j.useAIConfigRepository)?void 0:c.call(j))||{},v=((null==(u=j.useChatBoxActions)?void 0:u.call(j))||{}).triggerTask,b=L((0,r.useState)(!1),2),E=b[0],w=b[1],S=L((0,r.useState)([]),2),k=S[0],C=S[1],I=L((0,r.useState)(!1),2),x=I[0],O=I[1],A=L((0,r.useState)(!1),2),T=A[0],R=A[1],P=L((0,r.useState)(null),2),z=P[0],F=P[1],B=L(a.Form.useForm(),1)[0],D=(0,r.useCallback)(function(){var e=!1,t={repositoryId:s.repositoryId,targetType:s.type};return"mr"===s.type&&(t.mrIid=s.mrIid),"commit"===s.type&&(t.commitSha=s.commitSha),"branch"===s.type&&(t.branch=s.branch),y.request({url:"gitCodeReviews:list",params:{pageSize:1,sort:["-id"],filter:t}}).then(function(t){if(!e){var n;F(((null==t||null==(n=t.data)?void 0:n.data)||[])[0]||null)}}).catch(function(){}),function(){e=!0}},[y,s]);(0,r.useEffect)(function(){return D()},[D]);var H=(0,r.useCallback)(q(function(){var e,t;return N(this,function(n){switch(n.label){case 0:return[4,y.request({url:"gitReviewFlows:list",params:{pageSize:100,filter:{enabled:!0,$or:[{repositoryId:s.repositoryId},{repositoryId:null}]}}})];case 1:return C(t=(null==(e=n.sent().data)?void 0:e.data)||[]),[2,t]}})}),[y,s.repositoryId]),W=(0,r.useCallback)(function(e){var t,n=e.find(function(e){return e.repositoryId===s.repositoryId});return null!=(t=null!=n?n:e[0])?t:null},[s.repositoryId]);(0,r.useEffect)(function(){if(E){var e=!1;return H().then(function(t){if(!e){var n=W(t);(null==n?void 0:n.id)&&B.setFieldValue("flowId",n.id)}}).catch(function(){}),function(){e=!0}}},[E,H,W,B]);var _=(t=q(function(){var e,t,n,r,l,o,i,c,u,d,m;return N(this,function(h){switch(h.label){case 0:return h.trys.push([0,3,4,5]),[4,B.validateFields()];case 1:return n=h.sent(),O(!0),r={repositoryId:s.repositoryId,targetType:s.type,flowId:n.flowId,extraInstructions:n.extraInstructions||void 0},"mr"===s.type&&(r.mrIid=s.mrIid),"commit"===s.type&&(r.commitSha=s.commitSha),"branch"===s.type&&(r.branch=s.branch),[4,y.request({url:"gitManager:triggerReview",method:"post",data:r})];case 2:return o=null==(l=h.sent())||null==(t=l.data)||null==(e=t.data)?void 0:e.reviewId,a.message.success(f("Review started")),w(!1),B.resetFields(),D(),null==p||p(o),[3,5];case 3:if(null==(i=h.sent())?void 0:i.errorFields)return[2];return a.message.error((null==i||null==(m=i.response)||null==(d=m.data)||null==(u=d.errors)||null==(c=u[0])?void 0:c.message)||(null==i?void 0:i.message)||f("Failed to trigger review")),[3,5];case 4:return O(!1),[7];case 5:return[2]}})}),function(){return t.apply(this,arguments)}),G=function(){var e=s.title||K();return"mr"===s.type?{type:"git-merge-request",uid:"".concat(s.repositoryId,":").concat(s.mrIid),title:e,content:{repositoryId:s.repositoryId,mrIid:s.mrIid,title:e}}:"commit"===s.type?{type:"git-commit",uid:"".concat(s.repositoryId,":").concat(s.commitSha),title:e,content:{repositoryId:s.repositoryId,commitSha:s.commitSha,title:e}}:{type:"git-repository",uid:String(s.repositoryId),title:e,content:{repositoryId:s.repositoryId,branch:s.branch,title:e}}},$=(n=q(function(){var e,t,n,r,l,o;return N(this,function(i){switch(i.label){case 0:if(!v||!(null==g?void 0:g.getAIEmployees))return a.message.warning(f("AI plugin is not available")),[2];R(!0),i.label=1;case 1:if(i.trys.push([1,9,10,11]),!k.length)return[3,2];return t=k,[3,4];case 2:return[4,H()];case 3:t=i.sent(),i.label=4;case 4:if(!(null==(n=W(t))?void 0:n.aiEmployeeUsername))return a.message.warning(f("No matching flow available")),[2];if(!(null==(e=g.aiEmployees)?void 0:e.length))return[3,5];return r=g.aiEmployees,[3,7];case 5:return[4,g.getAIEmployees()];case 6:r=i.sent(),i.label=7;case 7:if(!(l=r.find(function(e){return e.username===n.aiEmployeeUsername})))return a.message.warning(f("AI employee not found")),[2];return[4,v({aiEmployee:l,tasks:[{title:"".concat(n.name,": ").concat(K()),message:{user:"mr"===s.type?"Please review merge request !".concat(s.mrIid," (").concat(s.title||"untitled","). Use the attached Git merge request context and the available git tools when you need more detail."):"commit"===s.type?"Please review commit ".concat(s.commitSha," (").concat(s.title||"untitled","). Use the attached Git commit context and the available git tools when you need more detail."):"Please help me inspect branch ".concat(s.branch,". Use the attached Git repository context and the available git tools when you need more detail."),system:n.instructions||void 0,workContext:[G()]},model:n.llmService&&n.model?{llmService:n.llmService,model:n.model}:null,autoSend:!1}]})];case 8:return i.sent(),[3,11];case 9:return o=i.sent(),a.message.error((null==o?void 0:o.message)||f("Failed to open AI chat")),[3,11];case 10:return R(!1),[7];case 11:return[2]}})}),function(){return n.apply(this,arguments)}),K=function(){return"mr"===s.type?"MR !".concat(s.mrIid):"commit"===s.type?"Commit ".concat(String(s.commitSha).slice(0,7)):"Branch ".concat(s.branch)},V=z&&z.headSha&&z.latestSha&&z.headSha!==z.latestSha,J=!!z&&"pending"!==z.status,Q=J?V?f("Re-review (new commits)"):f("Re-run review"):f("Code Review"),X=J?o.ReloadOutlined:o.RobotOutlined,Y=(0,r.useMemo)(function(){var e;return[{key:"run",icon:l().createElement(o.ThunderboltOutlined,null),label:J?f("Re-run automated review"):f("Run automated review"),onClick:function(){return w(!0)}}].concat(function(e){if(Array.isArray(e))return M(e)}(e=z?[{key:"view",icon:l().createElement(o.RobotOutlined,null),label:f("Status: ".concat(z.status))+" - "+f("View in Review History tab"),onClick:function(){a.message.info(f('Please switch to the "Review History" tab to see the details.'))}}]:[])||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||U(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),[{key:"chat",icon:l().createElement(o.MessageOutlined,null),label:f("Ask AI Employee"),onClick:$,disabled:T}])},[J,z,T,$]);return l().createElement(l().Fragment,null,l().createElement(a.Dropdown,{menu:{items:Y},placement:"bottomRight",trigger:["click"]},l().createElement(a.Button,{size:void 0===d?"small":d,type:V?"primary":void 0===m?"default":m,icon:l().createElement(X,null),danger:!!V,loading:T},Q)),l().createElement(a.Modal,{title:l().createElement(a.Space,null,l().createElement(o.RobotOutlined,null),l().createElement("span",null,J?f("Re-run code review"):f("Run code review")),l().createElement("span",{style:{color:"#999",fontSize:12,fontWeight:400}},K())),open:E,onCancel:function(){return w(!1)},onOk:_,okText:J?f("Re-run"):f("Start Review"),confirmLoading:x,destroyOnClose:!0},J&&l().createElement(a.Alert,{type:V?"warning":"info",showIcon:!0,style:{marginBottom:12},message:V?f("New commits detected since last review. Re-running will overwrite the existing review."):f("A review already exists for this target. Re-running will overwrite it."),description:l().createElement(a.Space,{size:8,wrap:!0,style:{fontSize:12}},(null==z?void 0:z.headSha)&&l().createElement("span",null,f("Reviewed at"),":\xa0",l().createElement(a.Tag,{style:{fontFamily:"monospace"}},String(z.headSha).slice(0,7))),V&&(null==z?void 0:z.latestSha)&&l().createElement("span",null,f("Latest"),":\xa0",l().createElement(a.Tag,{color:"orange",style:{fontFamily:"monospace"}},String(z.latestSha).slice(0,7))))}),l().createElement(a.Form,{form:B,layout:"vertical"},l().createElement(a.Form.Item,{name:"flowId",label:f("Review Flow"),rules:[{required:!0,message:f("Please select a review flow")}],extra:0===k.length?l().createElement(a.Tooltip,{title:f("Create a review flow in the Review Flows tab first")},l().createElement("span",{style:{color:"#faad14"}},f("No enabled flow found for this repository"))):null},l().createElement(a.Select,{options:k.map(function(e){return{value:e.id,label:"".concat(e.name).concat(e.aiEmployeeUsername?" — @".concat(e.aiEmployeeUsername):"").concat(null==e.repositoryId?" (".concat(f("global"),")"):"")}}),placeholder:f("Select a review flow")})),l().createElement(a.Form.Item,{name:"extraInstructions",label:f("Extra instructions (optional)")},l().createElement(a.Input.TextArea,{rows:4,placeholder:f("e.g. Focus on security issues in authentication")})))))};function W(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function _(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function G(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){_(a,r,l,o,i,"next",e)}function i(e){_(a,r,l,o,i,"throw",e)}o(void 0)})}}function $(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return W(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return W(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function K(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var V=a.Typography.Text,J=a.theme.useToken,Q={A:{color:"green",icon:l().createElement(o.PlusCircleOutlined,null),label:"Added"},M:{color:"blue",icon:l().createElement(o.EditOutlined,null),label:"Modified"},D:{color:"red",icon:l().createElement(o.DeleteOutlined,null),label:"Deleted"},R:{color:"orange",icon:l().createElement(o.EditOutlined,null),label:"Renamed"}},X=function(){var e,t,n,c,u=h(),s=J().token,d=(0,i.useAPIClient)(),m=f(),p=m.selectedRepo,y=m.branches,g=m.currentBranch,v=$((0,r.useState)([]),2),b=v[0],E=v[1],w=$((0,r.useState)(!1),2),S=w[0],k=w[1],C=$((0,r.useState)(null),2),I=C[0],x=C[1],O=$((0,r.useState)(null),2),A=O[0],T=O[1],R=$((0,r.useState)(!1),2),P=R[0],z=R[1],F=$((0,r.useState)(null),2),B=F[0],j=F[1],M=$((0,r.useState)(null),2),D=M[0],q=M[1],L=$((0,r.useState)(""),2),U=L[0],N=L[1],W=(0,r.useCallback)(G(function(){var e,t,n;return K(this,function(r){switch(r.label){case 0:if(!p)return[2];k(!0),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,d.request({url:"gitManager:log",params:{repositoryId:p.id,maxCount:100}})];case 2:return E((null==(n=(null==(t=r.sent().data)||null==(e=t.data)?void 0:e.data)||(null==t?void 0:t.data))?void 0:n.all)||[]),[3,5];case 3:return console.warn("Failed to load commit history:",r.sent()),E([]),[3,5];case 4:return k(!1),[7];case 5:return[2]}})}),[d,p]);(0,r.useEffect)(function(){(null==p?void 0:p.status)==="connected"?W():E([])},[p]);var _=b.filter(function(e){var t=U.trim().toLowerCase();return!t||String(e.message||e.subject||e.body||"").toLowerCase().includes(t)}),X=(e=G(function(e){var t,n;return K(this,function(r){switch(r.label){case 0:x(e),z(!0),j(null),q(null),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,d.request({url:"gitManager:commitDetail",params:{repositoryId:p.id,commitHash:e.hash}})];case 2:return T((null==(n=r.sent().data)||null==(t=n.data)?void 0:t.data)||(null==n?void 0:n.data)),[3,5];case 3:return r.sent(),T(null),[3,5];case 4:return z(!1),[7];case 5:return[2]}})}),function(t){return e.apply(this,arguments)}),ee=(t=G(function(e,t){var n,r;return K(this,function(l){switch(l.label){case 0:q(t),l.label=1;case 1:return l.trys.push([1,3,,4]),[4,d.request({url:"gitManager:diff",params:{repositoryId:p.id,commitHash:e,file:t}})];case 2:return j((null==(r=l.sent().data)||null==(n=r.data)?void 0:n.data)||(null==r?void 0:r.data)||""),[3,4];case 3:return l.sent(),j("// Failed to load diff"),[3,4];case 4:return[2]}})}),function(e,n){return t.apply(this,arguments)});if(!p)return l().createElement(a.Empty,{description:u("No repository selected")});if("connected"!==p.status)return l().createElement(a.Empty,{description:u("Repository not cloned yet")});var et=[{title:"",key:"graph",width:40,render:function(e,t,n){return l().createElement("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",height:"100%"}},l().createElement("div",{style:{width:10,height:10,borderRadius:"50%",background:0===n?s.colorPrimary:s.colorBorder,border:"2px solid ".concat(0===n?s.colorPrimary:s.colorBorder),zIndex:1}}))}},{title:u("Message"),dataIndex:"message",key:"message",render:function(e,t){return l().createElement("div",null,l().createElement(V,{strong:!0,style:{fontSize:13}},e),l().createElement("div",{style:{marginTop:2}},l().createElement(V,{type:"secondary",style:{fontSize:12}},l().createElement(o.UserOutlined,{style:{marginRight:4}}),t.author_name,l().createElement("span",{style:{margin:"0 8px"}},"\xb7"),l().createElement(o.ClockCircleOutlined,{style:{marginRight:4}}),Z(t.date))))}},{title:"Hash",dataIndex:"hash",key:"hash",width:100,render:function(e){return l().createElement(V,{code:!0,copyable:!0,style:{fontSize:12}},null==e?void 0:e.substring(0,7))}},{title:"",key:"action",width:80,render:function(e,t){return l().createElement(a.Button,{size:"small",icon:l().createElement(o.DiffOutlined,null),onClick:function(){return X(t)}},"Detail")}}];return l().createElement("div",null,l().createElement("div",{style:{marginBottom:12,display:"flex",alignItems:"center",gap:12}},l().createElement(o.BranchesOutlined,null),l().createElement(a.Select,{size:"small",style:{width:200},value:g,options:y.map(function(e){return{label:e,value:e}}),disabled:!0}),l().createElement(a.Input.Search,{allowClear:!0,size:"small",style:{width:280},placeholder:u("Search commit title or message"),value:U,onChange:function(e){return N(e.target.value)}}),l().createElement(V,{type:"secondary"},_.length," commits")),S?l().createElement(a.Spin,null):l().createElement(a.Table,{dataSource:_,columns:et,rowKey:"hash",size:"small",pagination:{pageSize:30,showSizeChanger:!0},onRow:function(e){return{style:{cursor:"pointer"},onClick:function(){return X(e)}}}}),l().createElement(a.Drawer,{title:I?l().createElement("div",null,l().createElement(V,{strong:!0},I.message),l().createElement("div",null,l().createElement(V,{type:"secondary",style:{fontSize:12}},null==(n=I.hash)?void 0:n.substring(0,7)," \xb7 ",I.author_name," \xb7 ",Z(I.date)))):"Commit Detail",open:!!I,onClose:function(){x(null),T(null),j(null),q(null)},width:800,extra:I&&p?l().createElement(H,{target:{type:"commit",repositoryId:p.id,commitSha:I.hash,title:I.message},size:"small"}):null},P?l().createElement(a.Spin,null):A?l().createElement("div",null,l().createElement(V,{strong:!0},"Changed Files (",(null==(c=A.files)?void 0:c.length)||0,")"),l().createElement(a.List,{size:"small",style:{marginTop:8},dataSource:A.files||[],renderItem:function(e){var t=Q[e.status]||Q.M,n=D===e.file;return l().createElement(a.List.Item,{style:{cursor:"pointer",background:n?s.colorPrimaryBg:void 0,padding:"6px 12px",borderRadius:4},onClick:function(){return ee(I.hash,e.file)}},l().createElement(a.Space,null,l().createElement(a.Tag,{color:t.color,style:{minWidth:70,textAlign:"center"}},t.icon," ",t.label),l().createElement(V,{style:{fontSize:13}},e.file)))}}),null!==B&&l().createElement("div",{style:{marginTop:16}},l().createElement(V,{strong:!0,style:{display:"block",marginBottom:8}},l().createElement(o.FileTextOutlined,null)," ",D),l().createElement(Y,{content:B}))):null))},Y=(0,r.memo)(function(e){var t=e.content,n=J().token,r=t.split("\n");return l().createElement("div",{style:{fontFamily:"'JetBrains Mono', 'Fira Code', Consolas, monospace",fontSize:12,lineHeight:1.5,border:"1px solid ".concat(n.colorBorderSecondary),borderRadius:6,overflow:"auto",maxHeight:500}},r.map(function(e,t){var r="transparent",a=n.colorText;return e.startsWith("+")&&!e.startsWith("+++")?(r="rgba(46, 160, 67, 0.12)",a="#2ea043"):e.startsWith("-")&&!e.startsWith("---")?(r="rgba(248, 81, 73, 0.12)",a="#f85149"):e.startsWith("@@")?(r="rgba(56, 139, 253, 0.08)",a="#388bfd"):(e.startsWith("diff")||e.startsWith("index"))&&(a=n.colorTextSecondary),l().createElement("div",{key:t,style:{padding:"0 12px",background:r,color:a,whiteSpace:"pre",minHeight:20}},l().createElement("span",{style:{display:"inline-block",width:40,color:n.colorTextQuaternary,userSelect:"none",textAlign:"right",marginRight:12}},t+1),e)}))});function Z(e){if(!e)return"";var t=new Date(e),n=new Date().getTime()-t.getTime(),r=n/36e5;return r<1?"".concat(Math.round(n/6e4),"m ago"):r<24?"".concat(Math.round(r),"h ago"):r<168?"".concat(Math.round(r/24),"d ago"):t.toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}function ee(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function et(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function en(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){et(a,r,l,o,i,"next",e)}function i(e){et(a,r,l,o,i,"throw",e)}o(void 0)})}}function er(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return ee(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ee(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function el(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var ea=a.Typography.Text;a.Typography.Paragraph,a.Typography.Title;var eo=a.theme.useToken,ei={opened:{color:"blue",icon:l().createElement(o.MergeOutlined,null),label:"Open"},merged:{color:"purple",icon:l().createElement(o.CheckCircleOutlined,null),label:"Merged"},closed:{color:"red",icon:l().createElement(o.CloseCircleOutlined,null),label:"Closed"}},ec=function(){var e,t,n,c=h(),u=eo().token,s=(0,i.useAPIClient)(),d=f().selectedRepo,m=er((0,r.useState)([]),2),p=m[0],y=m[1],g=er((0,r.useState)(!1),2),v=g[0],b=g[1],E=er((0,r.useState)("opened"),2),w=E[0],S=E[1],k=er((0,r.useState)(""),2),C=k[0],I=k[1],x=er((0,r.useState)({page:1,perPage:20,total:0,totalPages:0}),2),O=x[0],A=x[1],T=er((0,r.useState)(null),2),R=T[0],P=T[1],z=er((0,r.useState)(null),2),F=z[0],B=z[1],j=er((0,r.useState)(!1),2),M=j[0],D=j[1],q=er((0,r.useState)([]),2),L=q[0],U=q[1],N=er((0,r.useState)(!1),2);N[0],N[1];var W=(0,r.useCallback)(en(function(){var e,t,n,r=arguments;return el(this,function(l){switch(l.label){case 0:if(e=r.length>0&&void 0!==r[0]?r[0]:1,!d)return[2];b(!0),l.label=1;case 1:return l.trys.push([1,3,4,5]),[4,s.request({url:"gitManager:mergeRequests",params:{repositoryId:d.id,state:w,search:C||void 0,page:e,perPage:20}})];case 2:return y((null==(n=(null==(t=l.sent().data)?void 0:t.data)||t)?void 0:n.data)||[]),(null==n?void 0:n.pagination)&&A(n.pagination),[3,5];case 3:return l.sent(),y([]),[3,5];case 4:return b(!1),[7];case 5:return[2]}})}),[s,d,w,C]);(0,r.useEffect)(function(){(null==d?void 0:d.status)==="connected"?W(1):y([])},[d,w]);var _=(e=en(function(e){var t,n,r,l,a,o,i,c,u,m;return el(this,function(p){switch(p.label){case 0:P(e),D(!0),U([]),p.label=1;case 1:return p.trys.push([1,3,4,5]),[4,Promise.all([s.request({url:"gitManager:mergeRequestDetail",params:{repositoryId:d.id,mrIid:e.iid}}),s.request({url:"gitManager:mergeRequestNotes",params:{repositoryId:d.id,mrIid:e.iid}})])];case 2:return c=(i=er.apply(void 0,[p.sent(),2]))[0],u=i[1],B((null==c||null==(n=c.data)||null==(t=n.data)?void 0:t.data)||(null==c||null==(r=c.data)?void 0:r.data)),U(Array.isArray(m=(null==u||null==(a=u.data)||null==(l=a.data)?void 0:l.data)||(null==u||null==(o=u.data)?void 0:o.data))?m:[]),[3,5];case 3:return p.sent(),B(null),[3,5];case 4:return D(!1),[7];case 5:return[2]}})}),function(t){return e.apply(this,arguments)});if(!d)return l().createElement(a.Empty,{description:c("No repository selected")});if("connected"!==d.status)return l().createElement(a.Empty,{description:c("Repository not cloned yet")});var G=[{title:"",key:"state_icon",width:40,render:function(e,t){var n=ei[t.state]||ei.opened;return l().createElement(a.Tooltip,{title:n.label},l().createElement("span",{style:{color:u["color".concat("blue"===n.color?"Primary":"purple"===n.color?"PurpleText":"Error")]||n.color,fontSize:16}},n.icon))}},{title:c("Title"),key:"title",render:function(e,t){var n,r;return l().createElement("div",null,l().createElement("div",{style:{display:"flex",alignItems:"center",gap:6}},t.draft&&l().createElement(a.Tag,{color:"default",style:{fontSize:11,lineHeight:"16px"}},"DRAFT"),l().createElement(ea,{strong:!0,style:{fontSize:13}},t.title),t.hasConflicts&&l().createElement(a.Tooltip,{title:c("Has conflicts")},l().createElement(o.ExclamationCircleOutlined,{style:{color:u.colorWarning}}))),l().createElement("div",{style:{marginTop:2}},l().createElement(ea,{type:"secondary",style:{fontSize:12}},"!",t.iid,l().createElement("span",{style:{margin:"0 6px"}},"\xb7"),l().createElement(o.UserOutlined,{style:{marginRight:3}}),(null==(n=t.author)?void 0:n.name)||(null==(r=t.author)?void 0:r.username)||"Unknown",l().createElement("span",{style:{margin:"0 6px"}},"\xb7"),l().createElement(o.ClockCircleOutlined,{style:{marginRight:3}}),ef(t.updatedAt))))}},{title:"",key:"branches",width:250,render:function(e,t){return l().createElement("div",{style:{fontSize:12}},l().createElement(a.Tag,{color:"blue",style:{fontSize:11}},l().createElement(o.BranchesOutlined,null)," ",t.sourceBranch),l().createElement("span",{style:{margin:"0 4px",color:u.colorTextSecondary}},"→"),l().createElement(a.Tag,{color:"green",style:{fontSize:11}},l().createElement(o.BranchesOutlined,null)," ",t.targetBranch))}},{title:"",key:"labels",width:180,render:function(e,t){var n;return l().createElement(a.Space,{size:2,wrap:!0},(t.labels||[]).slice(0,3).map(function(e){return l().createElement(a.Tag,{key:e,style:{fontSize:11}},e)}),(null==(n=t.labels)?void 0:n.length)>3&&l().createElement(ea,{type:"secondary",style:{fontSize:11}},"+",t.labels.length-3))}},{title:"",key:"meta",width:120,render:function(e,t){var n;return l().createElement(a.Space,{size:12},t.userNotesCount>0&&l().createElement(a.Tooltip,{title:"".concat(t.userNotesCount," comments")},l().createElement(a.Badge,{count:t.userNotesCount,size:"small",color:u.colorTextSecondary},l().createElement(o.CommentOutlined,{style:{fontSize:14,color:u.colorTextSecondary}}))),(null==(n=t.assignees)?void 0:n.length)>0&&l().createElement(a.Avatar.Group,{size:"small",max:{count:2}},t.assignees.map(function(e){var t;return l().createElement(a.Tooltip,{key:e.username,title:e.name},l().createElement(a.Avatar,{size:"small",src:e.avatarUrl},null==(t=e.name)?void 0:t[0]))})))}},{title:"",key:"actions",width:160,render:function(e,t){return l().createElement(a.Space,{onClick:function(e){return e.stopPropagation()}},l().createElement(H,{target:{type:"mr",repositoryId:d.id,mrIid:t.iid,title:t.title},size:"small"}),l().createElement(a.Tooltip,{title:c("View Details")},l().createElement(a.Button,{size:"small",icon:l().createElement(o.FileTextOutlined,null),onClick:function(e){e.stopPropagation(),_(t)}})),l().createElement(a.Tooltip,{title:c("Open in GitLab")},l().createElement(a.Button,{size:"small",icon:l().createElement(o.ExportOutlined,null),onClick:function(e){e.stopPropagation(),window.open(t.webUrl,"_blank")}})))}}];return l().createElement("div",null,l().createElement("div",{style:{marginBottom:12,display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"}},l().createElement(a.Select,{size:"small",style:{width:140},value:w,onChange:function(e){return S(e)},options:[{label:"\uD83D\uDFE2 ".concat(c("Open")),value:"opened"},{label:"\uD83D\uDFE3 ".concat(c("Merged")),value:"merged"},{label:"\uD83D\uDD34 ".concat(c("Closed")),value:"closed"},{label:"\uD83D\uDCCB ".concat(c("All")),value:"all"}]}),l().createElement(a.Input.Search,{size:"small",style:{width:260},placeholder:c("Search merge requests..."),value:C,onChange:function(e){return I(e.target.value)},onSearch:function(){W(1)},allowClear:!0}),l().createElement(a.Button,{size:"small",icon:l().createElement(o.ReloadOutlined,null),onClick:function(){return W(1)}},c("Refresh")),l().createElement(ea,{type:"secondary",style:{fontSize:12}},null!=O.total?"".concat(O.total," ").concat(c("total")):"")),v?l().createElement(a.Spin,null):l().createElement(a.Table,{dataSource:p,columns:G,rowKey:"iid",size:"small",pagination:{current:O.page,pageSize:O.perPage,total:O.total||void 0,onChange:function(e){return W(e)},showSizeChanger:!1},onRow:function(e){return{style:{cursor:"pointer"},onClick:function(){return _(e)}}}}),l().createElement(a.Drawer,{title:R?l().createElement("div",null,l().createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},(t=ei[R.state]||ei.opened,l().createElement(a.Tag,{color:t.color},t.icon," ",t.label)),R.draft&&l().createElement(a.Tag,null,"DRAFT"),l().createElement(ea,{strong:!0,style:{fontSize:15}},"!",R.iid)),l().createElement(ea,{strong:!0,style:{fontSize:16,display:"block",marginTop:4}},R.title)):c("Merge Request"),open:!!R,onClose:function(){P(null),B(null),U([])},width:900,extra:R&&l().createElement(a.Space,null,l().createElement(H,{target:{type:"mr",repositoryId:d.id,mrIid:R.iid,title:R.title},size:"small"}),l().createElement(a.Button,{type:"link",icon:l().createElement(o.ExportOutlined,null),onClick:function(){return window.open(R.webUrl,"_blank")}},c("Open in GitLab")))},M?l().createElement(a.Spin,null):F?l().createElement(a.Tabs,{defaultActiveKey:"overview",items:[{key:"overview",label:c("Overview"),children:l().createElement(eu,{mr:F})},{key:"changes",label:"".concat(c("Changes")," (").concat((null==(n=F.changes)?void 0:n.length)||0,")"),children:l().createElement(ed,{changes:F.changes||[]})},{key:"comments",label:l().createElement(a.Badge,{count:L.length,size:"small",offset:[6,0]},c("Comments")),children:l().createElement(em,{notes:L})}]}):null))},eu=function(e){var t,n,r,i,c=e.mr,u=h(),s=eo().token;return l().createElement("div",null,l().createElement("div",{style:{padding:"12px 16px",background:s.colorBgLayout,borderRadius:8,marginBottom:16,display:"flex",alignItems:"center",gap:8}},l().createElement(a.Tag,{color:"blue"},l().createElement(o.BranchesOutlined,null)," ",c.sourceBranch),l().createElement("span",{style:{color:s.colorTextSecondary,fontSize:16}},"→"),l().createElement(a.Tag,{color:"green"},l().createElement(o.BranchesOutlined,null)," ",c.targetBranch),c.hasConflicts&&l().createElement(a.Tag,{color:"warning",icon:l().createElement(o.ExclamationCircleOutlined,null)},u("Has conflicts"))),c.description&&l().createElement("div",{style:{marginBottom:16}},l().createElement(ea,{strong:!0},u("Description")),l().createElement("div",{style:{marginTop:8,padding:"12px 16px",background:s.colorBgLayout,borderRadius:8,whiteSpace:"pre-wrap",wordBreak:"break-word",fontSize:13,lineHeight:1.6}},c.description)),l().createElement("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"12px 24px",fontSize:13}},l().createElement(es,{label:u("Author"),value:c.author&&l().createElement(a.Space,{size:6},l().createElement(a.Avatar,{size:"small",src:c.author.avatarUrl},null==(t=c.author.name)?void 0:t[0]),l().createElement(ea,null,c.author.name),l().createElement(ea,{type:"secondary"},"@",c.author.username))}),l().createElement(es,{label:u("Assignees"),value:(null==(n=c.assignees)?void 0:n.length)>0?l().createElement(a.Space,{size:4,wrap:!0},c.assignees.map(function(e){var t;return l().createElement(a.Tooltip,{key:e.username,title:e.name},l().createElement(a.Tag,{icon:l().createElement(a.Avatar,{size:14,src:e.avatarUrl},null==(t=e.name)?void 0:t[0])},e.name))})):l().createElement(ea,{type:"secondary"},"—")}),l().createElement(es,{label:u("Reviewers"),value:(null==(r=c.reviewers)?void 0:r.length)>0?l().createElement(a.Space,{size:4,wrap:!0},c.reviewers.map(function(e){return l().createElement(a.Tag,{key:e.username},e.name)})):l().createElement(ea,{type:"secondary"},"—")}),l().createElement(es,{label:u("Labels"),value:(null==(i=c.labels)?void 0:i.length)>0?l().createElement(a.Space,{size:4,wrap:!0},c.labels.map(function(e){return l().createElement(a.Tag,{key:e},e)})):l().createElement(ea,{type:"secondary"},"—")}),l().createElement(es,{label:u("Created"),value:l().createElement(ea,null,ey(c.createdAt))}),l().createElement(es,{label:u("Updated"),value:l().createElement(ea,null,ey(c.updatedAt))}),c.mergedBy&&l().createElement(es,{label:u("Merged by"),value:l().createElement(ea,null,c.mergedBy.name," — ",ey(c.mergedAt))}),c.closedBy&&l().createElement(es,{label:u("Closed by"),value:l().createElement(ea,null,c.closedBy.name," — ",ey(c.closedAt))})))},es=function(e){var t=e.label,n=e.value;return l().createElement("div",null,l().createElement(ea,{type:"secondary",style:{fontSize:12,display:"block",marginBottom:2}},t),l().createElement("div",null,n))},ed=function(e){var t=e.changes,n=eo().token,o=h(),i=er((0,r.useState)(null),2),c=i[0],u=i[1];return t.length?l().createElement("div",null,t.map(function(e,t){var r=e.newPath||e.oldPath,o=c===r,i=null;return i=e.newFile?l().createElement(a.Tag,{color:"green"},"NEW"):e.deletedFile?l().createElement(a.Tag,{color:"red"},"DEL"):e.renamedFile?l().createElement(a.Tag,{color:"orange"},"RENAMED"):l().createElement(a.Tag,{color:"blue"},"MOD"),l().createElement("div",{key:t,style:{marginBottom:8}},l().createElement("div",{style:{padding:"6px 12px",background:o?n.colorPrimaryBg:n.colorBgLayout,borderRadius:6,cursor:"pointer",display:"flex",alignItems:"center",gap:8},onClick:function(){return u(o?null:r)}},i,l().createElement(ea,{style:{fontSize:13,fontFamily:"monospace"}},r),e.renamedFile&&e.oldPath!==e.newPath&&l().createElement(ea,{type:"secondary",style:{fontSize:11}},"(← ",e.oldPath,")")),o&&e.diff&&l().createElement(ep,{content:e.diff}))})):l().createElement(a.Empty,{description:o("No changes")})},em=function(e){var t=e.notes,n=eo().token,r=h();return t.length?l().createElement("div",null,t.map(function(e){var t,o,i,c,u;return l().createElement("div",{key:e.id,style:{padding:"12px 16px",marginBottom:12,background:n.colorBgLayout,borderRadius:8,borderLeft:"3px solid ".concat(e.resolved?n.colorSuccess:n.colorBorderSecondary)}},l().createElement("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8}},l().createElement(a.Avatar,{size:"small",src:null==(t=e.author)?void 0:t.avatarUrl},null==(i=e.author)||null==(o=i.name)?void 0:o[0]),l().createElement(ea,{strong:!0,style:{fontSize:13}},null==(c=e.author)?void 0:c.name),l().createElement(ea,{type:"secondary",style:{fontSize:12}},"@",null==(u=e.author)?void 0:u.username),l().createElement(ea,{type:"secondary",style:{fontSize:11,marginLeft:"auto"}},ef(e.createdAt)),e.resolvable&&l().createElement(a.Tag,{color:e.resolved?"success":"default",style:{fontSize:11}},e.resolved?r("Resolved"):r("Unresolved"))),l().createElement("div",{style:{whiteSpace:"pre-wrap",wordBreak:"break-word",fontSize:13,lineHeight:1.6}},e.body))})):l().createElement(a.Empty,{description:r("No comments")})},ep=(0,r.memo)(function(e){var t=e.content,n=eo().token,r=t.split("\n");return l().createElement("div",{style:{fontFamily:"'JetBrains Mono', 'Fira Code', Consolas, monospace",fontSize:12,lineHeight:1.5,border:"1px solid ".concat(n.colorBorderSecondary),borderRadius:6,overflow:"auto",maxHeight:400,margin:"4px 0"}},r.map(function(e,t){var r="transparent",a=n.colorText;return e.startsWith("+")&&!e.startsWith("+++")?(r="rgba(46, 160, 67, 0.12)",a="#2ea043"):e.startsWith("-")&&!e.startsWith("---")?(r="rgba(248, 81, 73, 0.12)",a="#f85149"):e.startsWith("@@")?(r="rgba(56, 139, 253, 0.08)",a="#388bfd"):(e.startsWith("diff")||e.startsWith("index"))&&(a=n.colorTextSecondary),l().createElement("div",{key:t,style:{padding:"0 12px",background:r,color:a,whiteSpace:"pre",minHeight:20}},l().createElement("span",{style:{display:"inline-block",width:40,color:n.colorTextQuaternary,userSelect:"none",textAlign:"right",marginRight:12}},t+1),e)}))});function ef(e){if(!e)return"";var t=new Date(e),n=new Date().getTime()-t.getTime(),r=n/36e5;return r<1?"".concat(Math.round(n/6e4),"m ago"):r<24?"".concat(Math.round(r),"h ago"):r<168?"".concat(Math.round(r/24),"d ago"):t.toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}function ey(e){return e?new Date(e).toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function eh(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eg(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function ev(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){eg(a,r,l,o,i,"next",e)}function i(e){eg(a,r,l,o,i,"throw",e)}o(void 0)})}}function eb(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||ew(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function eE(e){return function(e){if(Array.isArray(e))return eh(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||ew(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ew(e,t){if(e){if("string"==typeof e)return eh(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eh(e,t)}}function eS(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var ek=a.Typography.Text,eC=a.theme.useToken,eI={not_added:{color:"green",icon:l().createElement(o.FileAddOutlined,null),label:"New"},modified:{color:"blue",icon:l().createElement(o.EditOutlined,null),label:"Modified"},deleted:{color:"red",icon:l().createElement(o.DeleteOutlined,null),label:"Deleted"},renamed:{color:"orange",icon:l().createElement(o.EditOutlined,null),label:"Renamed"},conflicted:{color:"red",icon:l().createElement(o.WarningOutlined,null),label:"Conflict"},created:{color:"green",icon:l().createElement(o.FileAddOutlined,null),label:"Created"}},ex=function(){var e,t,n,c,u,s,d,m=h(),p=eC().token,y=(0,i.useAPIClient)(),g=f(),v=g.selectedRepo,b=g.refreshRepos,E=eb((0,r.useState)(null),2),w=E[0],S=E[1],k=eb((0,r.useState)(null),2),C=k[0],I=k[1],x=eb((0,r.useState)(null),2),O=x[0],A=x[1],T=(0,r.useCallback)(ev(function(){var e,t;return eS(this,function(n){switch(n.label){case 0:if(!v||"connected"!==v.status)return I(null),[2];S("status"),n.label=1;case 1:return n.trys.push([1,3,4,5]),[4,y.request({url:"gitManager:status",method:"post",params:{repositoryId:v.id}})];case 2:return I((null==(t=n.sent().data)||null==(e=t.data)?void 0:e.data)||(null==t?void 0:t.data)),[3,5];case 3:return console.warn("Failed to load git status:",n.sent()),I(null),[3,5];case 4:return S(null),[7];case 5:return[2]}})}),[y,v]);(0,r.useEffect)(function(){T()},[T]);var R=(0,r.useCallback)((e=ev(function(e){var t,n,r,l,o,i,c,u,s;return eS(this,function(d){switch(d.label){case 0:if(!v)return[2];S(e),A(null),d.label=1;case 1:return d.trys.push([1,6,7,8]),[4,y.request({url:"gitManager:".concat(e),method:"post",params:{repositoryId:v.id}})];case 2:if(n=d.sent().data,A({action:e,success:!0,message:m("{{action}} completed successfully",{action:e})}),a.message.success(m("{{action}} completed",{action:e})),r=(null==n||null==(t=n.data)?void 0:t.data)||(null==n?void 0:n.data),"status"===e&&I(r),"fetch"!==e&&"pull"!==e)return[3,4];return[4,T()];case 3:d.sent(),d.label=4;case 4:return[4,b()];case 5:return d.sent(),[3,8];case 6:return s=(null==(l=d.sent())||null==(u=l.response)||null==(c=u.data)||null==(i=c.errors)||null==(o=i[0])?void 0:o.message)||m("{{action}} failed",{action:e}),A({action:e,success:!1,message:s}),a.message.error(s),[3,8];case 7:return S(null),[7];case 8:return[2]}})}),function(t){return e.apply(this,arguments)}),[y,v,b,T]);if(!v)return l().createElement(a.Empty,{description:m("No repository selected")});if("connected"!==v.status)return l().createElement(a.Empty,{description:m("Repository not cloned yet")});var P=C?eE((null==(t=C.not_added)?void 0:t.map(function(e){return{file:e,status:"not_added"}}))||[]).concat(eE((null==(n=C.modified)?void 0:n.map(function(e){return{file:e,status:"modified"}}))||[]),eE((null==(c=C.deleted)?void 0:c.map(function(e){return{file:e,status:"deleted"}}))||[]),eE((null==(u=C.renamed)?void 0:u.map(function(e){return{file:"string"==typeof e?e:e.to,status:"renamed"}}))||[]),eE((null==(s=C.conflicted)?void 0:s.map(function(e){return{file:e,status:"conflicted"}}))||[]),eE((null==(d=C.created)?void 0:d.map(function(e){return{file:e,status:"created"}}))||[])):[];return l().createElement("div",null,l().createElement(a.Space,{size:"middle",wrap:!0,style:{marginBottom:24}},l().createElement(a.Button,{size:"large",icon:l().createElement(o.SyncOutlined,null),loading:"fetch"===w,onClick:function(){return R("fetch")}},m("Fetch")),l().createElement(a.Button,{size:"large",type:"primary",icon:l().createElement(o.CloudDownloadOutlined,null),loading:"pull"===w,onClick:function(){return R("pull")}},m("Pull")),l().createElement(a.Button,{size:"large",icon:l().createElement(o.BranchesOutlined,null),loading:"status"===w,onClick:T},m("Status"))),O&&l().createElement(a.Card,{size:"small",style:{marginBottom:16,borderColor:O.success?p.colorSuccessBorder:p.colorErrorBorder}},l().createElement(a.Space,null,O.success?l().createElement(o.CheckCircleOutlined,{style:{color:p.colorSuccess}}):l().createElement(o.WarningOutlined,{style:{color:p.colorError}}),l().createElement(ek,{strong:!0},O.action),l().createElement(ek,null,O.message))),C&&l().createElement(a.Card,{title:m("Working Directory Status"),size:"small"},l().createElement(a.Descriptions,{column:3,size:"small",style:{marginBottom:16}},l().createElement(a.Descriptions.Item,{label:"Branch"},l().createElement(a.Tag,{icon:l().createElement(o.BranchesOutlined,null),color:"blue"},C.current)),l().createElement(a.Descriptions.Item,{label:"Tracking"},l().createElement(ek,null,C.tracking||"N/A")),l().createElement(a.Descriptions.Item,{label:"Changes"},l().createElement(a.Space,null,C.ahead>0&&l().createElement(a.Badge,{count:"".concat(C.ahead," ahead"),style:{backgroundColor:p.colorPrimary}}),C.behind>0&&l().createElement(a.Badge,{count:"".concat(C.behind," behind"),style:{backgroundColor:p.colorWarning}}),0===C.ahead&&0===C.behind&&l().createElement(a.Tag,{color:"green",icon:l().createElement(o.CheckCircleOutlined,null)},"Up to date")))),P.length>0?l().createElement(l().Fragment,null,l().createElement(ek,{strong:!0,style:{display:"block",marginBottom:8}},P.length," changed file(s)"),l().createElement(a.List,{size:"small",dataSource:P,renderItem:function(e){var t=eI[e.status]||{color:"default",icon:l().createElement(o.QuestionCircleOutlined,null),label:e.status};return l().createElement(a.List.Item,{style:{padding:"4px 0"}},l().createElement(a.Space,null,l().createElement(a.Tag,{color:t.color,style:{minWidth:80,textAlign:"center"}},t.icon," ",t.label),l().createElement(ek,{code:!0,style:{fontSize:13}},e.file)))}})):l().createElement(ek,{type:"secondary"},"Working directory clean")))};function eO(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eA(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return eO(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eO(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var eT=function(e){var t=e.value,n=e.onChange,o=e.allowClear,c=e.size,u=e.style,s=e.placeholder,d=(0,i.useAPIClient)(),m=eA((0,r.useState)([]),2),p=m[0],f=m[1],y=eA((0,r.useState)(!1),2),h=y[0],g=y[1];return(0,r.useEffect)(function(){var e=!1;return g(!0),d.request({url:"aiEmployees:listByUser"}).then(function(t){if(!e){var n,r=(null==t||null==(n=t.data)?void 0:n.data)||[];f(Array.isArray(r)?r:[])}}).catch(function(){}).finally(function(){e||g(!1)}),function(){e=!0}},[d]),l().createElement(a.Select,{value:t,onChange:n,allowClear:void 0===o||o,loading:h,size:c,style:u,placeholder:s||"Select AI employee",options:p.map(function(e){return{value:e.username,label:"".concat(e.nickname||e.username," (@").concat(e.username,")")}}),showSearch:!0,optionFilterProp:"label"})};function eR(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eP(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return eR(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eR(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var ez=function(e){var t=e.value,n=e.onChange,o=e.allowClear,c=e.size,u=e.style,s=e.placeholder,d=(0,i.useAPIClient)(),m=eP((0,r.useState)([]),2),p=m[0],f=m[1],y=eP((0,r.useState)(!1),2),h=y[0],g=y[1];return(0,r.useEffect)(function(){var e=!1;return g(!0),d.request({url:"ai:listAllEnabledModels"}).then(function(t){if(!e){var n,r=(null==t||null==(n=t.data)?void 0:n.data)||[];f(Array.isArray(r)?r:[])}}).catch(function(){}).finally(function(){e||g(!1)}),function(){e=!0}},[d]),l().createElement(a.Select,{value:t,onChange:n,allowClear:void 0===o||o,loading:h,size:c,style:u,placeholder:s||"Select LLM Service",options:p.map(function(e){return{value:e.llmService,label:e.llmServiceTitle||e.llmService}}),showSearch:!0,optionFilterProp:"label"})};function eF(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eB(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return eF(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eF(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var ej=function(e){var t=e.llmService,n=e.value,o=e.onChange,c=e.allowClear,u=e.size,s=e.style,d=e.placeholder,m=(0,i.useAPIClient)(),p=eB((0,r.useState)([]),2),f=p[0],y=p[1],h=eB((0,r.useState)(!1),2),g=h[0],v=h[1];return(0,r.useEffect)(function(){var e=!1;return t?(v(!0),m.request({url:"ai:listModels",params:{llmService:t}}).then(function(t){if(!e){var n,r=(null==t||null==(n=t.data)?void 0:n.data)||[];y(Array.isArray(r)?r:[])}}).catch(function(){e||y([])}).finally(function(){e||v(!1)}),function(){e=!0}):void y([])},[m,t]),l().createElement(a.Select,{value:n,onChange:o,allowClear:void 0===c||c,loading:g,size:u,style:s,placeholder:d||"Select LLM Model",options:f.map(function(e){return{value:e.id,label:e.id}}),showSearch:!0,optionFilterProp:"label",disabled:!t})};function eM(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eD(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function eq(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){eD(a,r,l,o,i,"next",e)}function i(e){eD(a,r,l,o,i,"throw",e)}o(void 0)})}}function eL(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return eM(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eM(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function eU(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var eN={manual:"Manual",onMergeRequestCreated:"On MR Created",both:"Both"},eH={auto:"Auto",manual:"Manual",disabled:"Disabled"},eW=function(){var e,t,n=h(),c=(0,i.useAPIClient)(),u=f().repos,s=eL((0,r.useState)([]),2),d=s[0],m=s[1],p=eL((0,r.useState)(!1),2),y=p[0],g=p[1],v=eL((0,r.useState)(null),2),b=v[0],E=v[1],w=eL((0,r.useState)(!1),2),S=w[0],k=w[1],C=eL(a.Form.useForm(),1)[0],I=(0,r.useCallback)(eq(function(){var e;return eU(this,function(t){switch(t.label){case 0:g(!0),t.label=1;case 1:return t.trys.push([1,,3,4]),[4,c.request({url:"gitReviewFlows:list",params:{pageSize:100}})];case 2:return m((null==(e=t.sent().data)?void 0:e.data)||[]),[3,4];case 3:return g(!1),[7];case 4:return[2]}})}),[c]);(0,r.useEffect)(function(){I()},[I]);var x=(e=eq(function(){var e,t,r,l,o,i;return eU(this,function(u){switch(u.label){case 0:return u.trys.push([0,6,,7]),[4,C.validateFields()];case 1:if((void 0===(e=u.sent()).repositoryId||""===e.repositoryId)&&(e.repositoryId=null),!(null==b?void 0:b.id))return[3,3];return[4,c.request({url:"gitReviewFlows:update",method:"post",params:{filterByTk:b.id},data:e})];case 2:return u.sent(),a.message.success(n("Flow updated")),[3,5];case 3:return[4,c.request({url:"gitReviewFlows:create",method:"post",data:e})];case 4:u.sent(),a.message.success(n("Flow created")),u.label=5;case 5:return k(!1),E(null),C.resetFields(),I(),[3,7];case 6:if(null==(t=u.sent())?void 0:t.errorFields)return[2];return a.message.error((null==t||null==(i=t.response)||null==(o=i.data)||null==(l=o.errors)||null==(r=l[0])?void 0:r.message)||(null==t?void 0:t.message)||n("Failed to save")),[3,7];case 7:return[2]}})}),function(){return e.apply(this,arguments)}),O=(t=eq(function(e){var t;return eU(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,c.request({url:"gitReviewFlows:destroy",method:"post",params:{filterByTk:e}})];case 1:return r.sent(),a.message.success(n("Flow deleted")),I(),[3,3];case 2:return t=r.sent(),a.message.error((null==t?void 0:t.message)||n("Failed to delete")),[3,3];case 3:return[2]}})}),function(e){return t.apply(this,arguments)}),A=function(e){E(e),C.setFieldsValue(e),k(!0)},T=[{title:n("Name"),dataIndex:"name",render:function(e,t){return l().createElement(a.Space,null,l().createElement("span",{style:{fontWeight:500}},e),!t.enabled&&l().createElement(a.Tag,{color:"default"},n("Disabled")))}},{title:n("Repository"),dataIndex:"repositoryId",render:function(e){if(null==e)return l().createElement(a.Tag,{color:"purple"},n("Global"));var t=u.find(function(t){return t.id===e});return t?l().createElement(a.Space,{size:4},l().createElement(o.BranchesOutlined,null),t.name):"#".concat(e)}},{title:n("AI Employee"),dataIndex:"aiEmployeeUsername",render:function(e){return e?l().createElement(a.Tag,{color:"blue"},"@",e):l().createElement("span",{style:{color:"#999"}},"—")}},{title:n("Trigger"),dataIndex:"triggerMode",render:function(e){return l().createElement(a.Tag,null,n(eN[e]||e))}},{title:n("Post"),dataIndex:"postMode",render:function(e){return l().createElement(a.Tag,{color:"auto"===e?"green":"manual"===e?"orange":"default"},n(eH[e]||e))}},{title:"",key:"actions",width:100,render:function(e,t){return l().createElement(a.Space,null,l().createElement(a.Tooltip,{title:n("Edit")},l().createElement(a.Button,{size:"small",icon:l().createElement(o.EditOutlined,null),onClick:function(){return A(t)}})),l().createElement(a.Popconfirm,{title:n("Delete this flow?"),onConfirm:function(){return O(t.id)}},l().createElement(a.Button,{size:"small",danger:!0,icon:l().createElement(o.DeleteOutlined,null)})))}}];return l().createElement("div",null,l().createElement("div",{style:{marginBottom:12,display:"flex",justifyContent:"space-between"}},l().createElement(a.Button,{type:"primary",icon:l().createElement(o.PlusOutlined,null),onClick:function(){E(null),C.resetFields(),C.setFieldsValue({enabled:!0,triggerMode:"manual",postMode:"manual",instructions:"Please review the code changes with a focus on:\n1. Best Practices & Style:\n - C#/VB.NET: Follow standard naming conventions (PascalCase for methods/properties, camelCase for fields). Ensure proper use of async/await (avoid .Result/.Wait()). Use LINQ efficiently.\n - JS/TS: Use strict equality (===), prefer const/let. Ensure TypeScript types are explicit and avoid 'any'.\n2. Performance: Watch out for N+1 queries, unnecessary loops, and memory leaks.\n3. Security: Identify potential SQL injections, XSS vulnerabilities, and improper data validation.\n4. Maintainability: Check for readability, SOLID principles, and DRY. Ensure meaningful naming.\n5. Error Handling: Verify that exceptions are properly caught, handled, and logged."}),k(!0)}},n("Add Review Flow")),l().createElement(a.Button,{onClick:I,loading:y},n("Refresh"))),l().createElement(a.Table,{size:"small",rowKey:"id",loading:y,dataSource:d,columns:T,locale:{emptyText:l().createElement(a.Empty,{description:n("No review flows yet")})},pagination:{pageSize:20}}),l().createElement(a.Modal,{title:(null==b?void 0:b.id)?n("Edit Review Flow"):n("Add Review Flow"),open:S,onCancel:function(){k(!1),E(null),C.resetFields()},onOk:x,width:640,destroyOnClose:!0},l().createElement(a.Form,{form:C,layout:"vertical"},l().createElement(a.Form.Item,{name:"name",label:n("Name"),rules:[{required:!0}]},l().createElement(a.Input,{placeholder:n("e.g. Default review flow")})),l().createElement(a.Form.Item,{name:"repositoryId",label:n("Repository"),extra:n("Leave empty to apply to all repositories")},l().createElement(a.Select,{allowClear:!0,placeholder:n("All repositories (global)"),options:u.map(function(e){return{value:e.id,label:e.name}})})),l().createElement(a.Form.Item,{name:"aiEmployeeUsername",label:n("AI Employee"),rules:[{required:!0}]},l().createElement(eT,{placeholder:n("Select an AI employee")})),l().createElement(a.Space.Compact,{style:{width:"100%"}},l().createElement(a.Form.Item,{name:"llmService",label:n("LLM Service (optional)"),style:{flex:1,marginRight:8}},l().createElement(ez,{placeholder:n("Override flow LLM service")})),l().createElement(a.Form.Item,{noStyle:!0,shouldUpdate:function(e,t){return e.llmService!==t.llmService}},function(e){var t=(0,e.getFieldValue)("llmService");return l().createElement(a.Form.Item,{name:"model",label:n("Model (optional)"),style:{flex:1}},t?l().createElement(ej,{llmService:t,placeholder:n("Override LLM model")}):l().createElement(a.Input,{placeholder:n("Select an LLM service first"),disabled:!0}))})),l().createElement(a.Form.Item,{name:"triggerMode",label:n("Trigger Mode"),rules:[{required:!0}],extra:n("Auto modes require enabling Auto Review on the repository")},l().createElement(a.Select,{options:[{value:"manual",label:n("Manual")},{value:"onMergeRequestCreated",label:n("On Merge Request Created")},{value:"both",label:n("Both")}]})),l().createElement(a.Form.Item,{name:"postMode",label:n("Post Mode"),rules:[{required:!0}]},l().createElement(a.Select,{options:[{value:"auto",label:n("Auto post to MR")},{value:"manual",label:n("Manual approval before posting")},{value:"disabled",label:n("Do not post")}]})),l().createElement(a.Form.Item,{name:"branchFilter",label:n("Branch Filter (regex, optional)")},l().createElement(a.Input,{placeholder:"^(feature|hotfix)/.*$"})),l().createElement(a.Form.Item,{name:"instructions",label:n("Additional Instructions (optional)")},l().createElement(a.Input.TextArea,{rows:8,placeholder:n("Extra guidance appended to every review prompt")})),l().createElement(a.Form.Item,{name:"enabled",label:n("Enabled"),valuePropName:"checked"},l().createElement(a.Switch,null)))))},e_=n(457),eG=a.theme.useToken,e$=function(e){var t=e.content,n=e.maxHeight,r=eG().token;return t?l().createElement("div",{style:{fontSize:13,lineHeight:1.65,color:r.colorText,maxHeight:n,overflow:n?"auto":void 0}},l().createElement(e_.UG,{components:{code:function(e){var t,n,a=e.inline,o=e.children,i=function(e,t){if(null==e)return{};var n,r,l=function(e,t){if(null==e)return{};var n,r,l={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}(e,["inline","children"]),c=String(o).replace(/\n$/,"");return a?l().createElement("code",(t=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},i),n=n={style:{background:r.colorBgLayout,padding:"1px 6px",borderRadius:4,fontSize:12,fontFamily:"'JetBrains Mono', 'Fira Code', Consolas, monospace"}},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}),t),c):l().createElement("pre",{style:{background:r.colorBgLayout,padding:"10px 14px",borderRadius:6,overflowX:"auto",fontSize:12,fontFamily:"'JetBrains Mono', 'Fira Code', Consolas, monospace"}},l().createElement("code",null,c))},blockquote:function(e){var t=e.children;return l().createElement("blockquote",{style:{borderLeft:"3px solid ".concat(r.colorBorder),paddingLeft:12,color:r.colorTextSecondary,margin:"8px 0"}},t)}}},t)):null};function eK(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eV(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function eJ(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){eV(a,r,l,o,i,"next",e)}function i(e){eV(a,r,l,o,i,"throw",e)}o(void 0)})}}function eQ(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return eK(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eK(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function eX(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var eY=a.Typography.Text;a.Typography.Title,a.Typography.Paragraph;var eZ=a.theme.useToken,e0={pending:"default",running:"blue",completed:"green",failed:"red"},e1={pending_approval:"orange",approved:"cyan",posted:"green",post_failed:"red",skipped:"default",rejected:"red"},e2=function(e){var t,n,c,u=e.initialFilter,s=h();eZ().token;var d=(0,i.useAPIClient)(),m=f().repos,p=eQ((0,r.useState)([]),2),y=p[0],g=p[1],v=eQ((0,r.useState)(!1),2),b=v[0],E=v[1],w=eQ((0,r.useState)("all"),2),S=w[0],k=w[1],C=eQ((0,r.useState)("pending_approval"===(void 0===u?"all":u)?"pending_approval":"all"),2),I=C[0],x=C[1],O=eQ((0,r.useState)("all"),2),A=O[0],T=O[1],R=eQ((0,r.useState)(null),2),P=R[0],z=R[1],F=eQ((0,r.useState)(!1),2),B=F[0],j=F[1],M=eQ((0,r.useState)(""),2),D=M[0],q=M[1],L=(0,r.useCallback)(eJ(function(){var e,t;return eX(this,function(n){switch(n.label){case 0:E(!0),n.label=1;case 1:return n.trys.push([1,,3,4]),e={},"all"!==S&&(e.status=S),"all"!==I&&(e.postStatus=I),"all"!==A&&(e.triggeredBy=A),[4,d.request({url:"gitCodeReviews:list",params:{pageSize:50,sort:["-id"],filter:Object.keys(e).length?e:void 0}})];case 2:return g((null==(t=n.sent().data)?void 0:t.data)||[]),[3,4];case 3:return E(!1),[7];case 4:return[2]}})}),[d,S,I,A]);(0,r.useEffect)(function(){L()},[L]),(0,r.useEffect)(function(){if(y.some(function(e){return"running"===e.status||"pending"===e.status})){var e=setInterval(L,4e3);return function(){return clearInterval(e)}}},[y,L]);var U=(0,r.useCallback)((t=eJ(function(e){var t,n;return eX(this,function(r){switch(r.label){case 0:return[4,d.request({url:"gitCodeReviews:get",params:{filterByTk:e}})];case 1:return(n=null==(t=r.sent().data)?void 0:t.data)&&(g(function(t){return t.map(function(t){return t.id===e?n:t})}),(null==P?void 0:P.id)===e&&z(n)),[2]}})}),function(e){return t.apply(this,arguments)}),[d,P]),N=(n=eJ(function(e){var t,n,r,l,o;return eX(this,function(i){switch(i.label){case 0:if(!P)return[2];i.label=1;case 1:return i.trys.push([1,3,,4]),[4,d.request({url:"gitManager:reviewApprovePost",method:"post",data:{reviewId:P.id,editedMarkdown:e}})];case 2:return i.sent(),a.message.success(s("Review posted to merge request")),j(!1),U(P.id),L(),[3,4];case 3:return t=i.sent(),a.message.error((null==t||null==(o=t.response)||null==(l=o.data)||null==(r=l.errors)||null==(n=r[0])?void 0:n.message)||(null==t?void 0:t.message)||s("Failed to post review")),[3,4];case 4:return[2]}})}),function(e){return n.apply(this,arguments)}),H=(c=eJ(function(){var e;return eX(this,function(t){switch(t.label){case 0:if(!P)return[2];t.label=1;case 1:return t.trys.push([1,3,,4]),[4,d.request({url:"gitManager:reviewReject",method:"post",data:{reviewId:P.id}})];case 2:return t.sent(),a.message.success(s("Review rejected")),U(P.id),L(),[3,4];case 3:return e=t.sent(),a.message.error((null==e?void 0:e.message)||s("Failed to reject")),[3,4];case 4:return[2]}})}),function(){return c.apply(this,arguments)}),W=(0,r.useMemo)(function(){var e={};return m.forEach(function(t){return e[t.id]=t}),e},[m]),_=[{title:s("Target"),key:"target",render:function(e,t){var n=W[t.repositoryId],r=(null==n?void 0:n.name)||"#".concat(t.repositoryId);return"mr"===t.targetType?l().createElement(a.Space,{size:4},l().createElement(eY,{strong:!0},r),l().createElement(eY,{type:"secondary"},"!",t.mrIid)):"commit"===t.targetType?l().createElement(a.Space,{size:4},l().createElement(eY,{strong:!0},r),l().createElement(eY,{type:"secondary",style:{fontFamily:"monospace"}},String(t.commitSha||"").slice(0,7))):l().createElement(a.Space,{size:4},l().createElement(eY,{strong:!0},r),l().createElement(eY,{type:"secondary"},t.branch))}},{title:s("Type"),dataIndex:"targetType",width:80,render:function(e){return l().createElement(a.Tag,null,s(e.toUpperCase()))}},{title:s("Status"),dataIndex:"status",width:120,render:function(e){var t=e0[e]||"default",n="running"===e?l().createElement(o.ClockCircleOutlined,{spin:!0}):null;return l().createElement(a.Tag,{color:t,icon:n},s(e))}},{title:s("Post Status"),dataIndex:"postStatus",width:140,render:function(e){return l().createElement(a.Tag,{color:e1[e]||"default"},s(e))}},{title:s("Commit"),key:"sha",width:140,render:function(e,t){var n=t.headSha,r=t.latestSha;return n?l().createElement(a.Space,{size:4},l().createElement(a.Tag,{style:{fontFamily:"monospace",fontSize:11}},String(n).slice(0,7)),n&&r&&n!==r&&l().createElement(a.Tooltip,{title:"".concat(s("New commits"),": ").concat(String(r).slice(0,7))},l().createElement(a.Tag,{color:"orange",style:{fontSize:11}},s("new")))):l().createElement(eY,{type:"secondary"},"—")}},{title:s("Trigger"),dataIndex:"triggeredBy",width:90,render:function(e){return l().createElement(a.Tag,{color:"poll"===e?"geekblue":"default",style:{fontSize:11}},"poll"===e?s("Polling"):s("Manual"))}},{title:s("Duration"),dataIndex:"durationMs",width:90,render:function(e){return e?"".concat((e/1e3).toFixed(1),"s"):"—"}},{title:s("Created"),dataIndex:"createdAt",width:160,render:function(e){return e?new Date(e).toLocaleString():""}},{title:"",key:"actions",width:60,render:function(e,t){return l().createElement(a.Tooltip,{title:s("View")},l().createElement(a.Button,{size:"small",icon:l().createElement(o.FileTextOutlined,null),onClick:function(){z(t),j(!1),q(t.reviewMarkdown||"")}}))}}];return l().createElement("div",null,l().createElement(a.Space,{style:{marginBottom:12},wrap:!0},l().createElement(a.Select,{size:"small",style:{width:140},value:S,onChange:k,options:[{value:"all",label:s("All statuses")},{value:"pending",label:s("pending")},{value:"running",label:s("running")},{value:"completed",label:s("completed")},{value:"failed",label:s("failed")}]}),l().createElement(a.Select,{size:"small",style:{width:180},value:I,onChange:x,options:[{value:"all",label:s("All post statuses")},{value:"pending_approval",label:s("pending_approval")},{value:"approved",label:s("approved")},{value:"posted",label:s("posted")},{value:"post_failed",label:s("post_failed")},{value:"skipped",label:s("skipped")},{value:"rejected",label:s("rejected")}]}),l().createElement(a.Select,{size:"small",style:{width:130},value:A,onChange:T,options:[{value:"all",label:s("All triggers")},{value:"manual",label:s("Manual")},{value:"poll",label:s("Polling")}]}),l().createElement(a.Button,{size:"small",icon:l().createElement(o.ReloadOutlined,null),onClick:L},s("Refresh"))),l().createElement(a.Table,{size:"small",rowKey:"id",loading:b,dataSource:y,columns:_,locale:{emptyText:l().createElement(a.Empty,{description:s("No reviews yet")})},pagination:{pageSize:20},onRow:function(e){return{style:{cursor:"pointer"},onClick:function(){z(e),j(!1),q(e.reviewMarkdown||"")}}}}),l().createElement(a.Drawer,{title:P?l().createElement(a.Space,null,l().createElement(o.RobotOutlined,null),l().createElement("span",null,s("Code Review")),l().createElement(a.Tag,{color:e0[P.status]},s(P.status)),l().createElement(a.Tag,{color:e1[P.postStatus]},s(P.postStatus))):s("Code Review"),open:!!P,onClose:function(){z(null),j(!1)},width:840,extra:P&&l().createElement(a.Space,null,l().createElement(a.Button,{size:"small",icon:l().createElement(o.ReloadOutlined,null),onClick:function(){return U(P.id)}},s("Refresh")),"mr"===P.targetType&&l().createElement(a.Button,{size:"small",icon:l().createElement(o.ExportOutlined,null),onClick:function(){var e,t=W[P.repositoryId],n=null==t||null==(e=t.repoUrl)?void 0:e.replace(/\.git$/,"");n&&P.mrIid&&window.open("".concat(n,"/-/merge_requests/").concat(P.mrIid),"_blank")}},s("Open MR")))},P&&l().createElement(e3,{review:P,editing:B,editedMarkdown:D,onEdit:function(){return j(!0)},onCancelEdit:function(){j(!1),q(P.reviewMarkdown||"")},onChangeMarkdown:q,onApprove:N,onReject:H})))},e3=function(e){var t=e.review,n=e.editing,r=e.editedMarkdown,i=e.onEdit,c=e.onCancelEdit,u=e.onChangeMarkdown,s=e.onApprove,d=e.onReject,m=h(),p=eZ().token,f="completed"===t.status&&"mr"===t.targetType&&("pending_approval"===t.postStatus||"approved"===t.postStatus||"post_failed"===t.postStatus);return l().createElement("div",null,"running"===t.status&&l().createElement(a.Alert,{type:"info",showIcon:!0,message:m("Review in progress…"),description:m("The AI employee is analyzing the code. This page will refresh automatically."),style:{marginBottom:16}}),"failed"===t.status&&l().createElement(a.Alert,{type:"error",showIcon:!0,message:m("Review failed"),description:l().createElement("pre",{style:{whiteSpace:"pre-wrap",margin:0}},t.error),style:{marginBottom:16}}),"completed"===t.status&&"post_failed"===t.postStatus&&t.error&&l().createElement(a.Alert,{type:"error",showIcon:!0,message:m("Post Failed"),description:l().createElement("pre",{style:{whiteSpace:"pre-wrap",margin:0}},t.error),style:{marginBottom:16}}),f&&l().createElement(a.Space,{style:{marginBottom:16},wrap:!0},n?l().createElement(l().Fragment,null,l().createElement(a.Button,{type:"primary",icon:l().createElement(o.CheckOutlined,null),onClick:function(){return s(r)}},m("Save & Post")),l().createElement(a.Button,{onClick:c},m("Cancel"))):l().createElement(l().Fragment,null,l().createElement(a.Button,{type:"primary",icon:l().createElement(o.CheckOutlined,null),onClick:function(){return s(t.reviewMarkdown)}},m("Approve & Post")),l().createElement(a.Button,{icon:l().createElement(o.EditOutlined,null),onClick:i},m("Edit & Post")),l().createElement(a.Popconfirm,{title:m("Reject this review?"),onConfirm:d},l().createElement(a.Button,{danger:!0,icon:l().createElement(o.CloseOutlined,null)},m("Reject"))))),l().createElement(a.Tabs,{defaultActiveKey:"content",items:[{key:"content",label:m("Review Content"),children:n?l().createElement(a.Input.TextArea,{value:r,onChange:function(e){return u(e.target.value)},autoSize:{minRows:16,maxRows:40},style:{fontFamily:"'JetBrains Mono', 'Fira Code', Consolas, monospace",fontSize:13}}):t.reviewMarkdown?l().createElement("div",{style:{background:p.colorBgLayout,padding:16,borderRadius:8,maxHeight:"70vh",overflowY:"auto"}},l().createElement(e$,{content:t.reviewMarkdown})):l().createElement(a.Empty,{description:m("No content yet")})},{key:"metadata",label:m("Metadata"),children:l().createElement("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"8px 16px",fontSize:13}},l().createElement(e4,{label:m("Status"),value:t.status}),l().createElement(e4,{label:m("Post Status"),value:t.postStatus}),l().createElement(e4,{label:m("Trigger Type"),value:t.targetType}),l().createElement(e4,{label:m("Triggered By"),value:t.triggeredBy}),l().createElement(e4,{label:m("Reviewed SHA"),value:t.headSha||"—"}),l().createElement(e4,{label:m("Latest SHA"),value:t.latestSha||"—"}),l().createElement(e4,{label:m("Started At"),value:t.startedAt&&new Date(t.startedAt).toLocaleString()}),l().createElement(e4,{label:m("Finished At"),value:t.finishedAt&&new Date(t.finishedAt).toLocaleString()}),l().createElement(e4,{label:m("Duration"),value:t.durationMs?"".concat((t.durationMs/1e3).toFixed(1),"s"):"—"}),l().createElement(e4,{label:m("Posted Note ID"),value:t.postedNoteId||"—"}),l().createElement(e4,{label:m("Approved By"),value:t.approvedBy||"—"}),l().createElement(e4,{label:m("Approved At"),value:t.approvedAt&&new Date(t.approvedAt).toLocaleString()}),l().createElement(e4,{label:m("Session ID"),value:t.sessionId||"—"}),l().createElement(e4,{label:m("Flow ID"),value:t.flowId||"—"}))}]}))},e4=function(e){var t=e.label,n=e.value;return l().createElement("div",null,l().createElement(eY,{type:"secondary",style:{fontSize:12,display:"block"}},t),l().createElement("div",{style:{wordBreak:"break-all"}},n||"—"))};function e6(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function e5(e,t,n,r,l,a,o){try{var i=e[a](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,l)}function e8(e){return function(){var t=this,n=arguments;return new Promise(function(r,l){var a=e.apply(t,n);function o(e){e5(a,r,l,o,i,"next",e)}function i(e){e5(a,r,l,o,i,"throw",e)}o(void 0)})}}function e7(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,i=!1;try{for(l=l.call(e);!(o=(n=l.next()).done)&&(a.push(n.value),!t||a.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==l.return||l.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return e6(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return e6(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e9(e,t){var n,r,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&c[0]?r.return:c[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,c[1])).done)return l;switch(r=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var te=a.Typography.Text,tt=a.theme.useToken,tn=function(){var e,t,n=h();tt().token;var c=(0,i.useAPIClient)(),u=f(),s=u.repos,d=u.refreshRepos,m=e7((0,r.useState)(null),2),p=m[0],y=m[1],g=e7((0,r.useState)(!1),2),v=g[0],b=g[1],E=e7((0,r.useState)(null),2),w=E[0],S=E[1],k=e7((0,r.useState)([]),2),C=k[0],I=k[1],x=(0,r.useCallback)(e8(function(){var e,t,n,r;return e9(this,function(l){switch(l.label){case 0:b(!0),l.label=1;case 1:return l.trys.push([1,,4,5]),[4,Promise.all([c.request({url:"gitManager:pollerStatus"}),c.request({url:"gitReviewFlows:list",params:{pageSize:100,filter:{enabled:!0,triggerMode:{$in:["onMergeRequestCreated","both"]}}}})])];case 2:return n=(t=e7.apply(void 0,[l.sent(),2]))[0].data,r=t[1],y((null==n?void 0:n.data)||null),I((null==r||null==(e=r.data)?void 0:e.data)||[]),[4,d()];case 3:return l.sent(),[3,5];case 4:return b(!1),[7];case 5:return[2]}})}),[c,d]);(0,r.useEffect)(function(){x()},[x]);var O=(e=e8(function(){var e,t,r,l,o,i,u,s,d;return e9(this,function(m){switch(m.label){case 0:S("all"),m.label=1;case 1:return m.trys.push([1,3,4,5]),[4,c.request({url:"gitManager:pollNow",method:"post"})];case 2:return t=(null==(e=m.sent().data)?void 0:e.data)||{},a.message.success(n("Polled {{scanned}} MRs, triggered {{triggered}} reviews",{scanned:null!=(r=t.scanned)?r:0,triggered:null!=(l=t.triggered)?l:0})),x(),[3,5];case 3:return o=m.sent(),a.message.error((null==o||null==(d=o.response)||null==(s=d.data)||null==(u=s.errors)||null==(i=u[0])?void 0:i.message)||(null==o?void 0:o.message)||n("Failed")),[3,5];case 4:return S(null),[7];case 5:return[2]}})}),function(){return e.apply(this,arguments)}),A=(t=e8(function(e){var t,r,l,o,i,u,s,d,m;return e9(this,function(p){switch(p.label){case 0:S(e),p.label=1;case 1:return p.trys.push([1,3,4,5]),[4,c.request({url:"gitManager:pollNow",method:"post",data:{repositoryId:e}})];case 2:return r=(null==(t=p.sent().data)?void 0:t.data)||{},a.message.success(n("Polled {{scanned}} MRs, triggered {{triggered}} reviews",{scanned:null!=(l=r.scanned)?l:0,triggered:null!=(o=r.triggered)?o:0})),x(),[3,5];case 3:return i=p.sent(),a.message.error((null==i||null==(m=i.response)||null==(d=m.data)||null==(s=d.errors)||null==(u=s[0])?void 0:u.message)||(null==i?void 0:i.message)||n("Failed")),[3,5];case 4:return S(null),[7];case 5:return[2]}})}),function(e){return t.apply(this,arguments)}),T=s.filter(function(e){return e.autoReview});return l().createElement("div",null,l().createElement(a.Card,{size:"small",style:{marginBottom:16},title:l().createElement(a.Space,null,l().createElement(o.ClockCircleOutlined,null),n("Polling Status")),extra:l().createElement(a.Space,null,l().createElement(a.Button,{size:"small",type:"primary",icon:l().createElement(o.ThunderboltOutlined,null),onClick:O,loading:"all"===w,disabled:0===T.length},n("Poll Now (All)")),l().createElement(a.Button,{size:"small",icon:l().createElement(o.ReloadOutlined,null),onClick:x,loading:v},n("Refresh")))},l().createElement(a.Space,{direction:"vertical",size:4,style:{width:"100%"}},l().createElement(a.Space,null,l().createElement(te,{type:"secondary"},n("Background poller"),":"),l().createElement(a.Tag,{color:(null==p?void 0:p.running)?"green":"default"},(null==p?void 0:p.running)?n("Running"):n("Stopped")),(null==p?void 0:p.polling)&&l().createElement(a.Tag,{color:"blue"},n("Polling now…"))),l().createElement(a.Space,null,l().createElement(te,{type:"secondary"},n("Interval"),":"),l().createElement(te,null,(null==p?void 0:p.intervalSec)?"".concat(p.intervalSec,"s"):"—")),l().createElement(a.Space,null,l().createElement(te,{type:"secondary"},n("Last tick"),":"),l().createElement(te,null,(null==p?void 0:p.lastTickAt)?new Date(p.lastTickAt).toLocaleString():n("Never"))),(null==p?void 0:p.lastError)&&l().createElement(a.Space,null,l().createElement(te,{type:"secondary"},n("Last error"),":"),l().createElement(te,{type:"danger",style:{fontSize:12}},p.lastError)))),l().createElement(a.Card,{size:"small",title:l().createElement(a.Space,null,l().createElement(o.RobotOutlined,null),n("Auto-Review Repositories")),extra:l().createElement(te,{type:"secondary",style:{fontSize:12}},n("Toggle Auto Review on the Repositories tab to enable polling"))},0===T.length?l().createElement(a.Empty,{description:n("No repositories have Auto Review enabled")}):l().createElement(a.Table,{size:"small",rowKey:"id",dataSource:T,pagination:!1,columns:[{title:n("Repository Name"),dataIndex:"name"},{title:n("Primary Auto Flow"),dataIndex:"autoReviewFlowId",width:220,render:function(e,t){var r=C.find(function(t){return Number(t.id)===Number(e)}),o=C.find(function(e){return e.repositoryId===t.id||null==e.repositoryId});return r?l().createElement(a.Tag,{color:"blue"},r.name):o?l().createElement(a.Tag,{color:"default"},n("Fallback"),": ",o.name):l().createElement(a.Tag,{color:"red"},n("No matching flow available"))}},{title:n("Last Polled At"),dataIndex:"lastPolledAt",width:200,render:function(e){return e?new Date(e).toLocaleString():n("Never")}},{title:"",key:"actions",width:120,render:function(e,t){return l().createElement(a.Tooltip,{title:n("Poll this repository now")},l().createElement(a.Button,{size:"small",icon:l().createElement(o.ThunderboltOutlined,null),onClick:function(){return A(t.id)},loading:w===t.id},n("Poll Now")))}}]})))},tr=a.Typography.Text,tl=a.theme.useToken,ta=function(){var e=h(),t=tl().token,n=f(),i=n.repos,c=n.selectedRepo,u=n.setSelectedRepo,s=n.refreshRepos;return(0,r.useEffect)(function(){s()},[]),l().createElement("div",{style:{height:"100%"}},l().createElement("div",{style:{padding:"12px 0",marginBottom:16,display:"flex",alignItems:"center",gap:12,borderBottom:"1px solid ".concat(t.colorBorderSecondary)}},l().createElement(o.DatabaseOutlined,{style:{fontSize:16}}),l().createElement(tr,{strong:!0},"Repository:"),l().createElement(a.Select,{style:{minWidth:250},placeholder:e("Select a repository"),value:null==c?void 0:c.id,onChange:function(e){u(i.find(function(t){return t.id===e})||null)},options:i.map(function(t){return{label:l().createElement(a.Space,null,t.name,l().createElement(a.Tag,{color:"connected"===t.status?"green":"default",style:{fontSize:11}},"connected"===t.status?e("Connected"):e("Disconnected"))),value:t.id}}),allowClear:!0,onClear:function(){return u(null)}}),c&&l().createElement(tr,{type:"secondary",style:{fontSize:12}},c.repoUrl)),l().createElement(a.Tabs,{type:"card",defaultActiveKey:"repos",destroyInactiveTabPane:!0,items:[{key:"repos",label:l().createElement("span",null,l().createElement(o.DatabaseOutlined,null)," ",e("Repositories")),children:l().createElement(S,null)},{key:"explorer",label:l().createElement("span",null,l().createElement(o.FolderOutlined,null)," ",e("File Explorer")),children:l().createElement(B,null)},{key:"history",label:l().createElement("span",null,l().createElement(o.HistoryOutlined,null)," ",e("History")),children:l().createElement(X,null)},{key:"merge-requests",label:l().createElement("span",null,l().createElement(o.MergeOutlined,null)," ",e("Merge Requests")),children:l().createElement(ec,null)},{key:"operations",label:l().createElement("span",null,l().createElement(o.ToolOutlined,null)," ",e("Operations")),children:l().createElement(ex,null)},{key:"review-flows",label:l().createElement("span",null,l().createElement(o.RobotOutlined,null)," ",e("Review Flows")),children:l().createElement(eW,null)},{key:"review-history",label:l().createElement("span",null,l().createElement(o.AuditOutlined,null)," ",e("Review History")),children:l().createElement(e2,null)},{key:"polling",label:l().createElement("span",null,l().createElement(o.ClockCircleOutlined,null)," ",e("Polling")),children:l().createElement(tn,null)}]}))},to=function(){return l().createElement(y,null,l().createElement(ta,null))}}}]);
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WorkContext options exported as plain objects so we can register them
|
|
3
|
-
* regardless of whether plugin-ai is installed at compile time. The plugin
|
|
4
|
-
* checks `app.aiManager` at runtime before registering.
|
|
5
|
-
*/
|
|
6
|
-
export declare const GitRepositoryWorkContext: any;
|
|
7
|
-
export declare const GitMergeRequestWorkContext: any;
|
|
8
|
-
export declare const GitCommitWorkContext: any;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* Select dropdown listing AI employees the current user has access to.
|
|
4
|
-
* Calls `aiEmployees:listByUser` from plugin-ai.
|
|
5
|
-
*/
|
|
6
|
-
export declare const AIEmployeeSelect: React.FC<{
|
|
7
|
-
value?: string;
|
|
8
|
-
onChange?: (value: string) => void;
|
|
9
|
-
allowClear?: boolean;
|
|
10
|
-
size?: 'small' | 'middle' | 'large';
|
|
11
|
-
style?: React.CSSProperties;
|
|
12
|
-
placeholder?: string;
|
|
13
|
-
}>;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
export declare const LLMModelSelect: React.FC<{
|
|
3
|
-
llmService?: string;
|
|
4
|
-
value?: string;
|
|
5
|
-
onChange?: (value: string) => void;
|
|
6
|
-
allowClear?: boolean;
|
|
7
|
-
size?: 'small' | 'middle' | 'large';
|
|
8
|
-
style?: React.CSSProperties;
|
|
9
|
-
placeholder?: string;
|
|
10
|
-
}>;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* Lightweight markdown renderer used for displaying review reports.
|
|
4
|
-
* We avoid the full plugin-field-markdown-vditor `Display` component because
|
|
5
|
-
* it is tightly coupled to formily field context.
|
|
6
|
-
*/
|
|
7
|
-
export declare const MarkdownView: React.FC<{
|
|
8
|
-
content?: string;
|
|
9
|
-
maxHeight?: number | string;
|
|
10
|
-
}>;
|