cli-jaw 2.2.19 → 2.2.20

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 (95) hide show
  1. package/README.md +94 -3
  2. package/dist/server.js +11 -0
  3. package/dist/server.js.map +1 -1
  4. package/dist/src/agent/spawn/process-kill.js +96 -2
  5. package/dist/src/agent/spawn/process-kill.js.map +1 -1
  6. package/dist/src/agent/spawn.js +34 -65
  7. package/dist/src/agent/spawn.js.map +1 -1
  8. package/dist/src/bgtask/runner.js +26 -21
  9. package/dist/src/bgtask/runner.js.map +1 -1
  10. package/dist/src/cli/acp-client.js +11 -5
  11. package/dist/src/cli/acp-client.js.map +1 -1
  12. package/dist/src/cli/employee-handler.js +3 -2
  13. package/dist/src/cli/employee-handler.js.map +1 -1
  14. package/dist/src/code-mode/acp-host.js +22 -10
  15. package/dist/src/code-mode/acp-host.js.map +1 -1
  16. package/dist/src/core/config.js +14 -0
  17. package/dist/src/core/config.js.map +1 -1
  18. package/dist/src/core/db.js +16 -0
  19. package/dist/src/core/db.js.map +1 -1
  20. package/dist/src/core/employees.js +22 -4
  21. package/dist/src/core/employees.js.map +1 -1
  22. package/dist/src/core/windows-shell.js +63 -0
  23. package/dist/src/core/windows-shell.js.map +1 -0
  24. package/dist/src/discord/bot.js +199 -147
  25. package/dist/src/discord/bot.js.map +1 -1
  26. package/dist/src/discord/gateway-supervisor.js +303 -0
  27. package/dist/src/discord/gateway-supervisor.js.map +1 -0
  28. package/dist/src/discord/rest-scheduler.js +448 -0
  29. package/dist/src/discord/rest-scheduler.js.map +1 -0
  30. package/dist/src/discord/send-only-client.js +59 -43
  31. package/dist/src/discord/send-only-client.js.map +1 -1
  32. package/dist/src/manager/lifecycle.js +7 -2
  33. package/dist/src/manager/lifecycle.js.map +1 -1
  34. package/dist/src/manager/notes/capabilities.js +9 -7
  35. package/dist/src/manager/notes/capabilities.js.map +1 -1
  36. package/dist/src/memory/bootstrap.js +5 -1
  37. package/dist/src/memory/bootstrap.js.map +1 -1
  38. package/dist/src/memory/host-toolchain.js +156 -0
  39. package/dist/src/memory/host-toolchain.js.map +1 -0
  40. package/dist/src/messaging/channel-capabilities.js +30 -0
  41. package/dist/src/messaging/channel-capabilities.js.map +1 -0
  42. package/dist/src/messaging/delivery-outcome.js +73 -0
  43. package/dist/src/messaging/delivery-outcome.js.map +1 -0
  44. package/dist/src/messaging/draft-stream.js +154 -0
  45. package/dist/src/messaging/draft-stream.js.map +1 -0
  46. package/dist/src/messaging/runtime.js +3 -9
  47. package/dist/src/messaging/runtime.js.map +1 -1
  48. package/dist/src/messaging/send.js +40 -8
  49. package/dist/src/messaging/send.js.map +1 -1
  50. package/dist/src/messaging/types.js +22 -1
  51. package/dist/src/messaging/types.js.map +1 -1
  52. package/dist/src/notes/search.js +6 -4
  53. package/dist/src/notes/search.js.map +1 -1
  54. package/dist/src/prompt/builder.js +110 -6
  55. package/dist/src/prompt/builder.js.map +1 -1
  56. package/dist/src/prompt/conversation-context.js +23 -0
  57. package/dist/src/prompt/conversation-context.js.map +1 -0
  58. package/dist/src/prompt/templates/a1-system.md +28 -12
  59. package/dist/src/prompt/templates/control-system.md +19 -6
  60. package/dist/src/prompt/templates/employee.md +16 -3
  61. package/dist/src/security/path-guards.js +124 -27
  62. package/dist/src/security/path-guards.js.map +1 -1
  63. package/dist/src/slack/api.js +38 -5
  64. package/dist/src/slack/api.js.map +1 -1
  65. package/dist/src/slack/bot.js +214 -35
  66. package/dist/src/slack/bot.js.map +1 -1
  67. package/dist/src/slack/context.js +192 -0
  68. package/dist/src/slack/context.js.map +1 -0
  69. package/dist/src/slack/conversation.js +275 -0
  70. package/dist/src/slack/conversation.js.map +1 -0
  71. package/dist/src/slack/enrichment-cache.js +334 -0
  72. package/dist/src/slack/enrichment-cache.js.map +1 -0
  73. package/dist/src/slack/history.js +47 -8
  74. package/dist/src/slack/history.js.map +1 -1
  75. package/dist/src/slack/identity.js +99 -190
  76. package/dist/src/slack/identity.js.map +1 -1
  77. package/dist/src/slack/ingress.js +78 -2
  78. package/dist/src/slack/ingress.js.map +1 -1
  79. package/dist/src/slack/progress.js +39 -51
  80. package/dist/src/slack/progress.js.map +1 -1
  81. package/dist/src/slack/thread-tracker.js +78 -0
  82. package/dist/src/slack/thread-tracker.js.map +1 -1
  83. package/dist/src/telegram/bot.js +105 -56
  84. package/dist/src/telegram/bot.js.map +1 -1
  85. package/dist/src/telegram/update-offset.js +152 -0
  86. package/dist/src/telegram/update-offset.js.map +1 -0
  87. package/package.json +1 -1
  88. package/public/dist/assets/Agent-C5EvX-_v.js +1 -0
  89. package/public/dist/assets/{manager-Bjuh1jpq.js → manager-CP-Au860.js} +1 -1
  90. package/public/dist/manager/index.html +1 -1
  91. package/public/manager/src/settings/cli-status-polling.ts +84 -0
  92. package/public/manager/src/settings/pages/Agent.tsx +84 -5
  93. package/scripts/install-officecli.ps1 +38 -2
  94. package/scripts/install.ps1 +1 -1
  95. package/public/dist/assets/Agent-nMPZsMfN.js +0 -1
@@ -0,0 +1,334 @@
1
+ // ─── Enrichment Cache ────────────────────────────────
2
+ // The concurrency primitive behind Slack enrichment lookups: TTL cache with cap
3
+ // eviction, classified failure suppression, capability lockout with a single
4
+ // re-probe, in-flight coalescing, generation invalidation, and per-caller
5
+ // cancellation.
6
+ //
7
+ // Why this exists as its own module: every one of those concerns was already
8
+ // implemented, correctly and expensively, inside identity.ts — and specifying it
9
+ // a SECOND time for conversation lookups produced four consecutive audit
10
+ // failures, because the second specification kept disagreeing with the first
11
+ // about cancellation ownership. Extracting it means the discipline is written
12
+ // once and both adapters inherit it. Design: devlog
13
+ // 260812_slack_conversation_context/012_wp1_replan_shared_primitive.md.
14
+ //
15
+ // Two rules run through everything below:
16
+ // 1. Enrichment is decoration, never a precondition. Every failure path
17
+ // degrades; nothing here throws at its caller.
18
+ // 2. Shared work belongs to no single caller. One caller cancelling must not
19
+ // cancel the lookup its peers are waiting on.
20
+ const DEFAULT_SUPPRESSION_CAP = 1000;
21
+ export class EnrichmentCache {
22
+ partitions;
23
+ caches = new Map();
24
+ /** key -> epoch ms until which the key is suppressed. */
25
+ suppressed = new Map();
26
+ inFlight = new Map();
27
+ /** Capability keys whose lock has lapsed and whose re-probe is in flight. */
28
+ probing = new Set();
29
+ suppressionCap;
30
+ classifyFailure;
31
+ onEvent;
32
+ /**
33
+ * Bumped by reset. Captured at dispatch and re-checked before BOTH the cache
34
+ * write and the publication to waiters, so a lookup issued under a superseded
35
+ * token can neither poison the cache nor leak a stale value to a caller.
36
+ */
37
+ generation = 0;
38
+ constructor(options) {
39
+ this.partitions = options.partitions;
40
+ this.suppressionCap = options.suppressionCap ?? DEFAULT_SUPPRESSION_CAP;
41
+ this.classifyFailure = options.classifyFailure;
42
+ this.onEvent = options.onEvent;
43
+ for (const name of Object.keys(options.partitions)) {
44
+ this.caches.set(name, new Map());
45
+ }
46
+ }
47
+ /** Cache-only read. Never calls the loader; a miss is simply undefined. */
48
+ get(partition, resourceKey) {
49
+ const cache = this.caches.get(partition);
50
+ const entry = cache?.get(resourceKey);
51
+ if (!entry)
52
+ return undefined;
53
+ if (entry.expiresAt <= Date.now()) {
54
+ cache.delete(resourceKey);
55
+ return undefined;
56
+ }
57
+ return entry.value;
58
+ }
59
+ /** Insert a value obtained elsewhere (a bulk listing, a push payload). */
60
+ prime(partition, resourceKey, value) {
61
+ this.write(partition, resourceKey, value);
62
+ }
63
+ entryCount(partition) {
64
+ return this.caches.get(partition)?.size ?? 0;
65
+ }
66
+ isSuppressed(key) {
67
+ const until = this.suppressed.get(key);
68
+ if (until === undefined)
69
+ return false;
70
+ if (until <= Date.now()) {
71
+ this.suppressed.delete(key);
72
+ return false;
73
+ }
74
+ return true;
75
+ }
76
+ /**
77
+ * Suppress a key directly. Exposed for adapters that learn about a failure
78
+ * outside a `resolve` call.
79
+ */
80
+ suppress(key, ttlMs) {
81
+ this.suppressed.set(key, Date.now() + ttlMs);
82
+ if (this.suppressed.size > this.suppressionCap) {
83
+ const entries = [...this.suppressed.entries()].sort((a, b) => a[1] - b[1]);
84
+ for (const [stale] of entries.slice(0, Math.floor(this.suppressed.size / 2))) {
85
+ this.suppressed.delete(stale);
86
+ }
87
+ }
88
+ }
89
+ /** Release a capability lock and its probe reservation. */
90
+ clearCapability(capabilityKey) {
91
+ this.suppressed.delete(capabilityKey);
92
+ this.probing.delete(capabilityKey);
93
+ }
94
+ /**
95
+ * Resolve a value, degrading rather than throwing.
96
+ *
97
+ * Admission order is fixed (and load-bearing): cache -> suppression ->
98
+ * in-flight join -> start-rate admission -> new upstream request. Joining an
99
+ * existing request is NOT a "start", so coalesced callers never consume the
100
+ * rate budget.
101
+ */
102
+ async resolve(options) {
103
+ const { partition, resourceKey, capabilityKey, signal } = options;
104
+ const cached = this.get(partition, resourceKey);
105
+ if (cached !== undefined)
106
+ return cached;
107
+ // An already-cancelled caller should cost zero API calls.
108
+ if (signal?.aborted)
109
+ return options.degraded();
110
+ if (this.isSuppressed(resourceKey)) {
111
+ this.emit({ type: 'suppressed', scope: 'resource', key: resourceKey });
112
+ return options.degraded();
113
+ }
114
+ // Capability lock: while held, everyone degrades. Once it lapses exactly
115
+ // one caller is admitted to re-probe; the rest keep degrading until that
116
+ // probe answers. Letting them all through would restore the request storm
117
+ // the lock exists to prevent.
118
+ //
119
+ // The expiry check is INLINE rather than via isSuppressed(), because that
120
+ // helper deletes an expired key as a side effect — which erased the very
121
+ // marker that decides who becomes the probe, and admitted every caller.
122
+ let holdsProbe = false;
123
+ const lockedUntil = this.suppressed.get(capabilityKey);
124
+ if (lockedUntil !== undefined) {
125
+ if (lockedUntil > Date.now()) {
126
+ this.emit({ type: 'suppressed', scope: 'capability', key: capabilityKey });
127
+ return options.degraded();
128
+ }
129
+ if (this.probing.has(capabilityKey)) {
130
+ this.emit({ type: 'suppressed', scope: 'capability', key: capabilityKey });
131
+ return options.degraded();
132
+ }
133
+ // Lapsed and unclaimed: this caller is the single probe.
134
+ this.suppressed.delete(capabilityKey);
135
+ this.probing.add(capabilityKey);
136
+ holdsProbe = true;
137
+ }
138
+ else if (this.probing.has(capabilityKey)) {
139
+ // The probe holder already removed the marker; everyone else waits.
140
+ this.emit({ type: 'suppressed', scope: 'capability', key: capabilityKey });
141
+ return options.degraded();
142
+ }
143
+ const existing = this.inFlight.get(resourceKey);
144
+ if (existing && !existing.retired && existing.waiters > 0) {
145
+ if (holdsProbe)
146
+ this.probing.delete(capabilityKey);
147
+ return this.join(existing, options);
148
+ }
149
+ if (options.admitStart && !options.admitStart()) {
150
+ if (holdsProbe)
151
+ this.probing.delete(capabilityKey);
152
+ this.emit({ type: 'admission_declined', key: resourceKey });
153
+ return options.degraded();
154
+ }
155
+ return this.start(options, holdsProbe ? capabilityKey : null);
156
+ }
157
+ /** Invalidate everything. In-flight work is aborted and can no longer publish. */
158
+ reset() {
159
+ // Generation first: a request that settles during this call must already
160
+ // see itself as superseded.
161
+ this.generation += 1;
162
+ for (const record of this.inFlight.values()) {
163
+ record.retired = true;
164
+ record.controller.abort();
165
+ }
166
+ this.inFlight.clear();
167
+ this.probing.clear();
168
+ this.suppressed.clear();
169
+ for (const cache of this.caches.values())
170
+ cache.clear();
171
+ }
172
+ stats() {
173
+ const entries = {};
174
+ for (const [name, cache] of this.caches)
175
+ entries[name] = cache.size;
176
+ return { entries, suppressed: this.suppressed.size, inFlight: this.inFlight.size };
177
+ }
178
+ /**
179
+ * The current generation. Adapters compare against the value handed to their
180
+ * loader to tell a live result from a superseded one — needed when a failure
181
+ * has side effects of its own (a warn-once latch, a metric).
182
+ */
183
+ currentGeneration() {
184
+ return this.generation;
185
+ }
186
+ // ─── internals ──────────────────────────────────
187
+ emit(event) {
188
+ try {
189
+ this.onEvent?.(event);
190
+ }
191
+ catch { /* diagnostics must never break a lookup */ }
192
+ }
193
+ write(partition, resourceKey, value) {
194
+ const cache = this.caches.get(partition);
195
+ const spec = this.partitions[partition];
196
+ if (!cache || !spec)
197
+ return;
198
+ cache.set(resourceKey, { value, expiresAt: Date.now() + spec.ttlMs() });
199
+ if (cache.size > spec.cap) {
200
+ // Drop the half closest to expiry. Sorted by stored expiry rather than
201
+ // insertion order, because a re-write refreshes a value in place.
202
+ const entries = [...cache.entries()].sort((a, b) => a[1].expiresAt - b[1].expiresAt);
203
+ for (const [stale] of entries.slice(0, Math.floor(cache.size / 2))) {
204
+ cache.delete(stale);
205
+ }
206
+ }
207
+ }
208
+ /** Attach a caller to shared work, racing its own signal against the result. */
209
+ async join(record, options) {
210
+ record.waiters += 1;
211
+ try {
212
+ const value = await this.race(record, options.signal);
213
+ return value === undefined ? options.degraded() : value;
214
+ }
215
+ finally {
216
+ this.release(record, options.resourceKey);
217
+ }
218
+ }
219
+ /**
220
+ * Race shared work against this caller's cancellation.
221
+ *
222
+ * Cancelling abandons only this caller's interest — the shared request keeps
223
+ * running for its peers. `release` is what eventually stops it, once nobody
224
+ * is left waiting.
225
+ */
226
+ race(record, signal) {
227
+ if (!signal)
228
+ return record.promise;
229
+ if (signal.aborted)
230
+ return Promise.resolve(undefined);
231
+ return new Promise(resolve => {
232
+ const finish = (value) => {
233
+ signal.removeEventListener('abort', onAbort);
234
+ resolve(value);
235
+ };
236
+ const onAbort = () => finish(undefined);
237
+ signal.addEventListener('abort', onAbort, { once: true });
238
+ void record.promise.then(finish, () => finish(undefined));
239
+ });
240
+ }
241
+ /**
242
+ * Drop one waiter. When the last one leaves, the record is retired
243
+ * SYNCHRONOUSLY before its controller is aborted, so a caller arriving in the
244
+ * same tick cannot attach to work that is already dying.
245
+ */
246
+ release(record, resourceKey) {
247
+ record.waiters -= 1;
248
+ if (record.waiters > 0 || record.retired)
249
+ return;
250
+ record.retired = true;
251
+ if (this.inFlight.get(resourceKey) === record)
252
+ this.inFlight.delete(resourceKey);
253
+ // An abandoned probe reservation must be returned: an abort is neither a
254
+ // successful probe nor a capability failure, and holding it would keep the
255
+ // capability locked forever.
256
+ if (record.probeKey) {
257
+ this.probing.delete(record.probeKey);
258
+ record.probeKey = null;
259
+ }
260
+ // Only cancel work that is still running. The last waiter also departs on
261
+ // the SUCCESS path, and aborting there would fire cancellation handlers
262
+ // for a request that already delivered its value.
263
+ if (!record.settled)
264
+ record.controller.abort();
265
+ }
266
+ start(options, probeKey) {
267
+ const { partition, resourceKey, capabilityKey } = options;
268
+ const controller = new AbortController();
269
+ const generation = this.generation;
270
+ const record = {
271
+ promise: Promise.resolve(undefined),
272
+ controller,
273
+ waiters: 0,
274
+ probeKey,
275
+ retired: false,
276
+ settled: false,
277
+ };
278
+ record.promise = options
279
+ .load({ signal: controller.signal, generation })
280
+ .then((result) => {
281
+ // A result from a superseded generation describes the OLD token or
282
+ // workspace. It may neither be cached NOR handed to a waiter:
283
+ // returning it would leak one stale value per reset boundary.
284
+ if (generation !== this.generation) {
285
+ this.emit({ type: 'stale_discarded', key: resourceKey });
286
+ return undefined;
287
+ }
288
+ if (result.ok) {
289
+ if (record.probeKey) {
290
+ this.clearCapability(record.probeKey);
291
+ record.probeKey = null;
292
+ }
293
+ this.write(partition, resourceKey, result.value);
294
+ return result.value;
295
+ }
296
+ const suppression = this.classifyFailure(result.error, { resourceKey, capabilityKey });
297
+ if (suppression.kind === 'capability') {
298
+ this.suppress(suppression.key, suppression.ttlMs);
299
+ this.probing.delete(suppression.key);
300
+ if (record.probeKey === suppression.key)
301
+ record.probeKey = null;
302
+ this.emit({ type: 'capability_locked', key: suppression.key, error: result.error });
303
+ }
304
+ else if (suppression.kind === 'resource') {
305
+ this.suppress(suppression.key, suppression.ttlMs);
306
+ }
307
+ // A probe that failed for an unrelated reason must still release
308
+ // its reservation, or the capability never gets probed again.
309
+ if (record.probeKey) {
310
+ this.probing.delete(record.probeKey);
311
+ record.probeKey = null;
312
+ }
313
+ return undefined;
314
+ })
315
+ .catch(() => {
316
+ if (record.probeKey) {
317
+ this.probing.delete(record.probeKey);
318
+ record.probeKey = null;
319
+ }
320
+ return undefined;
321
+ })
322
+ .finally(() => {
323
+ record.settled = true;
324
+ // Identity-checked: a retired record may already have been replaced,
325
+ // and deleting the replacement would strand its waiters.
326
+ if (this.inFlight.get(resourceKey) === record)
327
+ this.inFlight.delete(resourceKey);
328
+ });
329
+ this.inFlight.set(resourceKey, record);
330
+ void capabilityKey; // capability state is keyed by the caller's choice
331
+ return this.join(record, options);
332
+ }
333
+ }
334
+ //# sourceMappingURL=enrichment-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrichment-cache.js","sourceRoot":"","sources":["../../../src/slack/enrichment-cache.ts"],"names":[],"mappings":"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"}
@@ -31,19 +31,58 @@ function normalize(raw) {
31
31
  }
32
32
  return out;
33
33
  }
34
- async function callWithRetry(token, method, body, fetchImpl) {
34
+ /**
35
+ * Abortable sleep. A cancelled ingress must not hold the loop open, which is
36
+ * why the timer is unref'd by default.
37
+ *
38
+ * `keepAlive` exists for callers that are AWAITING the pause as part of their
39
+ * result: an unref'd timer lets the process exit mid-await, and the pending
40
+ * promise then resolves never. Under CI load that surfaced as
41
+ * "Promise resolution is still pending but the event loop has already
42
+ * resolved" on the retry-backoff path.
43
+ */
44
+ function sleepUnlessAborted(ms, signal, keepAlive = false) {
45
+ if (signal?.aborted)
46
+ return Promise.resolve();
47
+ return new Promise(resolve => {
48
+ const timer = setTimeout(finish, ms);
49
+ if (!keepAlive)
50
+ timer.unref?.();
51
+ function finish() {
52
+ clearTimeout(timer);
53
+ signal?.removeEventListener('abort', finish);
54
+ resolve();
55
+ }
56
+ signal?.addEventListener('abort', finish, { once: true });
57
+ });
58
+ }
59
+ async function callWithRetry(token, method, body, opts = {}) {
35
60
  // form-encoded on purpose: conversations.replies REJECTS a JSON body with
36
61
  // invalid_arguments ("missing required field: channel/ts") — verified live
37
62
  // 2026-08-06 against T0BMJ7RSPHQ. conversations.history accepts both, so
38
63
  // both ride the form path for one consistent contract.
39
- const opts = { form: true, ...(fetchImpl ? { fetchImpl } : {}) };
40
- let result = await slackApi(token, method, body, opts);
41
- if (!result.ok && isRetryableSlackError(result.error)) {
64
+ const callOpts = {
65
+ form: true,
66
+ ...(opts.fetchImpl ? { fetchImpl: opts.fetchImpl } : {}),
67
+ ...(opts.signal ? { signal: opts.signal } : {}),
68
+ };
69
+ let result = await slackApi(token, method, body, callOpts);
70
+ // A 429 is retried by default (existing callers depend on it), but an
71
+ // enrichment caller opts out: it applies its own suppression window, and a
72
+ // retry would fire a second request before that window exists.
73
+ const retryable = isRetryableSlackError(result.error)
74
+ && !(opts.noRetryOnRateLimit && result.error === 'ratelimited');
75
+ if (!result.ok && retryable && !opts.signal?.aborted) {
42
76
  // One bounded retry after a short pause (Hermes uses 1s/2s; a single
43
77
  // 1s attempt is enough for an interactive lookup — the caller can
44
78
  // simply retry the whole request otherwise).
45
- await new Promise(resolve => setTimeout(resolve, 1000));
46
- result = await slackApi(token, method, body, opts);
79
+ // keepAlive: the caller is awaiting this pause to produce its result,
80
+ // so the process must not be allowed to exit mid-backoff.
81
+ await sleepUnlessAborted(1000, opts.signal, true);
82
+ // Re-check: the wait is where a cancel usually lands.
83
+ if (!opts.signal?.aborted) {
84
+ result = await slackApi(token, method, body, callOpts);
85
+ }
47
86
  }
48
87
  if (!result.ok) {
49
88
  // describeSlackError output is operator prose (never echoes tokens);
@@ -75,7 +114,7 @@ export function fetchSlackHistory(token, channel, opts = {}) {
75
114
  // Slack ignores `inclusive` when neither bound is present; send it only
76
115
  // when it can actually take effect.
77
116
  ...(opts.inclusive && (opts.oldest || opts.latest) ? { inclusive: true } : {}),
78
- }, opts.fetchImpl);
117
+ }, opts);
79
118
  }
80
119
  /** One thread: conversations.replies (parent message included, oldest first). */
81
120
  export function fetchSlackReplies(token, channel, threadTs, opts = {}) {
@@ -83,7 +122,7 @@ export function fetchSlackReplies(token, channel, threadTs, opts = {}) {
83
122
  channel,
84
123
  ts: threadTs,
85
124
  limit: clampLimit(opts.limit),
86
- }, opts.fetchImpl);
125
+ }, opts);
87
126
  }
88
127
  const FORMAT_CHAR_CAP = 6000;
89
128
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/slack/history.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/slack/history.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,wEAAwE;AACxE,4EAA4E;AAC5E,wEAAwE;AACxE,kEAAkE;AAClE,0EAA0E;AAC1E,4EAA4E;AAE5E,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,qBAAqB,EAAmB,MAAM,UAAU,CAAC;AAEhG,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAkB9D,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAS3C,SAAS,UAAU,CAAC,KAAyB;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,2BAA2B,CAAC;IACvD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,SAAS,CAAC,GAAiB;IAChC,MAAM,GAAG,GAA0B,EAAE,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;YAAE,SAAS;QAC7C,GAAG,CAAC,IAAI,CAAC;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YAC9C,GAAG,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC,CAAC;IACP,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAkBD;;;;;;;;;GASG;AACH,SAAS,kBAAkB,CAAC,EAAU,EAAE,MAAoB,EAAE,SAAS,GAAG,KAAK;IAC3E,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9C,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;QAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChC,SAAS,MAAM;YACX,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,aAAa,CACxB,KAAa,EACb,MAAyD,EACzD,IAA6B,EAC7B,OAAyB,EAAE;IAE3B,0EAA0E;IAC1E,2EAA2E;IAC3E,yEAAyE;IACzE,uDAAuD;IACvD,MAAM,QAAQ,GAAG;QACb,IAAI,EAAE,IAAa;QACnB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC;IACF,IAAI,MAAM,GAAG,MAAM,QAAQ,CAAiB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3E,sEAAsE;IACtE,2EAA2E;IAC3E,+DAA+D;IAC/D,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC;WAC9C,CAAC,CAAC,IAAI,CAAC,kBAAkB,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACnD,qEAAqE;QACrE,kEAAkE;QAClE,6CAA6C;QAC7C,sEAAsE;QACtE,0DAA0D;QAC1D,MAAM,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClD,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,MAAM,QAAQ,CAAiB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACb,qEAAqE;QACrE,kEAAkE;QAClE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IACrG,CAAC;IACD,OAAO;QACH,EAAE,EAAE,IAAI;QACR,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;QAChD,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI;KAC1C,CAAC;AACN,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC7B,KAAa,EACb,OAAe,EACf,OAAqF,EAAE;IAEvF,OAAO,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE;QACjD,OAAO;QACP,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,wEAAwE;QACxE,oCAAoC;QACpC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjF,EAAE,IAAI,CAAC,CAAC;AACb,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAC7B,KAAa,EACb,OAAe,EACf,QAAgB,EAChB,OAAyB,EAAE;IAE3B,OAAO,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE;QACjD,OAAO;QACP,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;KAChC,EAAE,IAAI,CAAC,CAAC;AACb,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACjC,QAA+B,EAC/B,UAA0B,EAC1B,KAAmC;IAEnC,MAAM,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxF,2EAA2E;QAC3E,6CAA6C;QAC7C,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI;YACd,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU;gBACpB,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC;YACpE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;gBACN,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,SAAS,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxE,CAAC,CAAC,SAAS,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;AAC5E,CAAC"}