@nestos/kanban 0.0.0-stage → 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 (124) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +165 -2
  3. package/dist/activity-BbC4sgKL.d.cts +258 -0
  4. package/dist/activity-Czlan5xW.d.ts +258 -0
  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 +16 -0
  10. package/dist/activity.cjs.map +1 -0
  11. package/dist/activity.d.cts +12 -0
  12. package/dist/activity.d.ts +12 -0
  13. package/dist/activity.js +16 -0
  14. package/dist/activity.js.map +1 -0
  15. package/dist/chunk-3JYLJPE5.js +95 -0
  16. package/dist/chunk-3JYLJPE5.js.map +1 -0
  17. package/dist/chunk-3LEIHB7Y.js +221 -0
  18. package/dist/chunk-3LEIHB7Y.js.map +1 -0
  19. package/dist/chunk-4XF6LQSU.cjs +9 -0
  20. package/dist/chunk-4XF6LQSU.cjs.map +1 -0
  21. package/dist/chunk-5Q7WB63A.cjs +282 -0
  22. package/dist/chunk-5Q7WB63A.cjs.map +1 -0
  23. package/dist/chunk-7KDOTBRX.cjs +58 -0
  24. package/dist/chunk-7KDOTBRX.cjs.map +1 -0
  25. package/dist/chunk-AHHEGTUA.js +148 -0
  26. package/dist/chunk-AHHEGTUA.js.map +1 -0
  27. package/dist/chunk-AOHQCX7K.cjs +95 -0
  28. package/dist/chunk-AOHQCX7K.cjs.map +1 -0
  29. package/dist/chunk-DINLR6E6.cjs +443 -0
  30. package/dist/chunk-DINLR6E6.cjs.map +1 -0
  31. package/dist/chunk-EYTVC2H5.cjs +1612 -0
  32. package/dist/chunk-EYTVC2H5.cjs.map +1 -0
  33. package/dist/chunk-FEE2YBZ7.js +1972 -0
  34. package/dist/chunk-FEE2YBZ7.js.map +1 -0
  35. package/dist/chunk-FNO5K3A7.js +282 -0
  36. package/dist/chunk-FNO5K3A7.js.map +1 -0
  37. package/dist/chunk-IHHDXZPZ.js +382 -0
  38. package/dist/chunk-IHHDXZPZ.js.map +1 -0
  39. package/dist/chunk-J3EAIVA3.js +280 -0
  40. package/dist/chunk-J3EAIVA3.js.map +1 -0
  41. package/dist/chunk-KH3WF3K4.js +443 -0
  42. package/dist/chunk-KH3WF3K4.js.map +1 -0
  43. package/dist/chunk-M35X5PHO.js +196 -0
  44. package/dist/chunk-M35X5PHO.js.map +1 -0
  45. package/dist/chunk-QRGZD2JU.cjs +1972 -0
  46. package/dist/chunk-QRGZD2JU.cjs.map +1 -0
  47. package/dist/chunk-RBOER6EW.cjs +221 -0
  48. package/dist/chunk-RBOER6EW.cjs.map +1 -0
  49. package/dist/chunk-RQP77ZTY.js +9 -0
  50. package/dist/chunk-RQP77ZTY.js.map +1 -0
  51. package/dist/chunk-RSH6QSEC.cjs +196 -0
  52. package/dist/chunk-RSH6QSEC.cjs.map +1 -0
  53. package/dist/chunk-VMRDXOLX.cjs +148 -0
  54. package/dist/chunk-VMRDXOLX.cjs.map +1 -0
  55. package/dist/chunk-X4UHZX6F.js +58 -0
  56. package/dist/chunk-X4UHZX6F.js.map +1 -0
  57. package/dist/chunk-XBSGUVCY.cjs +382 -0
  58. package/dist/chunk-XBSGUVCY.cjs.map +1 -0
  59. package/dist/chunk-XKDZHAUE.js +1612 -0
  60. package/dist/chunk-XKDZHAUE.js.map +1 -0
  61. package/dist/chunk-ZUZGAO6G.cjs +280 -0
  62. package/dist/chunk-ZUZGAO6G.cjs.map +1 -0
  63. package/dist/content-C5aJZFlw.d.cts +35 -0
  64. package/dist/content-hLH5BNud.d.ts +35 -0
  65. package/dist/contracts/index.cjs +31 -0
  66. package/dist/contracts/index.cjs.map +1 -0
  67. package/dist/contracts/index.d.cts +5 -0
  68. package/dist/contracts/index.d.ts +5 -0
  69. package/dist/contracts/index.js +31 -0
  70. package/dist/contracts/index.js.map +1 -0
  71. package/dist/discovery-9E-LfwIw.d.cts +61 -0
  72. package/dist/discovery-D60yrjej.d.ts +61 -0
  73. package/dist/discovery.cjs +377 -0
  74. package/dist/discovery.cjs.map +1 -0
  75. package/dist/discovery.d.cts +22 -0
  76. package/dist/discovery.d.ts +22 -0
  77. package/dist/discovery.js +377 -0
  78. package/dist/discovery.js.map +1 -0
  79. package/dist/execution-bridge-fpCnH6z5.d.cts +52 -0
  80. package/dist/execution-bridge-rk0uVy_n.d.ts +52 -0
  81. package/dist/execution.cjs +18 -0
  82. package/dist/execution.cjs.map +1 -0
  83. package/dist/execution.d.cts +42 -0
  84. package/dist/execution.d.ts +42 -0
  85. package/dist/execution.js +18 -0
  86. package/dist/execution.js.map +1 -0
  87. package/dist/index.cjs +74 -0
  88. package/dist/index.cjs.map +1 -0
  89. package/dist/index.d.cts +54 -0
  90. package/dist/index.d.ts +54 -0
  91. package/dist/index.js +74 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/module-CYfE7YhM.d.ts +11 -0
  94. package/dist/module-Ca9L3qCn.d.cts +11 -0
  95. package/dist/planning-CHrOqQ6b.d.cts +879 -0
  96. package/dist/planning-CHrOqQ6b.d.ts +879 -0
  97. package/dist/ports-B0McVg7B.d.ts +143 -0
  98. package/dist/ports-BeGO1VRI.d.cts +49 -0
  99. package/dist/ports-GQy0x-RI.d.cts +143 -0
  100. package/dist/ports-ykGiNUSx.d.ts +49 -0
  101. package/dist/runtime/index.cjs +205 -0
  102. package/dist/runtime/index.cjs.map +1 -0
  103. package/dist/runtime/index.d.cts +75 -0
  104. package/dist/runtime/index.d.ts +75 -0
  105. package/dist/runtime/index.js +205 -0
  106. package/dist/runtime/index.js.map +1 -0
  107. package/dist/runtime/integration.cjs +423 -0
  108. package/dist/runtime/integration.cjs.map +1 -0
  109. package/dist/runtime/integration.d.cts +658 -0
  110. package/dist/runtime/integration.d.ts +658 -0
  111. package/dist/runtime/integration.js +423 -0
  112. package/dist/runtime/integration.js.map +1 -0
  113. package/dist/storage.cjs +21 -0
  114. package/dist/storage.cjs.map +1 -0
  115. package/dist/storage.d.cts +71 -0
  116. package/dist/storage.d.ts +71 -0
  117. package/dist/storage.js +21 -0
  118. package/dist/storage.js.map +1 -0
  119. package/dist/store-DPwHzGiz.d.cts +28 -0
  120. package/dist/store-DgdrPCV9.d.ts +28 -0
  121. package/dist/task-projection-CSorlMws.d.ts +11 -0
  122. package/dist/task-projection-DKKB_ueb.d.cts +11 -0
  123. package/examples/standalone.ts +22 -0
  124. package/package.json +143 -4
@@ -0,0 +1,423 @@
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; } var _class;
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+ var _chunkQRGZD2JUcjs = require('../chunk-QRGZD2JU.cjs');
34
+ require('../chunk-5Q7WB63A.cjs');
35
+ require('../chunk-DINLR6E6.cjs');
36
+ require('../chunk-ZUZGAO6G.cjs');
37
+ require('../chunk-VMRDXOLX.cjs');
38
+ require('../chunk-EYTVC2H5.cjs');
39
+ require('../chunk-XBSGUVCY.cjs');
40
+ require('../chunk-4XF6LQSU.cjs');
41
+
42
+
43
+ var _chunkRBOER6EWcjs = require('../chunk-RBOER6EW.cjs');
44
+ require('../chunk-7KDOTBRX.cjs');
45
+
46
+
47
+
48
+ var _chunkRSH6QSECcjs = require('../chunk-RSH6QSEC.cjs');
49
+ require('../chunk-AOHQCX7K.cjs');
50
+
51
+ // src/runtime/task-fix.ts
52
+ function createTaskFix(options) {
53
+ return new TaskFix(options);
54
+ }
55
+ var TaskFix = (_class = class {
56
+ constructor(options) {;_class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this);_class.prototype.__init4.call(this);_class.prototype.__init5.call(this);_class.prototype.__init6.call(this);_class.prototype.__init7.call(this);_class.prototype.__init8.call(this);
57
+ this.options = options;
58
+ this.executor = options.executor;
59
+ }
60
+ __init() {this.stopping = false}
61
+
62
+ __init2() {this.pending = /* @__PURE__ */ new Map()}
63
+ serial(id, run) {
64
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !this.stopping, "SERVICE_STOPPING");
65
+ const next = (_nullishCoalesce(this.pending.get(id), () => ( Promise.resolve()))).catch(() => {
66
+ }).then(run);
67
+ this.pending.set(id, next);
68
+ void next.finally(() => {
69
+ if (this.pending.get(id) === next) this.pending.delete(id);
70
+ }).catch(() => {
71
+ });
72
+ return next;
73
+ }
74
+ async prepare(fix) {
75
+ if (fix.request) return fix;
76
+ const work = await this.executor.prepare(fix.dispatch, fix.item);
77
+ return this.options.journal.update("fix:" + fix.id, (old) => ({ ...old, request: _nullishCoalesce(old.request, () => ( work)) }));
78
+ }
79
+ async advance(fix) {
80
+ const { options } = this;
81
+ fix = await options.journal.get("fix:" + fix.id);
82
+ if (fix.state === "cancelling") return this.stop(fix);
83
+ if (fix.state === "cancelled") return view(fix);
84
+ if (fix.phase === "prepared" && (await options.service.read(fix.boardId)).lifecycle) return view(fix);
85
+ fix = await this.prepare(fix);
86
+ if (fix.snapshot) {
87
+ await options.accept(fix);
88
+ return view(await options.journal.get("fix:" + fix.id));
89
+ }
90
+ const claimed = await options.journal.claim("fix:" + fix.id);
91
+ const observation = await (claimed ? this.executor.start(fix.request) : this.executor.inspect(fix.request));
92
+ const sessionId = _nullishCoalesce(observation.executionSessionId, () => ( fix.sessionId));
93
+ if (sessionId !== fix.id) await options.journal.update("fix-session:" + sessionId, (old) => _nullishCoalesce(old, () => ( fix.id)));
94
+ const saved = await options.journal.update("fix:" + fix.id, (old) => ({ ...old, sessionId, code: observation.code }));
95
+ await options.observe(saved);
96
+ return view(saved);
97
+ }
98
+ __init3() {this.fixTask = async (boardId, request) => {
99
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !this.stopping, "SERVICE_STOPPING");
100
+ const fix = await this.options.freeze(boardId, request);
101
+ return this.serial(fix.id, () => this.advance(fix));
102
+ }}
103
+ __init4() {this.taskFixes = async (boardId, itemId) => {
104
+ await this.options.service.item(boardId, itemId);
105
+ return (await this.options.journal.findForBoard("fix:", boardId, (fix) => fix.itemId === itemId)).map((row) => view(row.value));
106
+ }}
107
+ __init5() {this.cancelFix = async (boardId, request) => this.serial(request.fixId, async () => {
108
+ _chunkRBOER6EWcjs.requireValue.call(void 0, /^[\w-]{1,128}$/.test(request.operationId), "INVALID_OPERATION_ID");
109
+ const board = await this.options.service.read(boardId), actor = await this.options.service.currentPrincipal();
110
+ _chunkRBOER6EWcjs.requireValue.call(void 0, actor.kind === "human" && _optionalChain([board, 'access', _8 => _8.members, 'optionalAccess', _9 => _9.some, 'call', _10 => _10((m) => m.kind === actor.kind && m.id === actor.id && _optionalChain([m, 'access', _11 => _11.roles, 'optionalAccess', _12 => _12.includes, 'call', _13 => _13("coordinator")]))]), "COORDINATOR_REQUIRED");
111
+ const fix = await this.options.journal.update("fix:" + request.fixId, (old) => {
112
+ _chunkRBOER6EWcjs.requireValue.call(void 0, _optionalChain([old, 'optionalAccess', _14 => _14.boardId]) === boardId, "FIX_NOT_FOUND");
113
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !old.accepted, "FIX_ALREADY_ACCEPTED");
114
+ return { ...old, state: old.state === "cancelled" ? "cancelled" : "cancelling", cancelOperationId: _nullishCoalesce(old.cancelOperationId, () => ( request.operationId)) };
115
+ });
116
+ return fix.state === "cancelled" ? view(fix) : this.stop(fix);
117
+ })}
118
+ async stop(fix) {
119
+ const started = Date.now();
120
+ try {
121
+ let stopped = fix.phase === "prepared" || fix.phase === "settled";
122
+ if (!stopped) stopped = await this.options.control.control({ executionId: fix.id, operationId: fix.cancelOperationId, action: "cancel" }) === "cancelled";
123
+ if (stopped && fix.snapshot) stopped = await this.stopCreatedTask(fix);
124
+ const saved = await this.options.journal.update("fix:" + fix.id, (old) => ({ ...old, state: stopped ? "cancelled" : "cancelling", ...stopped ? { phase: "settled" } : {}, code: void 0 }));
125
+ this.options.log({ operationId: fix.cancelOperationId, boardId: fix.boardId, stage: "fix.cancel", result: "success", durationMs: Date.now() - started });
126
+ return view(saved);
127
+ } catch (error) {
128
+ const code = _chunkQRGZD2JUcjs.safeCode.call(void 0, error, "FIX_CANCEL_UNKNOWN");
129
+ await this.options.journal.update("fix:" + fix.id, (old) => ({ ...old, code }));
130
+ this.options.log({ operationId: fix.cancelOperationId, boardId: fix.boardId, stage: "fix.cancel", result: "failure", code, durationMs: Date.now() - started });
131
+ throw error;
132
+ }
133
+ }
134
+ async stopCreatedTask(fix) {
135
+ let item;
136
+ try {
137
+ item = (await this.options.service.item(fix.boardId, fix.snapshot.operationId)).item;
138
+ } catch (error) {
139
+ if (error.code === "ITEM_NOT_FOUND") return true;
140
+ throw error;
141
+ }
142
+ if (["completed", "cancelled"].includes(item.status)) return true;
143
+ const controlId = "fix-cancel-" + fix.id;
144
+ await _chunkQRGZD2JUcjs.journalCommand.call(void 0,
145
+ this.options.journal,
146
+ this.options.service,
147
+ fix.boardId,
148
+ controlId,
149
+ { type: "request-control", itemId: item.id, controlId, action: "cancel" }
150
+ );
151
+ return false;
152
+ }
153
+ __init6() {this.intercept = async (sessionId, input) => {
154
+ const id = await this.options.journal.get("fix-session:" + sessionId);
155
+ if (!id) return false;
156
+ return this.serial(id, async () => {
157
+ const current = await this.options.journal.get("fix:" + id);
158
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !["cancelling", "cancelled"].includes(current.state), "FIX_INPUT_CLOSED");
159
+ return this.options.confirm(current, input);
160
+ });
161
+ }}
162
+ __init7() {this.quiesce = async () => {
163
+ this.stopping = true;
164
+ await Promise.allSettled([...this.pending.values()]);
165
+ }}
166
+ __init8() {this.scan = async () => {
167
+ for (const id of await _asyncNullishCoalesce(await this.options.journal.get("fix-index"), async () => ( []))) {
168
+ if (this.stopping) return;
169
+ const fix = await this.options.journal.get("fix:" + id);
170
+ if (!fix || fix.accepted || fix.state === "cancelled") continue;
171
+ try {
172
+ await this.serial(id, () => this.advance(fix));
173
+ } catch (error) {
174
+ this.options.log({ operationId: id, boardId: fix.boardId, stage: "fix.recover", result: "failure", code: _chunkQRGZD2JUcjs.safeCode.call(void 0, error, "FIX_RECOVERY_FAILED"), durationMs: 0 });
175
+ }
176
+ }
177
+ }}
178
+ }, _class);
179
+ function view(fix) {
180
+ const { id, boardId, itemId, sessionId, state, createdItemId, code } = fix;
181
+ return { id, boardId, itemId, sessionId, state, createdItemId, code };
182
+ }
183
+
184
+ // src/runtime/task-replies.ts
185
+ function taskReplies(service, journal, port) {
186
+ const replyTask = async (boardId, request) => {
187
+ _chunkRBOER6EWcjs.requireValue.call(void 0, /^[\w-]{1,96}$/.test(request.operationId) && typeof request.content === "string" && !!request.content.trim() && request.content.length <= 8e3, "WORKSPACE_REPLY_INVALID");
188
+ await service.item(boardId, request.itemId);
189
+ const old = await journal.get("task-reply:" + request.operationId);
190
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !old || old.boardId === boardId && JSON.stringify(old.request) === JSON.stringify(request), "IDEMPOTENCY_CONFLICT");
191
+ if (await journal.get("task-reply-delivered:" + request.operationId)) return;
192
+ const frozen = await freezeReply(service, journal, port, boardId, request);
193
+ await journal.update("task-reply-index", (previous) => _optionalChain([previous, 'optionalAccess', _15 => _15.includes, 'call', _16 => _16(request.operationId)]) ? previous : [..._nullishCoalesce(previous, () => ( [])), request.operationId]);
194
+ const claimed = await journal.claim("task-reply:" + request.operationId);
195
+ const current = await journal.get("task-reply:" + request.operationId);
196
+ if (current.phase === "cancelled" || current.phase === "cancelling") return;
197
+ if (claimed || current.phase === "submitting" || current.phase === void 0) await port.deliver(frozen);
198
+ await journal.update("task-reply-delivered:" + request.operationId, () => true);
199
+ };
200
+ return Object.assign(replyTask, { async scan() {
201
+ for (const id of await _asyncNullishCoalesce(await journal.get("task-reply-index"), async () => ( []))) {
202
+ if (await journal.get("task-reply-delivered:" + id) || await journal.get("task-reply-cancelled:" + id)) continue;
203
+ const saved = await journal.get("task-reply:" + id);
204
+ if (saved && !["cancelling", "cancelled"].includes(_nullishCoalesce(saved.phase, () => ( ""))) && !(await service.read(saved.boardId)).lifecycle) await replyTask(saved.boardId, saved.request);
205
+ }
206
+ } });
207
+ }
208
+ async function freezeReply(service, journal, port, boardId, request) {
209
+ const { item } = await service.item(boardId, request.itemId);
210
+ _chunkRBOER6EWcjs.requireValue.call(void 0, item.deletedAt === void 0 && _optionalChain([item, 'access', _17 => _17.control, 'optionalAccess', _18 => _18.action]) !== "cancel", "TASK_CANCELLING");
211
+ const workflow = await service.workflow(boardId), dispatch = workflow.dispatches[request.attemptId];
212
+ _chunkRBOER6EWcjs.requireValue.call(void 0, _optionalChain([dispatch, 'optionalAccess', _19 => _19.itemId]) === item.id && _optionalChain([item, 'access', _20 => _20.owner, 'optionalAccess', _21 => _21.token]) === dispatch.fence && ["prepared", "running", "unknown"].includes(dispatch.outcome), "STALE_EXECUTION_RESULT");
213
+ _chunkRBOER6EWcjs.requireValue.call(void 0, _optionalChain([item, 'access', _22 => _22.issues, 'optionalAccess', _23 => _23.some, 'call', _24 => _24((issue) => issue.id === request.replyTo && issue.attemptId === request.attemptId && !issue.resolvedBy)]), "ISSUE_NOT_FOUND");
214
+ const previous = await journal.get("task-reply:" + request.operationId);
215
+ if (previous) return previous;
216
+ const prepared = await port.prepare({ boardId, request, item, dispatch });
217
+ return journal.update("task-reply:" + request.operationId, (old) => {
218
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !old || old.boardId === boardId && JSON.stringify(old.request) === JSON.stringify(request), "IDEMPOTENCY_CONFLICT");
219
+ return _nullishCoalesce(old, () => ( { ...prepared, phase: "prepared", boardId, request: structuredClone(request) }));
220
+ });
221
+ }
222
+
223
+ // src/runtime/operation-runner.ts
224
+ async function coordinateOperation(options) {
225
+ const { journal, key, port } = options;
226
+ let record = await _asyncNullishCoalesce(await journal.get(key), async () => ( options.record));
227
+ _chunkRBOER6EWcjs.requireValue.call(void 0, record.fingerprint === options.record.fingerprint, "OPERATION_IDENTITY_CONFLICT");
228
+ if (record.phase === "settled" || record.phase === "prepared" && (await options.service.read(record.boardId)).lifecycle) return record;
229
+ const started = Date.now();
230
+ try {
231
+ if (record.phase === "prepared") {
232
+ if (!await journal.claim(key)) return await journal.get(key);
233
+ record = { ...record, phase: "submitting" };
234
+ await port.start(record);
235
+ }
236
+ const observed = await port.inspect(record);
237
+ const waiting = observed.state === "succeeded" && observed.output === void 0;
238
+ if (observed.state === "succeeded" && !waiting) await _optionalChain([port, 'access', _25 => _25.validate, 'optionalCall', _26 => _26(record, observed.output)]);
239
+ const terminal = !waiting && ["succeeded", "failed"].includes(observed.state);
240
+ return await save(options, {
241
+ ...record,
242
+ phase: terminal ? "settled" : record.phase,
243
+ state: waiting ? "unknown" : observed.state,
244
+ sessionId: observed.executionId,
245
+ code: waiting ? "OPERATION_RESULT_PENDING" : observed.code,
246
+ ...terminal ? { result: observed.output } : {}
247
+ });
248
+ } catch (error) {
249
+ const failure = _nullishCoalesce(_optionalChain([port, 'access', _27 => _27.classify, 'optionalCall', _28 => _28(error)]), () => ( { code: _chunkQRGZD2JUcjs.safeCode.call(void 0, error, "OPERATION_OBSERVATION_FAILED"), disposition: "unknown" }));
250
+ journal.diagnostic({ operationId: record.id, boardId: record.boardId, itemId: record.itemId, stage: "operation." + record.action, result: "failure", code: failure.code, durationMs: Date.now() - started });
251
+ return save(options, {
252
+ ...record,
253
+ phase: failure.disposition === "retry-unstarted" ? "prepared" : failure.disposition === "terminal" ? "settled" : record.phase,
254
+ state: failure.disposition === "terminal" ? "failed" : "unknown",
255
+ code: failure.code,
256
+ ...failure.result !== void 0 ? { result: failure.result } : {}
257
+ });
258
+ }
259
+ }
260
+ async function save({ journal, key, port, record }, next) {
261
+ const saved = await journal.update(key, (current) => {
262
+ _chunkRBOER6EWcjs.requireValue.call(void 0, _optionalChain([current, 'optionalAccess', _29 => _29.fingerprint]) === record.fingerprint, "OPERATION_IDENTITY_CONFLICT");
263
+ return current.phase === "settled" ? current : JSON.stringify(current) === JSON.stringify(next) ? current : next;
264
+ });
265
+ await _optionalChain([port, 'access', _30 => _30.report, 'optionalCall', _31 => _31(saved)]);
266
+ return saved;
267
+ }
268
+
269
+ // src/runtime/collaboration.ts
270
+ var KanbanCollaboration = class {
271
+ constructor(service, journal) {
272
+ this.service = service;
273
+ this.journal = journal;
274
+ }
275
+ async prepareFix(boardId, request, prepare) {
276
+ _chunkRBOER6EWcjs.requireValue.call(void 0, /^[\w-]{1,128}$/.test(request.operationId), "INVALID_OPERATION_ID");
277
+ const board = await this.service.read(boardId), item = (await this.service.item(boardId, request.itemId)).item;
278
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !board.lifecycle, "BOARD_STOPPING");
279
+ _chunkRBOER6EWcjs.requireValue.call(void 0, item.deletedAt === void 0, "ITEM_DELETED");
280
+ _chunkRBOER6EWcjs.requireValue.call(void 0, _optionalChain([item, 'access', _32 => _32.launch, 'optionalAccess', _33 => _33.admittedAt]) !== void 0 || ["claimed", "review", "completed"].includes(item.status), "FIX_REQUIRES_STARTED_TASK");
281
+ const id = await this.journal.update("fix-operation:" + boardId + ":" + request.operationId, (old) => _nullishCoalesce(old, () => ( _chunkRSH6QSECcjs.randomUUID.call(void 0, ))));
282
+ let fix = await this.journal.get("fix:" + id);
283
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !fix || fix.boardId === boardId && fix.itemId === item.id, "IDEMPOTENCY_CONFLICT");
284
+ if (!fix) {
285
+ _chunkRBOER6EWcjs.requireValue.call(void 0, board.automation, "FIX_PREPARATION_UNAVAILABLE");
286
+ const prepared = await prepare({ id, board, item });
287
+ const dispatch = {
288
+ id,
289
+ itemId: item.id,
290
+ itemRevision: item.revision,
291
+ planId: id,
292
+ planRevision: 1,
293
+ principal: board.automation.worker,
294
+ definitionDigest: _chunkRSH6QSECcjs.sha256HexSync.call(void 0, JSON.stringify(prepared.context)),
295
+ attempt: 1,
296
+ fence: id,
297
+ preparedAt: Date.now(),
298
+ outcome: "prepared",
299
+ inputs: {}
300
+ };
301
+ fix = await this.journal.update("fix:" + id, (old) => _nullishCoalesce(old, () => ( {
302
+ id,
303
+ boardId,
304
+ itemId: item.id,
305
+ sessionId: id,
306
+ state: "clarifying",
307
+ phase: "prepared",
308
+ dispatch,
309
+ item: structuredClone(item),
310
+ resourceId: prepared.resourceId,
311
+ context: prepared.context,
312
+ request: null
313
+ })));
314
+ }
315
+ await this.journal.update("fix-index", (old) => _optionalChain([old, 'optionalAccess', _34 => _34.includes, 'call', _35 => _35(id)]) ? old : [..._nullishCoalesce(old, () => ( [])), id]);
316
+ return fix;
317
+ }
318
+ async fix(id) {
319
+ const fix = await this.journal.get("fix:" + id);
320
+ _chunkRBOER6EWcjs.requireValue.call(void 0, fix, "FIX_NOT_FOUND");
321
+ await this.service.item(fix.boardId, fix.itemId);
322
+ return fix;
323
+ }
324
+ async confirmFix(id, snapshot) {
325
+ const fix = await this.fix(id);
326
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !["cancelling", "cancelled"].includes(fix.state), "FIX_INPUT_CLOSED");
327
+ return this.journal.update("fix:" + id, (old) => {
328
+ _chunkRBOER6EWcjs.requireValue.call(void 0, old && !["cancelling", "cancelled"].includes(old.state), "FIX_INPUT_CLOSED");
329
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !old.snapshot || old.snapshot.messageId === snapshot.messageId && old.snapshot.digest === snapshot.digest, "FIX_INPUT_CLOSED");
330
+ return old.snapshot ? old : { ...old, snapshot: structuredClone(snapshot), state: "frozen" };
331
+ });
332
+ }
333
+ async acceptFix(id, policy, deliver) {
334
+ const fix = await this.fix(id), snapshot = fix.snapshot;
335
+ _chunkRBOER6EWcjs.requireValue.call(void 0, snapshot, "FIX_PROPOSAL_REQUIRED");
336
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !["cancelling", "cancelled"].includes(fix.state), "FIX_INPUT_CLOSED");
337
+ const board = await this.service.read(fix.boardId);
338
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !_optionalChain([board, 'access', _36 => _36.workTypes, 'optionalAccess', _37 => _37.length]) || board.workTypes.some((type) => type.id === policy.kind && type.executable), "FIX_WORK_TYPE_REQUIRED");
339
+ await this.publishFix(fix);
340
+ await _chunkQRGZD2JUcjs.journalCommand.call(void 0, this.journal, this.service, fix.boardId, "fix-create:" + fix.id, {
341
+ type: "create-item",
342
+ item: {
343
+ id: snapshot.operationId,
344
+ title: snapshot.definition.title,
345
+ responsibility: snapshot.definition.responsibility,
346
+ acceptance: snapshot.definition.acceptance,
347
+ externalRefs: _optionalChain([fix, 'access', _38 => _38.item, 'access', _39 => _39.externalRefs, 'optionalAccess', _40 => _40.filter, 'call', _41 => _41((ref) => policy.inheritSystems.includes(ref.system))])
348
+ },
349
+ planning: { kind: policy.kind, priority: _nullishCoalesce(_optionalChain([fix, 'access', _42 => _42.item, 'access', _43 => _43.planning, 'optionalAccess', _44 => _44.priority]), () => ( 2)), dependencies: snapshot.definition.dependencies, references: [] }
350
+ });
351
+ await deliver(fix);
352
+ await this.journal.update("fix:" + id, (old) => ({ ...old, accepted: true, state: "accepted", createdItemId: snapshot.operationId }));
353
+ }
354
+ async publishFix(fix) {
355
+ const snapshot = fix.snapshot, envelope = {
356
+ schema: "kanban.fix/1",
357
+ version: 1,
358
+ operationId: snapshot.operationId,
359
+ sourceSessionId: fix.sessionId,
360
+ confirmation: { messageId: snapshot.messageId, content: snapshot.content, digest: snapshot.digest },
361
+ board: { id: fix.boardId },
362
+ resource: { id: fix.resourceId },
363
+ ...snapshot.definition
364
+ };
365
+ await this.journal.update("fix-definition:" + fix.id, (old) => {
366
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !old || JSON.stringify(old) === JSON.stringify(envelope), "FIX_DEFINITION_CHANGED");
367
+ return _nullishCoalesce(old, () => ( envelope));
368
+ });
369
+ }
370
+ async decisionSnapshot(identity) {
371
+ await this.service.read(identity.sourceBoardId);
372
+ const runs = await this.journal.get("record-runs:" + identity.sourceBoardId);
373
+ const record = await _asyncNullishCoalesce(await _asyncOptionalChain([runs, 'optionalAccess', async _45 => _45.find, 'call', async _46 => _46((run) => run.id === identity.runId), 'optionalAccess', async _47 => _47.record]), async () => ( await this.service.record(identity.sourceBoardId, identity.recordId)));
374
+ _chunkRBOER6EWcjs.requireValue.call(void 0, record.id === identity.recordId && record.revision === identity.recordRevision, "FIX_DECISION_REVISION_UNAVAILABLE");
375
+ return record;
376
+ }
377
+ };
378
+ async function collaborationRelations(journal, boardId, itemId) {
379
+ const analyses = await _chunkQRGZD2JUcjs.analysisHistory.call(void 0, journal, boardId, itemId);
380
+ const replies = await journal.findForBoard("task-reply:", boardId, (row) => row.request.itemId === itemId && row.phase !== "cancelled");
381
+ const activeReplies = [];
382
+ for (const { value } of replies) if (!await journal.get("task-reply-cancelled:" + value.request.operationId)) activeReplies.push({ operationId: value.request.operationId, executionId: value.sessionId });
383
+ return { planning: analyses.map((job) => ({ id: job.id, request: job.input })), replies: activeReplies };
384
+ }
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+
396
+
397
+
398
+
399
+
400
+
401
+
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+ exports.KanbanAutomationJournal = _chunkQRGZD2JUcjs.KanbanAutomationJournal; exports.KanbanCollaboration = KanbanCollaboration; exports.KanbanWorkLog = _chunkQRGZD2JUcjs.KanbanWorkLog; exports.adoptDecomposition = _chunkQRGZD2JUcjs.adoptDecomposition; exports.advanceRecordControl = _chunkQRGZD2JUcjs.advanceRecordControl; exports.analysisHistory = _chunkQRGZD2JUcjs.analysisHistory; exports.analysisSignature = _chunkQRGZD2JUcjs.analysisSignature; exports.analysisStatus = _chunkQRGZD2JUcjs.analysisStatus; exports.analyzeItem = _chunkQRGZD2JUcjs.analyzeItem; exports.assembleKanbanRuntime = _chunkQRGZD2JUcjs.assembleKanbanRuntime; exports.boardDeletionBlockers = _chunkQRGZD2JUcjs.boardDeletionBlockers; exports.cancelTaskMaintenance = _chunkQRGZD2JUcjs.cancelTaskMaintenance; exports.cancelTaskReplies = _chunkQRGZD2JUcjs.cancelTaskReplies; exports.collaborationRelations = collaborationRelations; exports.completeCompositePlans = _chunkQRGZD2JUcjs.completeCompositePlans; exports.coordinateOperation = coordinateOperation; exports.createBoardDeletion = _chunkQRGZD2JUcjs.createBoardDeletion; exports.createKanbanAutomation = _chunkQRGZD2JUcjs.createKanbanAutomation; exports.createRecordExecution = _chunkQRGZD2JUcjs.createRecordExecution; exports.createTaskFix = createTaskFix; exports.defaultReferences = _chunkQRGZD2JUcjs.defaultReferences; exports.deletionPreview = _chunkQRGZD2JUcjs.deletionPreview; exports.dependencyResults = _chunkQRGZD2JUcjs.dependencyResults; exports.drainBoardAnalyses = _chunkQRGZD2JUcjs.drainBoardAnalyses; exports.journalCommand = _chunkQRGZD2JUcjs.journalCommand; exports.parseAnalysis = _chunkQRGZD2JUcjs.parseAnalysis; exports.recordControlKey = _chunkQRGZD2JUcjs.recordControlKey; exports.requestRecordControl = _chunkQRGZD2JUcjs.requestRecordControl; exports.safeCode = _chunkQRGZD2JUcjs.safeCode; exports.scanBoardStopWork = _chunkQRGZD2JUcjs.scanBoardStopWork; exports.scanTaskControls = _chunkQRGZD2JUcjs.scanTaskControls; exports.taskReplies = taskReplies; exports.validateResourceReferences = _chunkQRGZD2JUcjs.validateResourceReferences; exports.validateSubtasks = _chunkQRGZD2JUcjs.validateSubtasks; exports.withBoardDeletion = _chunkQRGZD2JUcjs.withBoardDeletion; exports.workContext = _chunkQRGZD2JUcjs.workContext;
423
+ //# sourceMappingURL=integration.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/li/share/prj/x1/libraries/kanban/dist/runtime/integration.cjs","../../src/runtime/task-fix.ts","../../src/runtime/task-replies.ts","../../src/runtime/operation-runner.ts","../../src/runtime/collaboration.ts"],"names":[],"mappings":"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","file":"/home/li/share/prj/x1/libraries/kanban/dist/runtime/integration.cjs","sourcesContent":[null,"import {journalCommand} from './journal-command';\nimport type {KanbanFixSession} from '../contracts';\nimport type {KanbanExecutionPort} from '../execution';\nimport type {KanbanFixOptions,SavedFix} from './task-fix-ports';\nimport {requireValue} from '../rules';\nimport {safeCode} from './diagnostics';\nexport interface KanbanTaskFix<Instruction> {\n fixTask(board:string,request:{itemId:string;operationId:string}):Promise<KanbanFixSession>;\n taskFixes(board:string,item:string):Promise<KanbanFixSession[]>;\n cancelFix(board:string,request:{fixId:string;operationId:string}):Promise<KanbanFixSession>;\n intercept(session:string,input:Instruction):Promise<boolean>;\n scan():Promise<void>;\n quiesce():Promise<void>;\n}\nexport function createTaskFix<Instruction>(options:KanbanFixOptions<Instruction>):KanbanTaskFix<Instruction> {return new TaskFix(options);}\n/** Confirmation and admission use durable identities; Session observation cannot create another task. */\nclass TaskFix<Instruction> {\n private stopping=false;\n private readonly executor:KanbanExecutionPort;\n private readonly pending = new Map<string, Promise<unknown>>();\n private serial<T>(id: string, run: () => Promise<T>): Promise<T> {\n requireValue(!this.stopping,'SERVICE_STOPPING');\n const next = (this.pending.get(id) ?? Promise.resolve()).catch(() => {}).then(run);\n this.pending.set(id, next);\n void next.finally(() => {if (this.pending.get(id) === next) this.pending.delete(id);}).catch(() => {});\n return next;\n }\n constructor(private readonly options:KanbanFixOptions<Instruction>) {this.executor=options.executor;}\n private async prepare(fix:SavedFix):Promise<SavedFix> {\n if(fix.request)return fix;\n const work=await this.executor.prepare(fix.dispatch,fix.item);\n return this.options.journal.update<SavedFix>('fix:'+fix.id,old=>({...old!,request:old!.request??work}));\n }\n private async advance(fix:SavedFix):Promise<KanbanFixSession> {\n const {options}=this;\n fix = (await options.journal.get<SavedFix>('fix:' + fix.id))!;\n if (fix.state === 'cancelling') return this.stop(fix);\n if (fix.state === 'cancelled') return view(fix);\n if (fix.phase === 'prepared' && (await options.service.read(fix.boardId)).lifecycle) return view(fix);\n fix=await this.prepare(fix);\n if(fix.snapshot) {await options.accept(fix);return view((await options.journal.get<SavedFix>('fix:'+fix.id))!);}\n const claimed=await options.journal.claim('fix:'+fix.id);\n const observation=await (claimed?this.executor.start(fix.request):this.executor.inspect(fix.request));\n const sessionId=observation.executionSessionId??fix.sessionId;\n if(sessionId!==fix.id)await options.journal.update('fix-session:'+sessionId,old=>old??fix.id);\n const saved=await options.journal.update<SavedFix>('fix:'+fix.id,old=>({...old!,sessionId,code:observation.code}));\n await options.observe(saved);return view(saved);\n }\n fixTask=async(boardId:string,request:{itemId:string;operationId:string}):Promise<KanbanFixSession>=>{\n requireValue(!this.stopping,'SERVICE_STOPPING');\n const fix = await this.options.freeze(boardId,request); return this.serial(fix.id, () => this.advance(fix));\n };\n taskFixes = async (boardId: string, itemId: string): Promise<KanbanFixSession[]> => {\n await this.options.service.item(boardId, itemId);\n return (await this.options.journal.findForBoard<SavedFix>('fix:', boardId, fix => fix.itemId === itemId)).map(row => view(row.value));\n };\n cancelFix = async (boardId: string, request: {fixId: string; operationId: string}): Promise<KanbanFixSession> => this.serial(request.fixId, async () => {\n requireValue(/^[\\w-]{1,128}$/.test(request.operationId), 'INVALID_OPERATION_ID');\n const board = await this.options.service.read(boardId), actor = await this.options.service.currentPrincipal();\n requireValue(actor.kind === 'human' && board.members?.some(m => m.kind === actor.kind && m.id === actor.id && m.roles?.includes('coordinator')), 'COORDINATOR_REQUIRED');\n const fix = await this.options.journal.update<SavedFix>('fix:' + request.fixId, old => {\n requireValue(old?.boardId === boardId, 'FIX_NOT_FOUND');\n requireValue(!old.accepted, 'FIX_ALREADY_ACCEPTED');\n return {...old, state: old.state === 'cancelled' ? 'cancelled' : 'cancelling', cancelOperationId: old.cancelOperationId ?? request.operationId};\n });\n return fix.state === 'cancelled' ? view(fix) : this.stop(fix);\n });\n private async stop(fix: SavedFix): Promise<KanbanFixSession> {\n const started = Date.now();\n try {\n let stopped = fix.phase === 'prepared' || fix.phase === 'settled';\n if (!stopped) stopped = await this.options.control.control({executionId:fix.id,operationId:fix.cancelOperationId!,action:'cancel'}) === 'cancelled';\n if (stopped && fix.snapshot) stopped = await this.stopCreatedTask(fix);\n const saved = await this.options.journal.update<SavedFix>('fix:' + fix.id, old => ({...old!, state: stopped ? 'cancelled' : 'cancelling', ...(stopped ? {phase: 'settled' as const} : {}), code: undefined}));\n this.options.log({operationId: fix.cancelOperationId!, boardId: fix.boardId, stage: 'fix.cancel', result: 'success', durationMs: Date.now() - started});\n return view(saved);\n } catch (error) {\n const code = safeCode(error, 'FIX_CANCEL_UNKNOWN');\n await this.options.journal.update<SavedFix>('fix:' + fix.id, old => ({...old!, code}));\n this.options.log({operationId: fix.cancelOperationId!, boardId: fix.boardId, stage: 'fix.cancel', result: 'failure', code, durationMs: Date.now() - started});\n throw error;\n }\n }\n private async stopCreatedTask(fix: SavedFix): Promise<boolean> {\n let item;\n try {item = (await this.options.service.item(fix.boardId, fix.snapshot!.operationId)).item;}\n catch (error) {if ((error as {code?: string}).code === 'ITEM_NOT_FOUND') return true; throw error;}\n if (['completed','cancelled'].includes(item.status)) return true;\n const controlId = 'fix-cancel-' + fix.id;\n await journalCommand(this.options.journal, this.options.service, fix.boardId, controlId,\n {type:'request-control', itemId:item.id, controlId, action:'cancel'});\n return false;\n }\n intercept=async(sessionId:string,input:Instruction):Promise<boolean>=>{\n const id=await this.options.journal.get<string>('fix-session:'+sessionId);if(!id)return false;\n return this.serial(id, async () => {\n const current = (await this.options.journal.get<SavedFix>('fix:' + id))!;\n requireValue(!['cancelling','cancelled'].includes(current.state), 'FIX_INPUT_CLOSED');\n return this.options.confirm(current,input);\n });\n };\n quiesce=async()=>{this.stopping=true;await Promise.allSettled([...this.pending.values()]);};\n scan=async()=>{\n for(const id of await this.options.journal.get<string[]>('fix-index')??[]) {\n if(this.stopping)return;\n const fix=await this.options.journal.get<SavedFix>('fix:'+id);if(!fix||fix.accepted||fix.state==='cancelled')continue;\n try {await this.serial(id, () => this.advance(fix));} catch(error) {this.options.log({operationId:id,boardId:fix.boardId,stage:'fix.recover',result:'failure',code:safeCode(error,'FIX_RECOVERY_FAILED'),durationMs:0});}\n }\n };\n}\nfunction view(fix:SavedFix):KanbanFixSession {const {id,boardId,itemId,sessionId,state,createdItemId,code}=fix;return {id,boardId,itemId,sessionId,state,createdItemId,code};}\n","import type {KanbanClient,KanbanItem,KanbanDispatch} from '../contracts';\nimport type {KanbanAutomationJournal} from './automation-journal';\nimport {requireValue} from '../rules';\nexport interface KanbanTaskReply {itemId:string;attemptId:string;replyTo:string;operationId:string;content:string}\nexport type FrozenReply<T=unknown> = T & {phase?:'prepared'|'submitting'|'cancelling'|'cancelled';boardId:string;request:KanbanTaskReply;sessionId:string};\nexport interface KanbanReplyPort<T> {\n prepare(input:{boardId:string;request:KanbanTaskReply;item:KanbanItem;dispatch:KanbanDispatch}):Promise<T & {sessionId:string}>;\n deliver(reply:FrozenReply<T>):Promise<void>;\n}\n/** The durable Session queue carries correlated user input without a workspace mailbox. */\nexport function taskReplies<T>(service:KanbanClient,journal:KanbanAutomationJournal,port:KanbanReplyPort<T>) {\n const replyTask=async(boardId:string,request:KanbanTaskReply):Promise<void>=>{\n requireValue(/^[\\w-]{1,96}$/.test(request.operationId)&&typeof request.content==='string'&&!!request.content.trim()&&request.content.length<=8000,'WORKSPACE_REPLY_INVALID');\n await service.item(boardId,request.itemId);\n const old=await journal.get<FrozenReply<T>>('task-reply:'+request.operationId);\n requireValue(!old||old.boardId===boardId&&JSON.stringify(old.request)===JSON.stringify(request),'IDEMPOTENCY_CONFLICT');\n if(await journal.get('task-reply-delivered:'+request.operationId))return;\n const frozen=await freezeReply(service,journal,port,boardId,request);\n await journal.update<string[]>('task-reply-index',previous=>previous?.includes(request.operationId)?previous:[...previous??[],request.operationId]);\n const claimed = await journal.claim('task-reply:' + request.operationId);\n const current = (await journal.get<FrozenReply<T>>('task-reply:' + request.operationId))!;\n if (current.phase === 'cancelled' || current.phase === 'cancelling') return;\n if (claimed || current.phase === 'submitting' || current.phase === undefined) await port.deliver(frozen);\n await journal.update('task-reply-delivered:'+request.operationId,()=>true);\n };\n return Object.assign(replyTask,{async scan(){\n for(const id of await journal.get<string[]>('task-reply-index')??[]) {\n if(await journal.get('task-reply-delivered:'+id)||await journal.get('task-reply-cancelled:'+id))continue;\n const saved=await journal.get<FrozenReply<T>>('task-reply:'+id);if(saved&&!['cancelling','cancelled'].includes(saved.phase??'') && !(await service.read(saved.boardId)).lifecycle)await replyTask(saved.boardId,saved.request);\n }\n }});\n}\nasync function freezeReply<T>(service:KanbanClient,journal:KanbanAutomationJournal,port:KanbanReplyPort<T>,boardId:string,request:KanbanTaskReply):Promise<FrozenReply<T>> {\n const {item}=await service.item(boardId,request.itemId);\n requireValue(item.deletedAt===undefined&&item.control?.action!=='cancel','TASK_CANCELLING');\n const workflow=await service.workflow(boardId),dispatch=workflow.dispatches[request.attemptId];\n requireValue(dispatch?.itemId===item.id&&item.owner?.token===dispatch.fence&&['prepared','running','unknown'].includes(dispatch.outcome),'STALE_EXECUTION_RESULT');\n requireValue(item.issues?.some(issue=>issue.id===request.replyTo&&issue.attemptId===request.attemptId&&!issue.resolvedBy),'ISSUE_NOT_FOUND');\n const previous=await journal.get<FrozenReply<T>>('task-reply:'+request.operationId);\n if(previous)return previous;\n const prepared=await port.prepare({boardId,request,item,dispatch});\n return journal.update<FrozenReply<T>>('task-reply:'+request.operationId,old=>{\n requireValue(!old||old.boardId===boardId&&JSON.stringify(old.request)===JSON.stringify(request),'IDEMPOTENCY_CONFLICT');\n return old??{...prepared,phase:'prepared',boardId,request:structuredClone(request)};\n });\n}\n","import type {KanbanClient} from '../contracts';\nimport type {KanbanAutomationJournal} from './automation-journal';\nimport type {KanbanOperationRecord,KanbanOperationPort} from './operation-contracts';\nimport {requireValue} from '../rules';\nimport {safeCode} from './diagnostics';\ninterface Options<T extends KanbanOperationRecord> {\n service:Pick<KanbanClient,'read'>;journal:KanbanAutomationJournal;key:string;record:T;port:KanbanOperationPort<T>;\n}\n/** A frozen record crosses the submission boundary once; response loss only triggers inspection. */\nexport async function coordinateOperation<T extends KanbanOperationRecord>(options:Options<T>):Promise<T> {\n const {journal,key,port}=options;let record=await journal.get<T>(key)??options.record;\n requireValue(record.fingerprint===options.record.fingerprint,'OPERATION_IDENTITY_CONFLICT');\n if(record.phase==='settled'||record.phase==='prepared'&&(await options.service.read(record.boardId)).lifecycle)return record;\n const started=Date.now();\n try {\n if(record.phase==='prepared') {\n if(!await journal.claim(key))return (await journal.get<T>(key))!;\n record={...record,phase:'submitting'};await port.start(record);\n }\n const observed=await port.inspect(record);\n const waiting=observed.state==='succeeded'&&observed.output===undefined;\n if(observed.state==='succeeded'&&!waiting)await port.validate?.(record,observed.output);\n const terminal=!waiting&&['succeeded','failed'].includes(observed.state);\n return await save(options,{...record,phase:terminal?'settled':record.phase,\n state:waiting?'unknown':observed.state,sessionId:observed.executionId,\n code:waiting?'OPERATION_RESULT_PENDING':observed.code,...(terminal?{result:observed.output}:{})});\n }catch(error) {\n const failure=port.classify?.(error)??{code:safeCode(error,'OPERATION_OBSERVATION_FAILED'),disposition:'unknown'};\n journal.diagnostic({operationId:record.id,boardId:record.boardId,itemId:record.itemId,stage:'operation.'+record.action,result:'failure',code:failure.code,durationMs:Date.now()-started});\n return save(options,{...record,phase:failure.disposition==='retry-unstarted'?'prepared':failure.disposition==='terminal'?'settled':record.phase,\n state:failure.disposition==='terminal'?'failed':'unknown',code:failure.code,...(failure.result!==undefined?{result:failure.result}:{})});\n }\n}\nasync function save<T extends KanbanOperationRecord>({journal,key,port,record}:Options<T>,next:T):Promise<T> {\n const saved=await journal.update<T>(key,current=>{\n requireValue(current?.fingerprint===record.fingerprint,'OPERATION_IDENTITY_CONFLICT');\n return current.phase==='settled'?current:JSON.stringify(current)===JSON.stringify(next)?current:next;\n });\n await port.report?.(saved);return saved;\n}\n","import type {KanbanClient,KanbanBoard,KanbanItem,KanbanDispatch,KanbanProjectRecord} from '../contracts';\nimport type {KanbanAutomationJournal} from './automation-journal';\nimport type {SavedFix,Snapshot} from './task-fix-ports';\nimport {journalCommand} from './journal-command';\nimport {analysisHistory,type AnalysisJournalEntry} from './analysis-history';\nimport {randomUUID,sha256HexSync} from '../utils';\nimport {requireValue} from '../rules';\nexport interface KanbanFixPreparation {resourceId:string;context:unknown}\nexport class KanbanCollaboration {\n constructor(private readonly service:KanbanClient,private readonly journal:KanbanAutomationJournal) {}\n async prepareFix(boardId:string,request:{itemId:string;operationId:string},prepare:(input:{id:string;board:KanbanBoard;item:KanbanItem})=>Promise<KanbanFixPreparation>):Promise<SavedFix> {\n requireValue(/^[\\w-]{1,128}$/.test(request.operationId),'INVALID_OPERATION_ID');\n const board=await this.service.read(boardId),item=(await this.service.item(boardId,request.itemId)).item;\n requireValue(!board.lifecycle,'BOARD_STOPPING');requireValue(item.deletedAt===undefined,'ITEM_DELETED');\n requireValue(item.launch?.admittedAt!==undefined||['claimed','review','completed'].includes(item.status),'FIX_REQUIRES_STARTED_TASK');\n const id=await this.journal.update<string>('fix-operation:'+boardId+':'+request.operationId,old=>old??randomUUID());\n let fix=await this.journal.get<SavedFix>('fix:'+id);\n requireValue(!fix||fix.boardId===boardId&&fix.itemId===item.id,'IDEMPOTENCY_CONFLICT');\n if(!fix) {\n requireValue(board.automation,'FIX_PREPARATION_UNAVAILABLE');\n const prepared=await prepare({id,board,item});\n const dispatch:KanbanDispatch={id,itemId:item.id,itemRevision:item.revision,planId:id,planRevision:1,principal:board.automation.worker,\n definitionDigest:sha256HexSync(JSON.stringify(prepared.context)),attempt:1,fence:id,preparedAt:Date.now(),outcome:'prepared',inputs:{}};\n fix=await this.journal.update<SavedFix>('fix:'+id,old=>old??{id,boardId,itemId:item.id,sessionId:id,state:'clarifying',phase:'prepared',dispatch,item:structuredClone(item),\n resourceId:prepared.resourceId,context:prepared.context,request:null});\n }\n await this.journal.update<string[]>('fix-index',old=>old?.includes(id)?old:[...old??[],id]);return fix;\n }\n async fix(id:string):Promise<SavedFix> {\n const fix=await this.journal.get<SavedFix>('fix:'+id);requireValue(fix,'FIX_NOT_FOUND');\n await this.service.item(fix.boardId,fix.itemId);return fix;\n }\n async confirmFix(id:string,snapshot:Snapshot):Promise<SavedFix> {\n const fix=await this.fix(id);requireValue(!['cancelling','cancelled'].includes(fix.state),'FIX_INPUT_CLOSED');\n return this.journal.update<SavedFix>('fix:'+id,old=>{\n requireValue(old&&!['cancelling','cancelled'].includes(old.state),'FIX_INPUT_CLOSED');\n requireValue(!old.snapshot||old.snapshot.messageId===snapshot.messageId&&old.snapshot.digest===snapshot.digest,'FIX_INPUT_CLOSED');\n return old.snapshot?old:{...old,snapshot:structuredClone(snapshot),state:'frozen'};\n });\n }\n async acceptFix(id:string,policy:{kind:string;inheritSystems:string[]},deliver:(fix:SavedFix)=>Promise<void>):Promise<void> {\n const fix=await this.fix(id),snapshot=fix.snapshot;requireValue(snapshot,'FIX_PROPOSAL_REQUIRED');\n requireValue(!['cancelling','cancelled'].includes(fix.state),'FIX_INPUT_CLOSED');\n const board=await this.service.read(fix.boardId);\n requireValue(!board.workTypes?.length||board.workTypes.some(type=>type.id===policy.kind&&type.executable),'FIX_WORK_TYPE_REQUIRED');\n await this.publishFix(fix);\n await journalCommand(this.journal,this.service,fix.boardId,'fix-create:'+fix.id,{type:'create-item',item:{id:snapshot.operationId,\n title:snapshot.definition.title,responsibility:snapshot.definition.responsibility,acceptance:snapshot.definition.acceptance,\n externalRefs:fix.item.externalRefs?.filter(ref=>policy.inheritSystems.includes(ref.system))},\n planning:{kind:policy.kind,priority:fix.item.planning?.priority??2,dependencies:snapshot.definition.dependencies,references:[]}});\n await deliver(fix);\n await this.journal.update<SavedFix>('fix:'+id,old=>({...old!,accepted:true,state:'accepted',createdItemId:snapshot.operationId}));\n }\n private async publishFix(fix:SavedFix):Promise<void> {\n const snapshot=fix.snapshot!,envelope={schema:'kanban.fix/1',version:1,operationId:snapshot.operationId,sourceSessionId:fix.sessionId,\n confirmation:{messageId:snapshot.messageId,content:snapshot.content,digest:snapshot.digest},board:{id:fix.boardId},resource:{id:fix.resourceId},...snapshot.definition};\n await this.journal.update('fix-definition:'+fix.id,old=>{requireValue(!old||JSON.stringify(old)===JSON.stringify(envelope),'FIX_DEFINITION_CHANGED');return old??envelope;});\n }\n async decisionSnapshot(identity:{sourceBoardId:string;recordId:string;recordRevision:number;runId:string}):Promise<KanbanProjectRecord> {\n await this.service.read(identity.sourceBoardId);\n const runs=await this.journal.get<Array<{id:string;record:KanbanProjectRecord}>>('record-runs:'+identity.sourceBoardId);\n const record=runs?.find(run=>run.id===identity.runId)?.record??await this.service.record(identity.sourceBoardId,identity.recordId);\n requireValue(record.id===identity.recordId&&record.revision===identity.recordRevision,'FIX_DECISION_REVISION_UNAVAILABLE');return record;\n }\n\n}\n/** Adapter requests remain opaque; relation projection does not expose journal layouts. */\nexport async function collaborationRelations<Input=unknown>(journal:KanbanAutomationJournal,boardId:string,itemId:string) {\n const analyses=await analysisHistory<AnalysisJournalEntry & {input:Input}>(journal,boardId,itemId);\n const replies=await journal.findForBoard<{sessionId:string;phase?:string;request:{itemId:string;operationId:string}}>('task-reply:',boardId,row=>row.request.itemId===itemId&&row.phase!=='cancelled');\n const activeReplies:Array<{operationId:string;executionId:string}>=[];\n for(const {value} of replies)if(!await journal.get('task-reply-cancelled:'+value.request.operationId))activeReplies.push({operationId:value.request.operationId,executionId:value.sessionId});\n return {planning:analyses.map(job=>({id:job.id,request:job.input})),replies:activeReplies};\n}\n"]}