@aglyn/plugins-outreach 1.0.0-beta.220 → 1.0.0-beta.222

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 (116) hide show
  1. package/package.json +14 -14
  2. package/src/lib/components/do-not-contact-domains.d.ts +6 -2
  3. package/src/lib/components/do-not-contact-domains.js +73 -11
  4. package/src/lib/components/do-not-contact-domains.js.map +1 -1
  5. package/src/lib/components/enrollments-table.d.ts +6 -0
  6. package/src/lib/components/enrollments-table.js +77 -4
  7. package/src/lib/components/enrollments-table.js.map +1 -1
  8. package/src/lib/components/sequence-detail.js +3 -1
  9. package/src/lib/components/sequence-detail.js.map +1 -1
  10. package/src/lib/components/sequence-report-card.js +7 -3
  11. package/src/lib/components/sequence-report-card.js.map +1 -1
  12. package/src/lib/components/use-outreach-crm.d.ts +18 -15
  13. package/src/lib/components/use-outreach-crm.js +118 -87
  14. package/src/lib/components/use-outreach-crm.js.map +1 -1
  15. package/src/lib/components/use-outreach-data.d.ts +2 -2
  16. package/src/lib/components/use-outreach-data.js.map +1 -1
  17. package/src/lib/constants/transfer-resources.d.ts +33 -0
  18. package/src/lib/constants/transfer-resources.js +38 -0
  19. package/src/lib/constants/transfer-resources.js.map +1 -0
  20. package/src/lib/declarations.console-server.d.ts +7 -1
  21. package/src/lib/declarations.console-server.js +66 -1
  22. package/src/lib/declarations.console-server.js.map +1 -1
  23. package/src/lib/engine/click-tracking.js +1 -1
  24. package/src/lib/engine/click-tracking.js.map +1 -1
  25. package/src/lib/engine/ip-range.d.ts +26 -0
  26. package/src/lib/engine/ip-range.js +78 -0
  27. package/src/lib/engine/ip-range.js.map +1 -0
  28. package/src/lib/engine/open-source.d.ts +24 -0
  29. package/src/lib/engine/open-source.js +130 -0
  30. package/src/lib/engine/open-source.js.map +1 -0
  31. package/src/lib/engine/open-tracking.d.ts +15 -2
  32. package/src/lib/engine/open-tracking.js +59 -16
  33. package/src/lib/engine/open-tracking.js.map +1 -1
  34. package/src/lib/engine/outreach-access.d.ts +47 -0
  35. package/src/lib/engine/outreach-access.js +56 -0
  36. package/src/lib/engine/outreach-access.js.map +1 -0
  37. package/src/lib/enrollment/enroll-people.d.ts +10 -10
  38. package/src/lib/enrollment/enroll-people.js +30 -25
  39. package/src/lib/enrollment/enroll-people.js.map +1 -1
  40. package/src/lib/enrollment/gate-lookups.js +30 -15
  41. package/src/lib/enrollment/gate-lookups.js.map +1 -1
  42. package/src/lib/enrollment/message-templates.d.ts +24 -0
  43. package/src/lib/enrollment/message-templates.js +35 -0
  44. package/src/lib/enrollment/message-templates.js.map +1 -0
  45. package/src/lib/model/enrollment-engagement.d.ts +16 -0
  46. package/src/lib/model/enrollment-engagement.js +16 -0
  47. package/src/lib/model/enrollment-engagement.js.map +1 -1
  48. package/src/lib/model/enrollment-history.d.ts +8 -1
  49. package/src/lib/model/enrollment-history.js +17 -5
  50. package/src/lib/model/enrollment-history.js.map +1 -1
  51. package/src/lib/model/enrollment-timeline.d.ts +3 -0
  52. package/src/lib/model/enrollment-timeline.js +15 -4
  53. package/src/lib/model/enrollment-timeline.js.map +1 -1
  54. package/src/lib/model/outreach.types.d.ts +12 -3
  55. package/src/lib/model/outreach.types.js +12 -1
  56. package/src/lib/model/outreach.types.js.map +1 -1
  57. package/src/lib/model/sequence-report.d.ts +14 -7
  58. package/src/lib/model/sequence-report.js +12 -8
  59. package/src/lib/model/sequence-report.js.map +1 -1
  60. package/src/lib/plugin.js +18 -0
  61. package/src/lib/plugin.js.map +1 -1
  62. package/src/lib/routes/curate-routes.js +4 -6
  63. package/src/lib/routes/curate-routes.js.map +1 -1
  64. package/src/lib/routes/enroll-routes.d.ts +0 -12
  65. package/src/lib/routes/enroll-routes.js +52 -92
  66. package/src/lib/routes/enroll-routes.js.map +1 -1
  67. package/src/lib/routes/platform-deps.d.ts +4 -16
  68. package/src/lib/routes/platform-deps.js +5 -25
  69. package/src/lib/routes/platform-deps.js.map +1 -1
  70. package/src/lib/routes/preview-routes.js +25 -13
  71. package/src/lib/routes/preview-routes.js.map +1 -1
  72. package/src/lib/routes/register-routes.js +7 -5
  73. package/src/lib/routes/register-routes.js.map +1 -1
  74. package/src/lib/routes/route-gate.js +6 -17
  75. package/src/lib/routes/route-gate.js.map +1 -1
  76. package/src/lib/routes/sequence-routes.d.ts +46 -0
  77. package/src/lib/routes/sequence-routes.js +155 -63
  78. package/src/lib/routes/sequence-routes.js.map +1 -1
  79. package/src/lib/runtime/click-events.js +8 -8
  80. package/src/lib/runtime/click-events.js.map +1 -1
  81. package/src/lib/runtime/click-route.js +5 -2
  82. package/src/lib/runtime/click-route.js.map +1 -1
  83. package/src/lib/runtime/lead-records.d.ts +18 -10
  84. package/src/lib/runtime/lead-records.js +14 -60
  85. package/src/lib/runtime/lead-records.js.map +1 -1
  86. package/src/lib/runtime/open-events.d.ts +8 -0
  87. package/src/lib/runtime/open-events.js +10 -3
  88. package/src/lib/runtime/open-events.js.map +1 -1
  89. package/src/lib/runtime/platform-runtime-deps.d.ts +9 -5
  90. package/src/lib/runtime/platform-runtime-deps.js +31 -24
  91. package/src/lib/runtime/platform-runtime-deps.js.map +1 -1
  92. package/src/lib/runtime/send-job.js +20 -17
  93. package/src/lib/runtime/send-job.js.map +1 -1
  94. package/src/lib/runtime/sync-job.js +10 -5
  95. package/src/lib/runtime/sync-job.js.map +1 -1
  96. package/src/lib/storage/do-not-contact-store.d.ts +8 -0
  97. package/src/lib/storage/do-not-contact-store.js +13 -0
  98. package/src/lib/storage/do-not-contact-store.js.map +1 -1
  99. package/src/lib/testing/stand-in-record-system.d.ts +54 -0
  100. package/src/lib/testing/stand-in-record-system.js +243 -0
  101. package/src/lib/testing/stand-in-record-system.js.map +1 -0
  102. package/src/lib/transfer/do-not-contact-transfer.d.ts +129 -0
  103. package/src/lib/transfer/do-not-contact-transfer.js +801 -0
  104. package/src/lib/transfer/do-not-contact-transfer.js.map +1 -0
  105. package/src/lib/transfer/plan-gate.d.ts +25 -0
  106. package/src/lib/transfer/plan-gate.js +35 -0
  107. package/src/lib/transfer/plan-gate.js.map +1 -0
  108. package/src/lib/transfer/platform-transfer-deps.d.ts +24 -0
  109. package/src/lib/transfer/platform-transfer-deps.js +39 -0
  110. package/src/lib/transfer/platform-transfer-deps.js.map +1 -0
  111. package/src/lib/transfer/sequences-package.d.ts +48 -0
  112. package/src/lib/transfer/sequences-package.js +93 -0
  113. package/src/lib/transfer/sequences-package.js.map +1 -0
  114. package/src/lib/transfer/sequences-package.server.d.ts +31 -0
  115. package/src/lib/transfer/sequences-package.server.js +207 -0
  116. package/src/lib/transfer/sequences-package.server.js.map +1 -0
@@ -0,0 +1,207 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ /*==========================================
18
+ * SEQUENCES IN A WORKSPACE PACKAGE — the server half (AGL-3535).
19
+ *
20
+ * Reads the workspace's sequences as package items and writes imported
21
+ * ones through the editor's own save (`saveOutreachSequence`): the same
22
+ * validator, the same placement rules (the site is the organization's,
23
+ * the mailbox connected here and the importer's to send from, the
24
+ * countries allowed), the same activity line — so an import can store
25
+ * nothing the editor would refuse. A new sequence is a draft; a replaced
26
+ * one keeps its status; undo deletes through the delete route's own rule
27
+ * (a draft nobody was enrolled in) and restores through the save.
28
+ *
29
+ * The importer is resolved as the sequence routes resolve a caller: a
30
+ * member of the organization, across all of it, holding Use Sequences, in
31
+ * a workspace entitled to Sequences. Anything short of that is an
32
+ * objection at the dry run, before anything is written.
33
+ *=========================================*/ import { existingPackageItemsOf } from "@aglyn/aglyn/data-transfer";
34
+ import { checkEntitlement } from "@aglyn/aglyn/server";
35
+ import { OUTREACH_USE_PERMISSION } from "../constants/bundle-common.js";
36
+ import { defaultOutreachRouteDeps } from "../routes/register-routes.js";
37
+ import { removeOutreachSequence, saveOutreachSequence } from "../routes/sequence-routes.js";
38
+ import { readStoredOutreachMailbox, readStoredOutreachSequence } from "../storage/outreach-records.js";
39
+ import { outreachOrgCollection } from "../storage/outreach-records.js";
40
+ import { OUTREACH_MAILBOX_REFERENCE_KIND, OUTREACH_SEQUENCES_TRANSFER_KEY, outreachSequencePackageContent } from "./sequences-package.js";
41
+ /** The importer as a sequence route would admit them, or why it would not. */ async function importer(deps, ctx) {
42
+ var _ref;
43
+ if (!ctx.actorUid) return 'Sequences are imported by a member of the organization.';
44
+ const membership = await deps.gate.resolveOrgPermissions(ctx.actorUid, {
45
+ orgId: ctx.orgId
46
+ });
47
+ if (!membership.role || membership.orgId !== ctx.orgId) return 'You are not a member of that organization.';
48
+ if (!membership.orgWide) return 'Sequences covers the whole organization, and your access is to particular sites.';
49
+ if (membership.permissions[OUTREACH_USE_PERMISSION] !== true) return 'Your role does not include Use Sequences.';
50
+ const org = (_ref = await deps.gate.readOrg(ctx.orgId)) != null ? _ref : {};
51
+ if (!checkEntitlement(org, 'outreach')) return "Sequences isn't available to this workspace yet.";
52
+ return {
53
+ uid: ctx.actorUid,
54
+ email: null,
55
+ staff: false,
56
+ orgId: ctx.orgId,
57
+ org,
58
+ isOrgAdmin: membership.isOwner
59
+ };
60
+ }
61
+ /**
62
+ * Sequences as package items — archived ones too, so one coming back under
63
+ * its own id matches the archived sequence (which the save refuses to
64
+ * change) rather than writing over it as new.
65
+ */ async function readAll(deps, orgId, ids) {
66
+ const collection = outreachOrgCollection(deps.firestore(), orgId, 'sequences');
67
+ const docs = ids ? (await Promise.all(ids.map((id)=>collection.doc(id).get()))).filter((doc)=>doc.exists) : (await collection.get()).docs;
68
+ const items = [];
69
+ for (const doc of docs){
70
+ const stored = readStoredOutreachSequence(doc.id, doc.data());
71
+ if (!stored) continue;
72
+ const content = outreachSequencePackageContent(stored);
73
+ items.push({
74
+ kind: OUTREACH_SEQUENCES_TRANSFER_KEY,
75
+ id: doc.id,
76
+ name: content.name,
77
+ content
78
+ });
79
+ }
80
+ return items;
81
+ }
82
+ /** The draft one item is saved as: its content, under a kept-both copy's new name. */ function draftOf(write) {
83
+ var _ref;
84
+ var _write_rename;
85
+ return _extends({}, write.content, {
86
+ name: (_ref = (_write_rename = write.rename) == null ? void 0 : _write_rename.name) != null ? _ref : write.content.name
87
+ });
88
+ }
89
+ async function save(deps, caller, write, judgeOnly) {
90
+ return saveOutreachSequence(deps, caller, _extends({
91
+ sequenceId: write.decision === 'replace' ? write.targetId : null
92
+ }, write.decision === 'replace' ? {} : {
93
+ newId: write.targetId
94
+ }, {
95
+ draft: draftOf(write),
96
+ judgeOnly
97
+ }));
98
+ }
99
+ export function createOutreachSequencesPackage(deps = defaultOutreachRouteDeps()) {
100
+ return {
101
+ async items (ctx) {
102
+ return existingPackageItemsOf(OUTREACH_SEQUENCES_TRANSFER_KEY, await readAll(deps, ctx.orgId));
103
+ },
104
+ async readItems (ctx, ids) {
105
+ return readAll(deps, ctx.orgId, ids);
106
+ },
107
+ async problems (ctx, write) {
108
+ var _judged_issues;
109
+ const caller = await importer(deps, ctx);
110
+ if (typeof caller === 'string') return [
111
+ caller
112
+ ];
113
+ const judged = await save(deps, caller, write, true);
114
+ if (judged.ok !== false) return [];
115
+ const errors = ((_judged_issues = judged.issues) != null ? _judged_issues : []).filter((issue)=>issue.severity === 'error').map((issue)=>issue.message);
116
+ return errors.length ? [
117
+ ...new Set(errors)
118
+ ] : [
119
+ judged.message
120
+ ];
121
+ },
122
+ async referenceTargets (ctx, kinds) {
123
+ if (!kinds.includes(OUTREACH_MAILBOX_REFERENCE_KIND)) return [];
124
+ const snapshot = await outreachOrgCollection(deps.firestore(), ctx.orgId, 'mailboxes').get();
125
+ return [
126
+ {
127
+ kind: OUTREACH_MAILBOX_REFERENCE_KIND,
128
+ label: 'Mailbox',
129
+ targets: snapshot.docs.flatMap((doc)=>{
130
+ const mailbox = readStoredOutreachMailbox(doc.id, doc.data());
131
+ return mailbox && mailbox.status !== 'disconnected' ? [
132
+ {
133
+ id: doc.id,
134
+ name: mailbox.email
135
+ }
136
+ ] : [];
137
+ })
138
+ }
139
+ ];
140
+ },
141
+ async writeItems (ctx, items, writer) {
142
+ const caller = await importer(deps, ctx);
143
+ const results = [];
144
+ for (const write of items){
145
+ const before = await writer.alreadyApplied(write.row);
146
+ if (before) {
147
+ results.push(before);
148
+ continue;
149
+ }
150
+ let result;
151
+ if (typeof caller === 'string') {
152
+ result = {
153
+ row: write.row,
154
+ outcome: 'failed',
155
+ message: caller
156
+ };
157
+ } else {
158
+ const saved = await save(deps, caller, write, false);
159
+ result = saved.ok === false ? {
160
+ row: write.row,
161
+ outcome: 'failed',
162
+ recordId: write.targetId,
163
+ message: saved.message
164
+ } : {
165
+ row: write.row,
166
+ outcome: saved.created ? 'created' : 'updated',
167
+ recordId: saved.sequence.id
168
+ };
169
+ }
170
+ await writer.markApplied(result);
171
+ results.push(result);
172
+ }
173
+ return {
174
+ results,
175
+ undo: []
176
+ };
177
+ },
178
+ async revertItems (ctx, steps) {
179
+ const caller = await importer(deps, ctx);
180
+ const outcome = {
181
+ done: [],
182
+ refused: []
183
+ };
184
+ for (const step of steps){
185
+ if (typeof caller === 'string') {
186
+ outcome.refused.push({
187
+ id: step.id,
188
+ reason: caller
189
+ });
190
+ continue;
191
+ }
192
+ const done = step.action === 'delete' ? await removeOutreachSequence(deps, caller, step.id) : await saveOutreachSequence(deps, caller, {
193
+ sequenceId: step.id,
194
+ draft: outreachSequencePackageContent(step.content)
195
+ });
196
+ if (done.ok === false) outcome.refused.push({
197
+ id: step.id,
198
+ reason: done.message
199
+ });
200
+ else outcome.done.push(step.id);
201
+ }
202
+ return outcome;
203
+ }
204
+ };
205
+ }
206
+
207
+ //# sourceMappingURL=sequences-package.server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/outreach/src/lib/transfer/sequences-package.server.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*==========================================\n * SEQUENCES IN A WORKSPACE PACKAGE — the server half (AGL-3535).\n *\n * Reads the workspace's sequences as package items and writes imported\n * ones through the editor's own save (`saveOutreachSequence`): the same\n * validator, the same placement rules (the site is the organization's,\n * the mailbox connected here and the importer's to send from, the\n * countries allowed), the same activity line — so an import can store\n * nothing the editor would refuse. A new sequence is a draft; a replaced\n * one keeps its status; undo deletes through the delete route's own rule\n * (a draft nobody was enrolled in) and restores through the save.\n *\n * The importer is resolved as the sequence routes resolve a caller: a\n * member of the organization, across all of it, holding Use Sequences, in\n * a workspace entitled to Sequences. Anything short of that is an\n * objection at the dry run, before anything is written.\n *=========================================*/\n\nimport { existingPackageItemsOf, type ExistingPackageItem } from '@aglyn/aglyn/data-transfer'\nimport type {\n TransferApplyResult,\n TransferApplyWriter,\n TransferPackageItemContent,\n TransferPackageItemWrite,\n TransferPackageRevertResult,\n TransferPackageRevertStep,\n TransferResourceContext,\n} from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources'\nimport type { TransferReferenceKind, TransferRowResult } from '@aglyn/aglyn/data-transfer'\nimport { checkEntitlement } from '@aglyn/aglyn/server'\nimport { OUTREACH_USE_PERMISSION } from '../constants/bundle-common'\nimport { defaultOutreachRouteDeps } from '../routes/register-routes'\nimport type { OutreachRouteDeps } from '../routes/route-deps'\nimport type { OutreachRouteCaller } from '../routes/route-gate'\nimport { removeOutreachSequence, saveOutreachSequence } from '../routes/sequence-routes'\nimport { readStoredOutreachMailbox, readStoredOutreachSequence } from '../storage/outreach-records'\nimport { outreachOrgCollection } from '../storage/outreach-records'\nimport {\n OUTREACH_MAILBOX_REFERENCE_KIND,\n OUTREACH_SEQUENCES_TRANSFER_KEY,\n outreachSequencePackageContent,\n type OutreachSequencePackageContent,\n} from './sequences-package'\n\ntype Deps = Pick<OutreachRouteDeps, 'firestore' | 'now' | 'logOrgActivity' | 'gate'>\n\n/** The importer as a sequence route would admit them, or why it would not. */\nasync function importer(deps: Deps, ctx: TransferResourceContext): Promise<OutreachRouteCaller | string> {\n if (!ctx.actorUid) return 'Sequences are imported by a member of the organization.'\n const membership = await deps.gate.resolveOrgPermissions(ctx.actorUid, { orgId: ctx.orgId })\n if (!membership.role || membership.orgId !== ctx.orgId) return 'You are not a member of that organization.'\n if (!membership.orgWide) return 'Sequences covers the whole organization, and your access is to particular sites.'\n if (membership.permissions[OUTREACH_USE_PERMISSION] !== true) return 'Your role does not include Use Sequences.'\n const org = (await deps.gate.readOrg(ctx.orgId)) ?? {}\n if (!checkEntitlement(org, 'outreach')) return \"Sequences isn't available to this workspace yet.\"\n return { uid: ctx.actorUid, email: null, staff: false, orgId: ctx.orgId, org, isOrgAdmin: membership.isOwner }\n}\n\n/**\n * Sequences as package items — archived ones too, so one coming back under\n * its own id matches the archived sequence (which the save refuses to\n * change) rather than writing over it as new.\n */\nasync function readAll(deps: Deps, orgId: string, ids?: readonly string[]): Promise<Array<TransferPackageItemContent<OutreachSequencePackageContent>>> {\n const collection = outreachOrgCollection(deps.firestore(), orgId, 'sequences')\n const docs = ids\n ? (await Promise.all(ids.map((id) => collection.doc(id).get()))).filter((doc) => doc.exists)\n : (await collection.get()).docs\n const items: Array<TransferPackageItemContent<OutreachSequencePackageContent>> = []\n for (const doc of docs) {\n const stored = readStoredOutreachSequence(doc.id, doc.data())\n if (!stored) continue\n const content = outreachSequencePackageContent(stored)\n items.push({ kind: OUTREACH_SEQUENCES_TRANSFER_KEY, id: doc.id, name: content.name, content })\n }\n return items\n}\n\n/** The draft one item is saved as: its content, under a kept-both copy's new name. */\nfunction draftOf(write: TransferPackageItemWrite<OutreachSequencePackageContent>): OutreachSequencePackageContent {\n return { ...write.content, name: write.rename?.name ?? write.content.name }\n}\n\nasync function save(\n deps: Deps,\n caller: OutreachRouteCaller,\n write: TransferPackageItemWrite<OutreachSequencePackageContent>,\n judgeOnly: boolean,\n) {\n return saveOutreachSequence(deps, caller, {\n sequenceId: write.decision === 'replace' ? write.targetId : null,\n ...(write.decision === 'replace' ? {} : { newId: write.targetId }),\n draft: draftOf(write),\n judgeOnly,\n })\n}\n\nexport function createOutreachSequencesPackage(deps: Deps = defaultOutreachRouteDeps()) {\n return {\n async items(ctx: TransferResourceContext): Promise<ExistingPackageItem[]> {\n return existingPackageItemsOf(OUTREACH_SEQUENCES_TRANSFER_KEY, await readAll(deps, ctx.orgId))\n },\n\n async readItems(ctx: TransferResourceContext, ids: readonly string[]) {\n return readAll(deps, ctx.orgId, ids)\n },\n\n async problems(ctx: TransferResourceContext, write: TransferPackageItemWrite<OutreachSequencePackageContent>) {\n const caller = await importer(deps, ctx)\n if (typeof caller === 'string') return [caller]\n const judged = await save(deps, caller, write, true)\n if (judged.ok !== false) return []\n const errors = (judged.issues ?? []).filter((issue) => issue.severity === 'error').map((issue) => issue.message)\n return errors.length ? [...new Set(errors)] : [judged.message]\n },\n\n async referenceTargets(ctx: TransferResourceContext, kinds: readonly string[]): Promise<TransferReferenceKind[]> {\n if (!kinds.includes(OUTREACH_MAILBOX_REFERENCE_KIND)) return []\n const snapshot = await outreachOrgCollection(deps.firestore(), ctx.orgId, 'mailboxes').get()\n return [\n {\n kind: OUTREACH_MAILBOX_REFERENCE_KIND,\n label: 'Mailbox',\n targets: snapshot.docs.flatMap((doc) => {\n const mailbox = readStoredOutreachMailbox(doc.id, doc.data())\n return mailbox && mailbox.status !== 'disconnected' ? [{ id: doc.id, name: mailbox.email }] : []\n }),\n },\n ]\n },\n\n async writeItems(\n ctx: TransferResourceContext,\n items: ReadonlyArray<TransferPackageItemWrite<OutreachSequencePackageContent>>,\n writer: TransferApplyWriter,\n ): Promise<TransferApplyResult> {\n const caller = await importer(deps, ctx)\n const results: TransferRowResult[] = []\n for (const write of items) {\n const before = await writer.alreadyApplied(write.row)\n if (before) {\n results.push(before)\n continue\n }\n let result: TransferRowResult\n if (typeof caller === 'string') {\n result = { row: write.row, outcome: 'failed', message: caller }\n } else {\n const saved = await save(deps, caller, write, false)\n result =\n saved.ok === false\n ? { row: write.row, outcome: 'failed', recordId: write.targetId, message: saved.message }\n : { row: write.row, outcome: saved.created ? 'created' : 'updated', recordId: saved.sequence.id }\n }\n await writer.markApplied(result)\n results.push(result)\n }\n return { results, undo: [] }\n },\n\n async revertItems(\n ctx: TransferResourceContext,\n steps: ReadonlyArray<TransferPackageRevertStep<OutreachSequencePackageContent>>,\n ): Promise<TransferPackageRevertResult> {\n const caller = await importer(deps, ctx)\n const outcome: TransferPackageRevertResult = { done: [], refused: [] }\n for (const step of steps) {\n if (typeof caller === 'string') {\n outcome.refused.push({ id: step.id, reason: caller })\n continue\n }\n const done =\n step.action === 'delete'\n ? await removeOutreachSequence(deps, caller, step.id)\n : await saveOutreachSequence(deps, caller, { sequenceId: step.id, draft: outreachSequencePackageContent(step.content) })\n if (done.ok === false) outcome.refused.push({ id: step.id, reason: done.message })\n else outcome.done.push(step.id)\n }\n return outcome\n },\n }\n}\n"],"names":["existingPackageItemsOf","checkEntitlement","OUTREACH_USE_PERMISSION","defaultOutreachRouteDeps","removeOutreachSequence","saveOutreachSequence","readStoredOutreachMailbox","readStoredOutreachSequence","outreachOrgCollection","OUTREACH_MAILBOX_REFERENCE_KIND","OUTREACH_SEQUENCES_TRANSFER_KEY","outreachSequencePackageContent","importer","deps","ctx","actorUid","membership","gate","resolveOrgPermissions","orgId","role","orgWide","permissions","org","readOrg","uid","email","staff","isOrgAdmin","isOwner","readAll","ids","collection","firestore","docs","Promise","all","map","id","doc","get","filter","exists","items","stored","data","content","push","kind","name","draftOf","write","rename","save","caller","judgeOnly","sequenceId","decision","targetId","newId","draft","createOutreachSequencesPackage","readItems","problems","judged","ok","errors","issues","issue","severity","message","length","Set","referenceTargets","kinds","includes","snapshot","label","targets","flatMap","mailbox","status","writeItems","writer","results","before","alreadyApplied","row","result","outcome","saved","recordId","created","sequence","markApplied","undo","revertItems","steps","done","refused","step","reason","action"],"mappings":"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"}