@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.
Files changed (130) hide show
  1. package/README.md +27 -27
  2. package/dist/{a2-C41hD8SF.mjs → a2-ChRLRupa.mjs} +969 -25
  3. package/dist/access.d.mts +1 -1
  4. package/dist/access.mjs +3 -3
  5. package/dist/{actors-DjMeZpnU.mjs → actors-BOamkEuz.mjs} +3 -73
  6. package/dist/attempts-CLG840Oj.mjs +20 -0
  7. package/dist/{auth-COzc09sn.mjs → auth-Drg9FiC2.mjs} +225 -2
  8. package/dist/backend-B-SJ7p6p.d.mts +680 -0
  9. package/dist/backend-a2/contract.d.mts +873 -2
  10. package/dist/backend-a2/contract.mjs +2 -2
  11. package/dist/backend-a2/scheduler-local.d.mts +1 -1
  12. package/dist/backend-a2/scheduler-local.mjs +1 -1
  13. package/dist/backend-a2/scheduler-qstash.d.mts +78 -1
  14. package/dist/backend-a2/scheduler-qstash.mjs +521 -1
  15. package/dist/backend-a2/scheduler-vercel.d.mts +37 -1
  16. package/dist/backend-a2/scheduler-vercel.mjs +203 -1
  17. package/dist/backend-a2/store-memory.d.mts +2 -2
  18. package/dist/backend-a2/store-memory.mjs +3 -3
  19. package/dist/backend-a2/store-postgres.d.mts +1 -1
  20. package/dist/backend-a2/store-postgres.mjs +2850 -2
  21. package/dist/backend-a2/store-redis-http.d.mts +1 -1
  22. package/dist/backend-a2/store-redis-http.mjs +490 -2
  23. package/dist/backend-a2/store-redis.d.mts +10 -2
  24. package/dist/backend-a2/store-redis.mjs +51 -2
  25. package/dist/backend-a2/store-sqlite.d.mts +1 -1
  26. package/dist/backend-a2/store-sqlite.mjs +3 -3
  27. package/dist/backend-a2.d.mts +2706 -3
  28. package/dist/backend-a2.mjs +1 -1
  29. package/dist/{backend-http-Bid7RIpC.d.mts → backend-http-7cNb8nJI.d.mts} +10 -3
  30. package/dist/{backend-http-0roEmjl0.mjs → backend-http-CMlL3yq3.mjs} +2 -2
  31. package/dist/{backend-http-BVRno-ca.mjs → backend-http-Ddzd5kTS.mjs} +32 -3
  32. package/dist/backend-http.d.mts +1 -1
  33. package/dist/backend-http.mjs +1 -1
  34. package/dist/backend-http.node.d.mts +1 -1
  35. package/dist/backend-http.node.mjs +1 -1
  36. package/dist/{chat-provider-XCnQlxq6.d.mts → chat-provider-DNJQyajS.d.mts} +16 -4
  37. package/dist/{chat-provider-jFSeyNmB.mjs → chat-provider-YHy-WbrB.mjs} +15 -9
  38. package/dist/cli.mjs +30 -10
  39. package/dist/{client-DGDPaN7U.mjs → client-BA-J7usH.mjs} +10 -2
  40. package/dist/{conformance-DRR23YNy.mjs → conformance-CT5EeHeC.mjs} +5 -2
  41. package/dist/conformance.d.mts +1 -1
  42. package/dist/conformance.mjs +1 -1
  43. package/dist/{engine-Bir5s8ts.mjs → engine-D0oBUBEK.mjs} +249 -163
  44. package/dist/events-CewD4kw7.mjs +75 -0
  45. package/dist/{exports-Dvc1o52I.mjs → exports-CgjfMrQ-.mjs} +35 -32
  46. package/dist/exports-ZsgjzEnM.d.mts +4 -0
  47. package/dist/external-BV_cUncs.mjs +151 -0
  48. package/dist/folds-CRYY14kc.d.mts +534 -0
  49. package/dist/{reducers-mUPFuFJV.mjs → folds-Dyjput8M.mjs} +6 -73
  50. package/dist/ids-C6AYo1bu.mjs +31 -0
  51. package/dist/index.d.mts +4 -4
  52. package/dist/{index.default-Bkg77Pxn.mjs → index.default-C5Cpz3sa.mjs} +1 -1
  53. package/dist/index.mjs +5 -5
  54. package/dist/index.node.d.mts +4 -4
  55. package/dist/index.node.mjs +3 -3
  56. package/dist/inspect/app.js +31 -31
  57. package/dist/inspect/engine.js +5 -5
  58. package/dist/internal-CvsrprnU-CRY89I-b.mjs +203 -0
  59. package/dist/{local-Cr_dSjvs.mjs → local-DhkrAqPP.mjs} +1 -1
  60. package/dist/mentions-CB6ShY4R.mjs +72 -0
  61. package/dist/{targets-yM5JBUgr.mjs → middleware-CqaCwucP.mjs} +1 -33
  62. package/dist/platform-B4TnJtWu-CwcTyKg2.mjs +32 -0
  63. package/dist/{project-CFiArraX.mjs → project-DMDST9kl.mjs} +1 -1
  64. package/dist/{provider-BGjz-mDa.d.mts → provider-B0b9Qxw4.d.mts} +170 -40
  65. package/dist/provider-B3DpYSDq.mjs +220 -0
  66. package/dist/redis-tables-DN9PfIDi.mjs +3897 -0
  67. package/dist/reducer-CYPHsSmd-BQIfozGi.d.mts +170 -0
  68. package/dist/reducer-CjmvZSAb-D_OSISmj.mjs +74 -0
  69. package/dist/{contract-CuJmlrhw.mjs → reducers-BFmIXilu.mjs} +260 -287
  70. package/dist/retryable-lazy-DZWmHpii-Bye-W8q7.mjs +19 -0
  71. package/dist/scheduler-task-X1SToDjP-BVoWuInI.mjs +69 -0
  72. package/dist/{serve-BsOOc-6_.mjs → serve-BGYw0uNL.mjs} +5 -5
  73. package/dist/{server-jwPY7_wi.mjs → server-DPxBSogx.mjs} +4 -4
  74. package/dist/server-DtFrWxi3-Boa6gdWO.mjs +3602 -0
  75. package/dist/server-qgez0Xny-D5mLfqFQ.d.mts +385 -0
  76. package/dist/{serving-BNbzc96L.mjs → serving-CNkgUPW1.mjs} +1 -1
  77. package/dist/session-clear-wHd5GCpZ-BnKSxReK.mjs +51 -0
  78. package/dist/{sql-DbiEnqM0.mjs → sql-U9WTxrwJ.mjs} +2 -2
  79. package/dist/{sqlite-db-Cbj03vmp.mjs → sqlite-db-Ds4majtT.mjs} +1 -1
  80. package/dist/store-D0MhBvg6-4Z2L0Kqd.d.mts +530 -0
  81. package/dist/store-N8PXxDAS-BWBgzBHp.mjs +5 -0
  82. package/dist/store-codec-DwrWlgQx-CYxGW0aD.mjs +61 -0
  83. package/dist/store-memory-Bas9Uq5C.mjs +872 -0
  84. package/dist/store-memory-ZLiZbH3R.mjs +2 -0
  85. package/dist/store-polling-BZt2Rf3D-BiEM6_HB.mjs +148 -0
  86. package/dist/store-presence-polling-JuAy2Ck2-CYpuK75X.mjs +109 -0
  87. package/dist/store-sqlite-BmwL3pUR.mjs +2 -0
  88. package/dist/store-sqlite-CxxPCcCT.mjs +1053 -0
  89. package/dist/stream-buffer-DrTyiIuo-BKy-vI14.mjs +53 -0
  90. package/dist/sync-github.d.mts +24 -17
  91. package/dist/sync-github.mjs +89 -22
  92. package/dist/sync-kapso.d.mts +15 -13
  93. package/dist/sync-kapso.mjs +17 -14
  94. package/dist/sync-linear.d.mts +219 -0
  95. package/dist/sync-linear.mjs +311 -0
  96. package/dist/sync-slack.d.mts +12 -17
  97. package/dist/sync-slack.mjs +54 -42
  98. package/dist/sync.chat.d.mts +1 -1
  99. package/dist/sync.chat.mjs +1 -1
  100. package/dist/sync.d.mts +3 -3
  101. package/dist/sync.mjs +5 -4
  102. package/dist/targets-C-wdR5wP.mjs +33 -0
  103. package/dist/{tokens-DKLn5P9B.mjs → tokens-DhuzKzAl.mjs} +1 -1
  104. package/dist/{types-BHCjTZdB.d.mts → types-8yq2VnKI.d.mts} +2 -2
  105. package/dist/{users-Dls7_ANV.mjs → users-yryHKFMo.mjs} +2 -2
  106. package/dist/{watch-spec-W0c7ypHJ.mjs → watchers-hash-RLtnSF-t.mjs} +233 -28
  107. package/docs/01-board/01-mounting.md +1 -1
  108. package/docs/02-sync/01-overview.md +72 -48
  109. package/docs/02-sync/02-functions.md +398 -0
  110. package/docs/02-sync/03-slack.md +30 -25
  111. package/docs/02-sync/04-github.md +62 -26
  112. package/docs/02-sync/05-whatsapp.md +23 -19
  113. package/docs/02-sync/06-providers.md +60 -27
  114. package/docs/02-sync/07-linear.md +129 -0
  115. package/docs/03-guides/04-triage.md +1 -1
  116. package/docs/04-reference/01-cli.md +26 -6
  117. package/docs/04-reference/02-board.md +18 -5
  118. package/docs/04-reference/03-http.md +5 -2
  119. package/docs/04-reference/05-conformance.md +1 -1
  120. package/docs/index.md +5 -10
  121. package/package.json +31 -6
  122. package/dist/a2-D24cvwpN.d.mts +0 -3359
  123. package/dist/access-CJU2-vaa.mjs +0 -226
  124. package/dist/attempts-Bxp9KgPf.mjs +0 -919
  125. package/dist/exports-DLiE7fLY.d.mts +0 -4
  126. package/dist/provider-CuewcDNZ.mjs +0 -205
  127. package/dist/redis-tables-B35vv4CZ.mjs +0 -842
  128. package/dist/reducers-B_vUGQRp.d.mts +0 -1172
  129. package/dist/watchers-hash-CLjsa6od.mjs +0 -225
  130. package/docs/02-sync/02-callbacks.md +0 -265
@@ -0,0 +1,2 @@
1
+ import { t as memory } from "./store-memory-Bas9Uq5C.mjs";
2
+ export { memory };
@@ -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 };
@@ -0,0 +1,2 @@
1
+ import { t as sqlite } from "./store-sqlite-CxxPCcCT.mjs";
2
+ export { sqlite };