@dbx-tools/appkit-mastra 0.6.46 → 0.6.49

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.
@@ -24,6 +24,7 @@ import { Agent } from "@mastra/core/agent";
24
24
  import { createTool } from "@mastra/core/tools";
25
25
  import { z } from "zod";
26
26
  import { buildModel } from "./model.js";
27
+ import { TYPOGRAPHY_RULE } from "./style.js";
27
28
  /** Fast / small chat tier used for both titling and summaries. */
28
29
  const SUMMARY_MODEL_CLASS = model.ModelClass.ChatFast;
29
30
  /** System prompt for the summarizer agent (and the `summarize` tool). */
@@ -32,7 +33,7 @@ const SUMMARIZER_INSTRUCTIONS = [
32
33
  "Given a block of text, produce a faithful, concise summary of it.",
33
34
  "Default to a few sentences; follow any length guidance the caller gives.",
34
35
  "Plain prose. No preamble, no headers, no bullet points unless asked.",
35
- "Never use emojis. Use hyphens (-) only, never em dashes or en dashes.",
36
+ TYPOGRAPHY_RULE,
36
37
  "Never add information, opinions, or details not present in the input.",
37
38
  "Output only the summary.",
38
39
  ].join("\n");
@@ -44,8 +45,9 @@ const SUMMARIZER_INSTRUCTIONS = [
44
45
  export const TITLE_INSTRUCTIONS = [
45
46
  "Generate a short, specific title for this conversation, 3 to 6 words.",
46
47
  "Capture the user's topic, not the assistant's response.",
47
- "Plain text only: no surrounding quotes, no trailing punctuation,",
48
- "no emojis, and no em dashes. Output only the title.",
48
+ "Plain text only: no surrounding quotes and no trailing punctuation.",
49
+ TYPOGRAPHY_RULE,
50
+ "Output only the title.",
49
51
  ].join(" ");
50
52
  /**
51
53
  * Resolve the small-tier model for summarization / titling. Reused by
@@ -139,4 +141,4 @@ export function buildSummarizeTool(config) {
139
141
  },
140
142
  });
141
143
  }
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N1bW1hcml6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBR3hCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsa0VBQWtFO0FBQ2xFLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7QUFFdEQseUVBQXlFO0FBQ3pFLE1BQU0sdUJBQXVCLEdBQUc7SUFDOUIsaUNBQWlDO0lBQ2pDLG1FQUFtRTtJQUNuRSwwRUFBMEU7SUFDMUUsc0VBQXNFO0lBQ3RFLHVFQUF1RTtJQUN2RSx1RUFBdUU7SUFDdkUsMEJBQTBCO0NBQzNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRWI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLHVFQUF1RTtJQUN2RSx5REFBeUQ7SUFDekQsa0VBQWtFO0lBQ2xFLHFEQUFxRDtDQUN0RCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUVaOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUEwQjtJQUUxQixPQUFPLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQzVCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLG1CQUFt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QyxDQUFDO1lBQ2pGLE1BQU0sR0FBRyxHQUFHLE9BQ2dFLENBQUM7WUFDN0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDaEQsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxHQUFHLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUM5RCxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDckIsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNtYWxsLXRpZXIgc3VtbWFyaXphdGlvbiBmb3IgdGhlIE1hc3RyYSBwbHVnaW4uXG4gKlxuICogVHdvIHN1cmZhY2VzLCBib3RoIGJhY2tlZCBieSB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllclxuICogKHtAbGluayBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0fSkgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgc2FtZVxuICogYC9zZXJ2aW5nLWVuZHBvaW50c2AgcGlwZWxpbmUgYXMgdGhlIG1haW4gYWdlbnRzOlxuICpcbiAqICAgLSBBIGRlZGljYXRlZCBgc3VtbWFyaXplYCB0b29sIChzZWUge0BsaW5rIGJ1aWxkU3VtbWFyaXplVG9vbH0pXG4gKiAgICAgYWdlbnRzIGNhbiBjYWxsIHRvIGNvbmRlbnNlIGFyYml0cmFyeSB0ZXh0IHdpdGhvdXQgYnVybmluZyB0aGVcbiAqICAgICBoZWF2eXdlaWdodCBjaGF0IG1vZGVsLlxuICogICAtIFRoZSBtb2RlbCArIGluc3RydWN0aW9ucyBNYXN0cmEncyBtZW1vcnkgdXNlcyB0byBhdXRvLW5hbWVcbiAqICAgICBjb252ZXJzYXRpb24gdGhyZWFkcyAoYGdlbmVyYXRlVGl0bGVgKSwgc28gdGl0bGluZyByZXVzZXMgdGhlXG4gKiAgICAgc2FtZSBzbWFsbCB0aWVyIHJhdGhlciB0aGFuIHRoZSBhZ2VudCdzIHByaW1hcnkgbW9kZWwuXG4gKlxuICogTWlycm9ycyB0aGUgY2hhcnQtcGxhbm5lciB3aXJpbmcgaW4gYGNoYXJ0LnRzYDogYSBwZXItY29uZmlnIGNhY2hlZFxuICogYEFnZW50YCBvbiB0aGUgZmFzdCB0aWVyLCBpbnZva2VkIHZpYSBgYWdlbnQuZ2VuZXJhdGUoLi4uKWAgaW5zaWRlXG4gKiB0aGUgYWN0aXZlIGBhc1VzZXJgIHNjb3BlIHNvIHRva2VucyBzdGF5IHVzZXItc2NvcGVkLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFNb2RlbENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbGxtXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgdHlwZSB7IE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5cbi8qKiBGYXN0IC8gc21hbGwgY2hhdCB0aWVyIHVzZWQgZm9yIGJvdGggdGl0bGluZyBhbmQgc3VtbWFyaWVzLiAqL1xuY29uc3QgU1VNTUFSWV9NT0RFTF9DTEFTUyA9IG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdEZhc3Q7XG5cbi8qKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgc3VtbWFyaXplciBhZ2VudCAoYW5kIHRoZSBgc3VtbWFyaXplYCB0b29sKS4gKi9cbmNvbnN0IFNVTU1BUklaRVJfSU5TVFJVQ1RJT05TID0gW1xuICBcIllvdSBhcmUgYSBzdW1tYXJpemF0aW9uIGVuZ2luZS5cIixcbiAgXCJHaXZlbiBhIGJsb2NrIG9mIHRleHQsIHByb2R1Y2UgYSBmYWl0aGZ1bCwgY29uY2lzZSBzdW1tYXJ5IG9mIGl0LlwiLFxuICBcIkRlZmF1bHQgdG8gYSBmZXcgc2VudGVuY2VzOyBmb2xsb3cgYW55IGxlbmd0aCBndWlkYW5jZSB0aGUgY2FsbGVyIGdpdmVzLlwiLFxuICBcIlBsYWluIHByb3NlLiBObyBwcmVhbWJsZSwgbm8gaGVhZGVycywgbm8gYnVsbGV0IHBvaW50cyB1bmxlc3MgYXNrZWQuXCIsXG4gIFwiTmV2ZXIgdXNlIGVtb2ppcy4gVXNlIGh5cGhlbnMgKC0pIG9ubHksIG5ldmVyIGVtIGRhc2hlcyBvciBlbiBkYXNoZXMuXCIsXG4gIFwiTmV2ZXIgYWRkIGluZm9ybWF0aW9uLCBvcGluaW9ucywgb3IgZGV0YWlscyBub3QgcHJlc2VudCBpbiB0aGUgaW5wdXQuXCIsXG4gIFwiT3V0cHV0IG9ubHkgdGhlIHN1bW1hcnkuXCIsXG5dLmpvaW4oXCJcXG5cIik7XG5cbi8qKlxuICogSW5zdHJ1Y3Rpb25zIE1hc3RyYSdzIGBnZW5lcmF0ZVRpdGxlYCBoYW5kcyB0aGUgc21hbGwtdGllciBtb2RlbCB0b1xuICogbmFtZSBhIGNvbnZlcnNhdGlvbiB0aHJlYWQgZnJvbSBpdHMgb3BlbmluZyB0dXJuLiBLZXB0IHRlcnNlIHNvIHRoZVxuICogbW9kZWwgcmV0dXJucyBhIGJhcmUgdGl0bGUgd2l0aCBubyBkZWNvcmF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgVElUTEVfSU5TVFJVQ1RJT05TID0gW1xuICBcIkdlbmVyYXRlIGEgc2hvcnQsIHNwZWNpZmljIHRpdGxlIGZvciB0aGlzIGNvbnZlcnNhdGlvbiwgMyB0byA2IHdvcmRzLlwiLFxuICBcIkNhcHR1cmUgdGhlIHVzZXIncyB0b3BpYywgbm90IHRoZSBhc3Npc3RhbnQncyByZXNwb25zZS5cIixcbiAgXCJQbGFpbiB0ZXh0IG9ubHk6IG5vIHN1cnJvdW5kaW5nIHF1b3Rlcywgbm8gdHJhaWxpbmcgcHVuY3R1YXRpb24sXCIsXG4gIFwibm8gZW1vamlzLCBhbmQgbm8gZW0gZGFzaGVzLiBPdXRwdXQgb25seSB0aGUgdGl0bGUuXCIsXG5dLmpvaW4oXCIgXCIpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHNtYWxsLXRpZXIgbW9kZWwgZm9yIHN1bW1hcml6YXRpb24gLyB0aXRsaW5nLiBSZXVzZWQgYnlcbiAqIGJvdGggdGhlIHN1bW1hcml6ZXIgYWdlbnQgYW5kIE1hc3RyYSBtZW1vcnkncyBgZ2VuZXJhdGVUaXRsZWAuXG4gKlxuICogUmV0dXJuZWQgYXMgYSBgcmVxdWVzdENvbnRleHRgLXRha2luZyBmdW5jdGlvbiAoYSBNYXN0cmFcbiAqIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YCkgc28gZWFjaCBjYWxsIG1pbnRzIHVzZXItc2NvcGVkXG4gKiB0b2tlbnMgdmlhIHtAbGluayBidWlsZE1vZGVsfSwgZXhhY3RseSBsaWtlIHRoZSBwcmltYXJ5IGFnZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcnlNb2RlbChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4pOiAoYXJnczogeyByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfSkgPT4gUHJvbWlzZTxNYXN0cmFNb2RlbENvbmZpZz4ge1xuICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT5cbiAgICBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxDbGFzczogU1VNTUFSWV9NT0RFTF9DTEFTUyB9KTtcbn1cblxuLyoqXG4gKiBPbmUgc3VtbWFyaXplciBgQWdlbnRgIHBlciBwbHVnaW4gY29uZmlnLCBjYWNoZWQgb24gY29uZmlnLW9iamVjdFxuICogaWRlbnRpdHkgc28gYSBob3QgdG9vbCBwYXRoIGRvZXNuJ3QgcGF5IHRoZSBjb25zdHJ1Y3RvciBjb3N0IGVhY2hcbiAqIGNhbGwuIGBXZWFrTWFwYCBsZXRzIHJldGlyZWQgY29uZmlncyAoZS5nLiB0ZXN0IHJlY29uZmlndXJhdGlvbnMpXG4gKiByZWxlYXNlIHRoZWlyIGFnZW50IHdpdGhvdXQgbWFudWFsIGV2aWN0aW9uLlxuICovXG5jb25zdCBzdW1tYXJpemVyQWdlbnRzID0gbmV3IFdlYWtNYXA8TWFzdHJhUGx1Z2luQ29uZmlnLCBBZ2VudD4oKTtcblxuZnVuY3Rpb24gZ2V0U3VtbWFyaXplckFnZW50KGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogQWdlbnQge1xuICBsZXQgYWdlbnQgPSBzdW1tYXJpemVyQWdlbnRzLmdldChjb25maWcpO1xuICBpZiAoIWFnZW50KSB7XG4gICAgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgaWQ6IFwic3VtbWFyaXplclwiLFxuICAgICAgbmFtZTogXCJTdW1tYXJpemVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDb25kZW5zZXMgdGV4dCBpbnRvIGEgc2hvcnQgc3VtbWFyeSB1c2luZyBhIGZhc3QsIHNtYWxsIG1vZGVsLlwiLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBTVU1NQVJJWkVSX0lOU1RSVUNUSU9OUyxcbiAgICAgIG1vZGVsOiBzdW1tYXJ5TW9kZWwoY29uZmlnKSxcbiAgICB9KTtcbiAgICBzdW1tYXJpemVyQWdlbnRzLnNldChjb25maWcsIGFnZW50KTtcbiAgfVxuICByZXR1cm4gYWdlbnQ7XG59XG5cbi8qKiBJbnB1dHMgYWNjZXB0ZWQgYnkgdGhlIGBzdW1tYXJpemVgIHRvb2wuICovXG5jb25zdCBzdW1tYXJpemVJbnB1dCA9IHoub2JqZWN0KHtcbiAgdGV4dDogei5zdHJpbmcoKS5taW4oMSkuZGVzY3JpYmUoXCJUaGUgdGV4dCB0byBzdW1tYXJpemUuXCIpLFxuICBpbnN0cnVjdGlvbnM6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiT3B0aW9uYWwgZXh0cmEgZ3VpZGFuY2UgZm9yIHRoZSBzdW1tYXJ5LCBlLmcuICdvbmUgc2VudGVuY2UnIG9yICdsaXN0IHRoZSBhY3Rpb24gaXRlbXMnLlwiLFxuICAgICksXG4gIG1heFdvcmRzOiB6XG4gICAgLm51bWJlcigpXG4gICAgLmludCgpXG4gICAgLnBvc2l0aXZlKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIk9wdGlvbmFsIHNvZnQgY2FwIG9uIHRoZSBzdW1tYXJ5IGxlbmd0aCwgaW4gd29yZHMuXCIpLFxufSk7XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IHtAbGluayBzdW1tYXJpemVUZXh0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VtbWFyaXplT3B0aW9ucyB7XG4gIC8qKiBFeHRyYSBndWlkYW5jZSBmb3IgdGhlIHN1bW1hcnkgKGxlbmd0aCwgZm9jdXMsIGZvcm1hdCkuICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZztcbiAgLyoqIFNvZnQgY2FwIG9uIHN1bW1hcnkgbGVuZ3RoLCBpbiB3b3Jkcy4gKi9cbiAgbWF4V29yZHM/OiBudW1iZXI7XG4gIC8qKiBBY3RpdmUgcmVxdWVzdCBjb250ZXh0LCBzbyB0aGUgbW9kZWwgcmVzb2x2ZXIgbWludHMgdXNlci1zY29wZWQgdG9rZW5zLiAqL1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAvKiogQWJvcnQgc2lnbmFsIGJyaWRnZWQgZnJvbSB0aGUgY2FsbGluZyB0b29sIC8gcmVxdWVzdC4gKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBTdW1tYXJpemUgYHRleHRgIHdpdGggdGhlIHNtYWxsLXRpZXIgc3VtbWFyaXplciBhZ2VudCwgcmV0dXJuaW5nIHRoZVxuICogdHJpbW1lZCBzdW1tYXJ5IHN0cmluZy4gVGhyb3dzIG9uIG1vZGVsIGZhaWx1cmUgKHRoZSBjYWxsZXIgZGVjaWRlc1xuICogaG93IHRvIGRlZ3JhZGUpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3VtbWFyaXplVGV4dChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHRleHQ6IHN0cmluZyxcbiAgb3B0aW9uczogU3VtbWFyaXplT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBpbnN0cnVjdGlvbnMsIG1heFdvcmRzLCByZXF1ZXN0Q29udGV4dCwgYWJvcnRTaWduYWwgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHByb21wdCA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKHtcbiAgICAuLi4oaW5zdHJ1Y3Rpb25zID8geyBHdWlkYW5jZTogaW5zdHJ1Y3Rpb25zIH0gOiB7fSksXG4gICAgLi4uKG1heFdvcmRzICE9PSB1bmRlZmluZWQgPyB7IFwiTWF4IGxlbmd0aCAod29yZHMpXCI6IFN0cmluZyhtYXhXb3JkcykgfSA6IHt9KSxcbiAgICBUZXh0OiB0ZXh0LFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3VtbWFyaXplckFnZW50KGNvbmZpZykuZ2VuZXJhdGUocHJvbXB0LCB7XG4gICAgLi4uKHJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiByZXN1bHQudGV4dC50cmltKCk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBzdW1tYXJpemVgIHRvb2wuIEV4cG9zZWQgYXMgYW4gYW1iaWVudCBzeXN0ZW0gdG9vbCAobGlrZVxuICogYHJlbmRlcl9kYXRhYCkgc28gZXZlcnkgYWdlbnQgY2FuIG9mZmxvYWQgY29uZGVuc2luZyBsb25nIGNvbnRlbnQsXG4gKiBub3RlcywgdHJhbnNjcmlwdHMsIG9yIGJ1bGt5IHRvb2wgcmVzdWx0cyB0byB0aGUgZmFzdCB0aWVyIGluc3RlYWQgb2ZcbiAqIHNwZW5kaW5nIGl0cyBwcmltYXJ5IGNoYXQgbW9kZWwuIFRoZSB0b29sIHJlYWRzIHRoZSBsaXZlXG4gKiBgcmVxdWVzdENvbnRleHRgIC8gYGFib3J0U2lnbmFsYCBvZmYgdGhlIE1hc3RyYSBleGVjdXRpb24gY29udGV4dCBzb1xuICogaXRzIG1vZGVsIGNhbGwgc3RheXMgdXNlci1zY29wZWQgYW5kIGNhbmNlbHMgd2l0aCB0aGUgdHVybi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IFwic3VtbWFyaXplXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlN1bW1hcml6ZSBhIGJsb2NrIG9mIHRleHQgdXNpbmcgYSBmYXN0LCBzbWFsbCBtb2RlbC4gVXNlIGl0IHRvIGNvbmRlbnNlIGxvbmcgXCIgK1xuICAgICAgXCJjb250ZW50LCBub3RlcywgdHJhbnNjcmlwdHMsIG9yIHRvb2wgcmVzdWx0cyBpbnRvIGEgc2hvcnQgc3VtbWFyeSB3aXRob3V0IFwiICtcbiAgICAgIFwic3BlbmRpbmcgdGhlIG1haW4gY2hhdCBtb2RlbC5cIixcbiAgICBpbnB1dFNjaGVtYTogc3VtbWFyaXplSW5wdXQsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCB7IHRleHQsIGluc3RydWN0aW9ucywgbWF4V29yZHMgfSA9IGlucHV0IGFzIHouaW5mZXI8dHlwZW9mIHN1bW1hcml6ZUlucHV0PjtcbiAgICAgIGNvbnN0IGN0eCA9IGNvbnRleHQgYXNcbiAgICAgICAgeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0OyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgc3VtbWFyaXplVGV4dChjb25maWcsIHRleHQsIHtcbiAgICAgICAgLi4uKGluc3RydWN0aW9ucyA/IHsgaW5zdHJ1Y3Rpb25zIH0gOiB7fSksXG4gICAgICAgIC4uLihtYXhXb3JkcyAhPT0gdW5kZWZpbmVkID8geyBtYXhXb3JkcyB9IDoge30pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgICAuLi4oY3R4Py5hYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWw6IGN0eC5hYm9ydFNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBzdW1tYXJ5IH07XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N1bW1hcml6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBR3hCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU3QyxrRUFBa0U7QUFDbEUsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztBQUV0RCx5RUFBeUU7QUFDekUsTUFBTSx1QkFBdUIsR0FBRztJQUM5QixpQ0FBaUM7SUFDakMsbUVBQW1FO0lBQ25FLDBFQUEwRTtJQUMxRSxzRUFBc0U7SUFDdEUsZUFBZTtJQUNmLHVFQUF1RTtJQUN2RSwwQkFBMEI7Q0FDM0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFYjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsdUVBQXVFO0lBQ3ZFLHlEQUF5RDtJQUN6RCxxRUFBcUU7SUFDckUsZUFBZTtJQUNmLHdCQUF3QjtDQUN6QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUVaOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUEwQjtJQUUxQixPQUFPLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQzVCLFVB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QUFNLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUF1QyxDQUFDO1lBQ2pGLE1BQU0sR0FBRyxHQUFHLE9BQ2dFLENBQUM7WUFDN0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDaEQsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxHQUFHLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUM5RCxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDckIsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNtYWxsLXRpZXIgc3VtbWFyaXphdGlvbiBmb3IgdGhlIE1hc3RyYSBwbHVnaW4uXG4gKlxuICogVHdvIHN1cmZhY2VzLCBib3RoIGJhY2tlZCBieSB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllclxuICogKHtAbGluayBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0fSkgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgc2FtZVxuICogYC9zZXJ2aW5nLWVuZHBvaW50c2AgcGlwZWxpbmUgYXMgdGhlIG1haW4gYWdlbnRzOlxuICpcbiAqICAgLSBBIGRlZGljYXRlZCBgc3VtbWFyaXplYCB0b29sIChzZWUge0BsaW5rIGJ1aWxkU3VtbWFyaXplVG9vbH0pXG4gKiAgICAgYWdlbnRzIGNhbiBjYWxsIHRvIGNvbmRlbnNlIGFyYml0cmFyeSB0ZXh0IHdpdGhvdXQgYnVybmluZyB0aGVcbiAqICAgICBoZWF2eXdlaWdodCBjaGF0IG1vZGVsLlxuICogICAtIFRoZSBtb2RlbCArIGluc3RydWN0aW9ucyBNYXN0cmEncyBtZW1vcnkgdXNlcyB0byBhdXRvLW5hbWVcbiAqICAgICBjb252ZXJzYXRpb24gdGhyZWFkcyAoYGdlbmVyYXRlVGl0bGVgKSwgc28gdGl0bGluZyByZXVzZXMgdGhlXG4gKiAgICAgc2FtZSBzbWFsbCB0aWVyIHJhdGhlciB0aGFuIHRoZSBhZ2VudCdzIHByaW1hcnkgbW9kZWwuXG4gKlxuICogTWlycm9ycyB0aGUgY2hhcnQtcGxhbm5lciB3aXJpbmcgaW4gYGNoYXJ0LnRzYDogYSBwZXItY29uZmlnIGNhY2hlZFxuICogYEFnZW50YCBvbiB0aGUgZmFzdCB0aWVyLCBpbnZva2VkIHZpYSBgYWdlbnQuZ2VuZXJhdGUoLi4uKWAgaW5zaWRlXG4gKiB0aGUgYWN0aXZlIGBhc1VzZXJgIHNjb3BlIHNvIHRva2VucyBzdGF5IHVzZXItc2NvcGVkLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFNb2RlbENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbGxtXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgdHlwZSB7IE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBUWVBPR1JBUEhZX1JVTEUgfSBmcm9tIFwiLi9zdHlsZS50c1wiO1xuXG4vKiogRmFzdCAvIHNtYWxsIGNoYXQgdGllciB1c2VkIGZvciBib3RoIHRpdGxpbmcgYW5kIHN1bW1hcmllcy4gKi9cbmNvbnN0IFNVTU1BUllfTU9ERUxfQ0xBU1MgPSBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0O1xuXG4vKiogU3lzdGVtIHByb21wdCBmb3IgdGhlIHN1bW1hcml6ZXIgYWdlbnQgKGFuZCB0aGUgYHN1bW1hcml6ZWAgdG9vbCkuICovXG5jb25zdCBTVU1NQVJJWkVSX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJZb3UgYXJlIGEgc3VtbWFyaXphdGlvbiBlbmdpbmUuXCIsXG4gIFwiR2l2ZW4gYSBibG9jayBvZiB0ZXh0LCBwcm9kdWNlIGEgZmFpdGhmdWwsIGNvbmNpc2Ugc3VtbWFyeSBvZiBpdC5cIixcbiAgXCJEZWZhdWx0IHRvIGEgZmV3IHNlbnRlbmNlczsgZm9sbG93IGFueSBsZW5ndGggZ3VpZGFuY2UgdGhlIGNhbGxlciBnaXZlcy5cIixcbiAgXCJQbGFpbiBwcm9zZS4gTm8gcHJlYW1ibGUsIG5vIGhlYWRlcnMsIG5vIGJ1bGxldCBwb2ludHMgdW5sZXNzIGFza2VkLlwiLFxuICBUWVBPR1JBUEhZX1JVTEUsXG4gIFwiTmV2ZXIgYWRkIGluZm9ybWF0aW9uLCBvcGluaW9ucywgb3IgZGV0YWlscyBub3QgcHJlc2VudCBpbiB0aGUgaW5wdXQuXCIsXG4gIFwiT3V0cHV0IG9ubHkgdGhlIHN1bW1hcnkuXCIsXG5dLmpvaW4oXCJcXG5cIik7XG5cbi8qKlxuICogSW5zdHJ1Y3Rpb25zIE1hc3RyYSdzIGBnZW5lcmF0ZVRpdGxlYCBoYW5kcyB0aGUgc21hbGwtdGllciBtb2RlbCB0b1xuICogbmFtZSBhIGNvbnZlcnNhdGlvbiB0aHJlYWQgZnJvbSBpdHMgb3BlbmluZyB0dXJuLiBLZXB0IHRlcnNlIHNvIHRoZVxuICogbW9kZWwgcmV0dXJucyBhIGJhcmUgdGl0bGUgd2l0aCBubyBkZWNvcmF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgVElUTEVfSU5TVFJVQ1RJT05TID0gW1xuICBcIkdlbmVyYXRlIGEgc2hvcnQsIHNwZWNpZmljIHRpdGxlIGZvciB0aGlzIGNvbnZlcnNhdGlvbiwgMyB0byA2IHdvcmRzLlwiLFxuICBcIkNhcHR1cmUgdGhlIHVzZXIncyB0b3BpYywgbm90IHRoZSBhc3Npc3RhbnQncyByZXNwb25zZS5cIixcbiAgXCJQbGFpbiB0ZXh0IG9ubHk6IG5vIHN1cnJvdW5kaW5nIHF1b3RlcyBhbmQgbm8gdHJhaWxpbmcgcHVuY3R1YXRpb24uXCIsXG4gIFRZUE9HUkFQSFlfUlVMRSxcbiAgXCJPdXRwdXQgb25seSB0aGUgdGl0bGUuXCIsXG5dLmpvaW4oXCIgXCIpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHNtYWxsLXRpZXIgbW9kZWwgZm9yIHN1bW1hcml6YXRpb24gLyB0aXRsaW5nLiBSZXVzZWQgYnlcbiAqIGJvdGggdGhlIHN1bW1hcml6ZXIgYWdlbnQgYW5kIE1hc3RyYSBtZW1vcnkncyBgZ2VuZXJhdGVUaXRsZWAuXG4gKlxuICogUmV0dXJuZWQgYXMgYSBgcmVxdWVzdENvbnRleHRgLXRha2luZyBmdW5jdGlvbiAoYSBNYXN0cmFcbiAqIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YCkgc28gZWFjaCBjYWxsIG1pbnRzIHVzZXItc2NvcGVkXG4gKiB0b2tlbnMgdmlhIHtAbGluayBidWlsZE1vZGVsfSwgZXhhY3RseSBsaWtlIHRoZSBwcmltYXJ5IGFnZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcnlNb2RlbChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4pOiAoYXJnczogeyByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfSkgPT4gUHJvbWlzZTxNYXN0cmFNb2RlbENvbmZpZz4ge1xuICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT5cbiAgICBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxDbGFzczogU1VNTUFSWV9NT0RFTF9DTEFTUyB9KTtcbn1cblxuLyoqXG4gKiBPbmUgc3VtbWFyaXplciBgQWdlbnRgIHBlciBwbHVnaW4gY29uZmlnLCBjYWNoZWQgb24gY29uZmlnLW9iamVjdFxuICogaWRlbnRpdHkgc28gYSBob3QgdG9vbCBwYXRoIGRvZXNuJ3QgcGF5IHRoZSBjb25zdHJ1Y3RvciBjb3N0IGVhY2hcbiAqIGNhbGwuIGBXZWFrTWFwYCBsZXRzIHJldGlyZWQgY29uZmlncyAoZS5nLiB0ZXN0IHJlY29uZmlndXJhdGlvbnMpXG4gKiByZWxlYXNlIHRoZWlyIGFnZW50IHdpdGhvdXQgbWFudWFsIGV2aWN0aW9uLlxuICovXG5jb25zdCBzdW1tYXJpemVyQWdlbnRzID0gbmV3IFdlYWtNYXA8TWFzdHJhUGx1Z2luQ29uZmlnLCBBZ2VudD4oKTtcblxuZnVuY3Rpb24gZ2V0U3VtbWFyaXplckFnZW50KGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogQWdlbnQge1xuICBsZXQgYWdlbnQgPSBzdW1tYXJpemVyQWdlbnRzLmdldChjb25maWcpO1xuICBpZiAoIWFnZW50KSB7XG4gICAgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgaWQ6IFwic3VtbWFyaXplclwiLFxuICAgICAgbmFtZTogXCJTdW1tYXJpemVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDb25kZW5zZXMgdGV4dCBpbnRvIGEgc2hvcnQgc3VtbWFyeSB1c2luZyBhIGZhc3QsIHNtYWxsIG1vZGVsLlwiLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBTVU1NQVJJWkVSX0lOU1RSVUNUSU9OUyxcbiAgICAgIG1vZGVsOiBzdW1tYXJ5TW9kZWwoY29uZmlnKSxcbiAgICB9KTtcbiAgICBzdW1tYXJpemVyQWdlbnRzLnNldChjb25maWcsIGFnZW50KTtcbiAgfVxuICByZXR1cm4gYWdlbnQ7XG59XG5cbi8qKiBJbnB1dHMgYWNjZXB0ZWQgYnkgdGhlIGBzdW1tYXJpemVgIHRvb2wuICovXG5jb25zdCBzdW1tYXJpemVJbnB1dCA9IHoub2JqZWN0KHtcbiAgdGV4dDogei5zdHJpbmcoKS5taW4oMSkuZGVzY3JpYmUoXCJUaGUgdGV4dCB0byBzdW1tYXJpemUuXCIpLFxuICBpbnN0cnVjdGlvbnM6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiT3B0aW9uYWwgZXh0cmEgZ3VpZGFuY2UgZm9yIHRoZSBzdW1tYXJ5LCBlLmcuICdvbmUgc2VudGVuY2UnIG9yICdsaXN0IHRoZSBhY3Rpb24gaXRlbXMnLlwiLFxuICAgICksXG4gIG1heFdvcmRzOiB6XG4gICAgLm51bWJlcigpXG4gICAgLmludCgpXG4gICAgLnBvc2l0aXZlKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIk9wdGlvbmFsIHNvZnQgY2FwIG9uIHRoZSBzdW1tYXJ5IGxlbmd0aCwgaW4gd29yZHMuXCIpLFxufSk7XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IHtAbGluayBzdW1tYXJpemVUZXh0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VtbWFyaXplT3B0aW9ucyB7XG4gIC8qKiBFeHRyYSBndWlkYW5jZSBmb3IgdGhlIHN1bW1hcnkgKGxlbmd0aCwgZm9jdXMsIGZvcm1hdCkuICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZztcbiAgLyoqIFNvZnQgY2FwIG9uIHN1bW1hcnkgbGVuZ3RoLCBpbiB3b3Jkcy4gKi9cbiAgbWF4V29yZHM/OiBudW1iZXI7XG4gIC8qKiBBY3RpdmUgcmVxdWVzdCBjb250ZXh0LCBzbyB0aGUgbW9kZWwgcmVzb2x2ZXIgbWludHMgdXNlci1zY29wZWQgdG9rZW5zLiAqL1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAvKiogQWJvcnQgc2lnbmFsIGJyaWRnZWQgZnJvbSB0aGUgY2FsbGluZyB0b29sIC8gcmVxdWVzdC4gKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBTdW1tYXJpemUgYHRleHRgIHdpdGggdGhlIHNtYWxsLXRpZXIgc3VtbWFyaXplciBhZ2VudCwgcmV0dXJuaW5nIHRoZVxuICogdHJpbW1lZCBzdW1tYXJ5IHN0cmluZy4gVGhyb3dzIG9uIG1vZGVsIGZhaWx1cmUgKHRoZSBjYWxsZXIgZGVjaWRlc1xuICogaG93IHRvIGRlZ3JhZGUpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3VtbWFyaXplVGV4dChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHRleHQ6IHN0cmluZyxcbiAgb3B0aW9uczogU3VtbWFyaXplT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBpbnN0cnVjdGlvbnMsIG1heFdvcmRzLCByZXF1ZXN0Q29udGV4dCwgYWJvcnRTaWduYWwgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHByb21wdCA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKHtcbiAgICAuLi4oaW5zdHJ1Y3Rpb25zID8geyBHdWlkYW5jZTogaW5zdHJ1Y3Rpb25zIH0gOiB7fSksXG4gICAgLi4uKG1heFdvcmRzICE9PSB1bmRlZmluZWQgPyB7IFwiTWF4IGxlbmd0aCAod29yZHMpXCI6IFN0cmluZyhtYXhXb3JkcykgfSA6IHt9KSxcbiAgICBUZXh0OiB0ZXh0LFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3VtbWFyaXplckFnZW50KGNvbmZpZykuZ2VuZXJhdGUocHJvbXB0LCB7XG4gICAgLi4uKHJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiByZXN1bHQudGV4dC50cmltKCk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBzdW1tYXJpemVgIHRvb2wuIEV4cG9zZWQgYXMgYW4gYW1iaWVudCBzeXN0ZW0gdG9vbCAobGlrZVxuICogYHJlbmRlcl9kYXRhYCkgc28gZXZlcnkgYWdlbnQgY2FuIG9mZmxvYWQgY29uZGVuc2luZyBsb25nIGNvbnRlbnQsXG4gKiBub3RlcywgdHJhbnNjcmlwdHMsIG9yIGJ1bGt5IHRvb2wgcmVzdWx0cyB0byB0aGUgZmFzdCB0aWVyIGluc3RlYWQgb2ZcbiAqIHNwZW5kaW5nIGl0cyBwcmltYXJ5IGNoYXQgbW9kZWwuIFRoZSB0b29sIHJlYWRzIHRoZSBsaXZlXG4gKiBgcmVxdWVzdENvbnRleHRgIC8gYGFib3J0U2lnbmFsYCBvZmYgdGhlIE1hc3RyYSBleGVjdXRpb24gY29udGV4dCBzb1xuICogaXRzIG1vZGVsIGNhbGwgc3RheXMgdXNlci1zY29wZWQgYW5kIGNhbmNlbHMgd2l0aCB0aGUgdHVybi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IFwic3VtbWFyaXplXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlN1bW1hcml6ZSBhIGJsb2NrIG9mIHRleHQgdXNpbmcgYSBmYXN0LCBzbWFsbCBtb2RlbC4gVXNlIGl0IHRvIGNvbmRlbnNlIGxvbmcgXCIgK1xuICAgICAgXCJjb250ZW50LCBub3RlcywgdHJhbnNjcmlwdHMsIG9yIHRvb2wgcmVzdWx0cyBpbnRvIGEgc2hvcnQgc3VtbWFyeSB3aXRob3V0IFwiICtcbiAgICAgIFwic3BlbmRpbmcgdGhlIG1haW4gY2hhdCBtb2RlbC5cIixcbiAgICBpbnB1dFNjaGVtYTogc3VtbWFyaXplSW5wdXQsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCB7IHRleHQsIGluc3RydWN0aW9ucywgbWF4V29yZHMgfSA9IGlucHV0IGFzIHouaW5mZXI8dHlwZW9mIHN1bW1hcml6ZUlucHV0PjtcbiAgICAgIGNvbnN0IGN0eCA9IGNvbnRleHQgYXNcbiAgICAgICAgeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0OyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgc3VtbWFyaXplVGV4dChjb25maWcsIHRleHQsIHtcbiAgICAgICAgLi4uKGluc3RydWN0aW9ucyA/IHsgaW5zdHJ1Y3Rpb25zIH0gOiB7fSksXG4gICAgICAgIC4uLihtYXhXb3JkcyAhPT0gdW5kZWZpbmVkID8geyBtYXhXb3JkcyB9IDoge30pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgICAuLi4oY3R4Py5hYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWw6IGN0eC5hYm9ydFNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBzdW1tYXJ5IH07XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../src/agents.ts","../src/chart.ts","../src/config.ts","../src/defaults.ts","../src/filesystems.ts","../src/genie.ts","../src/history.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/observability.ts","../src/pagination.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/summarize.ts","../src/threads.ts","../src/trace-io.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/agents.ts","../src/chart.ts","../src/config.ts","../src/defaults.ts","../src/filesystems.ts","../src/genie.ts","../src/history.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/observability.ts","../src/pagination.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/threads.ts","../src/trace-io.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -31,18 +31,18 @@
31
31
  "dependencies": {
32
32
  "@databricks/appkit": "^0.43.0",
33
33
  "@databricks/sdk-experimental": "^0.17.0",
34
- "@dbx-tools/appkit": "0.6.46",
35
- "@dbx-tools/core": "0.6.46",
36
- "@dbx-tools/databricks": "0.6.46",
37
- "@dbx-tools/fs": "0.6.46",
38
- "@dbx-tools/genie": "0.6.46",
39
- "@dbx-tools/model": "0.6.46",
40
- "@dbx-tools/path": "0.6.46",
41
- "@dbx-tools/shared-core": "0.6.46",
42
- "@dbx-tools/shared-fs": "0.6.46",
43
- "@dbx-tools/shared-genie": "0.6.46",
44
- "@dbx-tools/shared-mastra": "0.6.46",
45
- "@dbx-tools/shared-model": "0.6.46",
34
+ "@dbx-tools/appkit": "0.6.49",
35
+ "@dbx-tools/core": "0.6.49",
36
+ "@dbx-tools/databricks": "0.6.49",
37
+ "@dbx-tools/fs": "0.6.49",
38
+ "@dbx-tools/genie": "0.6.49",
39
+ "@dbx-tools/model": "0.6.49",
40
+ "@dbx-tools/path": "0.6.49",
41
+ "@dbx-tools/shared-core": "0.6.49",
42
+ "@dbx-tools/shared-fs": "0.6.49",
43
+ "@dbx-tools/shared-genie": "0.6.49",
44
+ "@dbx-tools/shared-mastra": "0.6.49",
45
+ "@dbx-tools/shared-model": "0.6.49",
46
46
  "@mastra/ai-sdk": "^1.6.0",
47
47
  "@mastra/core": "^1.47.0",
48
48
  "@mastra/express": "^1.4.2",
@@ -71,7 +71,7 @@
71
71
  "./package.json": "./package.json"
72
72
  }
73
73
  },
74
- "version": "0.6.46",
74
+ "version": "0.6.49",
75
75
  "types": "./lib/index.d.ts",
76
76
  "type": "module",
77
77
  "exports": {
package/src/agents.ts CHANGED
@@ -32,6 +32,7 @@ import { buildGenieToolkitProvider, resolveGenieSpaces } from "./genie.ts";
32
32
  import type { MemoryBuilder } from "./memory.ts";
33
33
  import { buildModel } from "./model.ts";
34
34
  import { ResultProcessor, stripStaleChartsProcessor } from "./processors.ts";
35
+ import { TYPOGRAPHY_RULE } from "./style.ts";
35
36
  import { buildSummarizeTool } from "./summarize.ts";
36
37
  import { createWorkspace } from "./workspaces.ts";
37
38
 
@@ -408,8 +409,7 @@ export const DEFAULT_STYLE_INSTRUCTIONS = [
408
409
  "Use markdown formatting, including headings, lists, and code blocks.",
409
410
  "Avoid lists and headers for short replies.",
410
411
  "Plain prose.",
411
- "Use hyphens (-) only. Never use em dashes or en dashes.",
412
- "Never use emojis.",
412
+ TYPOGRAPHY_RULE,
413
413
  "Skip openers like 'Great question', 'Absolutely', and 'I'd be happy to help'.",
414
414
  "Skip closers like 'Let me know if you have any questions'.",
415
415
  "Skip self-disclaimers like 'I should mention' and 'It's important to note'.",
package/src/config.ts CHANGED
@@ -24,7 +24,7 @@ import type { PgVectorConfig, PostgresStoreConfig } from "@mastra/pg";
24
24
 
25
25
  import type { MastraAgentDefinition, MastraTools } from "./agents.ts";
26
26
  import type { GenieSpacesConfig } from "./genie.ts";
27
- import type { MastraIdentityMode } from "./identity.ts";
27
+ import { IDENTITY_MODES, type MastraIdentityMode } from "./identity.ts";
28
28
  import type { RemoteSkillsOption } from "./remote-skills.ts";
29
29
 
30
30
  /**
@@ -526,8 +526,13 @@ export interface MastraPluginConfig extends BasePluginConfig {
526
526
  * - `"service-principal"`: always the app service principal. Needs no OBO
527
527
  * scopes and works for any caller who can open the app, at the cost of
528
528
  * per-user attribution in Genie / Unity Catalog.
529
+ * - `"auto"`: OBO when the request carries an OBO token, the service principal
530
+ * when it does not. For an app serving BOTH the platform front door and a
531
+ * door that has no token to forward - a `@dbx-tools/cli-tunnel` gate, a
532
+ * Teams channel - where AppKit's `asUser` would otherwise throw
533
+ * `AuthenticationError` outside `NODE_ENV=development`.
529
534
  *
530
- * `"service-principal"` changes only the Databricks CREDENTIAL. Memory
535
+ * The service-principal path changes only the Databricks CREDENTIAL. Memory
531
536
  * threads, the per-user cache namespace, and trace metadata still key off the
532
537
  * forwarded user, so callers sharing the service principal's data access keep
533
538
  * separate conversations and cannot read each other's threads or charts.
@@ -536,6 +541,11 @@ export interface MastraPluginConfig extends BasePluginConfig {
536
541
  * ```ts
537
542
  * mastra({ genieIdentity: "service-principal", genieSpaces: { default: spaceId } });
538
543
  * ```
544
+ *
545
+ * @example One app behind both the front door and a public tunnel
546
+ * ```ts
547
+ * mastra({ genieIdentity: "auto", genieSpaces: { default: spaceId } });
548
+ * ```
539
549
  */
540
550
  genieIdentity?: MastraIdentityMode;
541
551
  /**
@@ -691,9 +701,11 @@ export const MASTRA_CONFIG_SCHEMA: ConfigSchema = {
691
701
  },
692
702
  genieIdentity: {
693
703
  type: "string",
694
- enum: ["user", "service-principal"],
704
+ // Derived from the resolver's own list, so a mode can never be accepted at
705
+ // runtime while the published schema (and the UI built from it) omits it.
706
+ enum: [...IDENTITY_MODES],
695
707
  description:
696
- 'Which Databricks identity the agents\' workspace calls (serving catalogue, Genie, statement execution) run as. "user" (default) is always OBO, so callers must be workspace members; "service-principal" always uses the app service principal, so any caller who can open the app works, at the cost of per-user attribution. Falls back to MASTRA_GENIE_IDENTITY.',
708
+ 'Which Databricks identity the agents\' workspace calls (serving catalogue, Genie, statement execution) run as. "user" (default) is always OBO, so callers must be workspace members; "service-principal" always uses the app service principal, so any caller who can open the app works, at the cost of per-user attribution; "auto" uses OBO when the request carries an OBO token and the service principal when it does not, for an app that also serves a tunnel or webhook door. Falls back to MASTRA_GENIE_IDENTITY.',
697
709
  },
698
710
  apiAccess: {
699
711
  type: "string",
package/src/identity.ts CHANGED
@@ -7,7 +7,14 @@
7
7
  * client on the ambient AppKit execution context. That context is user-scoped
8
8
  * (OBO) whenever the plugin enters `asUser(req)` and the app's service principal
9
9
  * otherwise, so ONE decision - do we enter that scope for this request - moves
10
- * every call site together. This module owns that decision.
10
+ * every call site together.
11
+ *
12
+ * The decision itself is NOT Mastra-specific (the Teams messaging endpoint and
13
+ * the tunnel gate face it too), so it lives in `@dbx-tools/appkit`'s `identity`
14
+ * module - which also documents the measured AppKit behavior that makes `"auto"`
15
+ * necessary. This module is the Mastra-facing binding: the plugin's own config
16
+ * field and env var, re-exporting the shared vocabulary so a consumer importing
17
+ * `@dbx-tools/appkit-mastra` needs no second import.
11
18
  *
12
19
  * Why the option exists: OBO requires the caller to be a member of the
13
20
  * WORKSPACE, not merely of the Databricks account. An app shared with an
@@ -19,7 +26,7 @@
19
26
  * / warehouse / serving / Unity Catalog grants the app was deployed with, and
20
27
  * works for every caller.
21
28
  *
22
- * The two modes, from `config.genieIdentity` (env: {@link IDENTITY_ENV}):
29
+ * The modes, from `config.genieIdentity` (env: {@link IDENTITY_ENV}):
23
30
  *
24
31
  * - `"user"` (default): always OBO. Calls are attributed per user and Genie /
25
32
  * Unity Catalog row filters apply per user. Correct whenever every caller is
@@ -28,9 +35,13 @@
28
35
  * - `"service-principal"`: always the app service principal. Needs no OBO
29
36
  * scopes and works for any caller who can open the app, at the cost of
30
37
  * per-user attribution in Genie / Unity Catalog.
38
+ * - `"auto"`: OBO when the request carries an OBO token, the service principal
39
+ * when it does not. The mode for an app that serves BOTH the platform front
40
+ * door and a door with no OBO token to forward (a `@dbx-tools/cli-tunnel`
41
+ * gate, a Teams channel), since a single container serves both at once.
31
42
  *
32
- * What `"service-principal"` does NOT change is WHO the turn belongs to. The
33
- * memory thread's `resourceId`, the per-user cache namespace, and the user
43
+ * What the service-principal path does NOT change is WHO the turn belongs to.
44
+ * The memory thread's `resourceId`, the per-user cache namespace, and the user
34
45
  * metadata on traces still come from the forwarded request headers, so two
35
46
  * account users sharing the service principal's data access still get separate
36
47
  * conversations and cannot read each other's threads or cached charts. Only the
@@ -39,72 +50,50 @@
39
50
  * @module
40
51
  */
41
52
 
42
- import { ConfigurationError } from "@databricks/appkit";
43
- import { string } from "@dbx-tools/shared-core";
44
- import type express from "express";
53
+ import { identity } from "@dbx-tools/appkit";
45
54
 
46
55
  /** Identity a chat turn's Databricks calls run as. See the module docs. */
47
- export type MastraIdentityMode = "user" | "service-principal";
56
+ export type MastraIdentityMode = identity.IdentityMode;
48
57
 
49
58
  /** Environment fallback for `config.genieIdentity`. */
50
59
  export const IDENTITY_ENV = "MASTRA_GENIE_IDENTITY";
51
60
 
52
61
  /** Every accepted {@link MastraIdentityMode}. */
53
- export const IDENTITY_MODES: readonly MastraIdentityMode[] = ["user", "service-principal"];
62
+ export const IDENTITY_MODES = identity.IDENTITY_MODES;
54
63
 
55
64
  /**
56
65
  * Default mode. `"user"` keeps OBO the only identity unless an app opts in, so
57
66
  * adopting this option can never silently widen an existing app's data access.
58
67
  */
59
- export const DEFAULT_IDENTITY_MODE: MastraIdentityMode = "user";
68
+ export const DEFAULT_IDENTITY_MODE = identity.DEFAULT_IDENTITY_MODE;
69
+
70
+ /** Header Databricks Apps forward the signed-in user's id on. */
71
+ export const USER_ID_HEADER = identity.USER_ID_HEADER;
72
+
73
+ /** Header Databricks Apps forward the signed-in user's email on. */
74
+ export const USER_EMAIL_HEADER = identity.USER_EMAIL_HEADER;
60
75
 
61
76
  /**
62
77
  * Resolve the configured mode: explicit plugin config, then {@link IDENTITY_ENV},
63
- * then {@link DEFAULT_IDENTITY_MODE}.
64
- *
65
- * An unrecognized value throws rather than falling back, since falling back
66
- * would silently keep serving OBO - and the 500s it produces - to exactly the
67
- * callers the option was set to accommodate.
78
+ * then {@link DEFAULT_IDENTITY_MODE}. An unrecognized value throws.
68
79
  */
69
80
  export function resolveIdentityMode(configured: string | undefined): MastraIdentityMode {
70
- const raw = string.trimToNull(configured) ?? string.trimToNull(process.env[IDENTITY_ENV]);
71
- if (raw === null) return DEFAULT_IDENTITY_MODE;
72
- const mode = raw.toLowerCase() as MastraIdentityMode;
73
- if (!IDENTITY_MODES.includes(mode)) {
74
- throw new ConfigurationError(
75
- `genieIdentity must be one of ${IDENTITY_MODES.join(" | ")} (env: ${IDENTITY_ENV})`,
76
- { context: { field: "genieIdentity", envVar: IDENTITY_ENV, received: raw } },
77
- );
78
- }
79
- return mode;
81
+ return identity.resolveIdentityMode(configured, IDENTITY_ENV, "genieIdentity");
80
82
  }
81
83
 
82
- /** Header Databricks Apps forward the signed-in user's id on. */
83
- export const USER_ID_HEADER = "x-forwarded-user";
84
-
85
- /** Header Databricks Apps forward the signed-in user's email on. */
86
- export const USER_EMAIL_HEADER = "x-forwarded-email";
87
-
88
84
  /**
89
85
  * The forwarded user id on `req`, or `undefined`. Used to attribute a turn to
90
- * the real caller in `service-principal` mode, where the Databricks client is
91
- * the app SP but memory / cache / traces must still key off the user.
86
+ * the real caller when the Databricks client is the app SP but memory / cache /
87
+ * traces must still key off the user.
92
88
  */
93
- export function requestUserId(req: express.Request): string | undefined {
94
- return string.trimToNull(req.header(USER_ID_HEADER)) ?? undefined;
95
- }
89
+ export const requestUserId = identity.requestUserId;
96
90
 
97
91
  /** The forwarded user email on `req`, or `undefined`. */
98
- export function requestUserEmail(req: express.Request): string | undefined {
99
- return string.trimToNull(req.header(USER_EMAIL_HEADER)) ?? undefined;
100
- }
92
+ export const requestUserEmail = identity.requestUserEmail;
101
93
 
102
94
  /**
103
95
  * Whether this request should run its Databricks calls as the app service
104
- * principal rather than OBO. `"service-principal"` always does; `"user"` never
105
- * does. The request is accepted for symmetry and to leave room for
106
- * request-scoped policy later; it is unused today.
96
+ * principal rather than OBO - `"service-principal"` always, `"user"` never, and
97
+ * `"auto"` only when the request carries no OBO token for AppKit to use.
107
98
  */
108
- export function useServicePrincipal(mode: MastraIdentityMode, _req?: express.Request): boolean {
109
- return mode === "service-principal";
110
- }
99
+ export const useServicePrincipal = identity.useServicePrincipal;
package/src/style.ts ADDED
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The typography rule every prompt in this plugin shares.
3
+ *
4
+ * Three prompts tell a model how to render text - the agent style block
5
+ * ({@link agents.DEFAULT_STYLE_INSTRUCTIONS}), the summarizer, and the thread
6
+ * titler - and they have to AGREE, because a summary or a thread title sits
7
+ * beside agent prose in the same UI. Stated three times they drifted: one said
8
+ * "never em dashes or en dashes", another only "no em dashes". Keep the rule
9
+ * here so a change reaches every prompt.
10
+ *
11
+ * Em dashes and emojis are the two most recognizable LLM tells, and an em dash
12
+ * additionally breaks the repo's own prose style, so they are called out rather
13
+ * than left to the model's defaults.
14
+ *
15
+ * @module
16
+ */
17
+
18
+ /**
19
+ * One sentence, safe to append to any instruction block.
20
+ *
21
+ * Phrased as a standalone sentence (not a list fragment) so it reads correctly
22
+ * whether the surrounding prompt is joined with newlines or spaces.
23
+ */
24
+ export const TYPOGRAPHY_RULE =
25
+ "Never use emojis. Use hyphens (-) only, never em dashes or en dashes.";
package/src/summarize.ts CHANGED
@@ -29,6 +29,7 @@ import { z } from "zod";
29
29
 
30
30
  import type { MastraPluginConfig } from "./config.ts";
31
31
  import { buildModel } from "./model.ts";
32
+ import { TYPOGRAPHY_RULE } from "./style.ts";
32
33
 
33
34
  /** Fast / small chat tier used for both titling and summaries. */
34
35
  const SUMMARY_MODEL_CLASS = model.ModelClass.ChatFast;
@@ -39,7 +40,7 @@ const SUMMARIZER_INSTRUCTIONS = [
39
40
  "Given a block of text, produce a faithful, concise summary of it.",
40
41
  "Default to a few sentences; follow any length guidance the caller gives.",
41
42
  "Plain prose. No preamble, no headers, no bullet points unless asked.",
42
- "Never use emojis. Use hyphens (-) only, never em dashes or en dashes.",
43
+ TYPOGRAPHY_RULE,
43
44
  "Never add information, opinions, or details not present in the input.",
44
45
  "Output only the summary.",
45
46
  ].join("\n");
@@ -52,8 +53,9 @@ const SUMMARIZER_INSTRUCTIONS = [
52
53
  export const TITLE_INSTRUCTIONS = [
53
54
  "Generate a short, specific title for this conversation, 3 to 6 words.",
54
55
  "Capture the user's topic, not the assistant's response.",
55
- "Plain text only: no surrounding quotes, no trailing punctuation,",
56
- "no emojis, and no em dashes. Output only the title.",
56
+ "Plain text only: no surrounding quotes and no trailing punctuation.",
57
+ TYPOGRAPHY_RULE,
58
+ "Output only the title.",
57
59
  ].join(" ");
58
60
 
59
61
  /**