@acorex-platform/extension-project-management-jira-client 0.0.70 → 1.0.2

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.
@@ -0,0 +1,215 @@
1
+ import { AXP_INTEGRATION_CONNECTION_STATUS, runtimeCommandPayloadData, AXP_INTEGRATION_AUTH_METHOD_TYPE } from '@acorex-platform/framework-shared/core';
2
+ import { AXEJiraCommandKeys, AXE_JIRA_ASSIST_INSTRUCTIONS_FIELD, AXE_JIRA_ASSIST_INSTRUCTIONS_MAX } from '@acorex-platform/extension-project-management-jira-client/contracts';
3
+ import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
4
+ import { AXMIntegrationConnectionManager, hasConfiguredIntegrationCredentials, AXP_INTEGRATION_CREDENTIAL_MASK, isMaskedIntegrationCredential, toSafeIntegrationConnectionDto } from '@acorex-platform/module-integration-management-client';
5
+ import { AXPLayoutBuilderService, resolveLayoutBuilderDialogResult } from '@acorex-platform/framework-client/layout/builder';
6
+ import { AXToastService } from '@acorex/components/toast';
7
+ import { AXTranslationService } from '@acorex/core/translation';
8
+ import * as i0 from '@angular/core';
9
+ import { inject, Injectable } from '@angular/core';
10
+ import { defaultTo, trim } from 'lodash-es';
11
+
12
+ //#endregion
13
+ //#region ---- Constants ----
14
+ /**
15
+ * http(s) URL with a host and no embedded credentials.
16
+ * Blank values pass so the required rule owns that message.
17
+ */
18
+ const JIRA_INSTANCE_URL_PATTERN = '^(?:\\s*|\\s*https?:\\/\\/[^\\s/?#@]+(?:[/?#][^\\s]*)?\\s*)$';
19
+ const JIRA_INSTANCE_URL_MESSAGE = '@extensions-jira:integration.connect.messages.invalid-url';
20
+ function isJiraInstanceUrl(value) {
21
+ return /^\s*https?:\/\/[^\s/?#@]+(?:[/?#][^\s]*)?\s*$/.test(value);
22
+ }
23
+ //#endregion
24
+ //#region ---- Command ----
25
+ /** Saves an on-premise Jira base URL and personal access token on the shared integration connection. */
26
+ class ConnectJiraCommand {
27
+ constructor() {
28
+ //#region ---- Services & Dependencies ----
29
+ this.translationService = inject(AXTranslationService);
30
+ this.toastService = inject(AXToastService);
31
+ this.layoutBuilder = inject(AXPLayoutBuilderService);
32
+ this.commandService = inject(AXPCommandService);
33
+ this.connectionManager = inject(AXMIntegrationConnectionManager);
34
+ }
35
+ //#endregion
36
+ //#region ---- Execute ----
37
+ async execute(input = {}) {
38
+ try {
39
+ const providerId = defaultTo(input.providerId, 'jira');
40
+ const connectionScope = input.connectionScope ?? 'user';
41
+ const i18nPrefix = '@extensions-jira:integration.connect';
42
+ const existing = await this.connectionManager.findByUniqueKey({
43
+ providerId,
44
+ connectionScope,
45
+ connectionKey: 'default',
46
+ });
47
+ const isReconfigure = hasConfiguredIntegrationCredentials(existing);
48
+ const existingConfig = (existing?.config ?? {});
49
+ const form = await this.openPatDialog({
50
+ i18nPrefix,
51
+ isReconfigure,
52
+ context: {
53
+ displayName: existing?.displayName ?? 'Jira',
54
+ instanceUrl: existing?.instanceUrl ?? '',
55
+ token: isReconfigure ? AXP_INTEGRATION_CREDENTIAL_MASK : '',
56
+ assistInstructions: typeof existingConfig.assistInstructions === 'string' ? existingConfig.assistInstructions : '',
57
+ },
58
+ });
59
+ if (!form) {
60
+ return { success: true, kind: 'object', data: { outcome: 'cancelled' } };
61
+ }
62
+ let token = trim(form.token);
63
+ if (isMaskedIntegrationCredential(token) && existing) {
64
+ token = trim(existingConfig.token ?? '');
65
+ }
66
+ const instanceUrl = trim(form.instanceUrl);
67
+ if (!instanceUrl || !token) {
68
+ const message = await this.translationService.translateAsync(`${i18nPrefix}.messages.required`);
69
+ return {
70
+ success: false,
71
+ message: { text: message ?? 'Jira base URL and personal access token are required.' },
72
+ };
73
+ }
74
+ const probe = await this.commandService.executeRemote(AXEJiraCommandKeys.ConnectionValidate, { instanceUrl, token });
75
+ if (!probe?.success) {
76
+ if (existing) {
77
+ await this.connectionManager.updateConnection(existing.id, {
78
+ status: AXP_INTEGRATION_CONNECTION_STATUS.NotConnected,
79
+ isRevoked: false,
80
+ });
81
+ }
82
+ const code = typeof probe?.message?.text === 'string' ? probe.message.text : '';
83
+ const messageKey = code === 'unauthorized' ? `${i18nPrefix}.messages.unauthorized` : `${i18nPrefix}.messages.unreachable`;
84
+ const message = await this.translationService.translateAsync(messageKey);
85
+ return { success: false, message: { text: message ?? 'Jira connection could not be verified.' } };
86
+ }
87
+ const probed = runtimeCommandPayloadData(probe);
88
+ const accountName = trim(probed?.displayName ?? '') || instanceUrl;
89
+ const connection = await this.connectionManager.upsertConnection({
90
+ providerId,
91
+ authMethodType: AXP_INTEGRATION_AUTH_METHOD_TYPE.Pat,
92
+ connectionScope,
93
+ connectionKey: 'default',
94
+ displayName: defaultTo(trim(form.displayName), 'Jira'),
95
+ instanceUrl,
96
+ externalAccountName: accountName,
97
+ config: {
98
+ ...existingConfig,
99
+ token,
100
+ [AXE_JIRA_ASSIST_INSTRUCTIONS_FIELD]: trim(form.assistInstructions).slice(0, AXE_JIRA_ASSIST_INSTRUCTIONS_MAX),
101
+ },
102
+ status: AXP_INTEGRATION_CONNECTION_STATUS.Connected,
103
+ isRevoked: false,
104
+ isDisabled: false,
105
+ });
106
+ this.toastService.success(await this.translationService.translateAsync(`${i18nPrefix}.messages.success`));
107
+ return {
108
+ success: true,
109
+ kind: 'object',
110
+ data: { outcome: 'connected', connection: toSafeIntegrationConnectionDto(connection) },
111
+ };
112
+ }
113
+ catch (error) {
114
+ const message = await this.translationService.translateAsync('@extensions-jira:integration.connect.messages.save-failed');
115
+ return {
116
+ success: false,
117
+ message: { text: message ?? (error instanceof Error ? error.message : 'Failed to connect Jira.') },
118
+ };
119
+ }
120
+ }
121
+ //#endregion
122
+ //#region ---- Dialogs ----
123
+ async openPatDialog(input) {
124
+ const instructions = await this.translationService.translateAsync('@extensions-jira:integration.auth.pat.instructions');
125
+ const result = await this.layoutBuilder
126
+ .create()
127
+ .dialog((dialog) => {
128
+ dialog
129
+ .setTitle(`${input.i18nPrefix}.pat-dialog.title`)
130
+ .setSize('md')
131
+ .setCloseButton(true)
132
+ .setContext({ ...input.context })
133
+ .content((flex) => {
134
+ flex
135
+ .setDirection('column')
136
+ .setGap('12px')
137
+ .customWidget('text-block-layout', { content: instructions ?? '' })
138
+ .formField(`${input.i18nPrefix}.pat-dialog.fields.display-name`, (field) => {
139
+ field.path('displayName');
140
+ field.textBox({ placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.display-name` });
141
+ })
142
+ .formField(`${input.i18nPrefix}.pat-dialog.fields.instance-url`, (field) => {
143
+ field.path('instanceUrl');
144
+ field.textBox({
145
+ placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.instance-url`,
146
+ validations: [
147
+ { rule: 'required' },
148
+ {
149
+ rule: 'regex',
150
+ options: {
151
+ pattern: JIRA_INSTANCE_URL_PATTERN,
152
+ message: JIRA_INSTANCE_URL_MESSAGE,
153
+ },
154
+ },
155
+ ],
156
+ });
157
+ })
158
+ .formField(`${input.i18nPrefix}.pat-dialog.fields.token`, (field) => {
159
+ field.path('token');
160
+ field.passwordBox({
161
+ placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.token`,
162
+ revealToggle: true,
163
+ validations: input.isReconfigure ? [] : [{ rule: 'required' }],
164
+ });
165
+ })
166
+ .formField(`${input.i18nPrefix}.pat-dialog.fields.assist-instructions`, (field) => {
167
+ field.path('assistInstructions');
168
+ field.largeTextBox({
169
+ rows: 4,
170
+ maxLength: AXE_JIRA_ASSIST_INSTRUCTIONS_MAX,
171
+ placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.assist-instructions`,
172
+ });
173
+ });
174
+ })
175
+ .setActions((actions) => {
176
+ actions
177
+ .cancel('@general:actions.cancel.title')
178
+ .submit(`${input.i18nPrefix}.pat-dialog.actions.save`);
179
+ })
180
+ .onAction(async (ref) => {
181
+ if (ref.action() === 'cancel') {
182
+ return null;
183
+ }
184
+ const ctx = ref.context();
185
+ const token = trim(ctx.token);
186
+ const instanceUrl = trim(ctx.instanceUrl);
187
+ if (!instanceUrl || (!token && !input.isReconfigure)) {
188
+ const message = await this.translationService.translateAsync(`${input.i18nPrefix}.messages.required`);
189
+ throw new Error(message ?? 'Jira base URL and personal access token are required.');
190
+ }
191
+ if (!isJiraInstanceUrl(instanceUrl)) {
192
+ const message = await this.translationService.translateAsync(`${input.i18nPrefix}.messages.invalid-url`);
193
+ throw new Error(message ?? 'Enter a valid URL starting with http:// or https://.');
194
+ }
195
+ return {
196
+ displayName: trim(ctx.displayName),
197
+ instanceUrl,
198
+ token,
199
+ assistInstructions: trim(ctx.assistInstructions),
200
+ };
201
+ });
202
+ })
203
+ .show();
204
+ return resolveLayoutBuilderDialogResult(result);
205
+ }
206
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ConnectJiraCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
207
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ConnectJiraCommand, providedIn: 'root' }); }
208
+ }
209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ConnectJiraCommand, decorators: [{
210
+ type: Injectable,
211
+ args: [{ providedIn: 'root' }]
212
+ }] });
213
+
214
+ export { ConnectJiraCommand };
215
+ //# sourceMappingURL=acorex-platform-extension-project-management-jira-client-connect-jira.command-w724jEDQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-extension-project-management-jira-client-connect-jira.command-w724jEDQ.mjs","sources":["../../../../libs/extensions/project-management/jira/client/src/lib/features/connect/connect-jira.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport {\n AXP_INTEGRATION_AUTH_METHOD_TYPE,\n AXP_INTEGRATION_CONNECTION_STATUS,\n runtimeCommandPayloadData,\n type AXPIntegrationConnectionScope,\n} from '@acorex-platform/framework-shared/core';\nimport {\n AXE_JIRA_ASSIST_INSTRUCTIONS_FIELD,\n AXE_JIRA_ASSIST_INSTRUCTIONS_MAX,\n AXEJiraCommandKeys,\n} from '@acorex-platform/extension-project-management-jira-client/contracts';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXMIntegrationConnectionManager,\n AXP_INTEGRATION_CREDENTIAL_MASK,\n hasConfiguredIntegrationCredentials,\n isMaskedIntegrationCredential,\n toSafeIntegrationConnectionDto,\n type ConnectCommandResult,\n} from '@acorex-platform/module-integration-management-client';\nimport {\n AXPLayoutBuilderService,\n resolveLayoutBuilderDialogResult,\n type AXPDialogRef,\n type IActionBuilder,\n type IDialogBuilder,\n type IFlexContainerBuilder,\n type IFormFieldBuilder,\n} from '@acorex-platform/framework-client/layout/builder';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Injectable, inject } from '@angular/core';\nimport { defaultTo, trim } from 'lodash-es';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface ConnectJiraCommandInput {\n providerId?: string;\n connectionScope?: AXPIntegrationConnectionScope;\n}\n\ninterface JiraPatFormContext {\n displayName: string;\n instanceUrl: string;\n token: string;\n assistInstructions: string;\n}\n\ninterface JiraPatFormResult {\n displayName: string;\n instanceUrl: string;\n token: string;\n assistInstructions: string;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\n/**\n * http(s) URL with a host and no embedded credentials.\n * Blank values pass so the required rule owns that message.\n */\nconst JIRA_INSTANCE_URL_PATTERN = '^(?:\\\\s*|\\\\s*https?:\\\\/\\\\/[^\\\\s/?#@]+(?:[/?#][^\\\\s]*)?\\\\s*)$';\n\nconst JIRA_INSTANCE_URL_MESSAGE = '@extensions-jira:integration.connect.messages.invalid-url';\n\nfunction isJiraInstanceUrl(value: string): boolean {\n return /^\\s*https?:\\/\\/[^\\s/?#@]+(?:[/?#][^\\s]*)?\\s*$/.test(value);\n}\n\n//#endregion\n\n//#region ---- Command ----\n\n/** Saves an on-premise Jira base URL and personal access token on the shared integration connection. */\n@Injectable({ providedIn: 'root' })\nexport class ConnectJiraCommand implements AXPCommand<ConnectJiraCommandInput, ConnectCommandResult> {\n //#region ---- Services & Dependencies ----\n\n private readonly translationService = inject(AXTranslationService);\n private readonly toastService = inject(AXToastService);\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly commandService = inject(AXPCommandService);\n private readonly connectionManager = inject(AXMIntegrationConnectionManager);\n\n //#endregion\n\n //#region ---- Execute ----\n\n async execute(input: ConnectJiraCommandInput = {}): AXPCommandExecuteResultPromise<ConnectCommandResult> {\n try {\n const providerId = defaultTo(input.providerId, 'jira');\n const connectionScope: AXPIntegrationConnectionScope = input.connectionScope ?? 'user';\n const i18nPrefix = '@extensions-jira:integration.connect';\n const existing = await this.connectionManager.findByUniqueKey({\n providerId,\n connectionScope,\n connectionKey: 'default',\n });\n const isReconfigure = hasConfiguredIntegrationCredentials(existing);\n const existingConfig = (existing?.config ?? {}) as {\n token?: string;\n assistInstructions?: string;\n };\n\n const form = await this.openPatDialog({\n i18nPrefix,\n isReconfigure,\n context: {\n displayName: existing?.displayName ?? 'Jira',\n instanceUrl: existing?.instanceUrl ?? '',\n token: isReconfigure ? AXP_INTEGRATION_CREDENTIAL_MASK : '',\n assistInstructions:\n typeof existingConfig.assistInstructions === 'string' ? existingConfig.assistInstructions : '',\n },\n });\n\n if (!form) {\n return { success: true, kind: 'object', data: { outcome: 'cancelled' } };\n }\n\n let token = trim(form.token);\n if (isMaskedIntegrationCredential(token) && existing) {\n token = trim(existingConfig.token ?? '');\n }\n const instanceUrl = trim(form.instanceUrl);\n if (!instanceUrl || !token) {\n const message = await this.translationService.translateAsync(`${i18nPrefix}.messages.required`);\n return {\n success: false,\n message: { text: message ?? 'Jira base URL and personal access token are required.' },\n };\n }\n\n const probe = await this.commandService.executeRemote<\n { instanceUrl: string; token: string },\n { displayName?: string }\n >(AXEJiraCommandKeys.ConnectionValidate, { instanceUrl, token });\n if (!probe?.success) {\n if (existing) {\n await this.connectionManager.updateConnection(existing.id, {\n status: AXP_INTEGRATION_CONNECTION_STATUS.NotConnected,\n isRevoked: false,\n });\n }\n const code = typeof probe?.message?.text === 'string' ? probe.message.text : '';\n const messageKey =\n code === 'unauthorized' ? `${i18nPrefix}.messages.unauthorized` : `${i18nPrefix}.messages.unreachable`;\n const message = await this.translationService.translateAsync(messageKey);\n return { success: false, message: { text: message ?? 'Jira connection could not be verified.' } };\n }\n const probed = runtimeCommandPayloadData(probe);\n const accountName = trim(probed?.displayName ?? '') || instanceUrl;\n\n const connection = await this.connectionManager.upsertConnection({\n providerId,\n authMethodType: AXP_INTEGRATION_AUTH_METHOD_TYPE.Pat,\n connectionScope,\n connectionKey: 'default',\n displayName: defaultTo(trim(form.displayName), 'Jira'),\n instanceUrl,\n externalAccountName: accountName,\n config: {\n ...existingConfig,\n token,\n [AXE_JIRA_ASSIST_INSTRUCTIONS_FIELD]: trim(form.assistInstructions).slice(\n 0,\n AXE_JIRA_ASSIST_INSTRUCTIONS_MAX,\n ),\n },\n status: AXP_INTEGRATION_CONNECTION_STATUS.Connected,\n isRevoked: false,\n isDisabled: false,\n });\n\n this.toastService.success(\n await this.translationService.translateAsync(`${i18nPrefix}.messages.success`),\n );\n\n return {\n success: true,\n kind: 'object',\n data: { outcome: 'connected', connection: toSafeIntegrationConnectionDto(connection) },\n };\n } catch (error: unknown) {\n const message = await this.translationService.translateAsync(\n '@extensions-jira:integration.connect.messages.save-failed',\n );\n return {\n success: false,\n message: { text: message ?? (error instanceof Error ? error.message : 'Failed to connect Jira.') },\n };\n }\n }\n\n //#endregion\n\n //#region ---- Dialogs ----\n\n private async openPatDialog(input: {\n i18nPrefix: string;\n isReconfigure: boolean;\n context: JiraPatFormContext;\n }): Promise<JiraPatFormResult | null> {\n const instructions = await this.translationService.translateAsync(\n '@extensions-jira:integration.auth.pat.instructions',\n );\n\n const result = await this.layoutBuilder\n .create()\n .dialog<JiraPatFormResult | null>((dialog: IDialogBuilder<JiraPatFormResult | null>) => {\n dialog\n .setTitle(`${input.i18nPrefix}.pat-dialog.title`)\n .setSize('md')\n .setCloseButton(true)\n .setContext({ ...input.context })\n .content((flex: IFlexContainerBuilder) => {\n flex\n .setDirection('column')\n .setGap('12px')\n .customWidget('text-block-layout', { content: instructions ?? '' })\n .formField(`${input.i18nPrefix}.pat-dialog.fields.display-name`, (field: IFormFieldBuilder) => {\n field.path('displayName');\n field.textBox({ placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.display-name` });\n })\n .formField(`${input.i18nPrefix}.pat-dialog.fields.instance-url`, (field) => {\n field.path('instanceUrl');\n field.textBox({\n placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.instance-url`,\n validations: [\n { rule: 'required' },\n {\n rule: 'regex',\n options: {\n pattern: JIRA_INSTANCE_URL_PATTERN,\n message: JIRA_INSTANCE_URL_MESSAGE,\n },\n },\n ],\n });\n })\n .formField(`${input.i18nPrefix}.pat-dialog.fields.token`, (field) => {\n field.path('token');\n field.passwordBox({\n placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.token`,\n revealToggle: true,\n validations: input.isReconfigure ? [] : [{ rule: 'required' }],\n });\n })\n .formField(`${input.i18nPrefix}.pat-dialog.fields.assist-instructions`, (field) => {\n field.path('assistInstructions');\n field.largeTextBox({\n rows: 4,\n maxLength: AXE_JIRA_ASSIST_INSTRUCTIONS_MAX,\n placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.assist-instructions`,\n });\n });\n })\n .setActions((actions: IActionBuilder) => {\n actions\n .cancel('@general:actions.cancel.title')\n .submit(`${input.i18nPrefix}.pat-dialog.actions.save`);\n })\n .onAction(async (ref: AXPDialogRef) => {\n if (ref.action() === 'cancel') {\n return null;\n }\n const ctx = ref.context() as JiraPatFormContext;\n const token = trim(ctx.token);\n const instanceUrl = trim(ctx.instanceUrl);\n if (!instanceUrl || (!token && !input.isReconfigure)) {\n const message = await this.translationService.translateAsync(`${input.i18nPrefix}.messages.required`);\n throw new Error(message ?? 'Jira base URL and personal access token are required.');\n }\n if (!isJiraInstanceUrl(instanceUrl)) {\n const message = await this.translationService.translateAsync(`${input.i18nPrefix}.messages.invalid-url`);\n throw new Error(message ?? 'Enter a valid URL starting with http:// or https://.');\n }\n return {\n displayName: trim(ctx.displayName),\n instanceUrl,\n token,\n assistInstructions: trim(ctx.assistInstructions),\n };\n });\n })\n .show();\n\n return resolveLayoutBuilderDialogResult<JiraPatFormResult>(result);\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ export { AXE_PM_PROJECT_SYNC_STRATEGIES as AXE_JIRA_PROJECT_SYNC_STRATEGIES } fr
4
4
  const config = {
5
5
  i18n: 'extensions-jira',
6
6
  };
7
- /** Logical module name (PascalCase) — matches entity-storage API naming (`JiraExtension.JiraInstance`). */
7
+ /** Logical module name (PascalCase). Credentials live on IntegrationManagement.IntegrationConnection. */
8
8
  const MODULE_NAME = 'JiraExtension';
9
9
  const RootConfig = {
10
10
  config,
@@ -13,74 +13,74 @@ const RootConfig = {
13
13
  title: `@${config.i18n}:integration.display-name`,
14
14
  icon: 'fa-brands fa-jira',
15
15
  },
16
- entities: {
17
- jiraInstance: {
18
- name: 'JiraInstance',
19
- fullName: `${MODULE_NAME}.JiraInstance`,
20
- title: `@${config.i18n}:instances.entities.instance.title`,
21
- titlePlural: `@${config.i18n}:instances.entities.instance.plural`,
22
- icon: 'fa-light fa-server',
23
- },
24
- jiraProject: {
25
- name: 'JiraProject',
26
- fullName: `${MODULE_NAME}.JiraProject`,
27
- title: `@${config.i18n}:project-links.entities.project-link.title`,
28
- titlePlural: `@${config.i18n}:project-links.entities.project-link.plural`,
29
- icon: 'fa-light fa-link',
30
- },
31
- jiraIssueType: {
32
- name: 'JiraIssueType',
33
- fullName: `${MODULE_NAME}.JiraIssueType`,
34
- title: `@${config.i18n}:issue-types.entities.issue-type.title`,
35
- titlePlural: `@${config.i18n}:issue-types.entities.issue-type.plural`,
36
- icon: 'fa-light fa-list-tree',
37
- },
38
- jiraField: {
39
- name: 'JiraField',
40
- fullName: `${MODULE_NAME}.JiraField`,
41
- title: `@${config.i18n}:fields.entities.field.title`,
42
- titlePlural: `@${config.i18n}:fields.entities.field.plural`,
43
- icon: 'fa-light fa-input-text',
44
- },
45
- jiraProjectIssueType: {
46
- name: 'JiraProjectIssueType',
47
- fullName: `${MODULE_NAME}.JiraProjectIssueType`,
48
- title: `@${config.i18n}:project-issue-types.entities.project-issue-type.title`,
49
- titlePlural: `@${config.i18n}:project-issue-types.entities.project-issue-type.plural`,
50
- icon: 'fa-light fa-link',
51
- },
52
- jiraProjectIssueTypeField: {
53
- name: 'JiraProjectIssueTypeField',
54
- fullName: `${MODULE_NAME}.JiraProjectIssueTypeField`,
55
- title: `@${config.i18n}:project-issue-type-fields.entities.project-issue-type-field.title`,
56
- titlePlural: `@${config.i18n}:project-issue-type-fields.entities.project-issue-type-field.plural`,
57
- icon: 'fa-light fa-table-columns',
58
- },
59
- jiraWorkflowStatus: {
60
- name: 'JiraWorkflowStatus',
61
- fullName: `${MODULE_NAME}.JiraWorkflowStatus`,
62
- title: `@${config.i18n}:workflow-statuses.entities.workflow-status.title`,
63
- titlePlural: `@${config.i18n}:workflow-statuses.entities.workflow-status.plural`,
64
- icon: 'fa-light fa-circle-dot',
65
- },
66
- jiraIssue: {
67
- name: 'JiraIssue',
68
- fullName: `${MODULE_NAME}.JiraIssue`,
69
- title: `@${config.i18n}:issues.entities.issue.title`,
70
- titlePlural: `@${config.i18n}:issues.entities.issue.plural`,
71
- icon: 'fa-light fa-ticket',
72
- },
73
- jiraWorklog: {
74
- name: 'JiraWorklog',
75
- fullName: `${MODULE_NAME}.JiraWorklog`,
76
- title: `@${config.i18n}:worklogs.entities.worklog.title`,
77
- titlePlural: `@${config.i18n}:worklogs.entities.worklog.plural`,
78
- icon: 'fa-light fa-clock',
79
- },
80
- },
81
16
  };
82
17
  //#endregion
83
18
 
19
+ //#region ---- Identity ----
20
+ /** Stable `AiManagement.Assist` id. The catalog row is shared; credentials stay on the user connection. */
21
+ const AXE_JIRA_ASSIST_ID = 'b0000001-0000-4000-8000-000000000006';
22
+ /** Programmatic assist name (`AiManagement.Assist.name`). */
23
+ const AXE_JIRA_ASSIST_NAME = 'jira-assistant';
24
+ const AXE_JIRA_SKILL_ID = 'e0000001-0000-4000-8000-000000000020';
25
+ const AXE_JIRA_SKILL_NAME = 'jira-issues';
26
+ /** `IntegrationConnection.config` field for this user's standing assist instructions. */
27
+ const AXE_JIRA_ASSIST_INSTRUCTIONS_FIELD = 'assistInstructions';
28
+ const AXE_JIRA_ASSIST_INSTRUCTIONS_MAX = 4000;
29
+ //#endregion
30
+
31
+ //#region ---- Imports ----
32
+ //#endregion
33
+ //#region ---- Playbook ----
34
+ const AXE_JIRA_SKILL_MARKDOWN = [
35
+ '## Jira issues',
36
+ '',
37
+ 'Follow this playbook when the user asks about their Jira issues, or asks to create or edit one.',
38
+ '',
39
+ '### Hard rules',
40
+ '- The Jira token belongs to the signed-in user. Never ask for it and never put it in the answer.',
41
+ '- Your first action for a Jira fact is a tool call. Do not invent keys, summaries, statuses, or counts.',
42
+ '- `jira-extension.Issue:Search` and `jira-extension.Issue:Get` are read-only queries.',
43
+ '- `jira-extension.Issue:Create` and `jira-extension.Issue:Update` change Jira. Call them only when the user asked to create or edit.',
44
+ '- All four tools already use that user\'s saved connection.',
45
+ '- These tools do not change status, add a comment, or write a worklog.',
46
+ '- If the tool returns `not-connected`, say the user must connect Jira in their settings. Stop.',
47
+ '- Follow the **User instructions** section in the system prompt, and `userInstructions` on a tool result, unless they conflict with a tool result.',
48
+ '',
49
+ '### Read',
50
+ '1. Open issues with no JQL named: call `jira-extension.Issue:Search` with `jql` = `assignee = currentUser() AND resolution = Unresolved ORDER BY updated DESC`.',
51
+ '2. A named filter (project, status, text): put it in `jql`. Keep `maxResults` at 10 unless the user asked for more (maximum 20).',
52
+ '3. One issue key (for example `ACOREX-123`): call `jira-extension.Issue:Get` with `issueKey`. Do not search first when the key is already known.',
53
+ '4. Answer from `data.issues` or `data.issue` only. Quote the key. If `total` is larger than the list, say there are more.',
54
+ '',
55
+ '### Create',
56
+ '1. Call `jira-extension.Issue:Create` only after the user asked to create an issue.',
57
+ '2. Required: `projectKey`, `issueType` (the type name, such as Bug or Task), and `summary`. If one is missing, ask the user. Do not guess a project or type.',
58
+ '3. Optional: `description`, `assignee` (Jira username on this server), `priority` (priority name).',
59
+ '4. On success, quote `data.key`. On `project-key-required`, `issue-type-required`, or `summary-required`, ask for that value. Any other error text is Jira\'s message: show it and stop.',
60
+ '',
61
+ '### Edit',
62
+ '1. Call `jira-extension.Issue:Update` only after the user asked to change an existing issue.',
63
+ '2. Required: `issueKey`. Send only the fields the user named: `summary`, `description`, `assignee`, `priority`.',
64
+ '3. On success, confirm `data.key` and the fields sent. On `invalid-key` or `nothing-to-update`, ask for the missing value. Any other error text is Jira\'s message: show it and stop.',
65
+ ].join('\n');
66
+ /** Playbook attached to `jira-assistant`. Seeded as an `AiManagement.Skill` row. */
67
+ const AXE_JIRA_SKILL_ROWS = [
68
+ {
69
+ id: AXE_JIRA_SKILL_ID,
70
+ name: AXE_JIRA_SKILL_NAME,
71
+ title: {
72
+ 'en-US': 'Jira Issues',
73
+ 'fa-IR': 'مسئله‌های جیرا',
74
+ },
75
+ description: {
76
+ 'en-US': 'Use when the user asks about their Jira issues, or asks to create or edit one. Uses the signed-in user connection. Do not ask for a token.',
77
+ 'fa-IR': 'وقتی کاربر درباره مسئله‌های جیرای خودش می‌پرسد، یا می‌خواهد یکی بسازد یا ویرایش کند. با اتصال همان کاربر. توکن نخواه.',
78
+ },
79
+ markdown: AXE_JIRA_SKILL_MARKDOWN,
80
+ },
81
+ ];
82
+ //#endregion
83
+
84
84
  //#region ---- Imports ----
85
85
  //#endregion
86
86
  //#region ---- Manifest ----
@@ -99,6 +99,9 @@ const JiraExtensionManifest = {
99
99
  //#region ---- Command Keys ----
100
100
  const AXEJiraCommandKeys = {
101
101
  ConnectionConnect: 'jira-extension.Connection:Connect',
102
+ ConnectionValidate: 'jira-extension.Connection:Validate',
103
+ IssueCreate: 'jira-extension.Issue:Create',
104
+ IssueUpdate: 'jira-extension.Issue:Update',
102
105
  ProjectImportFromJira: 'jira-extension.Project:ImportFromJira',
103
106
  ProjectSync: 'jira-extension.Project:Sync',
104
107
  };
@@ -107,6 +110,8 @@ const AXEJiraCommandKeys = {
107
110
  //#region ---- Query Keys ----
108
111
  const AXEJiraQueryKeys = {
109
112
  ProjectListRemote: 'jira-extension.Project:ListRemote',
113
+ IssueSearch: 'jira-extension.Issue:Search',
114
+ IssueGet: 'jira-extension.Issue:Get',
110
115
  };
111
116
  //#endregion
112
117
 
@@ -199,5 +204,5 @@ const AXEJiraPermissions = {
199
204
  * Generated bundle index. Do not edit.
200
205
  */
201
206
 
202
- export { AXEJiraCommandKeys, AXEJiraMenuKeys, AXEJiraPermissions, AXEJiraQueryKeys, AXPAdministrationPermissionKeys, JiraExtensionManifest, RootConfig };
207
+ export { AXEJiraCommandKeys, AXEJiraMenuKeys, AXEJiraPermissions, AXEJiraQueryKeys, AXE_JIRA_ASSIST_ID, AXE_JIRA_ASSIST_INSTRUCTIONS_FIELD, AXE_JIRA_ASSIST_INSTRUCTIONS_MAX, AXE_JIRA_ASSIST_NAME, AXE_JIRA_SKILL_ID, AXE_JIRA_SKILL_MARKDOWN, AXE_JIRA_SKILL_NAME, AXE_JIRA_SKILL_ROWS, AXPAdministrationPermissionKeys, JiraExtensionManifest, RootConfig };
203
208
  //# sourceMappingURL=acorex-platform-extension-project-management-jira-client-contracts.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-extension-project-management-jira-client-contracts.mjs","sources":["../../../../libs/extensions/project-management/jira/contracts/src/root-config.ts","../../../../libs/extensions/project-management/jira/contracts/src/manifest.ts","../../../../libs/extensions/project-management/jira/contracts/src/commands.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/queries.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/menu.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/permission.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/project-sync.api.types.ts","../../../../libs/extensions/project-management/jira/contracts/src/acorex-platform-extension-project-management-jira-client-contracts.ts"],"sourcesContent":["//#region ---- Module Config ----\n\nconst config = {\n i18n: 'extensions-jira',\n};\n\n/** Logical module name (PascalCase) — matches entity-storage API naming (`JiraExtension.JiraInstance`). */\nconst MODULE_NAME = 'JiraExtension';\n\nexport const RootConfig = {\n config,\n module: {\n name: MODULE_NAME,\n title: `@${config.i18n}:integration.display-name`,\n icon: 'fa-brands fa-jira',\n },\n entities: {\n jiraInstance: {\n name: 'JiraInstance',\n fullName: `${MODULE_NAME}.JiraInstance`,\n title: `@${config.i18n}:instances.entities.instance.title`,\n titlePlural: `@${config.i18n}:instances.entities.instance.plural`,\n icon: 'fa-light fa-server',\n },\n jiraProject: {\n name: 'JiraProject',\n fullName: `${MODULE_NAME}.JiraProject`,\n title: `@${config.i18n}:project-links.entities.project-link.title`,\n titlePlural: `@${config.i18n}:project-links.entities.project-link.plural`,\n icon: 'fa-light fa-link',\n },\n jiraIssueType: {\n name: 'JiraIssueType',\n fullName: `${MODULE_NAME}.JiraIssueType`,\n title: `@${config.i18n}:issue-types.entities.issue-type.title`,\n titlePlural: `@${config.i18n}:issue-types.entities.issue-type.plural`,\n icon: 'fa-light fa-list-tree',\n },\n jiraField: {\n name: 'JiraField',\n fullName: `${MODULE_NAME}.JiraField`,\n title: `@${config.i18n}:fields.entities.field.title`,\n titlePlural: `@${config.i18n}:fields.entities.field.plural`,\n icon: 'fa-light fa-input-text',\n },\n jiraProjectIssueType: {\n name: 'JiraProjectIssueType',\n fullName: `${MODULE_NAME}.JiraProjectIssueType`,\n title: `@${config.i18n}:project-issue-types.entities.project-issue-type.title`,\n titlePlural: `@${config.i18n}:project-issue-types.entities.project-issue-type.plural`,\n icon: 'fa-light fa-link',\n },\n jiraProjectIssueTypeField: {\n name: 'JiraProjectIssueTypeField',\n fullName: `${MODULE_NAME}.JiraProjectIssueTypeField`,\n title: `@${config.i18n}:project-issue-type-fields.entities.project-issue-type-field.title`,\n titlePlural: `@${config.i18n}:project-issue-type-fields.entities.project-issue-type-field.plural`,\n icon: 'fa-light fa-table-columns',\n },\n jiraWorkflowStatus: {\n name: 'JiraWorkflowStatus',\n fullName: `${MODULE_NAME}.JiraWorkflowStatus`,\n title: `@${config.i18n}:workflow-statuses.entities.workflow-status.title`,\n titlePlural: `@${config.i18n}:workflow-statuses.entities.workflow-status.plural`,\n icon: 'fa-light fa-circle-dot',\n },\n jiraIssue: {\n name: 'JiraIssue',\n fullName: `${MODULE_NAME}.JiraIssue`,\n title: `@${config.i18n}:issues.entities.issue.title`,\n titlePlural: `@${config.i18n}:issues.entities.issue.plural`,\n icon: 'fa-light fa-ticket',\n },\n jiraWorklog: {\n name: 'JiraWorklog',\n fullName: `${MODULE_NAME}.JiraWorklog`,\n title: `@${config.i18n}:worklogs.entities.worklog.title`,\n titlePlural: `@${config.i18n}:worklogs.entities.worklog.plural`,\n icon: 'fa-light fa-clock',\n },\n },\n};\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-shared/core';\nimport { RootConfig } from './root-config';\n\n//#endregion\n\n//#region ---- Manifest ----\n\nexport const JiraExtensionManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n type: 'integration',\n domain: 'project-management',\n dependencies: [],\n};\n\n//#endregion\n","//#region ---- Command Keys ----\n\nexport const AXEJiraCommandKeys = {\n ConnectionConnect: 'jira-extension.Connection:Connect',\n ProjectImportFromJira: 'jira-extension.Project:ImportFromJira',\n ProjectSync: 'jira-extension.Project:Sync',\n} as const;\n\n//#endregion\n","//#region ---- Query Keys ----\n\nexport const AXEJiraQueryKeys = {\n ProjectListRemote: 'jira-extension.Project:ListRemote',\n} as const;\n\n//#endregion\n","//#region ---- Menu Keys ----\n\nexport const AXEJiraMenuKeys = {\n JiraExtensionConfig: 'jira-extension:Menu:Configuration',\n Instances: 'jira-extension:Menu:Instances',\n IssueTypes: 'jira-extension:Menu:IssueTypes',\n Fields: 'jira-extension:Menu:Fields',\n Issues: 'jira-extension:Menu:Issues',\n Worklogs: 'jira-extension:Menu:Worklogs',\n} as const;\n\n//#endregion\n","//#region ---- Permission Keys ----\n\n/**\n * Administration capabilities used by this extension.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n */\nexport const AXPAdministrationPermissionKeys = {\n Access: 'Administration:Permission:Access',\n MaintainUsersAndRoles: 'Administration:Permission:MaintainUsersAndRoles',\n ManageSessions: 'Administration:Permission:ManageSessions',\n MaintainPolicies: 'Administration:Permission:MaintainPolicies',\n ViewIntegrations: 'Administration:Permission:ViewIntegrations',\n MaintainConnections: 'Administration:Permission:MaintainConnections',\n ManageIntegrationActions: 'Administration:Permission:ManageIntegrationActions',\n MaintainWorkflows: 'Administration:Permission:MaintainWorkflows',\n ManageWorkflowActions: 'Administration:Permission:ManageWorkflowActions',\n ViewRules: 'Administration:Permission:ViewRules',\n MaintainRules: 'Administration:Permission:MaintainRules',\n ManageRuleActions: 'Administration:Permission:ManageRuleActions',\n MaintainAi: 'Administration:Permission:MaintainAi',\n UseAiAssist: 'Administration:Permission:UseAiAssist',\n MaintainDashboards: 'Administration:Permission:MaintainDashboards',\n ViewJobs: 'Administration:Permission:ViewJobs',\n ManageJobActions: 'Administration:Permission:ManageJobActions',\n ViewObservability: 'Administration:Permission:ViewObservability',\n MaintainObservability: 'Administration:Permission:MaintainObservability',\n} as const;\n\n/**\n * @deprecated Prefer {@link AXPAdministrationPermissionKeys}.\n * Legacy nested shape kept so existing imports compile during migration.\n */\nexport const AXEJiraPermissions = {\n JiraExtension: {\n Management: AXPAdministrationPermissionKeys.MaintainConnections,\n JiraInstance: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n JiraProject: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n JiraIssue: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n JiraWorklog: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n Catalog: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Manage: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n ProjectImport: {\n Execute: AXPAdministrationPermissionKeys.ManageIntegrationActions,\n },\n ProjectSync: {\n Execute: AXPAdministrationPermissionKeys.ManageIntegrationActions,\n },\n },\n} as const;\n\n//#endregion\n","//#region ---- Remote Jira project DTO ----\n\nimport type { AXEJiraProjectSyncStrategy } from './sync.types';\n\n/** Subset of Jira REST API project resource used for import/sync. */\nexport interface AXEJiraRemoteProject {\n id: string;\n key: string;\n name: string;\n description?: string | null;\n projectTypeKey?: string | null;\n style?: string | null;\n simplified?: boolean | null;\n lead?: {\n accountId?: string;\n displayName?: string;\n } | null;\n avatarUrls?: Record<string, string> | null;\n}\n\nexport type AXEJiraProjectImportStatus = 'imported' | 'not_imported';\n\nexport interface AXEJiraRemoteProjectListItem extends AXEJiraRemoteProject {\n importStatus: AXEJiraProjectImportStatus;\n platformProjectId?: string | null;\n}\n\n//#endregion\n\n//#region ---- API request / response ----\n\nexport interface AXEJiraListRemoteProjectsRequest {\n instanceId?: string;\n}\n\nexport interface AXEJiraListRemoteProjectsResponse {\n instanceId: string;\n projects: AXEJiraRemoteProjectListItem[];\n}\n\nexport interface AXEJiraProjectImportRowInput {\n remote: AXEJiraRemoteProject;\n selected: boolean;\n syncStrategy: AXEJiraProjectSyncStrategy;\n existingPlatformProjectId?: string | null;\n}\n\nexport interface AXEJiraImportProjectsRequest {\n instanceId?: string;\n defaultProjectTypeId: string;\n rows: AXEJiraProjectImportRowInput[];\n}\n\nexport interface AXEJiraProjectImportResult {\n imported: number;\n updated: number;\n skipped: number;\n issuesImported?: number;\n issuesUpdated?: number;\n issuesRemoved?: number;\n worklogsImported?: number;\n worklogsUpdated?: number;\n}\n\nexport interface AXEJiraSyncPlatformProjectRequest {\n platformProjectId: string;\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-extension-project-management-jira-client-contracts.mjs","sources":["../../../../libs/extensions/project-management/jira/contracts/src/root-config.ts","../../../../libs/extensions/project-management/jira/contracts/src/jira-assist.metadata.ts","../../../../libs/extensions/project-management/jira/contracts/src/jira-assist.skill.ts","../../../../libs/extensions/project-management/jira/contracts/src/manifest.ts","../../../../libs/extensions/project-management/jira/contracts/src/commands.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/queries.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/menu.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/permission.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/project-sync.api.types.ts","../../../../libs/extensions/project-management/jira/contracts/src/acorex-platform-extension-project-management-jira-client-contracts.ts"],"sourcesContent":["//#region ---- Module Config ----\n\nconst config = {\n i18n: 'extensions-jira',\n};\n\n/** Logical module name (PascalCase). Credentials live on IntegrationManagement.IntegrationConnection. */\nconst MODULE_NAME = 'JiraExtension';\n\nexport const RootConfig = {\n config,\n module: {\n name: MODULE_NAME,\n title: `@${config.i18n}:integration.display-name`,\n icon: 'fa-brands fa-jira',\n },\n};\n\n//#endregion\n","//#region ---- Identity ----\n\n/** Stable `AiManagement.Assist` id. The catalog row is shared; credentials stay on the user connection. */\nexport const AXE_JIRA_ASSIST_ID = 'b0000001-0000-4000-8000-000000000006';\n\n/** Programmatic assist name (`AiManagement.Assist.name`). */\nexport const AXE_JIRA_ASSIST_NAME = 'jira-assistant';\n\nexport const AXE_JIRA_SKILL_ID = 'e0000001-0000-4000-8000-000000000020';\n\nexport const AXE_JIRA_SKILL_NAME = 'jira-issues';\n\n/** `IntegrationConnection.config` field for this user's standing assist instructions. */\nexport const AXE_JIRA_ASSIST_INSTRUCTIONS_FIELD = 'assistInstructions';\n\nexport const AXE_JIRA_ASSIST_INSTRUCTIONS_MAX = 4000;\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXE_JIRA_SKILL_ID, AXE_JIRA_SKILL_NAME } from './jira-assist.metadata';\n\n//#endregion\n\n//#region ---- Playbook ----\n\nexport const AXE_JIRA_SKILL_MARKDOWN = [\n '## Jira issues',\n '',\n 'Follow this playbook when the user asks about their Jira issues, or asks to create or edit one.',\n '',\n '### Hard rules',\n '- The Jira token belongs to the signed-in user. Never ask for it and never put it in the answer.',\n '- Your first action for a Jira fact is a tool call. Do not invent keys, summaries, statuses, or counts.',\n '- `jira-extension.Issue:Search` and `jira-extension.Issue:Get` are read-only queries.',\n '- `jira-extension.Issue:Create` and `jira-extension.Issue:Update` change Jira. Call them only when the user asked to create or edit.',\n '- All four tools already use that user\\'s saved connection.',\n '- These tools do not change status, add a comment, or write a worklog.',\n '- If the tool returns `not-connected`, say the user must connect Jira in their settings. Stop.',\n '- Follow the **User instructions** section in the system prompt, and `userInstructions` on a tool result, unless they conflict with a tool result.',\n '',\n '### Read',\n '1. Open issues with no JQL named: call `jira-extension.Issue:Search` with `jql` = `assignee = currentUser() AND resolution = Unresolved ORDER BY updated DESC`.',\n '2. A named filter (project, status, text): put it in `jql`. Keep `maxResults` at 10 unless the user asked for more (maximum 20).',\n '3. One issue key (for example `ACOREX-123`): call `jira-extension.Issue:Get` with `issueKey`. Do not search first when the key is already known.',\n '4. Answer from `data.issues` or `data.issue` only. Quote the key. If `total` is larger than the list, say there are more.',\n '',\n '### Create',\n '1. Call `jira-extension.Issue:Create` only after the user asked to create an issue.',\n '2. Required: `projectKey`, `issueType` (the type name, such as Bug or Task), and `summary`. If one is missing, ask the user. Do not guess a project or type.',\n '3. Optional: `description`, `assignee` (Jira username on this server), `priority` (priority name).',\n '4. On success, quote `data.key`. On `project-key-required`, `issue-type-required`, or `summary-required`, ask for that value. Any other error text is Jira\\'s message: show it and stop.',\n '',\n '### Edit',\n '1. Call `jira-extension.Issue:Update` only after the user asked to change an existing issue.',\n '2. Required: `issueKey`. Send only the fields the user named: `summary`, `description`, `assignee`, `priority`.',\n '3. On success, confirm `data.key` and the fields sent. On `invalid-key` or `nothing-to-update`, ask for the missing value. Any other error text is Jira\\'s message: show it and stop.',\n].join('\\n');\n\n/** Playbook attached to `jira-assistant`. Seeded as an `AiManagement.Skill` row. */\nexport const AXE_JIRA_SKILL_ROWS = [\n {\n id: AXE_JIRA_SKILL_ID,\n name: AXE_JIRA_SKILL_NAME,\n title: {\n 'en-US': 'Jira Issues',\n 'fa-IR': 'مسئله‌های جیرا',\n },\n description: {\n 'en-US':\n 'Use when the user asks about their Jira issues, or asks to create or edit one. Uses the signed-in user connection. Do not ask for a token.',\n 'fa-IR':\n 'وقتی کاربر درباره مسئله‌های جیرای خودش می‌پرسد، یا می‌خواهد یکی بسازد یا ویرایش کند. با اتصال همان کاربر. توکن نخواه.',\n },\n markdown: AXE_JIRA_SKILL_MARKDOWN,\n },\n];\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-shared/core';\nimport { RootConfig } from './root-config';\n\n//#endregion\n\n//#region ---- Manifest ----\n\nexport const JiraExtensionManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n type: 'integration',\n domain: 'project-management',\n dependencies: [],\n};\n\n//#endregion\n","//#region ---- Command Keys ----\n\nexport const AXEJiraCommandKeys = {\n ConnectionConnect: 'jira-extension.Connection:Connect',\n ConnectionValidate: 'jira-extension.Connection:Validate',\n IssueCreate: 'jira-extension.Issue:Create',\n IssueUpdate: 'jira-extension.Issue:Update',\n ProjectImportFromJira: 'jira-extension.Project:ImportFromJira',\n ProjectSync: 'jira-extension.Project:Sync',\n} as const;\n\n//#endregion\n","//#region ---- Query Keys ----\n\nexport const AXEJiraQueryKeys = {\n ProjectListRemote: 'jira-extension.Project:ListRemote',\n IssueSearch: 'jira-extension.Issue:Search',\n IssueGet: 'jira-extension.Issue:Get',\n} as const;\n\n//#endregion\n","//#region ---- Menu Keys ----\n\nexport const AXEJiraMenuKeys = {\n JiraExtensionConfig: 'jira-extension:Menu:Configuration',\n Instances: 'jira-extension:Menu:Instances',\n IssueTypes: 'jira-extension:Menu:IssueTypes',\n Fields: 'jira-extension:Menu:Fields',\n Issues: 'jira-extension:Menu:Issues',\n Worklogs: 'jira-extension:Menu:Worklogs',\n} as const;\n\n//#endregion\n","//#region ---- Permission Keys ----\n\n/**\n * Administration capabilities used by this extension.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n */\nexport const AXPAdministrationPermissionKeys = {\n Access: 'Administration:Permission:Access',\n MaintainUsersAndRoles: 'Administration:Permission:MaintainUsersAndRoles',\n ManageSessions: 'Administration:Permission:ManageSessions',\n MaintainPolicies: 'Administration:Permission:MaintainPolicies',\n ViewIntegrations: 'Administration:Permission:ViewIntegrations',\n MaintainConnections: 'Administration:Permission:MaintainConnections',\n ManageIntegrationActions: 'Administration:Permission:ManageIntegrationActions',\n MaintainWorkflows: 'Administration:Permission:MaintainWorkflows',\n ManageWorkflowActions: 'Administration:Permission:ManageWorkflowActions',\n ViewRules: 'Administration:Permission:ViewRules',\n MaintainRules: 'Administration:Permission:MaintainRules',\n ManageRuleActions: 'Administration:Permission:ManageRuleActions',\n MaintainAi: 'Administration:Permission:MaintainAi',\n UseAiAssist: 'Administration:Permission:UseAiAssist',\n MaintainDashboards: 'Administration:Permission:MaintainDashboards',\n ViewJobs: 'Administration:Permission:ViewJobs',\n ManageJobActions: 'Administration:Permission:ManageJobActions',\n ViewObservability: 'Administration:Permission:ViewObservability',\n MaintainObservability: 'Administration:Permission:MaintainObservability',\n} as const;\n\n/**\n * @deprecated Prefer {@link AXPAdministrationPermissionKeys}.\n * Legacy nested shape kept so existing imports compile during migration.\n */\nexport const AXEJiraPermissions = {\n JiraExtension: {\n Management: AXPAdministrationPermissionKeys.MaintainConnections,\n JiraInstance: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n JiraProject: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n JiraIssue: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n JiraWorklog: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n Catalog: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Manage: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n ProjectImport: {\n Execute: AXPAdministrationPermissionKeys.ManageIntegrationActions,\n },\n ProjectSync: {\n Execute: AXPAdministrationPermissionKeys.ManageIntegrationActions,\n },\n },\n} as const;\n\n//#endregion\n","//#region ---- Remote Jira project DTO ----\n\nimport type { AXEJiraProjectSyncStrategy } from './sync.types';\n\n/** Subset of Jira REST API project resource used for import/sync. */\nexport interface AXEJiraRemoteProject {\n id: string;\n key: string;\n name: string;\n description?: string | null;\n projectTypeKey?: string | null;\n style?: string | null;\n simplified?: boolean | null;\n lead?: {\n accountId?: string;\n displayName?: string;\n } | null;\n avatarUrls?: Record<string, string> | null;\n}\n\nexport type AXEJiraProjectImportStatus = 'imported' | 'not_imported';\n\nexport interface AXEJiraRemoteProjectListItem extends AXEJiraRemoteProject {\n importStatus: AXEJiraProjectImportStatus;\n platformProjectId?: string | null;\n}\n\n//#endregion\n\n//#region ---- API request / response ----\n\nexport interface AXEJiraListRemoteProjectsRequest {\n instanceId?: string;\n}\n\nexport interface AXEJiraListRemoteProjectsResponse {\n instanceId: string;\n projects: AXEJiraRemoteProjectListItem[];\n}\n\nexport interface AXEJiraProjectImportRowInput {\n remote: AXEJiraRemoteProject;\n selected: boolean;\n syncStrategy: AXEJiraProjectSyncStrategy;\n existingPlatformProjectId?: string | null;\n}\n\nexport interface AXEJiraImportProjectsRequest {\n instanceId?: string;\n defaultProjectTypeId: string;\n rows: AXEJiraProjectImportRowInput[];\n}\n\nexport interface AXEJiraProjectImportResult {\n imported: number;\n updated: number;\n skipped: number;\n issuesImported?: number;\n issuesUpdated?: number;\n issuesRemoved?: number;\n worklogsImported?: number;\n worklogsUpdated?: number;\n}\n\nexport interface AXEJiraSyncPlatformProjectRequest {\n platformProjectId: string;\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;AAAA;AAEA,MAAM,MAAM,GAAG;AACb,IAAA,IAAI,EAAE,iBAAiB;CACxB;AAED;AACA,MAAM,WAAW,GAAG,eAAe;AAE5B,MAAM,UAAU,GAAG;IACxB,MAAM;AACN,IAAA,MAAM,EAAE;AACN,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,KAAK,EAAE,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAA,yBAAA,CAA2B;AACjD,QAAA,IAAI,EAAE,mBAAmB;AAC1B,KAAA;;AAGH;;AClBA;AAEA;AACO,MAAM,kBAAkB,GAAG;AAElC;AACO,MAAM,oBAAoB,GAAG;AAE7B,MAAM,iBAAiB,GAAG;AAE1B,MAAM,mBAAmB,GAAG;AAEnC;AACO,MAAM,kCAAkC,GAAG;AAE3C,MAAM,gCAAgC,GAAG;AAEhD;;ACjBA;AAIA;AAEA;AAEO,MAAM,uBAAuB,GAAG;IACrC,gBAAgB;IAChB,EAAE;IACF,iGAAiG;IACjG,EAAE;IACF,gBAAgB;IAChB,kGAAkG;IAClG,yGAAyG;IACzG,uFAAuF;IACvF,sIAAsI;IACtI,6DAA6D;IAC7D,wEAAwE;IACxE,gGAAgG;IAChG,oJAAoJ;IACpJ,EAAE;IACF,UAAU;IACV,iKAAiK;IACjK,kIAAkI;IAClI,kJAAkJ;IAClJ,2HAA2H;IAC3H,EAAE;IACF,YAAY;IACZ,qFAAqF;IACrF,8JAA8J;IAC9J,oGAAoG;IACpG,0LAA0L;IAC1L,EAAE;IACF,UAAU;IACV,8FAA8F;IAC9F,iHAAiH;IACjH,uLAAuL;AACxL,CAAA,CAAC,IAAI,CAAC,IAAI;AAEX;AACO,MAAM,mBAAmB,GAAG;AACjC,IAAA;AACE,QAAA,EAAE,EAAE,iBAAiB;AACrB,QAAA,IAAI,EAAE,mBAAmB;AACzB,QAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAE,aAAa;AACtB,YAAA,OAAO,EAAE,gBAAgB;AAC1B,SAAA;AACD,QAAA,WAAW,EAAE;AACX,YAAA,OAAO,EACL,4IAA4I;AAC9I,YAAA,OAAO,EACL,uHAAuH;AAC1H,SAAA;AACD,QAAA,QAAQ,EAAE,uBAAuB;AAClC,KAAA;;AAGH;;AC5DA;AAKA;AAEA;AAEO,MAAM,qBAAqB,GAAsB;AACtD,IAAA,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;AAC5B,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK;AAC9B,IAAA,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;AAC5B,IAAA,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;AAC5B,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,MAAM,EAAE,oBAAoB;AAC5B,IAAA,YAAY,EAAE,EAAE;;AAGlB;;ACpBA;AAEO,MAAM,kBAAkB,GAAG;AAChC,IAAA,iBAAiB,EAAE,mCAAmC;AACtD,IAAA,kBAAkB,EAAE,oCAAoC;AACxD,IAAA,WAAW,EAAE,6BAA6B;AAC1C,IAAA,WAAW,EAAE,6BAA6B;AAC1C,IAAA,qBAAqB,EAAE,uCAAuC;AAC9D,IAAA,WAAW,EAAE,6BAA6B;;AAG5C;;ACXA;AAEO,MAAM,gBAAgB,GAAG;AAC9B,IAAA,iBAAiB,EAAE,mCAAmC;AACtD,IAAA,WAAW,EAAE,6BAA6B;AAC1C,IAAA,QAAQ,EAAE,0BAA0B;;AAGtC;;ACRA;AAEO,MAAM,eAAe,GAAG;AAC7B,IAAA,mBAAmB,EAAE,mCAAmC;AACxD,IAAA,SAAS,EAAE,+BAA+B;AAC1C,IAAA,UAAU,EAAE,gCAAgC;AAC5C,IAAA,MAAM,EAAE,4BAA4B;AACpC,IAAA,MAAM,EAAE,4BAA4B;AACpC,IAAA,QAAQ,EAAE,8BAA8B;;AAG1C;;ACXA;AAEA;;;AAGG;AACI,MAAM,+BAA+B,GAAG;AAC7C,IAAA,MAAM,EAAE,kCAAkC;AAC1C,IAAA,qBAAqB,EAAE,iDAAiD;AACxE,IAAA,cAAc,EAAE,0CAA0C;AAC1D,IAAA,gBAAgB,EAAE,4CAA4C;AAC9D,IAAA,gBAAgB,EAAE,4CAA4C;AAC9D,IAAA,mBAAmB,EAAE,+CAA+C;AACpE,IAAA,wBAAwB,EAAE,oDAAoD;AAC9E,IAAA,iBAAiB,EAAE,6CAA6C;AAChE,IAAA,qBAAqB,EAAE,iDAAiD;AACxE,IAAA,SAAS,EAAE,qCAAqC;AAChD,IAAA,aAAa,EAAE,yCAAyC;AACxD,IAAA,iBAAiB,EAAE,6CAA6C;AAChE,IAAA,UAAU,EAAE,sCAAsC;AAClD,IAAA,WAAW,EAAE,uCAAuC;AACpD,IAAA,kBAAkB,EAAE,8CAA8C;AAClE,IAAA,QAAQ,EAAE,oCAAoC;AAC9C,IAAA,gBAAgB,EAAE,4CAA4C;AAC9D,IAAA,iBAAiB,EAAE,6CAA6C;AAChE,IAAA,qBAAqB,EAAE,iDAAiD;;AAG1E;;;AAGG;AACI,MAAM,kBAAkB,GAAG;AAChC,IAAA,aAAa,EAAE;QACb,UAAU,EAAE,+BAA+B,CAAC,mBAAmB;AAC/D,QAAA,YAAY,EAAE;YACZ,IAAI,EAAE,+BAA+B,CAAC,gBAAgB;YACtD,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;YAC3D,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;YAC3D,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;AAC5D,SAAA;AACD,QAAA,WAAW,EAAE;YACX,IAAI,EAAE,+BAA+B,CAAC,gBAAgB;YACtD,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;YAC3D,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;YAC3D,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;AAC5D,SAAA;AACD,QAAA,SAAS,EAAE;YACT,IAAI,EAAE,+BAA+B,CAAC,gBAAgB;YACtD,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;YAC3D,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;YAC3D,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;AAC5D,SAAA;AACD,QAAA,WAAW,EAAE;YACX,IAAI,EAAE,+BAA+B,CAAC,gBAAgB;YACtD,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;YAC3D,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;YAC3D,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;AAC5D,SAAA;AACD,QAAA,OAAO,EAAE;YACP,IAAI,EAAE,+BAA+B,CAAC,gBAAgB;YACtD,MAAM,EAAE,+BAA+B,CAAC,mBAAmB;AAC5D,SAAA;AACD,QAAA,aAAa,EAAE;YACb,OAAO,EAAE,+BAA+B,CAAC,wBAAwB;AAClE,SAAA;AACD,QAAA,WAAW,EAAE;YACX,OAAO,EAAE,+BAA+B,CAAC,wBAAwB;AAClE,SAAA;AACF,KAAA;;AAGH;;ACxEA;AAoEA;;ACpEA;;AAEG;;"}