@bike4mind/cli 0.2.30-subagent-delegation.19188 → 0.2.31-b4m-cli-undo-command.19493
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/{artifactExtractor-YSZB7U2T.js → artifactExtractor-Z6CL6QFN.js} +1 -1
- package/dist/{chunk-44RZA4RG.js → chunk-2LLA4MTN.js} +2 -2
- package/dist/{chunk-TVW4ZESU.js → chunk-BYXFQJYT.js} +10 -1
- package/dist/{chunk-ICLEQOH6.js → chunk-GE7Q64MS.js} +1570 -5
- package/dist/{chunk-FLA4PWXB.js → chunk-RI45VJW3.js} +262 -34
- package/dist/{chunk-YNQB2RM7.js → chunk-T67NGQW6.js} +2 -2
- package/dist/{chunk-PP5WVA27.js → chunk-ZOWCX4MQ.js} +2 -2
- package/dist/{create-NX7AO3LR.js → create-JNUW7ICC.js} +3 -3
- package/dist/index.js +3118 -503
- package/dist/{llmMarkdownGenerator-BYSKH6JZ.js → llmMarkdownGenerator-KGA4HTQN.js} +1 -1
- package/dist/{markdownGenerator-25VAIDTL.js → markdownGenerator-ERG7FI5H.js} +1 -1
- package/dist/{mementoService-HY2ZPJF2.js → mementoService-I56R5DNA.js} +3 -3
- package/dist/{src-EIUJ74FN.js → src-EMANOLFK.js} +12 -2
- package/dist/{src-3JKTTJ5U.js → src-IAR65K73.js} +59 -1
- package/dist/{store-FU6NDC2W.js → store-K5MB3SE7.js} +1 -1
- package/dist/{subtractCredits-XU7WMHLE.js → subtractCredits-3MEQF5CV.js} +3 -3
- package/package.json +9 -9
|
@@ -171,6 +171,20 @@ var ChatModels;
|
|
|
171
171
|
})(ChatModels || (ChatModels = {}));
|
|
172
172
|
var CHAT_MODELS = Object.values(ChatModels);
|
|
173
173
|
var supportedChatModels = z.nativeEnum(ChatModels);
|
|
174
|
+
var REASONING_SUPPORTED_MODELS = /* @__PURE__ */ new Set([
|
|
175
|
+
ChatModels.O1,
|
|
176
|
+
ChatModels.O3_MINI,
|
|
177
|
+
ChatModels.O3,
|
|
178
|
+
ChatModels.O4_MINI,
|
|
179
|
+
ChatModels.GPT5,
|
|
180
|
+
ChatModels.GPT5_MINI,
|
|
181
|
+
ChatModels.GPT5_NANO,
|
|
182
|
+
ChatModels.GPT5_CHAT_LATEST,
|
|
183
|
+
ChatModels.GPT5_1,
|
|
184
|
+
ChatModels.GPT5_1_CHAT_LATEST,
|
|
185
|
+
ChatModels.GPT5_2,
|
|
186
|
+
ChatModels.GPT5_2_CHAT_LATEST
|
|
187
|
+
]);
|
|
174
188
|
var SpeechToTextModels;
|
|
175
189
|
(function(SpeechToTextModels2) {
|
|
176
190
|
SpeechToTextModels2["WHISPER_1"] = "whisper-1";
|
|
@@ -311,8 +325,14 @@ var b4mLLMTools = z5.enum([
|
|
|
311
325
|
"planet_visibility",
|
|
312
326
|
// Knowledge base search
|
|
313
327
|
"search_knowledge_base",
|
|
328
|
+
"retrieve_knowledge_content",
|
|
314
329
|
// Agent delegation
|
|
315
|
-
"delegate_to_agent"
|
|
330
|
+
"delegate_to_agent",
|
|
331
|
+
// Quantum optimization tools
|
|
332
|
+
"quantum_schedule",
|
|
333
|
+
"quantum_formulate",
|
|
334
|
+
// Navigation tool
|
|
335
|
+
"navigate_view"
|
|
316
336
|
]);
|
|
317
337
|
var B4MLLMToolsList = b4mLLMTools.options.map((tool) => tool);
|
|
318
338
|
var RechartsChartTypeSchema = z5.enum([
|
|
@@ -1063,6 +1083,34 @@ var WebhookDeliveryStatus;
|
|
|
1063
1083
|
WebhookDeliveryStatus2["Pending"] = "pending";
|
|
1064
1084
|
})(WebhookDeliveryStatus || (WebhookDeliveryStatus = {}));
|
|
1065
1085
|
|
|
1086
|
+
// ../../b4m-core/packages/common/dist/src/types/entities/WebhookAuditLogTypes.js
|
|
1087
|
+
var WebhookAuditStatus;
|
|
1088
|
+
(function(WebhookAuditStatus2) {
|
|
1089
|
+
WebhookAuditStatus2["Received"] = "received";
|
|
1090
|
+
WebhookAuditStatus2["Processing"] = "processing";
|
|
1091
|
+
WebhookAuditStatus2["Completed"] = "completed";
|
|
1092
|
+
WebhookAuditStatus2["Failed"] = "failed";
|
|
1093
|
+
})(WebhookAuditStatus || (WebhookAuditStatus = {}));
|
|
1094
|
+
|
|
1095
|
+
// ../../b4m-core/packages/common/dist/src/types/entities/JiraWebhookConfigTypes.js
|
|
1096
|
+
var COMMON_JIRA_WEBHOOK_EVENTS = [
|
|
1097
|
+
"jira:issue_created",
|
|
1098
|
+
"jira:issue_updated",
|
|
1099
|
+
"comment_created",
|
|
1100
|
+
"comment_updated",
|
|
1101
|
+
"sprint_started",
|
|
1102
|
+
"sprint_closed"
|
|
1103
|
+
];
|
|
1104
|
+
|
|
1105
|
+
// ../../b4m-core/packages/common/dist/src/types/entities/JiraWebhookDeliveryTypes.js
|
|
1106
|
+
var JiraWebhookDeliveryStatus;
|
|
1107
|
+
(function(JiraWebhookDeliveryStatus2) {
|
|
1108
|
+
JiraWebhookDeliveryStatus2["Success"] = "success";
|
|
1109
|
+
JiraWebhookDeliveryStatus2["Failed"] = "failed";
|
|
1110
|
+
JiraWebhookDeliveryStatus2["Filtered"] = "filtered";
|
|
1111
|
+
JiraWebhookDeliveryStatus2["Pending"] = "pending";
|
|
1112
|
+
})(JiraWebhookDeliveryStatus || (JiraWebhookDeliveryStatus = {}));
|
|
1113
|
+
|
|
1066
1114
|
// ../../b4m-core/packages/common/dist/src/types/common.js
|
|
1067
1115
|
var SupportedFabFileMimeTypes;
|
|
1068
1116
|
(function(SupportedFabFileMimeTypes2) {
|
|
@@ -1169,6 +1217,29 @@ var VoiceSessionSendTranscriptAction = z10.object({
|
|
|
1169
1217
|
conversationItemId: z10.string(),
|
|
1170
1218
|
timestamp: z10.coerce.date().optional()
|
|
1171
1219
|
});
|
|
1220
|
+
var CliCompletionRequestAction = z10.object({
|
|
1221
|
+
action: z10.literal("cli_completion_request"),
|
|
1222
|
+
accessToken: z10.string(),
|
|
1223
|
+
requestId: z10.string().uuid(),
|
|
1224
|
+
model: z10.string(),
|
|
1225
|
+
messages: z10.array(z10.object({
|
|
1226
|
+
role: z10.enum(["user", "assistant", "system"]),
|
|
1227
|
+
content: z10.union([z10.string(), z10.array(z10.unknown())])
|
|
1228
|
+
})),
|
|
1229
|
+
options: z10.object({
|
|
1230
|
+
temperature: z10.number().optional(),
|
|
1231
|
+
maxTokens: z10.number().optional(),
|
|
1232
|
+
stream: z10.boolean().optional(),
|
|
1233
|
+
tools: z10.array(z10.unknown()).optional()
|
|
1234
|
+
}).optional()
|
|
1235
|
+
});
|
|
1236
|
+
var CliToolRequestAction = z10.object({
|
|
1237
|
+
action: z10.literal("cli_tool_request"),
|
|
1238
|
+
accessToken: z10.string(),
|
|
1239
|
+
requestId: z10.string().uuid(),
|
|
1240
|
+
toolName: z10.string(),
|
|
1241
|
+
input: z10.record(z10.unknown())
|
|
1242
|
+
});
|
|
1172
1243
|
var VoiceSessionEndedAction = z10.object({
|
|
1173
1244
|
action: z10.literal("voice_session_ended"),
|
|
1174
1245
|
userId: z10.string(),
|
|
@@ -1457,6 +1528,36 @@ var VoiceCreditsExhaustedAction = z10.object({
|
|
|
1457
1528
|
creditsUsed: z10.number(),
|
|
1458
1529
|
clientId: z10.string().optional()
|
|
1459
1530
|
});
|
|
1531
|
+
var CliCompletionChunkAction = z10.object({
|
|
1532
|
+
action: z10.literal("cli_completion_chunk"),
|
|
1533
|
+
requestId: z10.string(),
|
|
1534
|
+
chunk: z10.object({
|
|
1535
|
+
type: z10.enum(["content", "tool_use"]),
|
|
1536
|
+
text: z10.string(),
|
|
1537
|
+
tools: z10.array(z10.unknown()).optional(),
|
|
1538
|
+
usage: z10.object({
|
|
1539
|
+
inputTokens: z10.number().optional(),
|
|
1540
|
+
outputTokens: z10.number().optional()
|
|
1541
|
+
}).optional(),
|
|
1542
|
+
thinking: z10.array(z10.unknown()).optional()
|
|
1543
|
+
})
|
|
1544
|
+
});
|
|
1545
|
+
var CliCompletionDoneAction = z10.object({
|
|
1546
|
+
action: z10.literal("cli_completion_done"),
|
|
1547
|
+
requestId: z10.string()
|
|
1548
|
+
});
|
|
1549
|
+
var CliCompletionErrorAction = z10.object({
|
|
1550
|
+
action: z10.literal("cli_completion_error"),
|
|
1551
|
+
requestId: z10.string(),
|
|
1552
|
+
error: z10.string()
|
|
1553
|
+
});
|
|
1554
|
+
var CliToolResponseAction = z10.object({
|
|
1555
|
+
action: z10.literal("cli_tool_response"),
|
|
1556
|
+
requestId: z10.string(),
|
|
1557
|
+
success: z10.boolean(),
|
|
1558
|
+
content: z10.unknown().optional(),
|
|
1559
|
+
error: z10.string().optional()
|
|
1560
|
+
});
|
|
1460
1561
|
var SessionCreatedAction = shareableDocumentSchema.extend({
|
|
1461
1562
|
action: z10.literal("session.created"),
|
|
1462
1563
|
id: z10.string(),
|
|
@@ -1491,7 +1592,9 @@ var MessageDataToServer = z10.discriminatedUnion("action", [
|
|
|
1491
1592
|
DataUnsubscribeRequestAction,
|
|
1492
1593
|
HeartbeatAction,
|
|
1493
1594
|
VoiceSessionSendTranscriptAction,
|
|
1494
|
-
VoiceSessionEndedAction
|
|
1595
|
+
VoiceSessionEndedAction,
|
|
1596
|
+
CliCompletionRequestAction,
|
|
1597
|
+
CliToolRequestAction
|
|
1495
1598
|
]);
|
|
1496
1599
|
var MessageDataToClient = z10.discriminatedUnion("action", [
|
|
1497
1600
|
DataSubscriptionUpdateAction,
|
|
@@ -1517,7 +1620,11 @@ var MessageDataToClient = z10.discriminatedUnion("action", [
|
|
|
1517
1620
|
PiHistoryCompleteAction,
|
|
1518
1621
|
PiHistoryErrorAction,
|
|
1519
1622
|
SessionCreatedAction,
|
|
1520
|
-
VoiceCreditsExhaustedAction
|
|
1623
|
+
VoiceCreditsExhaustedAction,
|
|
1624
|
+
CliCompletionChunkAction,
|
|
1625
|
+
CliCompletionDoneAction,
|
|
1626
|
+
CliCompletionErrorAction,
|
|
1627
|
+
CliToolResponseAction
|
|
1521
1628
|
]);
|
|
1522
1629
|
|
|
1523
1630
|
// ../../b4m-core/packages/common/dist/src/schemas/cliCompletions.js
|
|
@@ -2401,6 +2508,8 @@ var SettingKeySchema = z21.enum([
|
|
|
2401
2508
|
"githubMcpClientSecret",
|
|
2402
2509
|
"atlassianClientId",
|
|
2403
2510
|
"atlassianClientSecret",
|
|
2511
|
+
"qWorkUrl",
|
|
2512
|
+
"qWorkToken",
|
|
2404
2513
|
// BRANDING RELATED SETTINGS
|
|
2405
2514
|
"FacebookLink",
|
|
2406
2515
|
"RedditLink",
|
|
@@ -2467,7 +2576,11 @@ var SettingKeySchema = z21.enum([
|
|
|
2467
2576
|
// LIVEOPS TRIAGE AUTOMATION SETTINGS
|
|
2468
2577
|
"liveopsTriageConfig",
|
|
2469
2578
|
// HELP CENTER SETTINGS
|
|
2470
|
-
"EnableHelpChat"
|
|
2579
|
+
"EnableHelpChat",
|
|
2580
|
+
// B4M PI SETTINGS
|
|
2581
|
+
"EnableBmPi",
|
|
2582
|
+
// QUANTUM CANVASSER SETTINGS
|
|
2583
|
+
"EnableQuantumCanvasser"
|
|
2471
2584
|
]);
|
|
2472
2585
|
var CategoryOrder = [
|
|
2473
2586
|
"AI",
|
|
@@ -2825,6 +2938,16 @@ var API_SERVICE_GROUPS = {
|
|
|
2825
2938
|
{ key: "atlassianClientSecret", order: 5 }
|
|
2826
2939
|
]
|
|
2827
2940
|
},
|
|
2941
|
+
Q_WORK: {
|
|
2942
|
+
id: "qWorkAPIService",
|
|
2943
|
+
name: "Q/Work",
|
|
2944
|
+
description: "Q/Work integration settings",
|
|
2945
|
+
icon: "Handyman",
|
|
2946
|
+
settings: [
|
|
2947
|
+
{ key: "qWorkUrl", order: 1 },
|
|
2948
|
+
{ key: "qWorkToken", order: 2 }
|
|
2949
|
+
]
|
|
2950
|
+
},
|
|
2828
2951
|
SEARCH: {
|
|
2829
2952
|
id: "searchAPIService",
|
|
2830
2953
|
name: "Search Service",
|
|
@@ -2888,7 +3011,9 @@ var API_SERVICE_GROUPS = {
|
|
|
2888
3011
|
{ key: "EnableMcpToolFiltering", order: 15 },
|
|
2889
3012
|
{ key: "McpToolFilteringMaxTools", order: 16 },
|
|
2890
3013
|
{ key: "EnableParallelToolExecution", order: 17 },
|
|
2891
|
-
{ key: "EnableHelpChat", order: 18 }
|
|
3014
|
+
{ key: "EnableHelpChat", order: 18 },
|
|
3015
|
+
{ key: "EnableBmPi", order: 19 },
|
|
3016
|
+
{ key: "EnableQuantumCanvasser", order: 20 }
|
|
2892
3017
|
]
|
|
2893
3018
|
},
|
|
2894
3019
|
NOTEBOOK: {
|
|
@@ -3706,6 +3831,25 @@ var settingsMap = {
|
|
|
3706
3831
|
order: 5,
|
|
3707
3832
|
isSensitive: true
|
|
3708
3833
|
}),
|
|
3834
|
+
qWorkUrl: makeStringSetting({
|
|
3835
|
+
key: "qWorkUrl",
|
|
3836
|
+
name: "Q/Work URL",
|
|
3837
|
+
defaultValue: "",
|
|
3838
|
+
description: "The base URL for the Q/Work API (for example: https://q.bike4mind.com).",
|
|
3839
|
+
category: "Tools",
|
|
3840
|
+
group: API_SERVICE_GROUPS.Q_WORK.id,
|
|
3841
|
+
order: 1
|
|
3842
|
+
}),
|
|
3843
|
+
qWorkToken: makeStringSetting({
|
|
3844
|
+
key: "qWorkToken",
|
|
3845
|
+
name: "Q/Work Token",
|
|
3846
|
+
defaultValue: "",
|
|
3847
|
+
description: "The bearer token used to authenticate requests to Q/Work.",
|
|
3848
|
+
category: "Tools",
|
|
3849
|
+
group: API_SERVICE_GROUPS.Q_WORK.id,
|
|
3850
|
+
order: 2,
|
|
3851
|
+
isSensitive: true
|
|
3852
|
+
}),
|
|
3709
3853
|
EnableOllama: makeBooleanSetting({
|
|
3710
3854
|
key: "EnableOllama",
|
|
3711
3855
|
name: "Enable Ollama",
|
|
@@ -4078,6 +4222,26 @@ var settingsMap = {
|
|
|
4078
4222
|
category: "Experimental",
|
|
4079
4223
|
group: API_SERVICE_GROUPS.EXPERIMENTAL.id,
|
|
4080
4224
|
order: 17
|
|
4225
|
+
}),
|
|
4226
|
+
// B4M Pi (Project Intelligence) Settings
|
|
4227
|
+
EnableBmPi: makeBooleanSetting({
|
|
4228
|
+
key: "EnableBmPi",
|
|
4229
|
+
name: "Enable B4M Pi",
|
|
4230
|
+
defaultValue: true,
|
|
4231
|
+
description: "Enable the B4M Pi (Project Intelligence) module for repository analysis, task scheduling, and team activity dashboards.",
|
|
4232
|
+
category: "Experimental",
|
|
4233
|
+
group: API_SERVICE_GROUPS.EXPERIMENTAL.id,
|
|
4234
|
+
order: 18
|
|
4235
|
+
}),
|
|
4236
|
+
// OptiHashi Settings
|
|
4237
|
+
EnableQuantumCanvasser: makeBooleanSetting({
|
|
4238
|
+
key: "EnableQuantumCanvasser",
|
|
4239
|
+
name: "Enable OptiHashi",
|
|
4240
|
+
defaultValue: false,
|
|
4241
|
+
description: "Enable OptiHashi, the quantum optimizer module for AI-driven optimization across classical and quantum solvers.",
|
|
4242
|
+
category: "Experimental",
|
|
4243
|
+
group: API_SERVICE_GROUPS.EXPERIMENTAL.id,
|
|
4244
|
+
order: 18
|
|
4081
4245
|
})
|
|
4082
4246
|
// Add more settings as needed
|
|
4083
4247
|
};
|
|
@@ -4600,6 +4764,16 @@ var SlackEvents;
|
|
|
4600
4764
|
SlackEvents2["CHANNEL_EXPORT_FAILED"] = "Slack Channel Export Failed";
|
|
4601
4765
|
})(SlackEvents || (SlackEvents = {}));
|
|
4602
4766
|
|
|
4767
|
+
// ../../b4m-core/packages/common/dist/src/schemas/analytics/events/help.js
|
|
4768
|
+
var HelpEvents;
|
|
4769
|
+
(function(HelpEvents2) {
|
|
4770
|
+
HelpEvents2["HELP_ARTICLE_VIEW"] = "Help Article Viewed";
|
|
4771
|
+
HelpEvents2["HELP_SEARCH"] = "Help Search";
|
|
4772
|
+
HelpEvents2["HELP_ARTICLE_FEEDBACK"] = "Help Article Feedback";
|
|
4773
|
+
HelpEvents2["HELP_CHAT_QUERY"] = "Help Chat Query";
|
|
4774
|
+
HelpEvents2["HELP_CHAT_FEEDBACK"] = "Help Chat Feedback";
|
|
4775
|
+
})(HelpEvents || (HelpEvents = {}));
|
|
4776
|
+
|
|
4603
4777
|
// ../../b4m-core/packages/common/dist/src/schemas/team.js
|
|
4604
4778
|
import { z as z24 } from "zod";
|
|
4605
4779
|
var InternalTeamMemberSchema = z24.object({
|
|
@@ -7258,6 +7432,632 @@ var AgileApi = class {
|
|
|
7258
7432
|
}
|
|
7259
7433
|
};
|
|
7260
7434
|
|
|
7435
|
+
// ../../b4m-core/packages/common/dist/src/jira/webhook/format.js
|
|
7436
|
+
function daysUntil(dateString) {
|
|
7437
|
+
const expirationDate = new Date(dateString);
|
|
7438
|
+
const now = /* @__PURE__ */ new Date();
|
|
7439
|
+
const diffMs = expirationDate.getTime() - now.getTime();
|
|
7440
|
+
return Math.ceil(diffMs / (1e3 * 60 * 60 * 24));
|
|
7441
|
+
}
|
|
7442
|
+
function formatWebhook(webhook) {
|
|
7443
|
+
const daysUntilExpiry = daysUntil(webhook.expirationDate);
|
|
7444
|
+
return {
|
|
7445
|
+
id: webhook.id,
|
|
7446
|
+
events: webhook.events,
|
|
7447
|
+
jqlFilter: webhook.jqlFilter,
|
|
7448
|
+
expirationDate: webhook.expirationDate,
|
|
7449
|
+
daysUntilExpiry,
|
|
7450
|
+
isExpiringSoon: daysUntilExpiry < 7
|
|
7451
|
+
};
|
|
7452
|
+
}
|
|
7453
|
+
function formatWebhookList(response) {
|
|
7454
|
+
return {
|
|
7455
|
+
webhooks: response.values.map(formatWebhook),
|
|
7456
|
+
total: response.total,
|
|
7457
|
+
hasMore: !response.isLast
|
|
7458
|
+
};
|
|
7459
|
+
}
|
|
7460
|
+
function extractAdfText(body, maxLength = 500) {
|
|
7461
|
+
if (!body || typeof body !== "object")
|
|
7462
|
+
return "";
|
|
7463
|
+
const doc = body;
|
|
7464
|
+
if (doc.type !== "doc" || !Array.isArray(doc.content))
|
|
7465
|
+
return "";
|
|
7466
|
+
const parts = [];
|
|
7467
|
+
let totalLength = 0;
|
|
7468
|
+
function walk(nodes) {
|
|
7469
|
+
for (const node of nodes) {
|
|
7470
|
+
if (totalLength >= maxLength)
|
|
7471
|
+
return;
|
|
7472
|
+
if (!node || typeof node !== "object")
|
|
7473
|
+
continue;
|
|
7474
|
+
const n = node;
|
|
7475
|
+
if (n.type === "text" && typeof n.text === "string") {
|
|
7476
|
+
const remaining = maxLength - totalLength;
|
|
7477
|
+
const text = n.text.slice(0, remaining);
|
|
7478
|
+
parts.push(text);
|
|
7479
|
+
totalLength += text.length;
|
|
7480
|
+
}
|
|
7481
|
+
if (Array.isArray(n.content)) {
|
|
7482
|
+
walk(n.content);
|
|
7483
|
+
}
|
|
7484
|
+
}
|
|
7485
|
+
}
|
|
7486
|
+
walk(doc.content);
|
|
7487
|
+
const result = parts.join("");
|
|
7488
|
+
if (totalLength >= maxLength)
|
|
7489
|
+
return result + "...";
|
|
7490
|
+
return result;
|
|
7491
|
+
}
|
|
7492
|
+
function escapeSlackMrkdwn(text) {
|
|
7493
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\*/g, "\u2217").replace(/_/g, "\uFF3F").replace(/~/g, "\u223C").replace(/`/g, "\u02CB");
|
|
7494
|
+
}
|
|
7495
|
+
var PRIORITY_EMOJI = {
|
|
7496
|
+
Highest: ":red_circle:",
|
|
7497
|
+
High: ":large_orange_circle:",
|
|
7498
|
+
Medium: ":large_yellow_circle:",
|
|
7499
|
+
Low: ":large_green_circle:",
|
|
7500
|
+
Lowest: ":white_circle:"
|
|
7501
|
+
};
|
|
7502
|
+
function getPriorityEmoji(priority) {
|
|
7503
|
+
if (!priority)
|
|
7504
|
+
return "";
|
|
7505
|
+
return PRIORITY_EMOJI[priority] || ":blue_circle:";
|
|
7506
|
+
}
|
|
7507
|
+
function formatIssueEventForSlack(event, siteUrl) {
|
|
7508
|
+
const { issue, webhookEvent, user, changelog } = event;
|
|
7509
|
+
const { fields } = issue;
|
|
7510
|
+
const priorityEmoji = getPriorityEmoji(fields.priority?.name);
|
|
7511
|
+
const issueUrl = `${siteUrl}/browse/${issue.key}`;
|
|
7512
|
+
let action;
|
|
7513
|
+
let emoji;
|
|
7514
|
+
switch (webhookEvent) {
|
|
7515
|
+
case "jira:issue_created":
|
|
7516
|
+
action = "created";
|
|
7517
|
+
emoji = ":new:";
|
|
7518
|
+
break;
|
|
7519
|
+
case "jira:issue_updated":
|
|
7520
|
+
action = "updated";
|
|
7521
|
+
emoji = ":pencil2:";
|
|
7522
|
+
break;
|
|
7523
|
+
case "jira:issue_deleted":
|
|
7524
|
+
action = "deleted";
|
|
7525
|
+
emoji = ":wastebasket:";
|
|
7526
|
+
break;
|
|
7527
|
+
default:
|
|
7528
|
+
action = "changed";
|
|
7529
|
+
emoji = ":bell:";
|
|
7530
|
+
}
|
|
7531
|
+
let changelogText = "";
|
|
7532
|
+
if (changelog?.items && changelog.items.length > 0) {
|
|
7533
|
+
const changes = changelog.items.slice(0, 3).map((item) => {
|
|
7534
|
+
const from = escapeSlackMrkdwn(item.fromString || "None");
|
|
7535
|
+
const to = escapeSlackMrkdwn(item.toString || "None");
|
|
7536
|
+
if (item.field === "status") {
|
|
7537
|
+
return `Status: ${from} \u2192 ${to}`;
|
|
7538
|
+
}
|
|
7539
|
+
if (item.field === "assignee") {
|
|
7540
|
+
return `Assignee: ${escapeSlackMrkdwn(item.fromString || "Unassigned")} \u2192 ${escapeSlackMrkdwn(item.toString || "Unassigned")}`;
|
|
7541
|
+
}
|
|
7542
|
+
if (item.field === "priority") {
|
|
7543
|
+
return `Priority: ${from} \u2192 ${to}`;
|
|
7544
|
+
}
|
|
7545
|
+
return `${escapeSlackMrkdwn(item.field)}: ${from} \u2192 ${to}`;
|
|
7546
|
+
});
|
|
7547
|
+
if (changes.length > 0) {
|
|
7548
|
+
changelogText = "\n" + changes.map((c) => `\u2022 ${c}`).join("\n");
|
|
7549
|
+
if (changelog.items.length > 3) {
|
|
7550
|
+
changelogText += `
|
|
7551
|
+
_...and ${changelog.items.length - 3} more changes_`;
|
|
7552
|
+
}
|
|
7553
|
+
}
|
|
7554
|
+
}
|
|
7555
|
+
const blocks = [
|
|
7556
|
+
{
|
|
7557
|
+
type: "header",
|
|
7558
|
+
text: {
|
|
7559
|
+
type: "plain_text",
|
|
7560
|
+
text: `${emoji} Issue ${action}: ${escapeSlackMrkdwn(issue.key)}`,
|
|
7561
|
+
emoji: true
|
|
7562
|
+
}
|
|
7563
|
+
},
|
|
7564
|
+
{
|
|
7565
|
+
type: "section",
|
|
7566
|
+
text: {
|
|
7567
|
+
type: "mrkdwn",
|
|
7568
|
+
text: `*<${issueUrl}|${escapeSlackMrkdwn(issue.key)}>* ${escapeSlackMrkdwn(fields.summary)}`
|
|
7569
|
+
}
|
|
7570
|
+
},
|
|
7571
|
+
{
|
|
7572
|
+
type: "section",
|
|
7573
|
+
text: {
|
|
7574
|
+
type: "mrkdwn",
|
|
7575
|
+
text: [
|
|
7576
|
+
`${priorityEmoji} *Priority:* ${escapeSlackMrkdwn(fields.priority?.name || "None")}`,
|
|
7577
|
+
`*Status:* ${escapeSlackMrkdwn(fields.status.name)}`,
|
|
7578
|
+
`*Type:* ${escapeSlackMrkdwn(fields.issuetype.name)}`,
|
|
7579
|
+
`*Assignee:* ${escapeSlackMrkdwn(fields.assignee?.displayName || "Unassigned")}`
|
|
7580
|
+
].join(" | ")
|
|
7581
|
+
}
|
|
7582
|
+
}
|
|
7583
|
+
];
|
|
7584
|
+
if (changelogText) {
|
|
7585
|
+
blocks.push({
|
|
7586
|
+
type: "section",
|
|
7587
|
+
text: {
|
|
7588
|
+
type: "mrkdwn",
|
|
7589
|
+
text: `*Changes:*${changelogText}`
|
|
7590
|
+
}
|
|
7591
|
+
});
|
|
7592
|
+
}
|
|
7593
|
+
blocks.push({
|
|
7594
|
+
type: "context",
|
|
7595
|
+
elements: [
|
|
7596
|
+
{
|
|
7597
|
+
type: "mrkdwn",
|
|
7598
|
+
text: `${escapeSlackMrkdwn(user?.displayName || "Someone")} \u2022 ${escapeSlackMrkdwn(fields.project.name)} (${escapeSlackMrkdwn(fields.project.key)})`
|
|
7599
|
+
}
|
|
7600
|
+
]
|
|
7601
|
+
});
|
|
7602
|
+
blocks.push({
|
|
7603
|
+
type: "actions",
|
|
7604
|
+
elements: [
|
|
7605
|
+
{
|
|
7606
|
+
type: "button",
|
|
7607
|
+
text: {
|
|
7608
|
+
type: "plain_text",
|
|
7609
|
+
text: "View in Jira",
|
|
7610
|
+
emoji: true
|
|
7611
|
+
},
|
|
7612
|
+
url: issueUrl,
|
|
7613
|
+
style: "primary"
|
|
7614
|
+
}
|
|
7615
|
+
]
|
|
7616
|
+
});
|
|
7617
|
+
return {
|
|
7618
|
+
blocks,
|
|
7619
|
+
text: `${emoji} ${escapeSlackMrkdwn(issue.key)} ${action}: ${escapeSlackMrkdwn(fields.summary)}`
|
|
7620
|
+
};
|
|
7621
|
+
}
|
|
7622
|
+
function formatCommentEventForSlack(event, siteUrl) {
|
|
7623
|
+
const { issue, comment, webhookEvent } = event;
|
|
7624
|
+
const issueUrl = `${siteUrl}/browse/${issue.key}`;
|
|
7625
|
+
let action;
|
|
7626
|
+
let emoji;
|
|
7627
|
+
switch (webhookEvent) {
|
|
7628
|
+
case "comment_created":
|
|
7629
|
+
action = "commented on";
|
|
7630
|
+
emoji = ":speech_balloon:";
|
|
7631
|
+
break;
|
|
7632
|
+
case "comment_updated":
|
|
7633
|
+
action = "updated comment on";
|
|
7634
|
+
emoji = ":pencil:";
|
|
7635
|
+
break;
|
|
7636
|
+
case "comment_deleted":
|
|
7637
|
+
action = "deleted comment on";
|
|
7638
|
+
emoji = ":x:";
|
|
7639
|
+
break;
|
|
7640
|
+
default:
|
|
7641
|
+
action = "commented on";
|
|
7642
|
+
emoji = ":speech_balloon:";
|
|
7643
|
+
}
|
|
7644
|
+
const blocks = [
|
|
7645
|
+
{
|
|
7646
|
+
type: "header",
|
|
7647
|
+
text: {
|
|
7648
|
+
type: "plain_text",
|
|
7649
|
+
text: `${emoji} ${escapeSlackMrkdwn(comment.author.displayName)} ${action} ${escapeSlackMrkdwn(issue.key)}`,
|
|
7650
|
+
emoji: true
|
|
7651
|
+
}
|
|
7652
|
+
},
|
|
7653
|
+
{
|
|
7654
|
+
type: "section",
|
|
7655
|
+
text: {
|
|
7656
|
+
type: "mrkdwn",
|
|
7657
|
+
text: `*<${issueUrl}|${escapeSlackMrkdwn(issue.key)}>* ${escapeSlackMrkdwn(issue.fields.summary)}`
|
|
7658
|
+
}
|
|
7659
|
+
}
|
|
7660
|
+
];
|
|
7661
|
+
if (webhookEvent !== "comment_deleted") {
|
|
7662
|
+
const bodyText = extractAdfText(comment.body);
|
|
7663
|
+
if (bodyText) {
|
|
7664
|
+
blocks.push({
|
|
7665
|
+
type: "section",
|
|
7666
|
+
text: {
|
|
7667
|
+
type: "mrkdwn",
|
|
7668
|
+
text: `> ${escapeSlackMrkdwn(bodyText).replace(/\n/g, "\n> ")}`
|
|
7669
|
+
}
|
|
7670
|
+
});
|
|
7671
|
+
}
|
|
7672
|
+
}
|
|
7673
|
+
blocks.push({
|
|
7674
|
+
type: "context",
|
|
7675
|
+
elements: [
|
|
7676
|
+
{
|
|
7677
|
+
type: "mrkdwn",
|
|
7678
|
+
text: `${escapeSlackMrkdwn(issue.fields.project.name)} \u2022 ${escapeSlackMrkdwn(issue.fields.issuetype.name)}`
|
|
7679
|
+
}
|
|
7680
|
+
]
|
|
7681
|
+
}, {
|
|
7682
|
+
type: "actions",
|
|
7683
|
+
elements: [
|
|
7684
|
+
{
|
|
7685
|
+
type: "button",
|
|
7686
|
+
text: {
|
|
7687
|
+
type: "plain_text",
|
|
7688
|
+
text: "View in Jira",
|
|
7689
|
+
emoji: true
|
|
7690
|
+
},
|
|
7691
|
+
url: issueUrl,
|
|
7692
|
+
style: "primary"
|
|
7693
|
+
}
|
|
7694
|
+
]
|
|
7695
|
+
});
|
|
7696
|
+
return {
|
|
7697
|
+
blocks,
|
|
7698
|
+
text: `${emoji} ${escapeSlackMrkdwn(comment.author.displayName)} ${action} ${escapeSlackMrkdwn(issue.key)}: ${escapeSlackMrkdwn(issue.fields.summary)}`
|
|
7699
|
+
};
|
|
7700
|
+
}
|
|
7701
|
+
function formatSprintEventForSlack(event, siteUrl) {
|
|
7702
|
+
const { sprint, webhookEvent, user } = event;
|
|
7703
|
+
let action;
|
|
7704
|
+
let emoji;
|
|
7705
|
+
switch (webhookEvent) {
|
|
7706
|
+
case "sprint_created":
|
|
7707
|
+
action = "created";
|
|
7708
|
+
emoji = ":calendar:";
|
|
7709
|
+
break;
|
|
7710
|
+
case "sprint_started":
|
|
7711
|
+
action = "started";
|
|
7712
|
+
emoji = ":rocket:";
|
|
7713
|
+
break;
|
|
7714
|
+
case "sprint_closed":
|
|
7715
|
+
action = "completed";
|
|
7716
|
+
emoji = ":checkered_flag:";
|
|
7717
|
+
break;
|
|
7718
|
+
case "sprint_updated":
|
|
7719
|
+
action = "updated";
|
|
7720
|
+
emoji = ":pencil2:";
|
|
7721
|
+
break;
|
|
7722
|
+
case "sprint_deleted":
|
|
7723
|
+
action = "deleted";
|
|
7724
|
+
emoji = ":wastebasket:";
|
|
7725
|
+
break;
|
|
7726
|
+
default:
|
|
7727
|
+
action = "changed";
|
|
7728
|
+
emoji = ":bell:";
|
|
7729
|
+
}
|
|
7730
|
+
const sprintUrl = `${siteUrl}/secure/RapidBoard.jspa?rapidView=${sprint.originBoardId}`;
|
|
7731
|
+
const blocks = [
|
|
7732
|
+
{
|
|
7733
|
+
type: "header",
|
|
7734
|
+
text: {
|
|
7735
|
+
type: "plain_text",
|
|
7736
|
+
text: `${emoji} Sprint ${action}: ${escapeSlackMrkdwn(sprint.name)}`,
|
|
7737
|
+
emoji: true
|
|
7738
|
+
}
|
|
7739
|
+
},
|
|
7740
|
+
{
|
|
7741
|
+
type: "section",
|
|
7742
|
+
text: {
|
|
7743
|
+
type: "mrkdwn",
|
|
7744
|
+
text: [
|
|
7745
|
+
`*State:* ${escapeSlackMrkdwn(sprint.state)}`,
|
|
7746
|
+
sprint.startDate ? `*Start:* ${new Date(sprint.startDate).toLocaleDateString()}` : "",
|
|
7747
|
+
sprint.endDate ? `*End:* ${new Date(sprint.endDate).toLocaleDateString()}` : ""
|
|
7748
|
+
].filter(Boolean).join(" | ")
|
|
7749
|
+
}
|
|
7750
|
+
}
|
|
7751
|
+
];
|
|
7752
|
+
if (sprint.goal) {
|
|
7753
|
+
blocks.push({
|
|
7754
|
+
type: "section",
|
|
7755
|
+
text: {
|
|
7756
|
+
type: "mrkdwn",
|
|
7757
|
+
text: `*Goal:* ${escapeSlackMrkdwn(sprint.goal)}`
|
|
7758
|
+
}
|
|
7759
|
+
});
|
|
7760
|
+
}
|
|
7761
|
+
blocks.push({
|
|
7762
|
+
type: "context",
|
|
7763
|
+
elements: [
|
|
7764
|
+
{
|
|
7765
|
+
type: "mrkdwn",
|
|
7766
|
+
text: user?.displayName ? escapeSlackMrkdwn(user.displayName) : "System"
|
|
7767
|
+
}
|
|
7768
|
+
]
|
|
7769
|
+
});
|
|
7770
|
+
blocks.push({
|
|
7771
|
+
type: "actions",
|
|
7772
|
+
elements: [
|
|
7773
|
+
{
|
|
7774
|
+
type: "button",
|
|
7775
|
+
text: {
|
|
7776
|
+
type: "plain_text",
|
|
7777
|
+
text: "View Board",
|
|
7778
|
+
emoji: true
|
|
7779
|
+
},
|
|
7780
|
+
url: sprintUrl,
|
|
7781
|
+
style: "primary"
|
|
7782
|
+
}
|
|
7783
|
+
]
|
|
7784
|
+
});
|
|
7785
|
+
return {
|
|
7786
|
+
blocks,
|
|
7787
|
+
text: `${emoji} Sprint ${action}: ${escapeSlackMrkdwn(sprint.name)}`
|
|
7788
|
+
};
|
|
7789
|
+
}
|
|
7790
|
+
function formatGenericEventForSlack(eventType, payload, siteUrl) {
|
|
7791
|
+
const issue = payload.issue;
|
|
7792
|
+
const user = payload.user;
|
|
7793
|
+
const issueLink = payload.issueLink;
|
|
7794
|
+
const changelog = payload.changelog;
|
|
7795
|
+
const project = payload.project ?? issue?.fields?.project;
|
|
7796
|
+
const version = payload.version;
|
|
7797
|
+
const worklog = payload.worklog;
|
|
7798
|
+
const board = payload.board;
|
|
7799
|
+
const readableEvent = eventType.replace(/^jira:/, "").replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
7800
|
+
const blocks = [
|
|
7801
|
+
{
|
|
7802
|
+
type: "header",
|
|
7803
|
+
text: {
|
|
7804
|
+
type: "plain_text",
|
|
7805
|
+
text: `:bell: ${readableEvent}`,
|
|
7806
|
+
emoji: true
|
|
7807
|
+
}
|
|
7808
|
+
}
|
|
7809
|
+
];
|
|
7810
|
+
const details = [];
|
|
7811
|
+
if (issue?.key) {
|
|
7812
|
+
const issueUrl = `${siteUrl}/browse/${issue.key}`;
|
|
7813
|
+
blocks.push({
|
|
7814
|
+
type: "section",
|
|
7815
|
+
text: {
|
|
7816
|
+
type: "mrkdwn",
|
|
7817
|
+
text: `*<${issueUrl}|${escapeSlackMrkdwn(issue.key)}>* ${escapeSlackMrkdwn(issue.fields?.summary || "")}`
|
|
7818
|
+
}
|
|
7819
|
+
});
|
|
7820
|
+
const meta = [];
|
|
7821
|
+
if (issue.fields?.status?.name)
|
|
7822
|
+
meta.push(`*Status:* ${escapeSlackMrkdwn(issue.fields.status.name)}`);
|
|
7823
|
+
if (issue.fields?.issuetype?.name)
|
|
7824
|
+
meta.push(`*Type:* ${escapeSlackMrkdwn(issue.fields.issuetype.name)}`);
|
|
7825
|
+
if (issue.fields?.priority?.name) {
|
|
7826
|
+
const emoji = getPriorityEmoji(issue.fields.priority.name);
|
|
7827
|
+
meta.push(`${emoji} *Priority:* ${escapeSlackMrkdwn(issue.fields.priority.name)}`);
|
|
7828
|
+
}
|
|
7829
|
+
if (issue.fields?.assignee?.displayName)
|
|
7830
|
+
meta.push(`*Assignee:* ${escapeSlackMrkdwn(issue.fields.assignee.displayName)}`);
|
|
7831
|
+
if (meta.length > 0)
|
|
7832
|
+
details.push(meta.join(" | "));
|
|
7833
|
+
}
|
|
7834
|
+
if (issueLink?.issueLinkType) {
|
|
7835
|
+
const linkType = issueLink.issueLinkType;
|
|
7836
|
+
const linkDesc = escapeSlackMrkdwn(linkType.outwardName || linkType.name || "linked");
|
|
7837
|
+
details.push(`*Link type:* ${linkDesc}`);
|
|
7838
|
+
if (issueLink.sourceIssueId)
|
|
7839
|
+
details.push(`*Source issue ID:* ${issueLink.sourceIssueId}`);
|
|
7840
|
+
if (issueLink.destinationIssueId)
|
|
7841
|
+
details.push(`*Destination issue ID:* ${issueLink.destinationIssueId}`);
|
|
7842
|
+
}
|
|
7843
|
+
if (version?.name) {
|
|
7844
|
+
const versionParts = [`*Version:* ${escapeSlackMrkdwn(version.name)}`];
|
|
7845
|
+
if (version.description)
|
|
7846
|
+
versionParts.push(escapeSlackMrkdwn(version.description));
|
|
7847
|
+
if (version.released !== void 0)
|
|
7848
|
+
versionParts.push(version.released ? ":white_check_mark: Released" : "Unreleased");
|
|
7849
|
+
details.push(versionParts.join(" | "));
|
|
7850
|
+
}
|
|
7851
|
+
if (worklog) {
|
|
7852
|
+
const wlParts = [];
|
|
7853
|
+
if (worklog.author?.displayName)
|
|
7854
|
+
wlParts.push(`*By:* ${escapeSlackMrkdwn(worklog.author.displayName)}`);
|
|
7855
|
+
if (worklog.timeSpent)
|
|
7856
|
+
wlParts.push(`*Time:* ${escapeSlackMrkdwn(worklog.timeSpent)}`);
|
|
7857
|
+
if (wlParts.length > 0)
|
|
7858
|
+
details.push(wlParts.join(" | "));
|
|
7859
|
+
}
|
|
7860
|
+
if (board?.name) {
|
|
7861
|
+
details.push(`*Board:* ${escapeSlackMrkdwn(board.name)}`);
|
|
7862
|
+
}
|
|
7863
|
+
if (changelog?.items && changelog.items.length > 0) {
|
|
7864
|
+
const changes = changelog.items.slice(0, 3).map((item) => `\u2022 ${escapeSlackMrkdwn(item.field || "")}: ${escapeSlackMrkdwn(item.fromString || "None")} \u2192 ${escapeSlackMrkdwn(item.toString || "None")}`);
|
|
7865
|
+
if (changelog.items.length > 3) {
|
|
7866
|
+
changes.push(`_...and ${changelog.items.length - 3} more_`);
|
|
7867
|
+
}
|
|
7868
|
+
details.push(`*Changes:*
|
|
7869
|
+
${changes.join("\n")}`);
|
|
7870
|
+
}
|
|
7871
|
+
if (details.length > 0) {
|
|
7872
|
+
blocks.push({
|
|
7873
|
+
type: "section",
|
|
7874
|
+
text: {
|
|
7875
|
+
type: "mrkdwn",
|
|
7876
|
+
text: details.join("\n")
|
|
7877
|
+
}
|
|
7878
|
+
});
|
|
7879
|
+
}
|
|
7880
|
+
const contextParts = [];
|
|
7881
|
+
if (user?.displayName)
|
|
7882
|
+
contextParts.push(escapeSlackMrkdwn(user.displayName));
|
|
7883
|
+
if (project?.name)
|
|
7884
|
+
contextParts.push(`${escapeSlackMrkdwn(project.name)}${project.key ? ` (${escapeSlackMrkdwn(project.key)})` : ""}`);
|
|
7885
|
+
if (contextParts.length > 0) {
|
|
7886
|
+
blocks.push({
|
|
7887
|
+
type: "context",
|
|
7888
|
+
elements: [{ type: "mrkdwn", text: contextParts.join(" \u2022 ") }]
|
|
7889
|
+
});
|
|
7890
|
+
}
|
|
7891
|
+
if (issue?.key) {
|
|
7892
|
+
const issueUrl = `${siteUrl}/browse/${issue.key}`;
|
|
7893
|
+
blocks.push({
|
|
7894
|
+
type: "actions",
|
|
7895
|
+
elements: [
|
|
7896
|
+
{
|
|
7897
|
+
type: "button",
|
|
7898
|
+
text: { type: "plain_text", text: "View in Jira", emoji: true },
|
|
7899
|
+
url: issueUrl,
|
|
7900
|
+
style: "primary"
|
|
7901
|
+
}
|
|
7902
|
+
]
|
|
7903
|
+
});
|
|
7904
|
+
}
|
|
7905
|
+
const summary = issue?.key ? `${escapeSlackMrkdwn(issue.key)}: ${escapeSlackMrkdwn(issue.fields?.summary || readableEvent)}` : readableEvent;
|
|
7906
|
+
return {
|
|
7907
|
+
blocks,
|
|
7908
|
+
text: `:bell: ${summary}`
|
|
7909
|
+
};
|
|
7910
|
+
}
|
|
7911
|
+
|
|
7912
|
+
// ../../b4m-core/packages/common/dist/src/jira/webhook/api.js
|
|
7913
|
+
var WebhookApi = class {
|
|
7914
|
+
config;
|
|
7915
|
+
constructor(config) {
|
|
7916
|
+
this.config = config;
|
|
7917
|
+
}
|
|
7918
|
+
/**
|
|
7919
|
+
* Build URL for webhook API endpoints.
|
|
7920
|
+
*
|
|
7921
|
+
* Note: Webhooks use a different base URL than other Jira APIs.
|
|
7922
|
+
*/
|
|
7923
|
+
buildUrl(path, query = {}) {
|
|
7924
|
+
const url = new URL(`${this.config.apiBaseUrl}${path}`);
|
|
7925
|
+
for (const [key, value] of Object.entries(query)) {
|
|
7926
|
+
if (value !== void 0) {
|
|
7927
|
+
url.searchParams.append(key, String(value));
|
|
7928
|
+
}
|
|
7929
|
+
}
|
|
7930
|
+
return url.toString();
|
|
7931
|
+
}
|
|
7932
|
+
/**
|
|
7933
|
+
* Make an authenticated request to the Jira Webhook API.
|
|
7934
|
+
*/
|
|
7935
|
+
async request(method, path, options = {}) {
|
|
7936
|
+
const url = this.buildUrl(path, options.query);
|
|
7937
|
+
const headers = {
|
|
7938
|
+
Authorization: this.config.authHeader,
|
|
7939
|
+
Accept: "application/json",
|
|
7940
|
+
"Content-Type": "application/json"
|
|
7941
|
+
};
|
|
7942
|
+
const response = await fetch(url, {
|
|
7943
|
+
method,
|
|
7944
|
+
headers,
|
|
7945
|
+
body: options.body ? JSON.stringify(options.body) : void 0
|
|
7946
|
+
});
|
|
7947
|
+
if (!response.ok) {
|
|
7948
|
+
const errorBody = await response.text();
|
|
7949
|
+
throw new Error(`Jira Webhook API error (${response.status}): ${errorBody}`);
|
|
7950
|
+
}
|
|
7951
|
+
if (response.status === 204) {
|
|
7952
|
+
return {};
|
|
7953
|
+
}
|
|
7954
|
+
const data = await response.json();
|
|
7955
|
+
return data;
|
|
7956
|
+
}
|
|
7957
|
+
// ============================================================================
|
|
7958
|
+
// Webhook CRUD Operations
|
|
7959
|
+
// ============================================================================
|
|
7960
|
+
/**
|
|
7961
|
+
* List all webhooks registered by this OAuth app.
|
|
7962
|
+
*
|
|
7963
|
+
* @param startAt - Pagination start index (default: 0)
|
|
7964
|
+
* @param maxResults - Max results per page (default: 50, max: 100)
|
|
7965
|
+
*/
|
|
7966
|
+
async listWebhooks(params = {}) {
|
|
7967
|
+
const { startAt = 0, maxResults = 50 } = params;
|
|
7968
|
+
const response = await this.request("GET", "/webhook", {
|
|
7969
|
+
query: { startAt, maxResults }
|
|
7970
|
+
});
|
|
7971
|
+
return formatWebhookList(response);
|
|
7972
|
+
}
|
|
7973
|
+
/**
|
|
7974
|
+
* Register a new webhook.
|
|
7975
|
+
*
|
|
7976
|
+
* @param url - The URL where Jira will POST webhook events
|
|
7977
|
+
* @param events - Events to subscribe to
|
|
7978
|
+
* @param jqlFilter - Optional JQL filter (only matching issues trigger events)
|
|
7979
|
+
* @returns The created webhook ID
|
|
7980
|
+
*/
|
|
7981
|
+
async registerWebhook(params) {
|
|
7982
|
+
const { url, events, jqlFilter } = params;
|
|
7983
|
+
const webhook = {
|
|
7984
|
+
// Jira webhook API requires jqlFilter but has limited operator support.
|
|
7985
|
+
// "IS NOT EMPTY" and empty strings are rejected. Use a universally-true expression.
|
|
7986
|
+
jqlFilter: jqlFilter || "project != null",
|
|
7987
|
+
events
|
|
7988
|
+
};
|
|
7989
|
+
const body = {
|
|
7990
|
+
url,
|
|
7991
|
+
webhooks: [webhook]
|
|
7992
|
+
};
|
|
7993
|
+
const response = await this.request("POST", "/webhook", {
|
|
7994
|
+
body
|
|
7995
|
+
});
|
|
7996
|
+
console.log("[JIRA-WEBHOOK-API] registerWebhook raw response:", JSON.stringify(response, null, 2));
|
|
7997
|
+
if (!response.webhookRegistrationResult || response.webhookRegistrationResult.length === 0) {
|
|
7998
|
+
throw new Error("Failed to register webhook: No registration result returned");
|
|
7999
|
+
}
|
|
8000
|
+
const result = response.webhookRegistrationResult[0];
|
|
8001
|
+
if (result.errors && result.errors.length > 0) {
|
|
8002
|
+
throw new Error(`Failed to register webhook: ${result.errors.join(", ")}`);
|
|
8003
|
+
}
|
|
8004
|
+
if (result.createdWebhookId === void 0 || result.createdWebhookId === null) {
|
|
8005
|
+
throw new Error(`Failed to register webhook: No webhook ID in response. Full result: ${JSON.stringify(result)}`);
|
|
8006
|
+
}
|
|
8007
|
+
return {
|
|
8008
|
+
webhookId: result.createdWebhookId
|
|
8009
|
+
};
|
|
8010
|
+
}
|
|
8011
|
+
/**
|
|
8012
|
+
* Refresh webhook expiration dates.
|
|
8013
|
+
*
|
|
8014
|
+
* Jira webhooks expire after 30 days. Call this to extend expiration.
|
|
8015
|
+
*
|
|
8016
|
+
* @param webhookIds - IDs of webhooks to refresh
|
|
8017
|
+
* @returns New expiration date
|
|
8018
|
+
*/
|
|
8019
|
+
async refreshWebhooks(params) {
|
|
8020
|
+
const { webhookIds } = params;
|
|
8021
|
+
const body = {
|
|
8022
|
+
webhookIds
|
|
8023
|
+
};
|
|
8024
|
+
const response = await this.request("PUT", "/webhook/refresh", {
|
|
8025
|
+
body
|
|
8026
|
+
});
|
|
8027
|
+
return {
|
|
8028
|
+
expirationDate: response.expirationDate
|
|
8029
|
+
};
|
|
8030
|
+
}
|
|
8031
|
+
/**
|
|
8032
|
+
* Delete webhooks by ID.
|
|
8033
|
+
*
|
|
8034
|
+
* @param webhookIds - IDs of webhooks to delete
|
|
8035
|
+
*/
|
|
8036
|
+
async deleteWebhooks(params) {
|
|
8037
|
+
const { webhookIds } = params;
|
|
8038
|
+
const body = {
|
|
8039
|
+
webhookIds
|
|
8040
|
+
};
|
|
8041
|
+
await this.request("DELETE", "/webhook", {
|
|
8042
|
+
body
|
|
8043
|
+
});
|
|
8044
|
+
}
|
|
8045
|
+
/**
|
|
8046
|
+
* Get a specific webhook by ID.
|
|
8047
|
+
*
|
|
8048
|
+
* Note: Jira API doesn't have a direct "get by ID" endpoint,
|
|
8049
|
+
* so we list and filter.
|
|
8050
|
+
*/
|
|
8051
|
+
async getWebhook(params) {
|
|
8052
|
+
const { webhookId } = params;
|
|
8053
|
+
const response = await this.request("GET", "/webhook", {
|
|
8054
|
+
query: { startAt: 0, maxResults: 100 }
|
|
8055
|
+
});
|
|
8056
|
+
const webhook = response.values.find((w) => w.id === webhookId);
|
|
8057
|
+
return webhook || null;
|
|
8058
|
+
}
|
|
8059
|
+
};
|
|
8060
|
+
|
|
7261
8061
|
// ../../b4m-core/packages/common/dist/src/jira/api.js
|
|
7262
8062
|
var JIRA_MAX_ATTACHMENT_SIZE = 20 * 1024 * 1024;
|
|
7263
8063
|
function isValidIssueKey(key) {
|
|
@@ -8009,8 +8809,71 @@ var JiraApi = class {
|
|
|
8009
8809
|
}
|
|
8010
8810
|
return this._agileApi;
|
|
8011
8811
|
}
|
|
8812
|
+
// ============================================================================
|
|
8813
|
+
// Webhook API Access (Webhook Management)
|
|
8814
|
+
// ============================================================================
|
|
8815
|
+
_webhookApi = null;
|
|
8816
|
+
/**
|
|
8817
|
+
* Get the Webhook API client for webhook management operations.
|
|
8818
|
+
* Lazily instantiated on first access.
|
|
8819
|
+
*/
|
|
8820
|
+
get webhook() {
|
|
8821
|
+
if (!this._webhookApi) {
|
|
8822
|
+
this._webhookApi = new WebhookApi(this.config);
|
|
8823
|
+
}
|
|
8824
|
+
return this._webhookApi;
|
|
8825
|
+
}
|
|
8012
8826
|
};
|
|
8013
8827
|
|
|
8828
|
+
// ../../b4m-core/packages/common/dist/src/jira/webhook/types.js
|
|
8829
|
+
function isIssueWebhookEvent(payload) {
|
|
8830
|
+
const event = payload.webhookEvent;
|
|
8831
|
+
if (typeof event !== "string" || !event.startsWith("jira:issue_"))
|
|
8832
|
+
return false;
|
|
8833
|
+
const issue = payload.issue;
|
|
8834
|
+
if (!issue || typeof issue.key !== "string")
|
|
8835
|
+
return false;
|
|
8836
|
+
const fields = issue.fields;
|
|
8837
|
+
if (!fields || typeof fields.summary !== "string")
|
|
8838
|
+
return false;
|
|
8839
|
+
const status = fields.status;
|
|
8840
|
+
const issuetype = fields.issuetype;
|
|
8841
|
+
const project = fields.project;
|
|
8842
|
+
if (!status?.name || !issuetype?.name || !project?.key)
|
|
8843
|
+
return false;
|
|
8844
|
+
return true;
|
|
8845
|
+
}
|
|
8846
|
+
function isCommentWebhookEvent(payload) {
|
|
8847
|
+
const event = payload.webhookEvent;
|
|
8848
|
+
if (typeof event !== "string" || !event.startsWith("comment_"))
|
|
8849
|
+
return false;
|
|
8850
|
+
const issue = payload.issue;
|
|
8851
|
+
if (!issue || typeof issue.key !== "string")
|
|
8852
|
+
return false;
|
|
8853
|
+
const comment = payload.comment;
|
|
8854
|
+
if (!comment || typeof comment.id !== "string")
|
|
8855
|
+
return false;
|
|
8856
|
+
const author = comment.author;
|
|
8857
|
+
if (!author || typeof author.displayName !== "string")
|
|
8858
|
+
return false;
|
|
8859
|
+
return true;
|
|
8860
|
+
}
|
|
8861
|
+
function isSprintWebhookEvent(payload) {
|
|
8862
|
+
const event = payload.webhookEvent;
|
|
8863
|
+
if (typeof event !== "string" || !event.startsWith("sprint_"))
|
|
8864
|
+
return false;
|
|
8865
|
+
const sprint = payload.sprint;
|
|
8866
|
+
if (!sprint || typeof sprint.name !== "string")
|
|
8867
|
+
return false;
|
|
8868
|
+
return true;
|
|
8869
|
+
}
|
|
8870
|
+
function extractWebhookEventType(payload) {
|
|
8871
|
+
const event = payload.webhookEvent;
|
|
8872
|
+
if (typeof event !== "string" || event.length === 0)
|
|
8873
|
+
return null;
|
|
8874
|
+
return event;
|
|
8875
|
+
}
|
|
8876
|
+
|
|
8014
8877
|
// ../../b4m-core/packages/common/dist/src/atlassian/config.js
|
|
8015
8878
|
function getErrorMessage(error) {
|
|
8016
8879
|
if (error instanceof Error) {
|
|
@@ -8575,6 +9438,679 @@ function serializeSSEEvent(event) {
|
|
|
8575
9438
|
}
|
|
8576
9439
|
var SSE_DONE_SIGNAL = "data: [DONE]\n\n";
|
|
8577
9440
|
|
|
9441
|
+
// ../../b4m-core/packages/common/dist/src/navigation/viewRegistry.js
|
|
9442
|
+
var VIEW_REGISTRY = [
|
|
9443
|
+
// ── OptiHashi (Quantum Optimizer) ──────────────────────────────────────
|
|
9444
|
+
{
|
|
9445
|
+
id: "opti.root",
|
|
9446
|
+
section: "opti",
|
|
9447
|
+
label: "OptiHashi Home",
|
|
9448
|
+
description: "The OptiHashi Quantum Optimizer landing page showing all 8 pattern family cards",
|
|
9449
|
+
navigationType: "route",
|
|
9450
|
+
target: "/opti",
|
|
9451
|
+
keywords: ["optimization", "canvasser", "home", "patterns", "families"]
|
|
9452
|
+
},
|
|
9453
|
+
{
|
|
9454
|
+
id: "opti.scheduling",
|
|
9455
|
+
section: "opti",
|
|
9456
|
+
label: "Scheduling",
|
|
9457
|
+
description: "Scheduling optimization: job-shop, flow-shop, shift scheduling, makespan minimization",
|
|
9458
|
+
navigationType: "action",
|
|
9459
|
+
target: "scheduling",
|
|
9460
|
+
keywords: ["scheduling", "job-shop", "flow-shop", "shifts", "makespan", "calendar"]
|
|
9461
|
+
},
|
|
9462
|
+
{
|
|
9463
|
+
id: "opti.scheduling.problem",
|
|
9464
|
+
section: "opti",
|
|
9465
|
+
label: "Problem Editor",
|
|
9466
|
+
description: "Define and preview scheduling problems \u2014 job-shop matrix, QUBO encoding",
|
|
9467
|
+
navigationType: "action",
|
|
9468
|
+
target: "scheduling.problem",
|
|
9469
|
+
keywords: ["problem", "editor", "QUBO", "matrix", "jobs", "machines", "operations", "custom problem"]
|
|
9470
|
+
},
|
|
9471
|
+
{
|
|
9472
|
+
id: "opti.scheduling.solvers",
|
|
9473
|
+
section: "opti",
|
|
9474
|
+
label: "Solver Selection",
|
|
9475
|
+
description: "Configure which solvers to race \u2014 greedy, simulated annealing, tabu search, genetic algorithm, ant colony",
|
|
9476
|
+
navigationType: "action",
|
|
9477
|
+
target: "scheduling.solvers",
|
|
9478
|
+
keywords: [
|
|
9479
|
+
"solvers",
|
|
9480
|
+
"tabu",
|
|
9481
|
+
"simulated annealing",
|
|
9482
|
+
"genetic algorithm",
|
|
9483
|
+
"ant colony",
|
|
9484
|
+
"greedy",
|
|
9485
|
+
"solver race",
|
|
9486
|
+
"configure solvers"
|
|
9487
|
+
]
|
|
9488
|
+
},
|
|
9489
|
+
{
|
|
9490
|
+
id: "opti.scheduling.results",
|
|
9491
|
+
section: "opti",
|
|
9492
|
+
label: "Race Results",
|
|
9493
|
+
description: "View solver race results \u2014 progress, best schedule, makespan comparison, utilization",
|
|
9494
|
+
navigationType: "action",
|
|
9495
|
+
target: "scheduling.results",
|
|
9496
|
+
keywords: [
|
|
9497
|
+
"results",
|
|
9498
|
+
"race results",
|
|
9499
|
+
"makespan",
|
|
9500
|
+
"comparison",
|
|
9501
|
+
"best schedule",
|
|
9502
|
+
"utilization",
|
|
9503
|
+
"solver comparison"
|
|
9504
|
+
]
|
|
9505
|
+
},
|
|
9506
|
+
{
|
|
9507
|
+
id: "opti.scheduling.gantt",
|
|
9508
|
+
section: "opti",
|
|
9509
|
+
label: "Gantt Chart",
|
|
9510
|
+
description: "Gantt chart visualization of the best scheduling solution",
|
|
9511
|
+
navigationType: "action",
|
|
9512
|
+
target: "scheduling.gantt",
|
|
9513
|
+
keywords: ["gantt", "chart", "visualization", "timeline", "schedule view"]
|
|
9514
|
+
},
|
|
9515
|
+
{
|
|
9516
|
+
id: "opti.scheduling.qwork",
|
|
9517
|
+
section: "opti",
|
|
9518
|
+
label: "Q/Work",
|
|
9519
|
+
description: "View quantum job history and status from Q/Work",
|
|
9520
|
+
navigationType: "action",
|
|
9521
|
+
target: "scheduling.qwork",
|
|
9522
|
+
keywords: ["quantum", "q/work", "qwork", "hardware", "quantum computer", "jobs", "status", "history"]
|
|
9523
|
+
},
|
|
9524
|
+
{
|
|
9525
|
+
id: "opti.routing",
|
|
9526
|
+
section: "opti",
|
|
9527
|
+
label: "Routing",
|
|
9528
|
+
description: "Vehicle routing, TSP, logistics, delivery routes, fleet management",
|
|
9529
|
+
navigationType: "action",
|
|
9530
|
+
target: "routing",
|
|
9531
|
+
keywords: ["routing", "TSP", "vehicle", "logistics", "delivery", "fleet", "path"]
|
|
9532
|
+
},
|
|
9533
|
+
{
|
|
9534
|
+
id: "opti.packing",
|
|
9535
|
+
section: "opti",
|
|
9536
|
+
label: "Packing",
|
|
9537
|
+
description: "Bin packing, knapsack, container loading, space optimization",
|
|
9538
|
+
navigationType: "action",
|
|
9539
|
+
target: "packing",
|
|
9540
|
+
keywords: ["packing", "bin", "knapsack", "container", "loading", "space"]
|
|
9541
|
+
},
|
|
9542
|
+
{
|
|
9543
|
+
id: "opti.network",
|
|
9544
|
+
section: "opti",
|
|
9545
|
+
label: "Network Design",
|
|
9546
|
+
description: "Network flow, facility location, supply chain network design",
|
|
9547
|
+
navigationType: "action",
|
|
9548
|
+
target: "network",
|
|
9549
|
+
keywords: ["network", "flow", "facility", "location", "supply chain", "graph"]
|
|
9550
|
+
},
|
|
9551
|
+
{
|
|
9552
|
+
id: "opti.selection",
|
|
9553
|
+
section: "opti",
|
|
9554
|
+
label: "Selection",
|
|
9555
|
+
description: "Portfolio selection, feature selection, subset optimization",
|
|
9556
|
+
navigationType: "action",
|
|
9557
|
+
target: "selection",
|
|
9558
|
+
keywords: ["selection", "portfolio", "feature", "subset", "pick", "choose"]
|
|
9559
|
+
},
|
|
9560
|
+
{
|
|
9561
|
+
id: "opti.economic",
|
|
9562
|
+
section: "opti",
|
|
9563
|
+
label: "Economic",
|
|
9564
|
+
description: "Resource allocation, pricing, budgeting, economic optimization",
|
|
9565
|
+
navigationType: "action",
|
|
9566
|
+
target: "economic",
|
|
9567
|
+
keywords: ["economic", "resource", "allocation", "pricing", "budget", "cost"]
|
|
9568
|
+
},
|
|
9569
|
+
{
|
|
9570
|
+
id: "opti.assignment",
|
|
9571
|
+
section: "opti",
|
|
9572
|
+
label: "Assignment",
|
|
9573
|
+
description: "Task assignment, matching, workforce allocation, team formation",
|
|
9574
|
+
navigationType: "action",
|
|
9575
|
+
target: "assignment",
|
|
9576
|
+
keywords: ["assignment", "matching", "workforce", "team", "allocate", "assign"]
|
|
9577
|
+
},
|
|
9578
|
+
{
|
|
9579
|
+
id: "opti.partitioning",
|
|
9580
|
+
section: "opti",
|
|
9581
|
+
label: "Partitioning",
|
|
9582
|
+
description: "Graph partitioning, clustering, load balancing, data partitioning",
|
|
9583
|
+
navigationType: "action",
|
|
9584
|
+
target: "partitioning",
|
|
9585
|
+
keywords: ["partitioning", "clustering", "balancing", "partition", "divide", "split"]
|
|
9586
|
+
},
|
|
9587
|
+
// ── Admin ──────────────────────────────────────────────────────────────
|
|
9588
|
+
{
|
|
9589
|
+
id: "admin.users",
|
|
9590
|
+
section: "admin",
|
|
9591
|
+
label: "User Management",
|
|
9592
|
+
description: "View and manage user accounts, roles, and permissions",
|
|
9593
|
+
navigationType: "tab",
|
|
9594
|
+
target: "0",
|
|
9595
|
+
// AdminTab.Users
|
|
9596
|
+
keywords: ["users", "accounts", "roles", "permissions", "manage users"],
|
|
9597
|
+
requiresAdmin: true
|
|
9598
|
+
},
|
|
9599
|
+
{
|
|
9600
|
+
id: "admin.credit_analytics",
|
|
9601
|
+
section: "admin",
|
|
9602
|
+
label: "Credit Analytics",
|
|
9603
|
+
description: "View credit usage, add credits to users, billing analytics",
|
|
9604
|
+
navigationType: "tab",
|
|
9605
|
+
target: "15",
|
|
9606
|
+
// AdminTab.CreditAnalytics
|
|
9607
|
+
keywords: ["credits", "billing", "usage", "add credits", "balance", "cost"],
|
|
9608
|
+
requiresAdmin: true
|
|
9609
|
+
},
|
|
9610
|
+
{
|
|
9611
|
+
id: "admin.settings",
|
|
9612
|
+
section: "admin",
|
|
9613
|
+
label: "Admin Settings",
|
|
9614
|
+
description: "System-wide administration settings and configuration",
|
|
9615
|
+
navigationType: "tab",
|
|
9616
|
+
target: "1",
|
|
9617
|
+
// AdminTab.AdminSettings
|
|
9618
|
+
keywords: ["settings", "configuration", "admin", "system settings"],
|
|
9619
|
+
requiresAdmin: true
|
|
9620
|
+
},
|
|
9621
|
+
{
|
|
9622
|
+
id: "admin.system_health",
|
|
9623
|
+
section: "admin",
|
|
9624
|
+
label: "System Health",
|
|
9625
|
+
description: "Monitor system health, uptime, and performance metrics",
|
|
9626
|
+
navigationType: "tab",
|
|
9627
|
+
target: "29",
|
|
9628
|
+
// AdminTab.SystemHealth
|
|
9629
|
+
keywords: ["health", "uptime", "monitoring", "performance", "status"],
|
|
9630
|
+
requiresAdmin: true
|
|
9631
|
+
},
|
|
9632
|
+
{
|
|
9633
|
+
id: "admin.llm_dashboard",
|
|
9634
|
+
section: "admin",
|
|
9635
|
+
label: "LLM Dashboard",
|
|
9636
|
+
description: "LLM model usage, costs, and performance monitoring",
|
|
9637
|
+
navigationType: "tab",
|
|
9638
|
+
target: "24",
|
|
9639
|
+
// AdminTab.LLMDashboard
|
|
9640
|
+
keywords: ["llm", "model", "ai", "costs", "tokens", "dashboard"],
|
|
9641
|
+
requiresAdmin: true
|
|
9642
|
+
},
|
|
9643
|
+
{
|
|
9644
|
+
id: "admin.tool_definitions",
|
|
9645
|
+
section: "admin",
|
|
9646
|
+
label: "Tool Definitions",
|
|
9647
|
+
description: "Manage LLM tool definitions and configurations",
|
|
9648
|
+
navigationType: "tab",
|
|
9649
|
+
target: "31",
|
|
9650
|
+
// AdminTab.ToolDefinitions
|
|
9651
|
+
keywords: ["tools", "tool definitions", "functions", "capabilities"],
|
|
9652
|
+
requiresAdmin: true
|
|
9653
|
+
},
|
|
9654
|
+
{
|
|
9655
|
+
id: "admin.organizations",
|
|
9656
|
+
section: "admin",
|
|
9657
|
+
label: "Organizations",
|
|
9658
|
+
description: "Manage organizations, teams, and multi-tenant settings",
|
|
9659
|
+
navigationType: "tab",
|
|
9660
|
+
target: "14",
|
|
9661
|
+
// AdminTab.Organizations
|
|
9662
|
+
keywords: ["organizations", "teams", "tenants", "companies"],
|
|
9663
|
+
requiresAdmin: true
|
|
9664
|
+
},
|
|
9665
|
+
{
|
|
9666
|
+
id: "admin.analytics",
|
|
9667
|
+
section: "admin",
|
|
9668
|
+
label: "Analytics",
|
|
9669
|
+
description: "User activity analytics, engagement metrics, and reports",
|
|
9670
|
+
navigationType: "tab",
|
|
9671
|
+
target: "3",
|
|
9672
|
+
// AdminTab.Analytics
|
|
9673
|
+
keywords: ["analytics", "metrics", "reports", "engagement", "activity"],
|
|
9674
|
+
requiresAdmin: true
|
|
9675
|
+
},
|
|
9676
|
+
{
|
|
9677
|
+
id: "admin.subscribers",
|
|
9678
|
+
section: "admin",
|
|
9679
|
+
label: "Subscribers",
|
|
9680
|
+
description: "Manage subscriber waitlist and access approvals",
|
|
9681
|
+
navigationType: "tab",
|
|
9682
|
+
target: "12",
|
|
9683
|
+
// AdminTab.Subscribers
|
|
9684
|
+
keywords: ["subscribers", "waitlist", "approvals", "signups"],
|
|
9685
|
+
requiresAdmin: true
|
|
9686
|
+
},
|
|
9687
|
+
{
|
|
9688
|
+
id: "admin.subscriptions",
|
|
9689
|
+
section: "admin",
|
|
9690
|
+
label: "Subscriptions",
|
|
9691
|
+
description: "Manage subscription plans, tiers, and billing",
|
|
9692
|
+
navigationType: "tab",
|
|
9693
|
+
target: "13",
|
|
9694
|
+
// AdminTab.Subscriptions
|
|
9695
|
+
keywords: ["subscriptions", "plans", "tiers", "billing", "pricing"],
|
|
9696
|
+
requiresAdmin: true
|
|
9697
|
+
},
|
|
9698
|
+
{
|
|
9699
|
+
id: "admin.invite_codes",
|
|
9700
|
+
section: "admin",
|
|
9701
|
+
label: "Invite Codes",
|
|
9702
|
+
description: "Create and manage registration invite codes",
|
|
9703
|
+
navigationType: "tab",
|
|
9704
|
+
target: "5",
|
|
9705
|
+
// AdminTab.RegistrationInvites
|
|
9706
|
+
keywords: ["invite", "codes", "registration", "invitations"],
|
|
9707
|
+
requiresAdmin: true
|
|
9708
|
+
},
|
|
9709
|
+
{
|
|
9710
|
+
id: "admin.agent_ops",
|
|
9711
|
+
section: "admin",
|
|
9712
|
+
label: "Agent Operations",
|
|
9713
|
+
description: "Monitor and manage AI agent operations and tasks",
|
|
9714
|
+
navigationType: "tab",
|
|
9715
|
+
target: "23",
|
|
9716
|
+
// AdminTab.AgentOps
|
|
9717
|
+
keywords: ["agents", "operations", "tasks", "agent ops"],
|
|
9718
|
+
requiresAdmin: true
|
|
9719
|
+
},
|
|
9720
|
+
{
|
|
9721
|
+
id: "admin.security_dashboard",
|
|
9722
|
+
section: "admin",
|
|
9723
|
+
label: "Security Dashboard",
|
|
9724
|
+
description: "Security monitoring, threat detection, and audit logs",
|
|
9725
|
+
navigationType: "tab",
|
|
9726
|
+
target: "26",
|
|
9727
|
+
// AdminTab.SecurityDashboard
|
|
9728
|
+
keywords: ["security", "threats", "audit", "logs", "vulnerabilities"],
|
|
9729
|
+
requiresAdmin: true
|
|
9730
|
+
},
|
|
9731
|
+
{
|
|
9732
|
+
id: "admin.system_prompts",
|
|
9733
|
+
section: "admin",
|
|
9734
|
+
label: "System Prompts",
|
|
9735
|
+
description: "Edit and manage system prompts for AI models",
|
|
9736
|
+
navigationType: "tab",
|
|
9737
|
+
target: "21",
|
|
9738
|
+
// AdminTab.SystemPrompts
|
|
9739
|
+
keywords: ["prompts", "system prompts", "instructions", "AI prompts"],
|
|
9740
|
+
requiresAdmin: true
|
|
9741
|
+
},
|
|
9742
|
+
{
|
|
9743
|
+
id: "admin.modals",
|
|
9744
|
+
section: "admin",
|
|
9745
|
+
label: "Modals",
|
|
9746
|
+
description: "Manage modal dialogs and popup configurations",
|
|
9747
|
+
navigationType: "tab",
|
|
9748
|
+
target: "7",
|
|
9749
|
+
// AdminTab.Modals
|
|
9750
|
+
keywords: ["modals", "dialogs", "popups", "announcements"],
|
|
9751
|
+
requiresAdmin: true
|
|
9752
|
+
},
|
|
9753
|
+
{
|
|
9754
|
+
id: "admin.whats_new",
|
|
9755
|
+
section: "admin",
|
|
9756
|
+
label: "What's New",
|
|
9757
|
+
description: "Manage What's New release notes and changelogs",
|
|
9758
|
+
navigationType: "tab",
|
|
9759
|
+
target: "32",
|
|
9760
|
+
// AdminTab.WhatsNewModals
|
|
9761
|
+
keywords: ["whats new", "release notes", "changelog", "updates"],
|
|
9762
|
+
requiresAdmin: true
|
|
9763
|
+
},
|
|
9764
|
+
{
|
|
9765
|
+
id: "admin.rapid_reply",
|
|
9766
|
+
section: "admin",
|
|
9767
|
+
label: "Rapid Reply",
|
|
9768
|
+
description: "Configure rapid reply templates and shortcuts",
|
|
9769
|
+
navigationType: "tab",
|
|
9770
|
+
target: "25",
|
|
9771
|
+
// AdminTab.RapidReply
|
|
9772
|
+
keywords: ["rapid reply", "templates", "shortcuts", "quick responses"],
|
|
9773
|
+
requiresAdmin: true
|
|
9774
|
+
},
|
|
9775
|
+
{
|
|
9776
|
+
id: "admin.slack_workspaces",
|
|
9777
|
+
section: "admin",
|
|
9778
|
+
label: "Slack Workspaces",
|
|
9779
|
+
description: "Manage connected Slack workspace integrations",
|
|
9780
|
+
navigationType: "tab",
|
|
9781
|
+
target: "30",
|
|
9782
|
+
// AdminTab.SlackWorkspaces
|
|
9783
|
+
keywords: ["slack", "workspaces", "integrations", "messaging"],
|
|
9784
|
+
requiresAdmin: true
|
|
9785
|
+
},
|
|
9786
|
+
{
|
|
9787
|
+
id: "admin.secrets_rotation",
|
|
9788
|
+
section: "admin",
|
|
9789
|
+
label: "Secrets Rotation",
|
|
9790
|
+
description: "Manage API key rotation and secret lifecycle",
|
|
9791
|
+
navigationType: "tab",
|
|
9792
|
+
target: "16",
|
|
9793
|
+
// AdminTab.SecretsRotation
|
|
9794
|
+
keywords: ["secrets", "rotation", "API keys", "credentials"],
|
|
9795
|
+
requiresAdmin: true
|
|
9796
|
+
},
|
|
9797
|
+
{
|
|
9798
|
+
id: "admin.bulk_import",
|
|
9799
|
+
section: "admin",
|
|
9800
|
+
label: "Bulk Import",
|
|
9801
|
+
description: "Bulk import users and data from CSV or other formats",
|
|
9802
|
+
navigationType: "tab",
|
|
9803
|
+
target: "17",
|
|
9804
|
+
// AdminTab.BulkImport
|
|
9805
|
+
keywords: ["bulk", "import", "CSV", "migration", "data import"],
|
|
9806
|
+
requiresAdmin: true
|
|
9807
|
+
},
|
|
9808
|
+
{
|
|
9809
|
+
id: "admin.feedbacks",
|
|
9810
|
+
section: "admin",
|
|
9811
|
+
label: "Feedbacks",
|
|
9812
|
+
description: "View and manage user feedback, bug reports, and feature requests",
|
|
9813
|
+
navigationType: "tab",
|
|
9814
|
+
target: "2",
|
|
9815
|
+
// AdminTab.Feedbacks
|
|
9816
|
+
keywords: ["feedback", "bug reports", "feature requests", "user feedback", "complaints"],
|
|
9817
|
+
requiresAdmin: true
|
|
9818
|
+
},
|
|
9819
|
+
{
|
|
9820
|
+
id: "admin.files",
|
|
9821
|
+
section: "admin",
|
|
9822
|
+
label: "Files",
|
|
9823
|
+
description: "Manage uploaded files across all users, storage analytics",
|
|
9824
|
+
navigationType: "tab",
|
|
9825
|
+
target: "8",
|
|
9826
|
+
// AdminTab.Files
|
|
9827
|
+
keywords: ["files", "uploads", "storage", "documents", "file management"],
|
|
9828
|
+
requiresAdmin: true
|
|
9829
|
+
},
|
|
9830
|
+
{
|
|
9831
|
+
id: "admin.documentation",
|
|
9832
|
+
section: "admin",
|
|
9833
|
+
label: "Documentation",
|
|
9834
|
+
description: "System documentation and internal reference guides",
|
|
9835
|
+
navigationType: "tab",
|
|
9836
|
+
target: "9",
|
|
9837
|
+
// AdminTab.Documentation
|
|
9838
|
+
keywords: ["documentation", "docs", "guides", "reference", "help docs"],
|
|
9839
|
+
requiresAdmin: true
|
|
9840
|
+
},
|
|
9841
|
+
{
|
|
9842
|
+
id: "admin.world_time",
|
|
9843
|
+
section: "admin",
|
|
9844
|
+
label: "World Time",
|
|
9845
|
+
description: "View current time across multiple time zones",
|
|
9846
|
+
navigationType: "tab",
|
|
9847
|
+
target: "10",
|
|
9848
|
+
// AdminTab.WorldTime
|
|
9849
|
+
keywords: ["world time", "time zones", "clocks", "UTC", "international time"],
|
|
9850
|
+
requiresAdmin: true
|
|
9851
|
+
},
|
|
9852
|
+
{
|
|
9853
|
+
id: "admin.model_logs",
|
|
9854
|
+
section: "admin",
|
|
9855
|
+
label: "Model Logs",
|
|
9856
|
+
description: "View LLM model request/response logs and debugging information",
|
|
9857
|
+
navigationType: "tab",
|
|
9858
|
+
target: "18",
|
|
9859
|
+
// AdminTab.ModelLogs
|
|
9860
|
+
keywords: ["model logs", "LLM logs", "request logs", "debugging", "API logs"],
|
|
9861
|
+
requiresAdmin: true
|
|
9862
|
+
},
|
|
9863
|
+
{
|
|
9864
|
+
id: "admin.model_metrics",
|
|
9865
|
+
section: "admin",
|
|
9866
|
+
label: "Model Metrics",
|
|
9867
|
+
description: "LLM model performance metrics, latency, and usage statistics",
|
|
9868
|
+
navigationType: "tab",
|
|
9869
|
+
target: "19",
|
|
9870
|
+
// AdminTab.ModelMetrics
|
|
9871
|
+
keywords: ["model metrics", "performance", "latency", "tokens", "model usage"],
|
|
9872
|
+
requiresAdmin: true
|
|
9873
|
+
},
|
|
9874
|
+
{
|
|
9875
|
+
id: "admin.event_metrics",
|
|
9876
|
+
section: "admin",
|
|
9877
|
+
label: "Event Metrics",
|
|
9878
|
+
description: "Track system events, user activity events, and event analytics",
|
|
9879
|
+
navigationType: "tab",
|
|
9880
|
+
target: "20",
|
|
9881
|
+
// AdminTab.EventMetrics
|
|
9882
|
+
keywords: ["event metrics", "events", "activity tracking", "event analytics"],
|
|
9883
|
+
requiresAdmin: true
|
|
9884
|
+
},
|
|
9885
|
+
{
|
|
9886
|
+
id: "admin.identity_providers",
|
|
9887
|
+
section: "admin",
|
|
9888
|
+
label: "Identity Providers",
|
|
9889
|
+
description: "Configure SSO, SAML, and identity provider integrations",
|
|
9890
|
+
navigationType: "tab",
|
|
9891
|
+
target: "22",
|
|
9892
|
+
// AdminTab.IdentityProviders
|
|
9893
|
+
keywords: ["identity", "SSO", "SAML", "providers", "authentication", "login providers"],
|
|
9894
|
+
requiresAdmin: true
|
|
9895
|
+
},
|
|
9896
|
+
{
|
|
9897
|
+
id: "admin.email_verification",
|
|
9898
|
+
section: "admin",
|
|
9899
|
+
label: "Email Verification",
|
|
9900
|
+
description: "Manage email verification status and send verification emails",
|
|
9901
|
+
navigationType: "tab",
|
|
9902
|
+
target: "27",
|
|
9903
|
+
// AdminTab.EmailVerification
|
|
9904
|
+
keywords: ["email", "verification", "verify email", "email status"],
|
|
9905
|
+
requiresAdmin: true
|
|
9906
|
+
},
|
|
9907
|
+
{
|
|
9908
|
+
id: "admin.team",
|
|
9909
|
+
section: "admin",
|
|
9910
|
+
label: "Team",
|
|
9911
|
+
description: "Manage team members, roles, and team settings",
|
|
9912
|
+
navigationType: "tab",
|
|
9913
|
+
target: "28",
|
|
9914
|
+
// AdminTab.Team
|
|
9915
|
+
keywords: ["team", "members", "roles", "team management", "staff"],
|
|
9916
|
+
requiresAdmin: true
|
|
9917
|
+
},
|
|
9918
|
+
{
|
|
9919
|
+
id: "admin.slack_metrics",
|
|
9920
|
+
section: "admin",
|
|
9921
|
+
label: "Slack Metrics",
|
|
9922
|
+
description: "Slack integration usage metrics and message analytics",
|
|
9923
|
+
navigationType: "tab",
|
|
9924
|
+
target: "33",
|
|
9925
|
+
// AdminTab.SlackMetrics
|
|
9926
|
+
keywords: ["slack metrics", "slack usage", "message analytics", "slack stats"],
|
|
9927
|
+
requiresAdmin: true
|
|
9928
|
+
},
|
|
9929
|
+
{
|
|
9930
|
+
id: "admin.system_secrets",
|
|
9931
|
+
section: "admin",
|
|
9932
|
+
label: "System Secrets",
|
|
9933
|
+
description: "View and manage system-level secrets and environment variables",
|
|
9934
|
+
navigationType: "tab",
|
|
9935
|
+
target: "34",
|
|
9936
|
+
// AdminTab.SystemSecrets
|
|
9937
|
+
keywords: ["system secrets", "environment variables", "env vars", "secrets", "configuration"],
|
|
9938
|
+
requiresAdmin: true
|
|
9939
|
+
},
|
|
9940
|
+
{
|
|
9941
|
+
id: "admin.liveops_triage",
|
|
9942
|
+
section: "admin",
|
|
9943
|
+
label: "LiveOps Triage",
|
|
9944
|
+
description: "Real-time error triage, production issue monitoring, and incident response",
|
|
9945
|
+
navigationType: "tab",
|
|
9946
|
+
target: "35",
|
|
9947
|
+
// AdminTab.LiveOpsTriage
|
|
9948
|
+
keywords: ["liveops", "triage", "errors", "incidents", "production issues", "monitoring"],
|
|
9949
|
+
requiresAdmin: true
|
|
9950
|
+
},
|
|
9951
|
+
// ── Global ─────────────────────────────────────────────────────────────
|
|
9952
|
+
{
|
|
9953
|
+
id: "global.chat",
|
|
9954
|
+
section: "global",
|
|
9955
|
+
label: "Chat",
|
|
9956
|
+
description: "Main AI chat interface for conversations",
|
|
9957
|
+
navigationType: "route",
|
|
9958
|
+
target: "/",
|
|
9959
|
+
keywords: ["chat", "conversation", "talk", "message", "ask"]
|
|
9960
|
+
},
|
|
9961
|
+
{
|
|
9962
|
+
id: "global.projects",
|
|
9963
|
+
section: "global",
|
|
9964
|
+
label: "Projects",
|
|
9965
|
+
description: "View and manage projects and workspaces",
|
|
9966
|
+
navigationType: "route",
|
|
9967
|
+
target: "/projects",
|
|
9968
|
+
keywords: ["projects", "workspaces", "organize", "folders"]
|
|
9969
|
+
},
|
|
9970
|
+
{
|
|
9971
|
+
id: "global.agents",
|
|
9972
|
+
section: "global",
|
|
9973
|
+
label: "Agents",
|
|
9974
|
+
description: "Browse and configure AI agents",
|
|
9975
|
+
navigationType: "route",
|
|
9976
|
+
target: "/agents",
|
|
9977
|
+
keywords: ["agents", "AI assistants", "bots", "configure agents"]
|
|
9978
|
+
},
|
|
9979
|
+
{
|
|
9980
|
+
id: "global.agents_create",
|
|
9981
|
+
section: "global",
|
|
9982
|
+
label: "Create Agent",
|
|
9983
|
+
description: "Create a new AI agent with personality, motivation, system prompt, and capabilities",
|
|
9984
|
+
navigationType: "route",
|
|
9985
|
+
target: "/agents/new",
|
|
9986
|
+
keywords: ["create agent", "new agent", "build agent", "agent personality", "agent motivation", "agent setup"]
|
|
9987
|
+
},
|
|
9988
|
+
{
|
|
9989
|
+
id: "global.profile",
|
|
9990
|
+
section: "global",
|
|
9991
|
+
label: "Profile",
|
|
9992
|
+
description: "User profile settings and preferences",
|
|
9993
|
+
navigationType: "route",
|
|
9994
|
+
target: "/profile",
|
|
9995
|
+
keywords: ["profile", "account", "preferences", "personal settings"]
|
|
9996
|
+
},
|
|
9997
|
+
{
|
|
9998
|
+
id: "global.profile_security",
|
|
9999
|
+
section: "global",
|
|
10000
|
+
label: "Security Settings",
|
|
10001
|
+
description: "MFA, password, and security settings for your account",
|
|
10002
|
+
navigationType: "route",
|
|
10003
|
+
target: "/profile/security",
|
|
10004
|
+
keywords: ["security", "MFA", "password", "two-factor", "2FA"]
|
|
10005
|
+
},
|
|
10006
|
+
{
|
|
10007
|
+
id: "global.profile_api_keys",
|
|
10008
|
+
section: "global",
|
|
10009
|
+
label: "API Keys",
|
|
10010
|
+
description: "Manage your personal API keys for integrations",
|
|
10011
|
+
navigationType: "route",
|
|
10012
|
+
target: "/profile/api-keys",
|
|
10013
|
+
keywords: ["API keys", "tokens", "integrations", "developer"]
|
|
10014
|
+
},
|
|
10015
|
+
{
|
|
10016
|
+
id: "global.admin",
|
|
10017
|
+
section: "global",
|
|
10018
|
+
label: "Admin Panel",
|
|
10019
|
+
description: "Admin dashboard for system management",
|
|
10020
|
+
navigationType: "route",
|
|
10021
|
+
target: "/admin",
|
|
10022
|
+
keywords: ["admin", "dashboard", "management", "administration"],
|
|
10023
|
+
requiresAdmin: true
|
|
10024
|
+
},
|
|
10025
|
+
{
|
|
10026
|
+
id: "global.help",
|
|
10027
|
+
section: "global",
|
|
10028
|
+
label: "Help",
|
|
10029
|
+
description: "Help documentation and support resources",
|
|
10030
|
+
navigationType: "route",
|
|
10031
|
+
target: "/help",
|
|
10032
|
+
keywords: ["help", "support", "documentation", "FAQ", "guide"]
|
|
10033
|
+
},
|
|
10034
|
+
{
|
|
10035
|
+
id: "global.knowledge_base",
|
|
10036
|
+
section: "global",
|
|
10037
|
+
label: "Knowledge Base",
|
|
10038
|
+
description: "Browse uploaded files and documents in your knowledge base",
|
|
10039
|
+
navigationType: "route",
|
|
10040
|
+
target: "/knowledge",
|
|
10041
|
+
keywords: ["knowledge", "files", "documents", "uploads", "library"]
|
|
10042
|
+
},
|
|
10043
|
+
{
|
|
10044
|
+
id: "global.settings",
|
|
10045
|
+
section: "global",
|
|
10046
|
+
label: "Settings",
|
|
10047
|
+
description: "Application settings and preferences",
|
|
10048
|
+
navigationType: "route",
|
|
10049
|
+
target: "/settings",
|
|
10050
|
+
keywords: ["settings", "preferences", "configuration", "options"]
|
|
10051
|
+
}
|
|
10052
|
+
];
|
|
10053
|
+
function getViewById(viewId) {
|
|
10054
|
+
return VIEW_REGISTRY.find((v) => v.id === viewId);
|
|
10055
|
+
}
|
|
10056
|
+
function getFilteredViews(options) {
|
|
10057
|
+
return VIEW_REGISTRY.filter((v) => {
|
|
10058
|
+
if (options?.section && v.section !== options.section)
|
|
10059
|
+
return false;
|
|
10060
|
+
if (v.requiresAdmin && !options?.isAdmin)
|
|
10061
|
+
return false;
|
|
10062
|
+
return true;
|
|
10063
|
+
});
|
|
10064
|
+
}
|
|
10065
|
+
function getViewSummaryForLLM(options) {
|
|
10066
|
+
const views = getFilteredViews(options);
|
|
10067
|
+
const grouped = {};
|
|
10068
|
+
for (const v of views) {
|
|
10069
|
+
const key = v.section.toUpperCase();
|
|
10070
|
+
if (!grouped[key])
|
|
10071
|
+
grouped[key] = [];
|
|
10072
|
+
grouped[key].push(`- ${v.id}: ${v.label} \u2014 ${v.description}`);
|
|
10073
|
+
}
|
|
10074
|
+
const sections = Object.entries(grouped).map(([section, lines]) => `[${section}]
|
|
10075
|
+
${lines.join("\n")}`).join("\n\n");
|
|
10076
|
+
return [
|
|
10077
|
+
"# MANDATORY: navigate_view Tool Usage",
|
|
10078
|
+
"",
|
|
10079
|
+
"You have a navigate_view tool that renders clickable navigation buttons in your response.",
|
|
10080
|
+
"",
|
|
10081
|
+
"RULE: If your response mentions or relates to ANY view listed below, you MUST call the navigate_view tool.",
|
|
10082
|
+
"Do NOT just mention a view in text \u2014 you MUST also call the tool so the user sees a clickable button.",
|
|
10083
|
+
"Call navigate_view AND write your text answer. Both. Every time.",
|
|
10084
|
+
"",
|
|
10085
|
+
"Example \u2014 if the user asks about scheduling:",
|
|
10086
|
+
'1. Call navigate_view with suggestions: [{viewId: "opti.scheduling", reason: "Try scheduling algorithms here"}]',
|
|
10087
|
+
"2. AND write your text answer about scheduling",
|
|
10088
|
+
"",
|
|
10089
|
+
"Example \u2014 if the user asks about user management:",
|
|
10090
|
+
'1. Call navigate_view with suggestions: [{viewId: "admin.users", reason: "Manage user accounts"}]',
|
|
10091
|
+
"2. AND write your text answer about user management",
|
|
10092
|
+
"",
|
|
10093
|
+
sections
|
|
10094
|
+
].join("\n");
|
|
10095
|
+
}
|
|
10096
|
+
function resolveNavigationIntents(suggestions, isAdmin) {
|
|
10097
|
+
return suggestions.map((s) => {
|
|
10098
|
+
const view = getViewById(s.viewId);
|
|
10099
|
+
if (!view)
|
|
10100
|
+
return null;
|
|
10101
|
+
if (view.requiresAdmin && !isAdmin)
|
|
10102
|
+
return null;
|
|
10103
|
+
return {
|
|
10104
|
+
viewId: view.id,
|
|
10105
|
+
label: view.label,
|
|
10106
|
+
description: view.description,
|
|
10107
|
+
navigationType: view.navigationType,
|
|
10108
|
+
target: view.target,
|
|
10109
|
+
reason: s.reason
|
|
10110
|
+
};
|
|
10111
|
+
}).filter((intent) => intent !== null);
|
|
10112
|
+
}
|
|
10113
|
+
|
|
8578
10114
|
// ../../b4m-core/packages/common/dist/src/utils/dayjsConfig.js
|
|
8579
10115
|
import dayjs from "dayjs";
|
|
8580
10116
|
import timezone from "dayjs/plugin/timezone.js";
|
|
@@ -8597,6 +10133,7 @@ export {
|
|
|
8597
10133
|
ChatModels,
|
|
8598
10134
|
CHAT_MODELS,
|
|
8599
10135
|
supportedChatModels,
|
|
10136
|
+
REASONING_SUPPORTED_MODELS,
|
|
8600
10137
|
SpeechToTextModels,
|
|
8601
10138
|
SPEECH_TO_TEXT_MODELS,
|
|
8602
10139
|
supportedSpeechToTextModels,
|
|
@@ -8703,6 +10240,9 @@ export {
|
|
|
8703
10240
|
isPlaceholderValue,
|
|
8704
10241
|
SecretAuditEvents,
|
|
8705
10242
|
WebhookDeliveryStatus,
|
|
10243
|
+
WebhookAuditStatus,
|
|
10244
|
+
COMMON_JIRA_WEBHOOK_EVENTS,
|
|
10245
|
+
JiraWebhookDeliveryStatus,
|
|
8706
10246
|
SupportedFabFileMimeTypes,
|
|
8707
10247
|
REASONING_EFFORT_LABELS,
|
|
8708
10248
|
REASONING_EFFORT_DESCRIPTIONS,
|
|
@@ -8711,6 +10251,8 @@ export {
|
|
|
8711
10251
|
DataUnsubscribeRequestAction,
|
|
8712
10252
|
HeartbeatAction,
|
|
8713
10253
|
VoiceSessionSendTranscriptAction,
|
|
10254
|
+
CliCompletionRequestAction,
|
|
10255
|
+
CliToolRequestAction,
|
|
8714
10256
|
VoiceSessionEndedAction,
|
|
8715
10257
|
DataSubscriptionUpdateAction,
|
|
8716
10258
|
LLMStatusUpdateAction,
|
|
@@ -8735,6 +10277,10 @@ export {
|
|
|
8735
10277
|
ImportHistoryJobProgressUpdateAction,
|
|
8736
10278
|
ResearchModeStreamAction,
|
|
8737
10279
|
VoiceCreditsExhaustedAction,
|
|
10280
|
+
CliCompletionChunkAction,
|
|
10281
|
+
CliCompletionDoneAction,
|
|
10282
|
+
CliCompletionErrorAction,
|
|
10283
|
+
CliToolResponseAction,
|
|
8738
10284
|
SessionCreatedAction,
|
|
8739
10285
|
MessageDataToServer,
|
|
8740
10286
|
MessageDataToClient,
|
|
@@ -8823,6 +10369,7 @@ export {
|
|
|
8823
10369
|
OrganizationEvents,
|
|
8824
10370
|
UserApiKeyEvents,
|
|
8825
10371
|
SlackEvents,
|
|
10372
|
+
HelpEvents,
|
|
8826
10373
|
InternalTeamMemberSchema,
|
|
8827
10374
|
InternalTeamMemberListSchema,
|
|
8828
10375
|
LatticeDataTypeSchema,
|
|
@@ -8940,11 +10487,24 @@ export {
|
|
|
8940
10487
|
formatIssueLinkTypes,
|
|
8941
10488
|
formatIssueLinks,
|
|
8942
10489
|
AgileApi,
|
|
10490
|
+
formatWebhook,
|
|
10491
|
+
formatWebhookList,
|
|
10492
|
+
extractAdfText,
|
|
10493
|
+
escapeSlackMrkdwn,
|
|
10494
|
+
formatIssueEventForSlack,
|
|
10495
|
+
formatCommentEventForSlack,
|
|
10496
|
+
formatSprintEventForSlack,
|
|
10497
|
+
formatGenericEventForSlack,
|
|
10498
|
+
WebhookApi,
|
|
8943
10499
|
JIRA_MAX_ATTACHMENT_SIZE,
|
|
8944
10500
|
isValidIssueKey,
|
|
8945
10501
|
wikiMarkupToAdf,
|
|
8946
10502
|
containsWikiTable,
|
|
8947
10503
|
JiraApi,
|
|
10504
|
+
isIssueWebhookEvent,
|
|
10505
|
+
isCommentWebhookEvent,
|
|
10506
|
+
isSprintWebhookEvent,
|
|
10507
|
+
extractWebhookEventType,
|
|
8948
10508
|
getErrorMessage,
|
|
8949
10509
|
getAtlassianConfig,
|
|
8950
10510
|
MCP_PROVIDER_METADATA,
|
|
@@ -9005,5 +10565,10 @@ export {
|
|
|
9005
10565
|
formatSSEError,
|
|
9006
10566
|
serializeSSEEvent,
|
|
9007
10567
|
SSE_DONE_SIGNAL,
|
|
10568
|
+
VIEW_REGISTRY,
|
|
10569
|
+
getViewById,
|
|
10570
|
+
getFilteredViews,
|
|
10571
|
+
getViewSummaryForLLM,
|
|
10572
|
+
resolveNavigationIntents,
|
|
9008
10573
|
dayjsConfig_default
|
|
9009
10574
|
};
|