@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.
@@ -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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").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&apos;s New",
9757
+ description: "Manage What&apos;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
  };