@vercel/board 0.16.0 → 0.18.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.
- package/README.md +27 -27
- package/dist/{a2-C41hD8SF.mjs → a2-ChRLRupa.mjs} +969 -25
- package/dist/access.d.mts +1 -1
- package/dist/access.mjs +3 -3
- package/dist/{actors-DjMeZpnU.mjs → actors-BOamkEuz.mjs} +3 -73
- package/dist/attempts-CLG840Oj.mjs +20 -0
- package/dist/{auth-COzc09sn.mjs → auth-Drg9FiC2.mjs} +225 -2
- package/dist/backend-B-SJ7p6p.d.mts +680 -0
- package/dist/backend-a2/contract.d.mts +873 -2
- package/dist/backend-a2/contract.mjs +2 -2
- package/dist/backend-a2/scheduler-local.d.mts +1 -1
- package/dist/backend-a2/scheduler-local.mjs +1 -1
- package/dist/backend-a2/scheduler-qstash.d.mts +78 -1
- package/dist/backend-a2/scheduler-qstash.mjs +521 -1
- package/dist/backend-a2/scheduler-vercel.d.mts +37 -1
- package/dist/backend-a2/scheduler-vercel.mjs +203 -1
- package/dist/backend-a2/store-memory.d.mts +2 -2
- package/dist/backend-a2/store-memory.mjs +3 -3
- package/dist/backend-a2/store-postgres.d.mts +1 -1
- package/dist/backend-a2/store-postgres.mjs +2850 -2
- package/dist/backend-a2/store-redis-http.d.mts +1 -1
- package/dist/backend-a2/store-redis-http.mjs +490 -2
- package/dist/backend-a2/store-redis.d.mts +10 -2
- package/dist/backend-a2/store-redis.mjs +51 -2
- package/dist/backend-a2/store-sqlite.d.mts +1 -1
- package/dist/backend-a2/store-sqlite.mjs +3 -3
- package/dist/backend-a2.d.mts +2706 -3
- package/dist/backend-a2.mjs +1 -1
- package/dist/{backend-http-Bid7RIpC.d.mts → backend-http-7cNb8nJI.d.mts} +10 -3
- package/dist/{backend-http-0roEmjl0.mjs → backend-http-CMlL3yq3.mjs} +2 -2
- package/dist/{backend-http-BVRno-ca.mjs → backend-http-Ddzd5kTS.mjs} +32 -3
- package/dist/backend-http.d.mts +1 -1
- package/dist/backend-http.mjs +1 -1
- package/dist/backend-http.node.d.mts +1 -1
- package/dist/backend-http.node.mjs +1 -1
- package/dist/{chat-provider-XCnQlxq6.d.mts → chat-provider-DNJQyajS.d.mts} +16 -4
- package/dist/{chat-provider-jFSeyNmB.mjs → chat-provider-YHy-WbrB.mjs} +15 -9
- package/dist/cli.mjs +30 -10
- package/dist/{client-DGDPaN7U.mjs → client-BA-J7usH.mjs} +10 -2
- package/dist/{conformance-DRR23YNy.mjs → conformance-CT5EeHeC.mjs} +5 -2
- package/dist/conformance.d.mts +1 -1
- package/dist/conformance.mjs +1 -1
- package/dist/{engine-Bir5s8ts.mjs → engine-D0oBUBEK.mjs} +249 -163
- package/dist/events-CewD4kw7.mjs +75 -0
- package/dist/{exports-Dvc1o52I.mjs → exports-CgjfMrQ-.mjs} +35 -32
- package/dist/exports-ZsgjzEnM.d.mts +4 -0
- package/dist/external-BV_cUncs.mjs +151 -0
- package/dist/folds-CRYY14kc.d.mts +534 -0
- package/dist/{reducers-mUPFuFJV.mjs → folds-Dyjput8M.mjs} +6 -73
- package/dist/ids-C6AYo1bu.mjs +31 -0
- package/dist/index.d.mts +4 -4
- package/dist/{index.default-Bkg77Pxn.mjs → index.default-C5Cpz3sa.mjs} +1 -1
- package/dist/index.mjs +5 -5
- package/dist/index.node.d.mts +4 -4
- package/dist/index.node.mjs +3 -3
- package/dist/inspect/app.js +31 -31
- package/dist/inspect/engine.js +5 -5
- package/dist/internal-CvsrprnU-CRY89I-b.mjs +203 -0
- package/dist/{local-Cr_dSjvs.mjs → local-DhkrAqPP.mjs} +1 -1
- package/dist/mentions-CB6ShY4R.mjs +72 -0
- package/dist/{targets-yM5JBUgr.mjs → middleware-CqaCwucP.mjs} +1 -33
- package/dist/platform-B4TnJtWu-CwcTyKg2.mjs +32 -0
- package/dist/{project-CFiArraX.mjs → project-DMDST9kl.mjs} +1 -1
- package/dist/{provider-BGjz-mDa.d.mts → provider-B0b9Qxw4.d.mts} +170 -40
- package/dist/provider-B3DpYSDq.mjs +220 -0
- package/dist/redis-tables-DN9PfIDi.mjs +3897 -0
- package/dist/reducer-CYPHsSmd-BQIfozGi.d.mts +170 -0
- package/dist/reducer-CjmvZSAb-D_OSISmj.mjs +74 -0
- package/dist/{contract-CuJmlrhw.mjs → reducers-BFmIXilu.mjs} +260 -287
- package/dist/retryable-lazy-DZWmHpii-Bye-W8q7.mjs +19 -0
- package/dist/scheduler-task-X1SToDjP-BVoWuInI.mjs +69 -0
- package/dist/{serve-BsOOc-6_.mjs → serve-BGYw0uNL.mjs} +5 -5
- package/dist/{server-jwPY7_wi.mjs → server-DPxBSogx.mjs} +4 -4
- package/dist/server-DtFrWxi3-Boa6gdWO.mjs +3602 -0
- package/dist/server-qgez0Xny-D5mLfqFQ.d.mts +385 -0
- package/dist/{serving-BNbzc96L.mjs → serving-CNkgUPW1.mjs} +1 -1
- package/dist/session-clear-wHd5GCpZ-BnKSxReK.mjs +51 -0
- package/dist/{sql-DbiEnqM0.mjs → sql-U9WTxrwJ.mjs} +2 -2
- package/dist/{sqlite-db-Cbj03vmp.mjs → sqlite-db-Ds4majtT.mjs} +1 -1
- package/dist/store-D0MhBvg6-4Z2L0Kqd.d.mts +530 -0
- package/dist/store-N8PXxDAS-BWBgzBHp.mjs +5 -0
- package/dist/store-codec-DwrWlgQx-CYxGW0aD.mjs +61 -0
- package/dist/store-memory-Bas9Uq5C.mjs +872 -0
- package/dist/store-memory-ZLiZbH3R.mjs +2 -0
- package/dist/store-polling-BZt2Rf3D-BiEM6_HB.mjs +148 -0
- package/dist/store-presence-polling-JuAy2Ck2-CYpuK75X.mjs +109 -0
- package/dist/store-sqlite-BmwL3pUR.mjs +2 -0
- package/dist/store-sqlite-CxxPCcCT.mjs +1053 -0
- package/dist/stream-buffer-DrTyiIuo-BKy-vI14.mjs +53 -0
- package/dist/sync-github.d.mts +24 -17
- package/dist/sync-github.mjs +89 -22
- package/dist/sync-kapso.d.mts +15 -13
- package/dist/sync-kapso.mjs +17 -14
- package/dist/sync-linear.d.mts +219 -0
- package/dist/sync-linear.mjs +311 -0
- package/dist/sync-slack.d.mts +12 -17
- package/dist/sync-slack.mjs +54 -42
- package/dist/sync.chat.d.mts +1 -1
- package/dist/sync.chat.mjs +1 -1
- package/dist/sync.d.mts +3 -3
- package/dist/sync.mjs +5 -4
- package/dist/targets-C-wdR5wP.mjs +33 -0
- package/dist/{tokens-DKLn5P9B.mjs → tokens-DhuzKzAl.mjs} +1 -1
- package/dist/{types-BHCjTZdB.d.mts → types-8yq2VnKI.d.mts} +2 -2
- package/dist/{users-Dls7_ANV.mjs → users-yryHKFMo.mjs} +2 -2
- package/dist/{watch-spec-W0c7ypHJ.mjs → watchers-hash-RLtnSF-t.mjs} +233 -28
- package/docs/01-board/01-mounting.md +1 -1
- package/docs/02-sync/01-overview.md +72 -48
- package/docs/02-sync/02-functions.md +398 -0
- package/docs/02-sync/03-slack.md +30 -25
- package/docs/02-sync/04-github.md +62 -26
- package/docs/02-sync/05-whatsapp.md +23 -19
- package/docs/02-sync/06-providers.md +60 -27
- package/docs/02-sync/07-linear.md +129 -0
- package/docs/03-guides/04-triage.md +1 -1
- package/docs/04-reference/01-cli.md +26 -6
- package/docs/04-reference/02-board.md +18 -5
- package/docs/04-reference/03-http.md +5 -2
- package/docs/04-reference/05-conformance.md +1 -1
- package/docs/index.md +5 -10
- package/package.json +31 -6
- package/dist/a2-D24cvwpN.d.mts +0 -3359
- package/dist/access-CJU2-vaa.mjs +0 -226
- package/dist/attempts-Bxp9KgPf.mjs +0 -919
- package/dist/exports-DLiE7fLY.d.mts +0 -4
- package/dist/provider-CuewcDNZ.mjs +0 -205
- package/dist/redis-tables-B35vv4CZ.mjs +0 -842
- package/dist/reducers-B_vUGQRp.d.mts +0 -1172
- package/dist/watchers-hash-CLjsa6od.mjs +0 -225
- package/docs/02-sync/02-callbacks.md +0 -265
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { r as POLL_TIMINGS } from "./internal-CvsrprnU-CRY89I-b.mjs";
|
|
2
|
+
//#region ../../node_modules/.pnpm/experimental-a2@0.22.0_@upstash+qstash@2.12.0_@vercel+queue@0.7.0_ai@7.0.130_zod@4.6.5__52060f00b21aecfab049c27fa3abd2f9/node_modules/experimental-a2/dist/store-polling-BZt2Rf3D.js
|
|
3
|
+
const streamActivities = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
function createStreamActivity(wake) {
|
|
5
|
+
let idle = false;
|
|
6
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
7
|
+
const setIdle = (next) => {
|
|
8
|
+
if (idle === next) return;
|
|
9
|
+
idle = next;
|
|
10
|
+
for (const listener of listeners) listener(idle);
|
|
11
|
+
};
|
|
12
|
+
return {
|
|
13
|
+
get idle() {
|
|
14
|
+
return idle;
|
|
15
|
+
},
|
|
16
|
+
setIdle,
|
|
17
|
+
activate() {
|
|
18
|
+
setIdle(false);
|
|
19
|
+
wake();
|
|
20
|
+
},
|
|
21
|
+
subscribe(listener) {
|
|
22
|
+
listeners.add(listener);
|
|
23
|
+
return () => listeners.delete(listener);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The shared polling stream — how poll-based backends (sqlite,
|
|
29
|
+
* postgres) implement `A2Store.stream`.
|
|
30
|
+
*
|
|
31
|
+
* The cadence is activity-adaptive: while events are flowing, polls
|
|
32
|
+
* run at a tight floor (25ms) so streams feel pushed — a token
|
|
33
|
+
* generation reads smoothly instead of clumping at the idle interval;
|
|
34
|
+
* every empty poll doubles the gap until the idle ceiling. The cadence
|
|
35
|
+
* is owned (POLL_TIMINGS in internal.ts), not a public option: the
|
|
36
|
+
* floor already keeps active streams smooth, so tuning it is a cost
|
|
37
|
+
* decision a2 makes, not one it delegates. Correctness never depends
|
|
38
|
+
* on the cadence — each poll is a catch-up read (`index > last`, in
|
|
39
|
+
* order), so nothing can be missed, only arrive a beat later.
|
|
40
|
+
*/
|
|
41
|
+
/** Unref'd cancellable timer — shared with the redis safety read. */
|
|
42
|
+
const defaultSleep = (ms) => {
|
|
43
|
+
let timer;
|
|
44
|
+
let wake;
|
|
45
|
+
return {
|
|
46
|
+
promise: new Promise((resolve) => {
|
|
47
|
+
wake = resolve;
|
|
48
|
+
timer = setTimeout(resolve, ms);
|
|
49
|
+
timer.unref?.();
|
|
50
|
+
}),
|
|
51
|
+
cancel: () => {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
wake?.();
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
const ceiling = () => POLL_TIMINGS.idleCeilingMs;
|
|
58
|
+
const floor = () => Math.min(POLL_TIMINGS.activeFloorMs, POLL_TIMINGS.idleCeilingMs);
|
|
59
|
+
/**
|
|
60
|
+
* Build the `stream()` iterable from a backend's catch-up read. The
|
|
61
|
+
* iterable ends when the consumer calls `return()` (a disconnecting
|
|
62
|
+
* SSE client), waking any pending sleep immediately.
|
|
63
|
+
*/
|
|
64
|
+
function pollingStream(readAfter, options) {
|
|
65
|
+
const startAfter = options.startAfter ?? 0;
|
|
66
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
67
|
+
return { [Symbol.asyncIterator]() {
|
|
68
|
+
let last = startAfter;
|
|
69
|
+
let buffer = [];
|
|
70
|
+
let position = 0;
|
|
71
|
+
let closed = false;
|
|
72
|
+
let pending = null;
|
|
73
|
+
let interval = floor();
|
|
74
|
+
let activityVersion = 0;
|
|
75
|
+
const activity = createStreamActivity(() => {
|
|
76
|
+
if (closed) return;
|
|
77
|
+
activityVersion += 1;
|
|
78
|
+
interval = floor();
|
|
79
|
+
pending?.cancel();
|
|
80
|
+
});
|
|
81
|
+
const iterator = {
|
|
82
|
+
async next() {
|
|
83
|
+
for (;;) {
|
|
84
|
+
if (closed) return {
|
|
85
|
+
value: void 0,
|
|
86
|
+
done: true
|
|
87
|
+
};
|
|
88
|
+
try {
|
|
89
|
+
if (position === buffer.length) {
|
|
90
|
+
const rows = await readAfter(last);
|
|
91
|
+
if (closed) return {
|
|
92
|
+
value: void 0,
|
|
93
|
+
done: true
|
|
94
|
+
};
|
|
95
|
+
buffer = rows;
|
|
96
|
+
position = 0;
|
|
97
|
+
}
|
|
98
|
+
} catch (error) {
|
|
99
|
+
if (closed) return {
|
|
100
|
+
value: void 0,
|
|
101
|
+
done: true
|
|
102
|
+
};
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
if (closed) return {
|
|
106
|
+
value: void 0,
|
|
107
|
+
done: true
|
|
108
|
+
};
|
|
109
|
+
const row = buffer[position];
|
|
110
|
+
if (row) {
|
|
111
|
+
activity.activate();
|
|
112
|
+
last = row.index;
|
|
113
|
+
buffer[position] = void 0;
|
|
114
|
+
position += 1;
|
|
115
|
+
if (position === buffer.length) {
|
|
116
|
+
buffer = [];
|
|
117
|
+
position = 0;
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
value: row,
|
|
121
|
+
done: false
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
activity.setIdle(interval === ceiling());
|
|
125
|
+
const version = activityVersion;
|
|
126
|
+
pending = sleep(interval);
|
|
127
|
+
await pending.promise;
|
|
128
|
+
pending = null;
|
|
129
|
+
if (version === activityVersion) interval = Math.min(interval * 2, ceiling());
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
async return() {
|
|
133
|
+
closed = true;
|
|
134
|
+
buffer = [];
|
|
135
|
+
position = 0;
|
|
136
|
+
pending?.cancel();
|
|
137
|
+
return {
|
|
138
|
+
value: void 0,
|
|
139
|
+
done: true
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
streamActivities.set(iterator, activity);
|
|
144
|
+
return iterator;
|
|
145
|
+
} };
|
|
146
|
+
}
|
|
147
|
+
//#endregion
|
|
148
|
+
export { streamActivities as i, defaultSleep as n, pollingStream as r, createStreamActivity as t };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { r as POLL_TIMINGS } from "./internal-CvsrprnU-CRY89I-b.mjs";
|
|
2
|
+
import { n as defaultSleep } from "./store-polling-BZt2Rf3D-BiEM6_HB.mjs";
|
|
3
|
+
//#region ../../node_modules/.pnpm/experimental-a2@0.22.0_@upstash+qstash@2.12.0_@vercel+queue@0.7.0_ai@7.0.130_zod@4.6.5__52060f00b21aecfab049c27fa3abd2f9/node_modules/experimental-a2/dist/store-presence-polling-JuAy2Ck2.js
|
|
4
|
+
const key = ({ participant, field }) => JSON.stringify([participant, field]);
|
|
5
|
+
function pollPresence({ read, deliver, sleep = defaultSleep }) {
|
|
6
|
+
let stopped = false;
|
|
7
|
+
let pending;
|
|
8
|
+
let interval = Math.min(POLL_TIMINGS.activeFloorMs, POLL_TIMINGS.idleCeilingMs);
|
|
9
|
+
let version = 0;
|
|
10
|
+
const seen = /* @__PURE__ */ new Map();
|
|
11
|
+
const activate = () => {
|
|
12
|
+
version += 1;
|
|
13
|
+
interval = Math.min(POLL_TIMINGS.activeFloorMs, POLL_TIMINGS.idleCeilingMs);
|
|
14
|
+
pending?.cancel();
|
|
15
|
+
};
|
|
16
|
+
const ready = read().then((rows) => {
|
|
17
|
+
if (stopped) return;
|
|
18
|
+
for (const row of rows) seen.set(key(row), row);
|
|
19
|
+
}).catch(() => void 0);
|
|
20
|
+
/** Delivers how `rows` differ from what was seen; true when they do. */
|
|
21
|
+
const reconcile = (rows) => {
|
|
22
|
+
const live = /* @__PURE__ */ new Set();
|
|
23
|
+
let changed = false;
|
|
24
|
+
for (const row of rows) {
|
|
25
|
+
const id = key(row);
|
|
26
|
+
live.add(id);
|
|
27
|
+
const prior = seen.get(id);
|
|
28
|
+
seen.set(id, row);
|
|
29
|
+
if (prior?.seen === row.seen && prior.at.getTime() === row.at.getTime() && JSON.stringify(prior.value) === JSON.stringify(row.value)) continue;
|
|
30
|
+
changed = true;
|
|
31
|
+
deliver({
|
|
32
|
+
participant: row.participant,
|
|
33
|
+
values: { [row.field]: row.value },
|
|
34
|
+
seen: row.seen,
|
|
35
|
+
at: row.at
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
for (const [id, row] of seen) {
|
|
39
|
+
if (live.has(id)) continue;
|
|
40
|
+
seen.delete(id);
|
|
41
|
+
changed = true;
|
|
42
|
+
deliver({
|
|
43
|
+
participant: row.participant,
|
|
44
|
+
values: { [row.field]: null },
|
|
45
|
+
seen: row.seen,
|
|
46
|
+
at: row.at
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return changed;
|
|
50
|
+
};
|
|
51
|
+
const run = async () => {
|
|
52
|
+
await ready;
|
|
53
|
+
for (;;) {
|
|
54
|
+
if (stopped) return;
|
|
55
|
+
const before = version;
|
|
56
|
+
pending = sleep(interval);
|
|
57
|
+
await pending.promise;
|
|
58
|
+
if (stopped) return;
|
|
59
|
+
try {
|
|
60
|
+
const reading = version;
|
|
61
|
+
const rows = await read();
|
|
62
|
+
if (stopped) return;
|
|
63
|
+
if (version !== reading) continue;
|
|
64
|
+
if (reconcile(rows)) activate();
|
|
65
|
+
else if (version === before) interval = Math.min(interval * 2, POLL_TIMINGS.idleCeilingMs);
|
|
66
|
+
} catch {
|
|
67
|
+
interval = POLL_TIMINGS.idleCeilingMs;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
run();
|
|
72
|
+
return {
|
|
73
|
+
ready,
|
|
74
|
+
async snapshot(readSnapshot) {
|
|
75
|
+
const reading = version;
|
|
76
|
+
const rows = await readSnapshot();
|
|
77
|
+
if (!stopped && version === reading && reconcile(rows)) activate();
|
|
78
|
+
return rows;
|
|
79
|
+
},
|
|
80
|
+
wake: activate,
|
|
81
|
+
update(patch) {
|
|
82
|
+
for (const [field, value] of Object.entries(patch.values)) {
|
|
83
|
+
const id = key({
|
|
84
|
+
participant: patch.participant,
|
|
85
|
+
field
|
|
86
|
+
});
|
|
87
|
+
if (value === null) {
|
|
88
|
+
seen.delete(id);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
seen.set(id, {
|
|
92
|
+
participant: patch.participant,
|
|
93
|
+
field,
|
|
94
|
+
value,
|
|
95
|
+
seen: patch.seen,
|
|
96
|
+
at: patch.at
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
activate();
|
|
100
|
+
},
|
|
101
|
+
stop() {
|
|
102
|
+
stopped = true;
|
|
103
|
+
pending?.cancel();
|
|
104
|
+
seen.clear();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//#endregion
|
|
109
|
+
export { pollPresence as t };
|