@nestos/kanban 0.5.1 → 0.5.2

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 (147) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +73 -29
  3. package/dist/{activity-C6xDM-cg.d.cts → activity-BbC4sgKL.d.cts} +28 -2
  4. package/dist/{activity-Dw8DOw0L.d.ts → activity-Czlan5xW.d.ts} +28 -2
  5. package/dist/activity-module-DaO1Rry0.d.cts +22 -0
  6. package/dist/activity-module-T22wliZu.d.ts +22 -0
  7. package/dist/activity-ports-Dqxa86zT.d.cts +12 -0
  8. package/dist/activity-ports-cxfrelaL.d.ts +12 -0
  9. package/dist/activity.cjs +10 -282
  10. package/dist/activity.cjs.map +1 -1
  11. package/dist/activity.d.cts +8 -30
  12. package/dist/activity.d.ts +8 -30
  13. package/dist/activity.js +9 -281
  14. package/dist/activity.js.map +1 -1
  15. package/dist/{chunk-O4OGAAV4.js → chunk-3JYLJPE5.js} +29 -5
  16. package/dist/chunk-3JYLJPE5.js.map +1 -0
  17. package/dist/{chunk-ATUFFNLV.js → chunk-3LEIHB7Y.js} +5 -5
  18. package/dist/chunk-4XF6LQSU.cjs.map +1 -1
  19. package/dist/chunk-5Q7WB63A.cjs +282 -0
  20. package/dist/chunk-5Q7WB63A.cjs.map +1 -0
  21. package/dist/{chunk-PSKQAFDF.cjs → chunk-7KDOTBRX.cjs} +1 -1
  22. package/dist/chunk-7KDOTBRX.cjs.map +1 -0
  23. package/dist/{chunk-5DLZWW5Y.js → chunk-AHHEGTUA.js} +3 -3
  24. package/dist/chunk-AOHQCX7K.cjs +95 -0
  25. package/dist/chunk-AOHQCX7K.cjs.map +1 -0
  26. package/dist/{chunk-IUI5CI2S.cjs → chunk-DINLR6E6.cjs} +96 -92
  27. package/dist/chunk-DINLR6E6.cjs.map +1 -0
  28. package/dist/{chunk-L44TM4EE.cjs → chunk-EYTVC2H5.cjs} +568 -454
  29. package/dist/chunk-EYTVC2H5.cjs.map +1 -0
  30. package/dist/chunk-FEE2YBZ7.js +1972 -0
  31. package/dist/chunk-FEE2YBZ7.js.map +1 -0
  32. package/dist/chunk-FNO5K3A7.js +282 -0
  33. package/dist/chunk-FNO5K3A7.js.map +1 -0
  34. package/dist/chunk-IHHDXZPZ.js +382 -0
  35. package/dist/chunk-IHHDXZPZ.js.map +1 -0
  36. package/dist/chunk-J3EAIVA3.js +280 -0
  37. package/dist/chunk-J3EAIVA3.js.map +1 -0
  38. package/dist/{chunk-DFTOTBGF.js → chunk-KH3WF3K4.js} +20 -16
  39. package/dist/chunk-KH3WF3K4.js.map +1 -0
  40. package/dist/{chunk-TB2RZGDV.js → chunk-M35X5PHO.js} +14 -1
  41. package/dist/chunk-M35X5PHO.js.map +1 -0
  42. package/dist/chunk-QRGZD2JU.cjs +1972 -0
  43. package/dist/chunk-QRGZD2JU.cjs.map +1 -0
  44. package/dist/{chunk-4KF7KUAI.cjs → chunk-RBOER6EW.cjs} +6 -6
  45. package/dist/chunk-RBOER6EW.cjs.map +1 -0
  46. package/dist/{chunk-6MN3H3YF.cjs → chunk-RSH6QSEC.cjs} +16 -3
  47. package/dist/chunk-RSH6QSEC.cjs.map +1 -0
  48. package/dist/{chunk-T7P5EIC4.cjs → chunk-VMRDXOLX.cjs} +33 -33
  49. package/dist/chunk-VMRDXOLX.cjs.map +1 -0
  50. package/dist/{chunk-5XKOCKY2.js → chunk-X4UHZX6F.js} +1 -1
  51. package/dist/chunk-XBSGUVCY.cjs +382 -0
  52. package/dist/chunk-XBSGUVCY.cjs.map +1 -0
  53. package/dist/{chunk-OHQTKGQN.js → chunk-XKDZHAUE.js} +242 -128
  54. package/dist/chunk-XKDZHAUE.js.map +1 -0
  55. package/dist/chunk-ZUZGAO6G.cjs +280 -0
  56. package/dist/chunk-ZUZGAO6G.cjs.map +1 -0
  57. package/dist/{content-CAIp1njn.d.cts → content-C5aJZFlw.d.cts} +1 -1
  58. package/dist/{content-CGMJdyH_.d.ts → content-hLH5BNud.d.ts} +1 -1
  59. package/dist/contracts/index.cjs +13 -3
  60. package/dist/contracts/index.cjs.map +1 -1
  61. package/dist/contracts/index.d.cts +5 -4
  62. package/dist/contracts/index.d.ts +5 -4
  63. package/dist/contracts/index.js +14 -4
  64. package/dist/{discovery-DxpirOz3.d.cts → discovery-9E-LfwIw.d.cts} +1 -1
  65. package/dist/{discovery-gSqWpuRm.d.ts → discovery-D60yrjej.d.ts} +1 -1
  66. package/dist/discovery.cjs +63 -65
  67. package/dist/discovery.cjs.map +1 -1
  68. package/dist/discovery.d.cts +4 -4
  69. package/dist/discovery.d.ts +4 -4
  70. package/dist/discovery.js +5 -7
  71. package/dist/discovery.js.map +1 -1
  72. package/dist/execution-bridge-fpCnH6z5.d.cts +52 -0
  73. package/dist/execution-bridge-rk0uVy_n.d.ts +52 -0
  74. package/dist/execution.cjs +6 -356
  75. package/dist/execution.cjs.map +1 -1
  76. package/dist/execution.d.cts +4 -51
  77. package/dist/execution.d.ts +4 -51
  78. package/dist/execution.js +9 -359
  79. package/dist/execution.js.map +1 -1
  80. package/dist/index.cjs +10 -12
  81. package/dist/index.cjs.map +1 -1
  82. package/dist/index.d.cts +9 -16
  83. package/dist/index.d.ts +9 -16
  84. package/dist/index.js +10 -12
  85. package/dist/index.js.map +1 -1
  86. package/dist/{module-CWNK2BMj.d.ts → module-CYfE7YhM.d.ts} +2 -2
  87. package/dist/{module-BbvwdCDF.d.cts → module-Ca9L3qCn.d.cts} +2 -2
  88. package/dist/{planning-CcFZYdIL.d.cts → planning-CHrOqQ6b.d.cts} +45 -10
  89. package/dist/{planning-CcFZYdIL.d.ts → planning-CHrOqQ6b.d.ts} +45 -10
  90. package/dist/{ports-Bn6ro2FB.d.ts → ports-B0McVg7B.d.ts} +4 -3
  91. package/dist/ports-BeGO1VRI.d.cts +49 -0
  92. package/dist/{ports-CaL6geqR.d.cts → ports-GQy0x-RI.d.cts} +4 -3
  93. package/dist/ports-ykGiNUSx.d.ts +49 -0
  94. package/dist/runtime/index.cjs +205 -0
  95. package/dist/runtime/index.cjs.map +1 -0
  96. package/dist/runtime/index.d.cts +75 -0
  97. package/dist/runtime/index.d.ts +75 -0
  98. package/dist/runtime/index.js +205 -0
  99. package/dist/runtime/index.js.map +1 -0
  100. package/dist/runtime/integration.cjs +423 -0
  101. package/dist/runtime/integration.cjs.map +1 -0
  102. package/dist/runtime/integration.d.cts +658 -0
  103. package/dist/runtime/integration.d.ts +658 -0
  104. package/dist/runtime/integration.js +423 -0
  105. package/dist/runtime/integration.js.map +1 -0
  106. package/dist/storage.cjs +9 -277
  107. package/dist/storage.cjs.map +1 -1
  108. package/dist/storage.d.cts +6 -6
  109. package/dist/storage.d.ts +6 -6
  110. package/dist/storage.js +11 -279
  111. package/dist/storage.js.map +1 -1
  112. package/dist/{store-q63eSMoT.d.cts → store-DPwHzGiz.d.cts} +2 -2
  113. package/dist/{store-Ct0gOAAg.d.ts → store-DgdrPCV9.d.ts} +2 -2
  114. package/dist/task-projection-CSorlMws.d.ts +11 -0
  115. package/dist/task-projection-DKKB_ueb.d.cts +11 -0
  116. package/examples/standalone.ts +22 -0
  117. package/package.json +117 -87
  118. package/dist/chunk-2YFPV5GF.cjs +0 -16
  119. package/dist/chunk-2YFPV5GF.cjs.map +0 -1
  120. package/dist/chunk-4KF7KUAI.cjs.map +0 -1
  121. package/dist/chunk-6MN3H3YF.cjs.map +0 -1
  122. package/dist/chunk-DFTOTBGF.js.map +0 -1
  123. package/dist/chunk-G6FCDLDF.js +0 -16
  124. package/dist/chunk-G6FCDLDF.js.map +0 -1
  125. package/dist/chunk-IUI5CI2S.cjs.map +0 -1
  126. package/dist/chunk-KYNYPKKH.cjs +0 -71
  127. package/dist/chunk-KYNYPKKH.cjs.map +0 -1
  128. package/dist/chunk-L44TM4EE.cjs.map +0 -1
  129. package/dist/chunk-LSE6JG5I.cjs +0 -20
  130. package/dist/chunk-LSE6JG5I.cjs.map +0 -1
  131. package/dist/chunk-O4OGAAV4.js.map +0 -1
  132. package/dist/chunk-OHQTKGQN.js.map +0 -1
  133. package/dist/chunk-PSKQAFDF.cjs.map +0 -1
  134. package/dist/chunk-QTMTBEBA.js +0 -20
  135. package/dist/chunk-QTMTBEBA.js.map +0 -1
  136. package/dist/chunk-T7P5EIC4.cjs.map +0 -1
  137. package/dist/chunk-TB2RZGDV.js.map +0 -1
  138. package/dist/ui/index.cjs +0 -1961
  139. package/dist/ui/index.cjs.map +0 -1
  140. package/dist/ui/index.d.cts +0 -209
  141. package/dist/ui/index.d.ts +0 -209
  142. package/dist/ui/index.js +0 -1961
  143. package/dist/ui/index.js.map +0 -1
  144. package/dist/ui/kanban.css +0 -194
  145. /package/dist/{chunk-ATUFFNLV.js.map → chunk-3LEIHB7Y.js.map} +0 -0
  146. /package/dist/{chunk-5DLZWW5Y.js.map → chunk-AHHEGTUA.js.map} +0 -0
  147. /package/dist/{chunk-5XKOCKY2.js.map → chunk-X4UHZX6F.js.map} +0 -0
@@ -0,0 +1,280 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } async function _asyncOptionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = await fn(value); } else if (op === 'call' || op === 'optionalCall') { value = await fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+ var _chunkEYTVC2H5cjs = require('./chunk-EYTVC2H5.cjs');
24
+
25
+
26
+
27
+
28
+ var _chunkRBOER6EWcjs = require('./chunk-RBOER6EW.cjs');
29
+
30
+
31
+
32
+ var _chunkRSH6QSECcjs = require('./chunk-RSH6QSEC.cjs');
33
+
34
+ // src/conditional-store.ts
35
+ var ConditionalKanbanStore = class {
36
+ constructor(client, prepareDirectory, path = "kanban/boards.seq", bodies) {
37
+ this.client = client;
38
+ this.prepareDirectory = prepareDirectory;
39
+ this.path = path;
40
+ this.bodies = bodies;
41
+ if (!bodies && client.readBody && client.writeBody) this.bodies = { read: async (hash) => {
42
+ try {
43
+ return await client.readBody(path, hash);
44
+ } catch (error) {
45
+ if (_optionalChain([error, 'optionalAccess', _2 => _2.remoteCode]) === "SEQ_BODY_INTEGRITY") throw new (0, _chunkRSH6QSECcjs.KanbanError)("BODY_INTEGRITY");
46
+ throw error;
47
+ }
48
+ }, write: (hash, bytes) => client.writeBody(path, hash, bytes) };
49
+ }
50
+ async select(keys) {
51
+ return this.client.query(this.path, { keys });
52
+ }
53
+ async boardId(number) {
54
+ return entry(await this.select([_chunkEYTVC2H5cjs.boardNumberKey.call(void 0, number)]), _chunkEYTVC2H5cjs.boardNumberKey.call(void 0, number));
55
+ }
56
+ async ids() {
57
+ return JSON.parse(await _asyncNullishCoalesce(entry(await this.select(["index"]), "index"), async () => ( "[]")));
58
+ }
59
+ async view(id) {
60
+ const raw = entry(await this.select([_chunkEYTVC2H5cjs.boardKey.call(void 0, id)]), _chunkEYTVC2H5cjs.boardKey.call(void 0, id));
61
+ const indexed = _chunkEYTVC2H5cjs.indexedView.call(void 0, raw);
62
+ if (indexed) return indexed;
63
+ const state = await this.read(id);
64
+ return state ? _chunkEYTVC2H5cjs.viewFromState.call(void 0, state) : null;
65
+ }
66
+ async read(id) {
67
+ const snapshot = await this.select([_chunkEYTVC2H5cjs.boardKey.call(void 0, id)]);
68
+ return _chunkEYTVC2H5cjs.hydrate.call(void 0, await this.loadRows(entry(snapshot, _chunkEYTVC2H5cjs.boardKey.call(void 0, id)), snapshot.revision), this.bodies);
69
+ }
70
+ async loadRows(raw, revision) {
71
+ const keys = _chunkEYTVC2H5cjs.rowKeys.call(void 0, raw), rows = {};
72
+ for (let start = 0; start < keys.length; start += 256) {
73
+ _chunkRBOER6EWcjs.requireValue.call(void 0, revision !== null, "INVALID_STORAGE");
74
+ const page = await this.queryRevision(keys.slice(start, start + 256), revision);
75
+ for (const row of page.entries) {
76
+ _chunkRBOER6EWcjs.requireValue.call(void 0, typeof row.value === "string", "INVALID_STORAGE");
77
+ rows[row.key] = row.value;
78
+ }
79
+ }
80
+ return { raw, rows };
81
+ }
82
+ async queryRevision(keys, expectedRevision) {
83
+ try {
84
+ return await this.client.query(this.path, { keys, expectedRevision });
85
+ } catch (error) {
86
+ if (_optionalChain([error, 'optionalAccess', _3 => _3.code]) === "ECONFLICT") throw new (0, _chunkRSH6QSECcjs.KanbanError)("REVISION_CONFLICT");
87
+ throw error;
88
+ }
89
+ }
90
+ async events(id, after, limit, through) {
91
+ const end = Math.min(through, after + limit);
92
+ const keys = Array.from({ length: Math.max(0, end - after) }, (_, index) => `event/${encodeURIComponent(id)}/${String(after + index + 1).padStart(16, "0")}`);
93
+ if (!keys.length) return [];
94
+ const events = [];
95
+ for (let start = 0; start < keys.length; start += 256) {
96
+ const rows = await this.select(keys.slice(start, start + 256));
97
+ events.push(...rows.entries.map((e) => JSON.parse(String(e.value))));
98
+ }
99
+ return events.sort((a, b) => a.sequence - b.sequence);
100
+ }
101
+ async archived(board, item) {
102
+ const raw = entry(await this.select([_chunkEYTVC2H5cjs.archiveKey.call(void 0, board, item)]), _chunkEYTVC2H5cjs.archiveKey.call(void 0, board, item));
103
+ if (!raw) return null;
104
+ const record = await _chunkEYTVC2H5cjs.decodeRow.call(void 0, raw, this.bodies);
105
+ record.item.number ??= await _asyncOptionalChain([(await this.view(board)), 'optionalAccess', async _4 => _4.state, 'access', async _5 => _5.archiveIndex, 'optionalAccess', async _6 => _6.find, 'call', async _7 => _7((value) => value.id === item), 'optionalAccess', async _8 => _8.number]);
106
+ return record;
107
+ }
108
+ async numberBoard(snapshot, raw, id, state) {
109
+ const high = _chunkEYTVC2H5cjs.counter.call(void 0, entry(snapshot, _chunkEYTVC2H5cjs.boardCounterKey)), number = _chunkEYTVC2H5cjs.allocateBoardNumber.call(void 0, raw, high);
110
+ state.board.number = number;
111
+ if (_chunkEYTVC2H5cjs.storedBoardNumber.call(void 0, raw) !== void 0) return [];
112
+ if (snapshot.revision !== null) {
113
+ const lookup = await this.queryRevision([_chunkEYTVC2H5cjs.boardNumberKey.call(void 0, number)], snapshot.revision), owner = entry(lookup, _chunkEYTVC2H5cjs.boardNumberKey.call(void 0, number));
114
+ _chunkRBOER6EWcjs.requireValue.call(void 0, owner === null || owner === id, "INVALID_NUMBERING");
115
+ }
116
+ return [{ action: "set", key: _chunkEYTVC2H5cjs.boardCounterKey, value: String(Math.max(high, number)) }, { action: "set", key: _chunkEYTVC2H5cjs.boardNumberKey.call(void 0, number), value: id }];
117
+ }
118
+ async update(id, operationId, fingerprint, change) {
119
+ await this.prepareDirectory();
120
+ const receiptKey = `receipt/${encodeURIComponent(id)}/${encodeURIComponent(operationId)}`;
121
+ const snapshot = await this.select([_chunkEYTVC2H5cjs.boardKey.call(void 0, id), receiptKey, "index", _chunkEYTVC2H5cjs.boardCounterKey]);
122
+ const raw = entry(snapshot, _chunkEYTVC2H5cjs.boardKey.call(void 0, id)), receipt = entry(snapshot, receiptKey);
123
+ const before = await this.loadRows(raw, snapshot.revision), current = await _chunkEYTVC2H5cjs.hydrate.call(void 0, before, this.bodies);
124
+ if (receipt) {
125
+ _chunkEYTVC2H5cjs.verifyReceipt.call(void 0, receipt, fingerprint);
126
+ _chunkRBOER6EWcjs.requireValue.call(void 0, current, "CORRUPT_RECEIPT");
127
+ return current;
128
+ }
129
+ const original = JSON.stringify(current), state = change(current);
130
+ _chunkEYTVC2H5cjs.numberEntities.call(void 0, state);
131
+ if (JSON.stringify(state) === original) return state;
132
+ const numbering = await this.numberBoard(snapshot, raw, id, state);
133
+ const { changes, encoded } = await prepareChanges(id, before, state, this.bodies);
134
+ changes.push(...numbering);
135
+ changes.push({ action: "set", key: _chunkEYTVC2H5cjs.boardKey.call(void 0, id), value: encoded.raw }, { action: "set", key: receiptKey, value: _chunkEYTVC2H5cjs.receiptDigest.call(void 0, fingerprint) });
136
+ const ids = JSON.parse(_nullishCoalesce(entry(snapshot, "index"), () => ( "[]")));
137
+ if (!ids.includes(id)) changes.push({ action: "set", key: "index", value: JSON.stringify([...ids, id]) });
138
+ _chunkRBOER6EWcjs.requireValue.call(void 0, changes.length <= 256, "REMOTE_TRANSACTION_LIMIT");
139
+ try {
140
+ await this.client.transaction(this.path, snapshot.revision, changes);
141
+ } catch (error) {
142
+ if (_optionalChain([error, 'optionalAccess', _9 => _9.outcome]) === "not-committed" && _optionalChain([error, 'optionalAccess', _10 => _10.code]) === "ECONFLICT") throw new (0, _chunkRSH6QSECcjs.KanbanError)("REVISION_CONFLICT");
143
+ throw error;
144
+ }
145
+ return state;
146
+ }
147
+ };
148
+ function entry(snapshot, key) {
149
+ const value = _optionalChain([snapshot, 'access', _11 => _11.entries, 'access', _12 => _12.find, 'call', _13 => _13((e) => e.key === key), 'optionalAccess', _14 => _14.value]);
150
+ if (value === void 0) return null;
151
+ if (typeof value !== "string") throw new (0, _chunkRSH6QSECcjs.KanbanError)("INVALID_STORAGE");
152
+ return value;
153
+ }
154
+ async function prepareChanges(id, before, state, bodies) {
155
+ const changes = state.events.map((event) => ({
156
+ action: "set",
157
+ key: `event/${encodeURIComponent(id)}/${String(event.sequence).padStart(16, "0")}`,
158
+ value: JSON.stringify(event)
159
+ }));
160
+ for (const write of _nullishCoalesce(state.archiveWrites, () => ( []))) changes.push(write.value ? { action: "set", key: _chunkEYTVC2H5cjs.archiveKey.call(void 0, id, write.id), value: await _chunkEYTVC2H5cjs.encodeRow.call(void 0, write.value, bodies) } : { action: "delete", key: _chunkEYTVC2H5cjs.archiveKey.call(void 0, id, write.id) });
161
+ delete state.archiveWrites;
162
+ state.events = [];
163
+ const encoded = await _chunkEYTVC2H5cjs.encodeBoard.call(void 0, state, bodies);
164
+ for (const row of _chunkEYTVC2H5cjs.rowChanges.call(void 0, before, encoded)) changes.push(row.value === null ? { action: "delete", key: row.key } : { action: "set", key: row.key, value: row.value });
165
+ return { changes, encoded };
166
+ }
167
+
168
+ // src/content.ts
169
+ async function inspectKanbanContent(store, content) {
170
+ const state = await store.read(content.board.id);
171
+ const ids = new Set([..._nullishCoalesce(_optionalChain([state, 'optionalAccess', _15 => _15.board, 'access', _16 => _16.items]), () => ( [])), ..._nullishCoalesce(_optionalChain([state, 'optionalAccess', _17 => _17.archiveIndex]), () => ( []))].map((item) => item.id));
172
+ return {
173
+ version: _nullishCoalesce(_optionalChain([state, 'optionalAccess', _18 => _18.presetVersions, 'optionalAccess', _19 => _19[content.id]]), () => ( 0)),
174
+ complete: !!state && content.items.every((item) => ids.has(item.command.item.id)) && (_nullishCoalesce(content.records, () => ( []))).every((entry2) => _optionalChain([state, 'access', _20 => _20.records, 'optionalAccess', _21 => _21.some, 'call', _22 => _22((record) => record.id === entry2.record.id)]))
175
+ };
176
+ }
177
+ async function installKanbanContent(options) {
178
+ const started = (_nullishCoalesce(options.now, () => ( Date.now)))(), content = structuredClone(options.content);
179
+ try {
180
+ _chunkRBOER6EWcjs.identity.call(void 0, content.id);
181
+ _chunkRBOER6EWcjs.identity.call(void 0, options.operationId);
182
+ validateContent(content);
183
+ const actor = _chunkRBOER6EWcjs.normalizeActor.call(void 0, options.actor), before = await options.store.read(content.board.id);
184
+ const initial = _nullishCoalesce(before, () => ( _chunkEYTVC2H5cjs.createBoardState.call(void 0, content.board, actor, started)));
185
+ await options.authorize({ actor, board: structuredClone(initial.board), action: "install-content" });
186
+ const result = { changed: false, created: 0 };
187
+ if (before && !options.fillMissing && (_nullishCoalesce(_optionalChain([before, 'access', _23 => _23.presetVersions, 'optionalAccess', _24 => _24[content.id]]), () => ( 1))) >= content.version) {
188
+ report(options, started, "success");
189
+ return result;
190
+ }
191
+ await options.store.update(content.board.id, options.operationId, JSON.stringify({ content, actor, fillMissing: !!options.fillMissing, missingReferences: options.missingReferences }), (current) => {
192
+ _chunkRBOER6EWcjs.requireValue.call(void 0, JSON.stringify(current) === JSON.stringify(before), "REVISION_CONFLICT");
193
+ if (_optionalChain([current, 'optionalAccess', _25 => _25.board, 'access', _26 => _26.deletedAt]) !== void 0) {
194
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !options.fillMissing, "BOARD_DELETED");
195
+ return current;
196
+ }
197
+ const installed = _nullishCoalesce(_optionalChain([current, 'optionalAccess', _27 => _27.presetVersions, 'optionalAccess', _28 => _28[content.id]]), () => ( (current ? 1 : 0)));
198
+ if (current && !options.fillMissing && installed >= content.version) return current;
199
+ const state = _nullishCoalesce(current, () => ( initial));
200
+ result.changed = !current;
201
+ applyContent(state, { ...options, content }, actor, installed, started, result);
202
+ (state.presetVersions ??= {})[content.id] = content.version;
203
+ return state;
204
+ });
205
+ report(options, started, "success");
206
+ return result;
207
+ } catch (error) {
208
+ const raw = _optionalChain([error, 'optionalAccess', _29 => _29.code]);
209
+ report(options, started, "failure", typeof raw === "string" && /^[A-Z][A-Z0-9_]{0,79}$/.test(raw) ? raw : "CONTENT_INSTALL_FAILED");
210
+ throw error;
211
+ }
212
+ }
213
+ function validateContent(content) {
214
+ _chunkRBOER6EWcjs.requireValue.call(void 0, Number.isSafeInteger(content.version) && content.version > 0, "INVALID_CONTENT_VERSION");
215
+ _chunkRBOER6EWcjs.requireValue.call(void 0, Array.isArray(content.items) && content.items.length <= 1e3, "CONTENT_ITEM_LIMIT");
216
+ for (const rows of [content.records, content.amendments]) _chunkRBOER6EWcjs.requireValue.call(void 0, rows === void 0 || Array.isArray(rows) && rows.length <= 1e3, "CONTENT_RECORD_LIMIT");
217
+ for (const entry2 of [...content.items, ..._nullishCoalesce(content.records, () => ( [])), ..._nullishCoalesce(content.amendments, () => ( []))]) {
218
+ const version = _nullishCoalesce(entry2.introduced, () => ( 1));
219
+ _chunkRBOER6EWcjs.requireValue.call(void 0, Number.isSafeInteger(version) && version > 0 && version <= content.version, "INVALID_CONTENT_VERSION");
220
+ }
221
+ }
222
+ function applyContent(state, options, actor, installed, now, result) {
223
+ const content = options.content, version = options.fillMissing ? 0 : installed;
224
+ const known = new Set([...state.board.items, ..._nullishCoalesce(state.archiveIndex, () => ( []))].map((item) => item.id));
225
+ const apply = (command) => _chunkEYTVC2H5cjs.reduce.call(void 0, state, command, actor, options.operationId, now, (_nullishCoalesce(options.id, () => ( (0, _chunkRSH6QSECcjs.randomUUID))))());
226
+ for (const entry2 of content.items) {
227
+ if (known.has(entry2.command.item.id) || (_nullishCoalesce(entry2.introduced, () => ( 1))) <= version) continue;
228
+ insertItem(state, entry2, options.missingReferences === "detach", apply);
229
+ known.add(entry2.command.item.id);
230
+ result.changed = true;
231
+ result.created++;
232
+ }
233
+ for (const entry2 of _nullishCoalesce(content.records, () => ( []))) {
234
+ if ((_nullishCoalesce(entry2.introduced, () => ( 1))) <= version || _optionalChain([state, 'access', _30 => _30.records, 'optionalAccess', _31 => _31.some, 'call', _32 => _32((record2) => record2.id === entry2.record.id)])) continue;
235
+ const record = structuredClone(entry2.record);
236
+ if (options.missingReferences === "detach") record.itemIds = record.itemIds.filter((id) => known.has(id));
237
+ apply({ type: "append-record", record });
238
+ if (entry2.confirmed) apply({ type: "review-record", recordId: record.id, accept: true });
239
+ result.changed = true;
240
+ }
241
+ for (const entry2 of _nullishCoalesce(content.amendments, () => ( []))) {
242
+ if ((_nullishCoalesce(entry2.introduced, () => ( 1))) <= version) continue;
243
+ const item = state.board.items.find((item2) => item2.id === entry2.itemId);
244
+ if (!item) continue;
245
+ const count = _nullishCoalesce(_optionalChain([item, 'access', _33 => _33.amendments, 'optionalAccess', _34 => _34.length]), () => ( 0));
246
+ _chunkEYTVC2H5cjs.proposeAmendment.call(void 0, item, { action: "update", ...entry2, sources: [] }, entry2.proposedBy, now, entry2.runId);
247
+ if ((_nullishCoalesce(_optionalChain([item, 'access', _35 => _35.amendments, 'optionalAccess', _36 => _36.length]), () => ( 0))) > count) {
248
+ item.revision++;
249
+ state.board.revision++;
250
+ result.changed = true;
251
+ }
252
+ }
253
+ }
254
+ function insertItem(state, entry2, detach, apply) {
255
+ const command = structuredClone(entry2.command), parentId = _optionalChain([command, 'access', _37 => _37.planning, 'optionalAccess', _38 => _38.parentId]);
256
+ if (detach && parentId) {
257
+ const parent = state.board.items.find((item) => item.id === parentId);
258
+ if (!parent || ["completed", "cancelled"].includes(parent.status)) delete command.planning.parentId;
259
+ }
260
+ const itemId = command.item.id;
261
+ apply(command);
262
+ if (entry2.blocked) apply({ type: "block-item", itemId, reason: entry2.blocked });
263
+ if (entry2.completion) {
264
+ apply({ type: "close-plan", itemId, resultRef: entry2.completion.resultRef });
265
+ if (entry2.completion.archiveReason) apply({ type: "archive-items", itemIds: [itemId], reason: entry2.completion.archiveReason });
266
+ }
267
+ }
268
+ function report(options, start, result, code) {
269
+ try {
270
+ options.log({ operationId: options.operationId, boardId: options.content.board.id, stage: "content.install", result, code, durationMs: (_nullishCoalesce(options.now, () => ( Date.now)))() - start });
271
+ } catch (e2) {
272
+ }
273
+ }
274
+
275
+
276
+
277
+
278
+
279
+ exports.ConditionalKanbanStore = ConditionalKanbanStore; exports.inspectKanbanContent = inspectKanbanContent; exports.installKanbanContent = installKanbanContent;
280
+ //# sourceMappingURL=chunk-ZUZGAO6G.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/li/share/prj/x1/libraries/kanban/dist/chunk-ZUZGAO6G.cjs","../src/conditional-store.ts","../src/content.ts"],"names":[],"mappings":"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","file":"/home/li/share/prj/x1/libraries/kanban/dist/chunk-ZUZGAO6G.cjs","sourcesContent":[null,"import {numberEntities, boardCounterKey, boardNumberKey, counter, allocateBoardNumber, storedBoardNumber} from './numbering';\nimport type {KanbanSeqClient, KanbanSeqChange, KanbanSeqSnapshot} from './storage-ports';\nimport type {KanbanEvent, KanbanArchivedItem} from './contracts';\nimport {KanbanError, type KanbanState, type KanbanStore} from './ports';\nimport {requireValue} from './rules';\nimport {indexedView, viewFromState, archiveKey, boardKey as key, rowKeys, hydrate, encodeBoard, rowChanges, encodeRow, decodeRow, receiptDigest, verifyReceipt, type StoredBoard, type KanbanBodyStore} from './storage-codec';\n\n/** The project export and its authorization are frozen in the injected HTTP client. */\nexport class ConditionalKanbanStore implements KanbanStore {\n constructor(private readonly client: Pick<KanbanSeqClient, 'query' | 'transaction'> & Partial<Pick<KanbanSeqClient, 'readBody' | 'writeBody'>>,\n private readonly prepareDirectory: () => Promise<void>, private readonly path = 'kanban/boards.seq', private readonly bodies?: KanbanBodyStore) {\n if (!bodies && client.readBody && client.writeBody) this.bodies = {read: async hash => {\n try {return await client.readBody!(path, hash);}\n catch (error) {if ((error as {remoteCode?: string})?.remoteCode === 'SEQ_BODY_INTEGRITY') throw new KanbanError('BODY_INTEGRITY'); throw error;}\n }, write: (hash, bytes) => client.writeBody!(path, hash, bytes)};\n }\n private async select(keys: string[]): Promise<KanbanSeqSnapshot> {return this.client.query(this.path, {keys});}\n async boardId(number: number): Promise<string | null> {return entry(await this.select([boardNumberKey(number)]), boardNumberKey(number));}\n async ids(): Promise<string[]> {return JSON.parse(entry(await this.select(['index']), 'index') ?? '[]');}\n async view(id: string) {\n const raw = entry(await this.select([key(id)]), key(id));\n const indexed = indexedView(raw); if (indexed) return indexed;\n const state = await this.read(id); return state ? viewFromState(state) : null;\n }\n async read(id: string): Promise<KanbanState | null> {\n const snapshot = await this.select([key(id)]);\n return hydrate(await this.loadRows(entry(snapshot, key(id)), snapshot.revision), this.bodies);\n }\n private async loadRows(raw: string | null, revision: string | null): Promise<StoredBoard> {\n const keys = rowKeys(raw), rows: Record<string, string> = {};\n for (let start = 0; start < keys.length; start += 256) {\n requireValue(revision !== null, 'INVALID_STORAGE');\n const page = await this.queryRevision(keys.slice(start, start + 256), revision);\n for (const row of page.entries) {requireValue(typeof row.value === 'string', 'INVALID_STORAGE'); rows[row.key] = row.value;}\n }\n return {raw, rows};\n }\n private async queryRevision(keys: string[], expectedRevision: string) {\n try {return await this.client.query(this.path, {keys, expectedRevision});}\n catch (error) {\n if ((error as {code?: string})?.code === 'ECONFLICT') throw new KanbanError('REVISION_CONFLICT');\n throw error;\n }\n }\n async events(id: string, after: number, limit: number, through: number): Promise<KanbanEvent[]> {\n const end = Math.min(through, after + limit);\n const keys = Array.from({length: Math.max(0, end - after)}, (_, index) =>\n `event/${encodeURIComponent(id)}/${String(after + index + 1).padStart(16, '0')}`);\n if (!keys.length) return [];\n const events: KanbanEvent[] = [];\n // Event keys below through are immutable; concurrent appends cannot change this prefix.\n for (let start = 0; start < keys.length; start += 256) {\n const rows = await this.select(keys.slice(start, start + 256));\n events.push(...rows.entries.map(e => JSON.parse(String(e.value)) as KanbanEvent));\n }\n return events.sort((a, b) => a.sequence - b.sequence);\n }\n async archived(board: string, item: string): Promise<KanbanArchivedItem | null> {\n const raw = entry(await this.select([archiveKey(board, item)]), archiveKey(board, item));\n if (!raw) return null; const record = await decodeRow<KanbanArchivedItem>(raw, this.bodies);\n record.item.number ??= (await this.view(board))?.state.archiveIndex?.find(value => value.id === item)?.number; return record;\n }\n private async numberBoard(snapshot: KanbanSeqSnapshot, raw: string | null, id: string, state: KanbanState): Promise<KanbanSeqChange[]> {\n const high = counter(entry(snapshot, boardCounterKey)), number = allocateBoardNumber(raw, high);\n state.board.number = number;\n if (storedBoardNumber(raw) !== undefined) return [];\n if (snapshot.revision !== null) {\n const lookup = await this.queryRevision([boardNumberKey(number)], snapshot.revision), owner = entry(lookup, boardNumberKey(number));\n requireValue(owner === null || owner === id, 'INVALID_NUMBERING');\n }\n return [{action:'set',key:boardCounterKey,value:String(Math.max(high,number))}, {action:'set',key:boardNumberKey(number),value:id}];\n }\n async update(id: string, operationId: string, fingerprint: string,\n change: (state: KanbanState | null) => KanbanState): Promise<KanbanState> {\n await this.prepareDirectory();\n const receiptKey = `receipt/${encodeURIComponent(id)}/${encodeURIComponent(operationId)}`;\n const snapshot = await this.select([key(id), receiptKey, 'index', boardCounterKey]);\n const raw = entry(snapshot, key(id)), receipt = entry(snapshot, receiptKey);\n const before = await this.loadRows(raw, snapshot.revision), current = await hydrate(before, this.bodies);\n if (receipt) {verifyReceipt(receipt, fingerprint); requireValue(current, 'CORRUPT_RECEIPT'); return current;}\n const original = JSON.stringify(current), state = change(current); numberEntities(state); if (JSON.stringify(state) === original) return state;\n const numbering = await this.numberBoard(snapshot, raw, id, state);\n const {changes, encoded} = await prepareChanges(id, before, state, this.bodies);\n changes.push(...numbering);\n changes.push({action: 'set', key: key(id), value: encoded.raw!}, {action: 'set', key: receiptKey, value: receiptDigest(fingerprint)});\n const ids: string[] = JSON.parse(entry(snapshot, 'index') ?? '[]');\n if (!ids.includes(id)) changes.push({action: 'set', key: 'index', value: JSON.stringify([...ids, id])});\n requireValue(changes.length <= 256, 'REMOTE_TRANSACTION_LIMIT');\n // The transport owns unknown-write reconciliation. Never retry a mutation here.\n try {await this.client.transaction(this.path, snapshot.revision, changes);}\n catch (error) {\n if ((error as {outcome?: string})?.outcome === 'not-committed' && (error as {code?: string})?.code === 'ECONFLICT') throw new KanbanError('REVISION_CONFLICT');\n throw error;\n }\n return state;\n }\n}\nfunction entry(snapshot: KanbanSeqSnapshot, key: string): string | null {\n const value = snapshot.entries.find(e => e.key === key)?.value;\n if (value === undefined) return null;\n if (typeof value !== 'string') throw new KanbanError('INVALID_STORAGE'); return value;\n}\n\nasync function prepareChanges(id: string, before: StoredBoard, state: KanbanState, bodies?: KanbanBodyStore) {\n const changes: KanbanSeqChange[] = state.events.map(event => ({action: 'set',\n key: `event/${encodeURIComponent(id)}/${String(event.sequence).padStart(16, '0')}`, value: JSON.stringify(event)}));\n for (const write of state.archiveWrites ?? []) changes.push(write.value\n ? {action: 'set', key: archiveKey(id, write.id), value: await encodeRow(write.value, bodies)}\n : {action: 'delete', key: archiveKey(id, write.id)});\n delete state.archiveWrites; state.events = [];\n const encoded = await encodeBoard(state, bodies);\n for (const row of rowChanges(before, encoded)) changes.push(row.value === null ? {action: 'delete', key: row.key} : {action: 'set', key: row.key, value: row.value});\n return {changes, encoded};\n}\n","import type {KanbanActor, KanbanCommand, KanbanContent, KanbanContentItem} from './contracts';\nimport type {KanbanModuleOptions, KanbanState, KanbanStore} from './ports';\nimport {createBoardState} from './board';\nimport {normalizeActor} from './identity';\nimport {identity, requireValue} from './rules';\nimport {reduce} from './reducer';\nimport {proposeAmendment} from './amendments';\nimport {randomUUID} from './utils';\n\nexport interface KanbanContentOptions extends KanbanModuleOptions {\n content: KanbanContent;\n operationId: string;\n fillMissing?: boolean;\n missingReferences?: 'reject' | 'detach';\n}\nexport async function inspectKanbanContent(store: KanbanStore, content: KanbanContent) {\n const state = await store.read(content.board.id);\n const ids = new Set([...state?.board.items ?? [], ...state?.archiveIndex ?? []].map(item => item.id));\n return {version: state?.presetVersions?.[content.id] ?? 0,\n complete: !!state && content.items.every(item => ids.has(item.command.item.id)) && (content.records ?? []).every(entry => state.records?.some(record => record.id === entry.record.id))};\n}\n\n/** Authorized bootstrap/import: domain changes and the installed version commit together. */\nexport async function installKanbanContent(options: KanbanContentOptions): Promise<{changed: boolean; created: number}> {\n const started = (options.now ?? Date.now)(), content = structuredClone(options.content);\n try {\n identity(content.id); identity(options.operationId);\n validateContent(content);\n const actor = normalizeActor(options.actor), before = await options.store.read(content.board.id);\n const initial = before ?? createBoardState(content.board, actor, started);\n await options.authorize({actor, board: structuredClone(initial.board), action: 'install-content'});\n const result = {changed: false, created: 0};\n if (before && !options.fillMissing && (before.presetVersions?.[content.id] ?? 1) >= content.version) {report(options, started, 'success'); return result;}\n await options.store.update(content.board.id, options.operationId, JSON.stringify({content, actor, fillMissing: !!options.fillMissing, missingReferences: options.missingReferences}), current => {\n requireValue(JSON.stringify(current) === JSON.stringify(before), 'REVISION_CONFLICT');\n if (current?.board.deletedAt !== undefined) {requireValue(!options.fillMissing, 'BOARD_DELETED'); return current;}\n const installed = current?.presetVersions?.[content.id] ?? (current ? 1 : 0);\n if (current && !options.fillMissing && installed >= content.version) return current;\n const state = current ?? initial; result.changed = !current;\n applyContent(state, {...options, content}, actor, installed, started, result);\n (state.presetVersions ??= {})[content.id] = content.version;\n return state;\n });\n report(options, started, 'success'); return result;\n } catch (error) {\n const raw = (error as {code?: unknown})?.code;\n report(options, started, 'failure', typeof raw === 'string' && /^[A-Z][A-Z0-9_]{0,79}$/.test(raw) ? raw : 'CONTENT_INSTALL_FAILED');\n throw error;\n }\n}\nfunction validateContent(content: KanbanContent): void {\n requireValue(Number.isSafeInteger(content.version) && content.version > 0, 'INVALID_CONTENT_VERSION');\n requireValue(Array.isArray(content.items) && content.items.length <= 1000, 'CONTENT_ITEM_LIMIT');\n for (const rows of [content.records, content.amendments]) requireValue(rows === undefined || Array.isArray(rows) && rows.length <= 1000, 'CONTENT_RECORD_LIMIT');\n for (const entry of [...content.items, ...content.records ?? [], ...content.amendments ?? []]) {\n const version = entry.introduced ?? 1;\n requireValue(Number.isSafeInteger(version) && version > 0 && version <= content.version, 'INVALID_CONTENT_VERSION');\n }\n}\nfunction applyContent(state: KanbanState, options: KanbanContentOptions, actor: KanbanActor, installed: number, now: number, result: {changed: boolean; created: number}): void {\n const content = options.content, version = options.fillMissing ? 0 : installed;\n const known = new Set([...state.board.items, ...state.archiveIndex ?? []].map(item => item.id));\n const apply = (command: KanbanCommand) => reduce(state, command, actor, options.operationId, now, (options.id ?? randomUUID)());\n for (const entry of content.items) {\n if (known.has(entry.command.item.id) || (entry.introduced ?? 1) <= version) continue;\n insertItem(state, entry, options.missingReferences === 'detach', apply);\n known.add(entry.command.item.id); result.changed = true; result.created++;\n }\n for (const entry of content.records ?? []) {\n if ((entry.introduced ?? 1) <= version || state.records?.some(record => record.id === entry.record.id)) continue;\n const record = structuredClone(entry.record);\n if (options.missingReferences === 'detach') record.itemIds = record.itemIds.filter(id => known.has(id));\n apply({type: 'append-record', record});\n if (entry.confirmed) apply({type: 'review-record', recordId: record.id, accept: true});\n result.changed = true;\n }\n for (const entry of content.amendments ?? []) {\n if ((entry.introduced ?? 1) <= version) continue;\n const item = state.board.items.find(item => item.id === entry.itemId); if (!item) continue;\n const count = item.amendments?.length ?? 0;\n // Imported attribution grants no authority to execute or review work.\n proposeAmendment(item, {action: 'update', ...entry, sources: []}, entry.proposedBy, now, entry.runId);\n if ((item.amendments?.length ?? 0) > count) {item.revision++; state.board.revision++; result.changed = true;}\n }\n}\nfunction insertItem(state: KanbanState, entry: KanbanContentItem, detach: boolean, apply: (command: KanbanCommand) => void): void {\n const command = structuredClone(entry.command), parentId = command.planning?.parentId;\n if (detach && parentId) {\n const parent = state.board.items.find(item => item.id === parentId);\n if (!parent || ['completed', 'cancelled'].includes(parent.status)) delete command.planning!.parentId;\n }\n const itemId = command.item.id;\n apply(command);\n if (entry.blocked) apply({type: 'block-item', itemId, reason: entry.blocked});\n if (entry.completion) {\n apply({type: 'close-plan', itemId, resultRef: entry.completion.resultRef});\n if (entry.completion.archiveReason) apply({type: 'archive-items', itemIds: [itemId], reason: entry.completion.archiveReason});\n }\n}\nfunction report(options: KanbanContentOptions, start: number, result: 'success' | 'failure', code?: string): void {\n try {options.log({operationId: options.operationId, boardId: options.content.board.id, stage: 'content.install', result, code, durationMs: (options.now ?? Date.now)() - start});}\n catch { /* Diagnostics cannot undo content installation. */ }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { l as KanbanBoardInput, o as KanbanCommand, N as KanbanRecordInput, a2 as KanbanText, K as KanbanActor } from './planning-CcFZYdIL.cjs';
1
+ import { l as KanbanBoardInput, o as KanbanCommand, N as KanbanRecordInput, a2 as KanbanText, K as KanbanActor } from './planning-CHrOqQ6b.cjs';
2
2
 
3
3
  interface KanbanContentItem {
4
4
  introduced?: number;
@@ -1,4 +1,4 @@
1
- import { l as KanbanBoardInput, o as KanbanCommand, N as KanbanRecordInput, a2 as KanbanText, K as KanbanActor } from './planning-CcFZYdIL.js';
1
+ import { l as KanbanBoardInput, o as KanbanCommand, N as KanbanRecordInput, a2 as KanbanText, K as KanbanActor } from './planning-CHrOqQ6b.js';
2
2
 
3
3
  interface KanbanContentItem {
4
4
  introduced?: number;
@@ -4,18 +4,28 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkPSKQAFDFcjs = require('../chunk-PSKQAFDF.cjs');
7
+ var _chunk7KDOTBRXcjs = require('../chunk-7KDOTBRX.cjs');
8
8
 
9
9
 
10
10
 
11
- var _chunkLSE6JG5Icjs = require('../chunk-LSE6JG5I.cjs');
12
11
 
13
12
 
14
13
 
15
14
 
16
15
 
16
+ var _chunkAOHQCX7Kcjs = require('../chunk-AOHQCX7K.cjs');
17
17
 
18
18
 
19
19
 
20
- exports.DEFAULT_KANBAN_SCAN_POLICY = _chunkPSKQAFDFcjs.DEFAULT_KANBAN_SCAN_POLICY; exports.DEFAULT_KANBAN_WORK_TYPES = _chunkPSKQAFDFcjs.DEFAULT_KANBAN_WORK_TYPES; exports.boardAllowsStart = _chunkLSE6JG5Icjs.boardAllowsStart; exports.boardControlPhase = _chunkLSE6JG5Icjs.boardControlPhase; exports.executableWorkItem = _chunkPSKQAFDFcjs.executableWorkItem; exports.kanbanReference = _chunkPSKQAFDFcjs.kanbanReference; exports.sameAutomationBinding = _chunkPSKQAFDFcjs.sameAutomationBinding;
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+ exports.DEFAULT_KANBAN_SCAN_POLICY = _chunk7KDOTBRXcjs.DEFAULT_KANBAN_SCAN_POLICY; exports.DEFAULT_KANBAN_WORK_TYPES = _chunk7KDOTBRXcjs.DEFAULT_KANBAN_WORK_TYPES; exports.TASK_START_DELAY_MS = _chunkAOHQCX7Kcjs.TASK_START_DELAY_MS; exports.boardAllowsStart = _chunkAOHQCX7Kcjs.boardAllowsStart; exports.boardControlPhase = _chunkAOHQCX7Kcjs.boardControlPhase; exports.executableWorkItem = _chunk7KDOTBRXcjs.executableWorkItem; exports.kanbanReference = _chunk7KDOTBRXcjs.kanbanReference; exports.projectKanbanTask = _chunkAOHQCX7Kcjs.projectKanbanTask; exports.sameAutomationBinding = _chunk7KDOTBRXcjs.sameAutomationBinding; exports.taskDue = _chunkAOHQCX7Kcjs.taskDue; exports.taskEditing = _chunkAOHQCX7Kcjs.taskEditing; exports.taskStartAt = _chunkAOHQCX7Kcjs.taskStartAt;
21
31
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/li/share/prj/x1/release/local-libraries/work/1ca933a0-6fe7-4e9c-b13b-76d7f318e0fb/source/libraries/kanban/dist/contracts/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,4eAAC","file":"/home/li/share/prj/x1/release/local-libraries/work/1ca933a0-6fe7-4e9c-b13b-76d7f318e0fb/source/libraries/kanban/dist/contracts/index.cjs"}
1
+ {"version":3,"sources":["/home/li/share/prj/x1/libraries/kanban/dist/contracts/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,ywBAAC","file":"/home/li/share/prj/x1/libraries/kanban/dist/contracts/index.cjs"}
@@ -1,4 +1,5 @@
1
- export { D as DEFAULT_KANBAN_WORK_TYPES, K as KanbanActor, a as KanbanAmendment, b as KanbanAnalysisStatus, c as KanbanArchivedItem, d as KanbanArtifactRef, e as KanbanAssignment, f as KanbanAutomationCatalog, g as KanbanAutomationOption, h as KanbanAutomationSettings, i as KanbanAutomationTarget, j as KanbanBoard, k as KanbanBoardControl, l as KanbanBoardInput, m as KanbanBoardSummary, n as KanbanColumn, o as KanbanCommand, p as KanbanDiscoveryBatch, q as KanbanDiscoveryChange, r as KanbanDispatch, s as KanbanEstimate, t as KanbanEvent, u as KanbanExternalReference, v as KanbanFixSession, w as KanbanItem, x as KanbanItemPage, y as KanbanItemQuery, z as KanbanItemSummary, A as KanbanLaunch, B as KanbanMember, C as KanbanNotificationPolicy, E as KanbanOverview, F as KanbanParticipant, G as KanbanPlanning, H as KanbanPolicy, I as KanbanPrincipal, J as KanbanProjectRecord, L as KanbanPublishedPlan, M as KanbanRecordActivity, N as KanbanRecordInput, O as KanbanRecordPage, P as KanbanRecordQuery, Q as KanbanRecordSummary, R as KanbanReferenceTarget, S as KanbanRequest, T as KanbanService, U as KanbanSourceRef, V as KanbanSuggestion, W as KanbanSuggestionKind, X as KanbanSuggestionPage, Y as KanbanSuggestionQuery, Z as KanbanTaskCommand, _ as KanbanTaskControl, $ as KanbanTaskIssue, a0 as KanbanTaskPhase, a1 as KanbanTaskProjection, a2 as KanbanText, a3 as KanbanWorkDefinition, a4 as KanbanWorkPlan, a5 as KanbanWorkType, a6 as KanbanWorkflowCommand, a7 as KanbanWorkflowState, a8 as boardAllowsStart, a9 as boardControlPhase, aa as executableWorkItem, ab as kanbanReference, ac as sameAutomationBinding } from '../planning-CcFZYdIL.cjs';
2
- export { D as DEFAULT_KANBAN_SCAN_POLICY, K as KanbanDiscoveryResult, a as KanbanScanConnection, b as KanbanScanInput, c as KanbanScanPolicy, d as KanbanScanSession, e as KanbanScanText } from '../discovery-DxpirOz3.cjs';
3
- export { K as KanbanClient, a as KanbanDeletionPreview, b as KanbanDeletionRequest, c as KanbanExecutionSession, d as KanbanExecutionSessionDetail, e as KanbanItemOperation, f as KanbanItemOperationBinding, g as KanbanItemOperationRequest, h as KanbanItemOperations, i as KanbanItemResourceCatalog, j as KanbanOperationChoice, k as KanbanOperationField, l as KanbanRecordExecution, m as KanbanRecordResource, n as KanbanRecordRunRequest, o as KanbanRelatedSession, p as KanbanSessionActivityQuery, q as KanbanSessionAssociation, r as KanbanSessionDetailQuery, s as KanbanSessionExecution, t as KanbanSessionItemPage, u as KanbanSessionItemSummary, v as KanbanSessionPhase, w as KanbanSessionPurpose, x as KanbanWorkResource, y as KanbanWorkResourceCleanup, z as KanbanWorkResourceQuery } from '../activity-C6xDM-cg.cjs';
4
- export { K as KanbanContent, a as KanbanContentAmendment, b as KanbanContentItem, c as KanbanContentRecord } from '../content-CAIp1njn.cjs';
1
+ export { D as DEFAULT_KANBAN_WORK_TYPES, K as KanbanActor, a as KanbanAmendment, b as KanbanAnalysisStatus, c as KanbanArchivedItem, d as KanbanArtifactRef, e as KanbanAssignment, f as KanbanAutomationCatalog, g as KanbanAutomationOption, h as KanbanAutomationSettings, i as KanbanAutomationTarget, j as KanbanBoard, k as KanbanBoardControl, l as KanbanBoardInput, m as KanbanBoardSummary, n as KanbanColumn, o as KanbanCommand, p as KanbanDiscoveryBatch, q as KanbanDiscoveryChange, r as KanbanDispatch, s as KanbanEstimate, t as KanbanEvent, u as KanbanExternalReference, v as KanbanFixSession, w as KanbanItem, x as KanbanItemPage, y as KanbanItemQuery, z as KanbanItemSummary, A as KanbanLaunch, B as KanbanMember, C as KanbanNotificationPolicy, E as KanbanOverview, F as KanbanParticipant, G as KanbanPlanning, H as KanbanPolicy, I as KanbanPrincipal, J as KanbanProjectRecord, L as KanbanPublishedPlan, M as KanbanRecordActivity, N as KanbanRecordInput, O as KanbanRecordPage, P as KanbanRecordQuery, Q as KanbanRecordSummary, R as KanbanReferenceTarget, S as KanbanRequest, T as KanbanService, U as KanbanSourceRef, V as KanbanSuggestion, W as KanbanSuggestionKind, X as KanbanSuggestionPage, Y as KanbanSuggestionQuery, Z as KanbanTaskCommand, _ as KanbanTaskControl, $ as KanbanTaskIssue, a0 as KanbanTaskPhase, a1 as KanbanTaskProjection, a2 as KanbanText, a3 as KanbanWorkDefinition, a4 as KanbanWorkPlan, a5 as KanbanWorkType, a6 as KanbanWorkflowCommand, a7 as KanbanWorkflowState, a8 as boardAllowsStart, a9 as boardControlPhase, aa as executableWorkItem, ab as kanbanReference, ac as sameAutomationBinding } from '../planning-CHrOqQ6b.cjs';
2
+ export { D as DEFAULT_KANBAN_SCAN_POLICY, K as KanbanDiscoveryResult, a as KanbanScanConnection, b as KanbanScanInput, c as KanbanScanPolicy, d as KanbanScanSession, e as KanbanScanText } from '../discovery-9E-LfwIw.cjs';
3
+ export { K as KanbanClient, a as KanbanDeletionPreview, b as KanbanDeletionRequest, c as KanbanExecutionSession, d as KanbanExecutionSessionDetail, e as KanbanItemOperation, f as KanbanItemOperationBinding, g as KanbanItemOperationRequest, h as KanbanItemOperations, i as KanbanItemResourceCatalog, j as KanbanOperationChoice, k as KanbanOperationField, l as KanbanRecordExecution, m as KanbanRecordResource, n as KanbanRecordRunRequest, o as KanbanRelatedSession, p as KanbanSessionActivityQuery, q as KanbanSessionAssociation, r as KanbanSessionDetailQuery, s as KanbanSessionExecution, t as KanbanSessionItemPage, u as KanbanSessionItemSummary, v as KanbanSessionPhase, w as KanbanSessionPurpose, x as KanbanWorkResource, y as KanbanWorkResourceCleanup, z as KanbanWorkResourceQuery } from '../activity-BbC4sgKL.cjs';
4
+ export { K as KanbanContent, a as KanbanContentAmendment, b as KanbanContentItem, c as KanbanContentRecord } from '../content-C5aJZFlw.cjs';
5
+ export { T as TASK_START_DELAY_MS, p as projectKanbanTask, t as taskDue, a as taskEditing, b as taskStartAt } from '../task-projection-DKKB_ueb.cjs';
@@ -1,4 +1,5 @@
1
- export { D as DEFAULT_KANBAN_WORK_TYPES, K as KanbanActor, a as KanbanAmendment, b as KanbanAnalysisStatus, c as KanbanArchivedItem, d as KanbanArtifactRef, e as KanbanAssignment, f as KanbanAutomationCatalog, g as KanbanAutomationOption, h as KanbanAutomationSettings, i as KanbanAutomationTarget, j as KanbanBoard, k as KanbanBoardControl, l as KanbanBoardInput, m as KanbanBoardSummary, n as KanbanColumn, o as KanbanCommand, p as KanbanDiscoveryBatch, q as KanbanDiscoveryChange, r as KanbanDispatch, s as KanbanEstimate, t as KanbanEvent, u as KanbanExternalReference, v as KanbanFixSession, w as KanbanItem, x as KanbanItemPage, y as KanbanItemQuery, z as KanbanItemSummary, A as KanbanLaunch, B as KanbanMember, C as KanbanNotificationPolicy, E as KanbanOverview, F as KanbanParticipant, G as KanbanPlanning, H as KanbanPolicy, I as KanbanPrincipal, J as KanbanProjectRecord, L as KanbanPublishedPlan, M as KanbanRecordActivity, N as KanbanRecordInput, O as KanbanRecordPage, P as KanbanRecordQuery, Q as KanbanRecordSummary, R as KanbanReferenceTarget, S as KanbanRequest, T as KanbanService, U as KanbanSourceRef, V as KanbanSuggestion, W as KanbanSuggestionKind, X as KanbanSuggestionPage, Y as KanbanSuggestionQuery, Z as KanbanTaskCommand, _ as KanbanTaskControl, $ as KanbanTaskIssue, a0 as KanbanTaskPhase, a1 as KanbanTaskProjection, a2 as KanbanText, a3 as KanbanWorkDefinition, a4 as KanbanWorkPlan, a5 as KanbanWorkType, a6 as KanbanWorkflowCommand, a7 as KanbanWorkflowState, a8 as boardAllowsStart, a9 as boardControlPhase, aa as executableWorkItem, ab as kanbanReference, ac as sameAutomationBinding } from '../planning-CcFZYdIL.js';
2
- export { D as DEFAULT_KANBAN_SCAN_POLICY, K as KanbanDiscoveryResult, a as KanbanScanConnection, b as KanbanScanInput, c as KanbanScanPolicy, d as KanbanScanSession, e as KanbanScanText } from '../discovery-gSqWpuRm.js';
3
- export { K as KanbanClient, a as KanbanDeletionPreview, b as KanbanDeletionRequest, c as KanbanExecutionSession, d as KanbanExecutionSessionDetail, e as KanbanItemOperation, f as KanbanItemOperationBinding, g as KanbanItemOperationRequest, h as KanbanItemOperations, i as KanbanItemResourceCatalog, j as KanbanOperationChoice, k as KanbanOperationField, l as KanbanRecordExecution, m as KanbanRecordResource, n as KanbanRecordRunRequest, o as KanbanRelatedSession, p as KanbanSessionActivityQuery, q as KanbanSessionAssociation, r as KanbanSessionDetailQuery, s as KanbanSessionExecution, t as KanbanSessionItemPage, u as KanbanSessionItemSummary, v as KanbanSessionPhase, w as KanbanSessionPurpose, x as KanbanWorkResource, y as KanbanWorkResourceCleanup, z as KanbanWorkResourceQuery } from '../activity-Dw8DOw0L.js';
4
- export { K as KanbanContent, a as KanbanContentAmendment, b as KanbanContentItem, c as KanbanContentRecord } from '../content-CGMJdyH_.js';
1
+ export { D as DEFAULT_KANBAN_WORK_TYPES, K as KanbanActor, a as KanbanAmendment, b as KanbanAnalysisStatus, c as KanbanArchivedItem, d as KanbanArtifactRef, e as KanbanAssignment, f as KanbanAutomationCatalog, g as KanbanAutomationOption, h as KanbanAutomationSettings, i as KanbanAutomationTarget, j as KanbanBoard, k as KanbanBoardControl, l as KanbanBoardInput, m as KanbanBoardSummary, n as KanbanColumn, o as KanbanCommand, p as KanbanDiscoveryBatch, q as KanbanDiscoveryChange, r as KanbanDispatch, s as KanbanEstimate, t as KanbanEvent, u as KanbanExternalReference, v as KanbanFixSession, w as KanbanItem, x as KanbanItemPage, y as KanbanItemQuery, z as KanbanItemSummary, A as KanbanLaunch, B as KanbanMember, C as KanbanNotificationPolicy, E as KanbanOverview, F as KanbanParticipant, G as KanbanPlanning, H as KanbanPolicy, I as KanbanPrincipal, J as KanbanProjectRecord, L as KanbanPublishedPlan, M as KanbanRecordActivity, N as KanbanRecordInput, O as KanbanRecordPage, P as KanbanRecordQuery, Q as KanbanRecordSummary, R as KanbanReferenceTarget, S as KanbanRequest, T as KanbanService, U as KanbanSourceRef, V as KanbanSuggestion, W as KanbanSuggestionKind, X as KanbanSuggestionPage, Y as KanbanSuggestionQuery, Z as KanbanTaskCommand, _ as KanbanTaskControl, $ as KanbanTaskIssue, a0 as KanbanTaskPhase, a1 as KanbanTaskProjection, a2 as KanbanText, a3 as KanbanWorkDefinition, a4 as KanbanWorkPlan, a5 as KanbanWorkType, a6 as KanbanWorkflowCommand, a7 as KanbanWorkflowState, a8 as boardAllowsStart, a9 as boardControlPhase, aa as executableWorkItem, ab as kanbanReference, ac as sameAutomationBinding } from '../planning-CHrOqQ6b.js';
2
+ export { D as DEFAULT_KANBAN_SCAN_POLICY, K as KanbanDiscoveryResult, a as KanbanScanConnection, b as KanbanScanInput, c as KanbanScanPolicy, d as KanbanScanSession, e as KanbanScanText } from '../discovery-D60yrjej.js';
3
+ export { K as KanbanClient, a as KanbanDeletionPreview, b as KanbanDeletionRequest, c as KanbanExecutionSession, d as KanbanExecutionSessionDetail, e as KanbanItemOperation, f as KanbanItemOperationBinding, g as KanbanItemOperationRequest, h as KanbanItemOperations, i as KanbanItemResourceCatalog, j as KanbanOperationChoice, k as KanbanOperationField, l as KanbanRecordExecution, m as KanbanRecordResource, n as KanbanRecordRunRequest, o as KanbanRelatedSession, p as KanbanSessionActivityQuery, q as KanbanSessionAssociation, r as KanbanSessionDetailQuery, s as KanbanSessionExecution, t as KanbanSessionItemPage, u as KanbanSessionItemSummary, v as KanbanSessionPhase, w as KanbanSessionPurpose, x as KanbanWorkResource, y as KanbanWorkResourceCleanup, z as KanbanWorkResourceQuery } from '../activity-Czlan5xW.js';
4
+ export { K as KanbanContent, a as KanbanContentAmendment, b as KanbanContentItem, c as KanbanContentRecord } from '../content-hLH5BNud.js';
5
+ export { T as TASK_START_DELAY_MS, p as projectKanbanTask, t as taskDue, a as taskEditing, b as taskStartAt } from '../task-projection-CSorlMws.js';
@@ -4,18 +4,28 @@ import {
4
4
  executableWorkItem,
5
5
  kanbanReference,
6
6
  sameAutomationBinding
7
- } from "../chunk-5XKOCKY2.js";
7
+ } from "../chunk-X4UHZX6F.js";
8
8
  import {
9
+ TASK_START_DELAY_MS,
9
10
  boardAllowsStart,
10
- boardControlPhase
11
- } from "../chunk-QTMTBEBA.js";
11
+ boardControlPhase,
12
+ projectKanbanTask,
13
+ taskDue,
14
+ taskEditing,
15
+ taskStartAt
16
+ } from "../chunk-3JYLJPE5.js";
12
17
  export {
13
18
  DEFAULT_KANBAN_SCAN_POLICY,
14
19
  DEFAULT_KANBAN_WORK_TYPES,
20
+ TASK_START_DELAY_MS,
15
21
  boardAllowsStart,
16
22
  boardControlPhase,
17
23
  executableWorkItem,
18
24
  kanbanReference,
19
- sameAutomationBinding
25
+ projectKanbanTask,
26
+ sameAutomationBinding,
27
+ taskDue,
28
+ taskEditing,
29
+ taskStartAt
20
30
  };
21
31
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { J as KanbanProjectRecord, z as KanbanItemSummary, j as KanbanBoard, q as KanbanDiscoveryChange, N as KanbanRecordInput } from './planning-CcFZYdIL.cjs';
1
+ import { J as KanbanProjectRecord, z as KanbanItemSummary, j as KanbanBoard, q as KanbanDiscoveryChange, N as KanbanRecordInput } from './planning-CHrOqQ6b.cjs';
2
2
 
3
3
  interface KanbanScanSession {
4
4
  id: string;
@@ -1,4 +1,4 @@
1
- import { J as KanbanProjectRecord, z as KanbanItemSummary, j as KanbanBoard, q as KanbanDiscoveryChange, N as KanbanRecordInput } from './planning-CcFZYdIL.js';
1
+ import { J as KanbanProjectRecord, z as KanbanItemSummary, j as KanbanBoard, q as KanbanDiscoveryChange, N as KanbanRecordInput } from './planning-CHrOqQ6b.js';
2
2
 
3
3
  interface KanbanScanSession {
4
4
  id: string;