@whooshbang/sdk 5.0.0 → 6.0.0

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.
Files changed (67) hide show
  1. package/README.md +232 -83
  2. package/dist/cli/commands.js +2 -0
  3. package/dist/cli/commands.js.map +1 -1
  4. package/dist/client.d.ts +209 -1
  5. package/dist/client.js +540 -5
  6. package/dist/client.js.map +1 -1
  7. package/dist/index.d.ts +2 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/interactions.js +18 -3
  10. package/dist/interactions.js.map +1 -1
  11. package/dist/recipient/element.js +641 -14
  12. package/dist/recipient/element.js.map +1 -1
  13. package/dist/recipient/i18n/ar.js +77 -0
  14. package/dist/recipient/i18n/ar.js.map +1 -1
  15. package/dist/recipient/i18n/catalog.d.ts +75 -0
  16. package/dist/recipient/i18n/catalog.js.map +1 -1
  17. package/dist/recipient/i18n/de.js +82 -0
  18. package/dist/recipient/i18n/de.js.map +1 -1
  19. package/dist/recipient/i18n/en.js +82 -0
  20. package/dist/recipient/i18n/en.js.map +1 -1
  21. package/dist/recipient/i18n/es.js +82 -0
  22. package/dist/recipient/i18n/es.js.map +1 -1
  23. package/dist/recipient/i18n/fa.js +77 -0
  24. package/dist/recipient/i18n/fa.js.map +1 -1
  25. package/dist/recipient/i18n/fr.js +82 -0
  26. package/dist/recipient/i18n/fr.js.map +1 -1
  27. package/dist/recipient/i18n/hi.js +82 -0
  28. package/dist/recipient/i18n/hi.js.map +1 -1
  29. package/dist/recipient/i18n/id.js +82 -0
  30. package/dist/recipient/i18n/id.js.map +1 -1
  31. package/dist/recipient/i18n/it.js +82 -0
  32. package/dist/recipient/i18n/it.js.map +1 -1
  33. package/dist/recipient/i18n/nl.js +82 -0
  34. package/dist/recipient/i18n/nl.js.map +1 -1
  35. package/dist/recipient/i18n/pl.js +82 -0
  36. package/dist/recipient/i18n/pl.js.map +1 -1
  37. package/dist/recipient/i18n/pt-BR.js +82 -0
  38. package/dist/recipient/i18n/pt-BR.js.map +1 -1
  39. package/dist/recipient/i18n/ru.js +82 -0
  40. package/dist/recipient/i18n/ru.js.map +1 -1
  41. package/dist/recipient/i18n/tr.js +82 -0
  42. package/dist/recipient/i18n/tr.js.map +1 -1
  43. package/dist/recipient/i18n/uk.js +82 -0
  44. package/dist/recipient/i18n/uk.js.map +1 -1
  45. package/dist/recipient/i18n/zh-Hans.js +77 -0
  46. package/dist/recipient/i18n/zh-Hans.js.map +1 -1
  47. package/dist/recipient/order-section.d.ts +41 -0
  48. package/dist/recipient/order-section.js +547 -0
  49. package/dist/recipient/order-section.js.map +1 -0
  50. package/dist/recipient/order-view.d.ts +123 -0
  51. package/dist/recipient/order-view.js +304 -0
  52. package/dist/recipient/order-view.js.map +1 -0
  53. package/dist/recipient/platform-mark.d.ts +1 -0
  54. package/dist/recipient/platform-mark.js +57 -0
  55. package/dist/recipient/platform-mark.js.map +1 -0
  56. package/dist/recipient/quiet-section.d.ts +47 -0
  57. package/dist/recipient/quiet-section.js +490 -0
  58. package/dist/recipient/quiet-section.js.map +1 -0
  59. package/dist/recipient/quiet-view.d.ts +84 -0
  60. package/dist/recipient/quiet-view.js +250 -0
  61. package/dist/recipient/quiet-view.js.map +1 -0
  62. package/dist/recipient/view.d.ts +2 -0
  63. package/dist/recipient/view.js.map +1 -1
  64. package/dist/webhooks.d.ts +30 -1
  65. package/dist/webhooks.js +57 -4
  66. package/dist/webhooks.js.map +1 -1
  67. package/package.json +12 -2
@@ -35,6 +35,83 @@ export const recipientPanelCopy = {
35
35
  unavailable: "通知设置不可用。",
36
36
  unsubscribe: "断开",
37
37
  unsubscribeWarning: "断开将停止此渠道的所有通知,且无法撤销。",
38
+ tabChannels: "渠道",
38
39
  waiting: "等待你在服务提供方完成操作…",
40
+ orderHeading: "如果你没有回复",
41
+ orderIntro: "当消息需要你回复时,我们会按此顺序尝试你的渠道,直到你回复为止。拖动渠道或使用箭头即可调整顺序。更改将应用于新消息。",
42
+ orderIntroNarrow: "我们会按此顺序尝试你的渠道,直到你回复为止。使用箭头调整顺序。",
43
+ orderLevelsLabel: "紧急程度",
44
+ orderLevels: { low: "低", normal: "普通", high: "高", critical: "紧急" },
45
+ orderUsedFor: (c) => `用于:${c}`,
46
+ orderMoveUp: (c) => `上移${c}`,
47
+ orderMoveDown: (c) => `下移${c}`,
48
+ orderRemove: (c) => `移除${c}`,
49
+ orderAdd: "添加",
50
+ orderAddChannel: (c) => `添加${c}`,
51
+ orderWait: "等待 {minutes} 分钟获取我的回复,然后",
52
+ orderWaitLabel: (c) => `在${c}上等待你回复的分钟数`,
53
+ orderLastTry: "最后一次尝试",
54
+ orderEmpty: "这里没有任何渠道时,此级别中需要你回复的消息将完全无法送达你。",
55
+ orderStepLimit: (count) => `你的顺序最多可包含 ${count} 个渠道。`,
56
+ orderNotIn: "不在你的顺序中",
57
+ orderPreview: "新消息将依次尝试:",
58
+ orderPreviewStep: "{channel},等待 {minutes} 分钟",
59
+ orderSave: "保存",
60
+ orderSaveEmpty: "保存——不要联系我",
61
+ orderDiscard: "放弃更改",
62
+ orderReset: "恢复为建议的顺序",
63
+ orderDisconnected: "已断开连接。此步骤将被跳过,我们会直接尝试下一步。",
64
+ orderReconnect: (c) => `重新连接${c}`,
65
+ orderRemoveFromOrder: "从顺序中移除",
66
+ orderSaved: "你的顺序已保存。",
67
+ orderConflict: "你的顺序已在其他地方更改,因此此次更改未保存。以下是最新版本。",
68
+ orderSaveFailed: "你的顺序未保存。请重试。",
69
+ quietHeading: "免打扰时段",
70
+ quietIntro: "选择你不想被打扰的时间,以及这段时间里你的消息会怎么处理。",
71
+ quietNow: (t) => `免打扰至 ${t}`,
72
+ quietWhenHeading: "时间",
73
+ quietPeriod: (n) => `免打扰时段 ${n}`,
74
+ quietRemovePeriod: (n) => `移除免打扰时段 ${n}`,
75
+ quietDays: "星期",
76
+ quietFrom: "开始",
77
+ quietTo: "结束",
78
+ quietOvernight: "次日结束",
79
+ quietAdd: "添加免打扰时段",
80
+ quietAddAnother: "+ 添加免打扰时段",
81
+ quietNoPeriods: "尚未设置免打扰时段。你的消息会照常送达。",
82
+ quietTimeZone: "时区",
83
+ quietTimeZoneFixed: (z) => `时间按 ${z} 计算。`,
84
+ quietChannelsHeading: "免打扰期间",
85
+ quietBehaviours: {
86
+ deliver: "送达",
87
+ silent: "静音送达",
88
+ withhold: "不送达",
89
+ },
90
+ quietWithheldHeading: "渠道不送达时",
91
+ quietHold: "保留消息,等免打扰结束再送达",
92
+ quietReroute: "改为发送到我的免打扰渠道",
93
+ quietRerouteChannel: "免打扰渠道",
94
+ quietChooseChannel: "选择渠道",
95
+ quietChannelUnusable: "你的免打扰渠道目前无法接收消息,所以你的消息会保留到免打扰结束。请选择其他渠道来解决。",
96
+ quietCritical: "紧急消息仍会送达",
97
+ quietCriticalHint: "紧急消息仍会通过各自的渠道送达你。",
98
+ quietSave: "保存",
99
+ quietTurnOn: "开启免打扰",
100
+ quietDiscard: "放弃更改",
101
+ quietTurnOff: "关闭免打扰",
102
+ quietSaved: "你的免打扰时段已保存。",
103
+ quietTurnedOff: "免打扰已关闭。",
104
+ quietSaveFailed: "你的免打扰时段未保存。请重试。",
105
+ quietFixFields: "请修正标记的项目,然后再次保存。",
106
+ quietErrors: {
107
+ window_limit: "最多可设置 7 个免打扰时段。",
108
+ window_days_invalid: "请至少选择一天。",
109
+ window_time_invalid: "请输入时间,例如 22:00。",
110
+ window_empty: "开始和结束时间不能相同。",
111
+ channel_behaviour_invalid: "免打扰期间,此渠道无法这样处理。",
112
+ quiet_channel_required: "请为你的消息选择一个渠道。",
113
+ quiet_channel_unavailable: "该渠道目前无法接收消息。请选择其他渠道。",
114
+ time_zone_invalid: "请从列表中选择时区。",
115
+ },
39
116
  };
40
117
  //# sourceMappingURL=zh-Hans.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zh-Hans.js","sourceRoot":"","sources":["../../../src/recipient/i18n/zh-Hans.ts"],"names":[],"mappings":"AAEA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAuB;IACpD,iBAAiB,EAAE,SAAS;IAC5B,cAAc,EAAE,eAAe;IAC/B,QAAQ,EAAE,MAAM;IAChB,eAAe,EAAE,IAAI;IACrB,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,IAAI;IACT,YAAY,EAAE,0BAA0B;IACxC,kBAAkB,EAAE,MAAM;IAC1B,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,OAAO,EAAE;IACrC,SAAS,EAAE,KAAK;IAChB,kBAAkB,EAAE,UAAU;IAC9B,mBAAmB,EAAE,OAAO;IAC5B,iBAAiB,EAAE,YAAY;IAC/B,YAAY,EAAE,OAAO;IACrB,KAAK,EAAE,cAAc;IACrB,OAAO,EAAE,mBAAmB;IAC5B,gBAAgB,EAAE,0BAA0B;IAC5C,aAAa,EAAE,YAAY;IAC3B,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,aAAa;IACtB,YAAY,EAAE,QAAQ;IACtB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,MAAM;IACd,eAAe,EACb,oCAAoC;IACtC,iBAAiB,EAAE,qBAAqB;IACxC,2BAA2B,EACzB,sCAAsC;IACxC,4BAA4B,EAC1B,gCAAgC;IAClC,2BAA2B,EACzB,iCAAiC;IACnC,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,IAAI;IACjB,kBAAkB,EAAE,sBAAsB;IAC1C,OAAO,EAAE,gBAAgB;CAC1B,CAAC"}
1
+ {"version":3,"file":"zh-Hans.js","sourceRoot":"","sources":["../../../src/recipient/i18n/zh-Hans.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Channel, EscalationOrder } from "@whooshbang/contracts";
2
+ import type { RecipientPanelCopy } from "./i18n/catalog.js";
3
+ import { type OrderCandidate, type OrderDraft, type OrderLevel } from "./order-view.js";
4
+ /**
5
+ * "If you don't answer": the recipient's own escalation order (FXO-3672),
6
+ * built exactly to the approved canvas. Always editable: rows reorder by drag
7
+ * or by the arrow buttons, a change brings up Save and Discard, and a saved
8
+ * personal order can go back to the suggested one.
9
+ *
10
+ * Every value reaches the DOM through `textContent` or a typed property.
11
+ */
12
+ export declare const ORDER_SECTION_STYLES = "\n.order { container-type: inline-size; }\n.order .intro { line-height: 1.45; margin: 0 0 1rem; opacity: .85; }\n.order .intro-narrow { display: none; }\n.order .muted { font-size: .85rem; opacity: .75; }\n.order .levels {\n background: color-mix(in srgb, currentColor 6%, transparent);\n border-radius: .625rem;\n display: grid;\n gap: .375rem;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n margin-bottom: .5rem;\n padding: .25rem;\n}\n.order .levels button {\n background: transparent;\n border-radius: .5rem;\n color: inherit;\n min-height: 2.75rem;\n opacity: .8;\n padding: 0 .25rem;\n}\n.order .levels button[aria-pressed=\"true\"] {\n background: Canvas;\n box-shadow: 0 1px 2px color-mix(in srgb, currentColor 20%, transparent);\n font-weight: 600;\n opacity: 1;\n}\n.order ol { list-style: none; margin: .75rem 0 0; padding: 0; }\n.order ol li {\n align-items: stretch;\n border: 0;\n display: flex;\n flex-direction: column;\n gap: 0;\n margin: 0;\n padding: 0;\n}\n.order ol li.drop-target .row { outline: 2px dashed var(--whooshbang-accent, #EB001B); outline-offset: 2px; }\n.order .row {\n align-items: center;\n border: 1px solid color-mix(in srgb, currentColor 22%, transparent);\n border-radius: .5rem;\n display: flex;\n gap: .625rem;\n padding: .375rem .375rem .375rem .625rem;\n}\n.order .row.unavailable {\n border-color: color-mix(in srgb, #c62828 45%, transparent);\n flex-wrap: wrap;\n}\n.order .row[draggable=\"true\"] { cursor: grab; }\n.order .handle, .order .mark { flex: 0 0 auto; }\n/* A zero basis keeps a long \"Disconnected\" line from wrapping the row. */\n.order .who { display: flex; flex: 1 1 0%; flex-direction: column; min-width: 0; }\n.order .who .name { font-size: .95rem; font-weight: 600; }\n.order .who .detail { font-size: .85rem; opacity: .75; overflow-wrap: anywhere; }\n.order .row.unavailable .who .name { opacity: .7; }\n.order .row.unavailable .who .detail { color: #b42318; opacity: 1; }\n.order button.icon {\n align-items: center;\n background: transparent;\n border-radius: .375rem;\n color: inherit;\n display: inline-flex;\n flex: 0 0 auto;\n height: 2.25rem;\n justify-content: center;\n padding: 0;\n width: 2.25rem;\n}\n.order button.icon:disabled { opacity: .35; }\n.order .fix { display: flex; flex-basis: 100%; flex-wrap: wrap; gap: .5rem; padding-inline-start: 2.75rem; }\n.order .fix button { min-height: 2.75rem; }\n.order .between {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n font-size: .9rem;\n gap: .5rem;\n padding: .5rem 0 .5rem 2.125rem;\n}\n.order .between input {\n background: Field;\n border: 1px solid color-mix(in srgb, currentColor 35%, transparent);\n border-radius: .375rem;\n box-sizing: border-box;\n color: inherit;\n font: inherit;\n min-height: 2.25rem;\n padding: 0 .375rem;\n text-align: center;\n font-variant-numeric: tabular-nums;\n width: calc(var(--wait-digits, 3) * 1ch + .75rem + 2px);\n -moz-appearance: textfield;\n appearance: textfield;\n}\n.order .between input::-webkit-inner-spin-button,\n.order .between input::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n.order .between input:focus-visible {\n outline: 2px solid var(--whooshbang-accent, #EB001B);\n outline-offset: 2px;\n}\n.order .last { font-size: .85rem; opacity: .75; padding: .5rem 0 .25rem 2.125rem; }\n.order .warning {\n background: color-mix(in srgb, #c62828 8%, transparent);\n border: 1px solid color-mix(in srgb, #c62828 40%, transparent);\n border-radius: .5rem;\n line-height: 1.45;\n margin-top: .75rem;\n padding: .75rem .875rem;\n}\n.order .not-in { display: flex; flex-direction: column; gap: .5rem; margin-top: 1rem; }\n.order .not-in .label { font-size: .85rem; font-weight: 600; }\n.order .candidate {\n align-items: center;\n border: 1px dashed color-mix(in srgb, currentColor 35%, transparent);\n border-radius: .5rem;\n display: flex;\n gap: .625rem;\n justify-content: space-between;\n padding: .375rem .375rem .375rem .875rem;\n}\n.order .candidate .who .name { font-weight: 400; }\n.order .candidate button { min-height: 2.5rem; }\n.order .changes {\n border-top: 1px solid color-mix(in srgb, currentColor 18%, transparent);\n display: flex;\n flex-direction: column;\n gap: .75rem;\n margin-top: 1rem;\n padding-top: .875rem;\n}\n.order .changes .preview { line-height: 1.45; }\n.order .changes .preview strong { font-weight: 600; }\n.order .changes .buttons { display: flex; flex-wrap: wrap; gap: .625rem; }\n.order .changes .buttons button { min-height: 2.75rem; padding: 0 1.1rem; }\n.order .changes .buttons .save { font-weight: 600; }\n.order button.link {\n background: transparent;\n color: var(--whooshbang-accent, #EB001B);\n margin-top: 1rem;\n min-height: 2.5rem;\n padding: 0;\n text-decoration: underline;\n}\n.order .order-status:empty { display: none; }\n.order .order-status { margin: .75rem 0 0; }\n@container (max-width: 30rem) {\n .order .intro-wide { display: none; }\n .order .intro-narrow { display: block; }\n .order .handle, .order .mark { display: none; }\n .order .row { gap: .375rem; padding-inline-start: .75rem; }\n .order .between, .order .last { padding-inline-start: .75rem; }\n .order .fix { padding-inline-start: 0; }\n .order .levels { gap: .25rem; }\n .order .changes .buttons { flex-direction: column; }\n .order .changes .buttons button { min-height: 3rem; width: 100%; }\n}\n";
13
+ export interface OrderSectionProps {
14
+ readonly copy: RecipientPanelCopy;
15
+ readonly locale: string;
16
+ readonly order: EscalationOrder;
17
+ readonly draft: OrderDraft;
18
+ readonly changed: boolean;
19
+ /** Category names sent at this tier. */
20
+ readonly usedFor: readonly string[];
21
+ readonly disabled: boolean;
22
+ readonly status: HTMLElement;
23
+ readonly channelName: (channel: Channel) => string;
24
+ /** Whether the panel can start a connection for this channel right now. */
25
+ readonly canReconnect: (channel: Channel) => boolean;
26
+ readonly on: {
27
+ readonly pickLevel: (level: OrderLevel) => void;
28
+ readonly move: (from: number, to: number) => void;
29
+ readonly remove: (index: number) => void;
30
+ readonly add: (candidate: OrderCandidate) => void;
31
+ /** `commit` is the finished edit; typing updates without a rebuild. */
32
+ readonly setWait: (index: number, typed: string, commit: boolean) => void;
33
+ readonly save: () => void;
34
+ readonly discard: () => void;
35
+ readonly reset: () => void;
36
+ readonly reconnect: (channel: Channel) => void;
37
+ };
38
+ }
39
+ /** "Telegram, wait 5 min → Slack, wait 5 min → Email", from saved steps only. */
40
+ export declare function orderPreviewText(props: Pick<OrderSectionProps, "copy" | "channelName" | "draft" | "order">): string;
41
+ export declare function renderOrderSection(props: OrderSectionProps): HTMLElement;