@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,42 @@
1
+ export { K as KanbanExecutionBridgeOptions, a as KanbanExecutionObservation, b as KanbanExecutionPort, c as createKanbanExecutionBridge } from './execution-bridge-rk0uVy_n.js';
2
+ import { K as KanbanClient } from './activity-Czlan5xW.js';
3
+ import { IFileSystem } from '@nestos/vfs-core';
4
+ import './planning-CHrOqQ6b.js';
5
+
6
+ /** Host supplies its scheduler; disposal prevents new scans and awaits in-flight work. */
7
+ declare function startKanbanMonitor(options: {
8
+ service: Pick<KanbanClient, 'scan'>;
9
+ subscribeTick: (tick: () => void) => () => void;
10
+ onError: (error: unknown) => void | Promise<void>;
11
+ onSuccess?: () => void | Promise<void>;
12
+ subscribeChanges?: (tick: () => void) => () => void;
13
+ initialScan?: boolean;
14
+ }): {
15
+ dispose(): Promise<void>;
16
+ };
17
+
18
+ interface WorkMessageScope {
19
+ runId: string;
20
+ itemId: string;
21
+ attemptId: string;
22
+ }
23
+ interface WorkMessage extends WorkMessageScope {
24
+ schema: 'work-message/1' | 'work-message/2';
25
+ id: string;
26
+ type: 'progress' | 'clarification' | 'error' | 'result' | 'resolved';
27
+ content: string;
28
+ replyTo?: string;
29
+ }
30
+ interface Journal {
31
+ get<T>(key: string): Promise<T | undefined>;
32
+ update<T>(key: string, change: (old: T | undefined) => T): Promise<T>;
33
+ }
34
+ /** Directory events are wakeups; immutable files plus durable receipts are authoritative. */
35
+ declare function consumeWorkMessages(fs: IFileSystem, directory: string, scope: WorkMessageScope, journal: Journal, deliver: (message: WorkMessage) => Promise<void | {
36
+ pending: true;
37
+ }>, decode: (text: string) => unknown, publishReply: (directory: string, name: string, content: string) => Promise<void>): Promise<WorkMessage[]>;
38
+ declare function parseWorkMessage(text: string, scope: WorkMessageScope, decode: (text: string) => unknown): WorkMessage;
39
+ /** Only explicit linked resolutions close issues; unrelated progress cannot erase them. */
40
+ declare function unresolvedWorkIssues(messages: WorkMessage[]): WorkMessage[];
41
+
42
+ export { type WorkMessage, type WorkMessageScope, consumeWorkMessages, parseWorkMessage, startKanbanMonitor, unresolvedWorkIssues };
@@ -0,0 +1,18 @@
1
+ import {
2
+ consumeWorkMessages,
3
+ createKanbanExecutionBridge,
4
+ parseWorkMessage,
5
+ startKanbanMonitor,
6
+ unresolvedWorkIssues
7
+ } from "./chunk-IHHDXZPZ.js";
8
+ import "./chunk-RQP77ZTY.js";
9
+ import "./chunk-M35X5PHO.js";
10
+ import "./chunk-3JYLJPE5.js";
11
+ export {
12
+ consumeWorkMessages,
13
+ createKanbanExecutionBridge,
14
+ parseWorkMessage,
15
+ startKanbanMonitor,
16
+ unresolvedWorkIssues
17
+ };
18
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/index.cjs ADDED
@@ -0,0 +1,74 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return 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; }
2
+
3
+ var _chunkDINLR6E6cjs = require('./chunk-DINLR6E6.cjs');
4
+
5
+
6
+ var _chunkVMRDXOLXcjs = require('./chunk-VMRDXOLX.cjs');
7
+
8
+
9
+
10
+ var _chunkEYTVC2H5cjs = require('./chunk-EYTVC2H5.cjs');
11
+ require('./chunk-4XF6LQSU.cjs');
12
+ require('./chunk-RBOER6EW.cjs');
13
+
14
+
15
+
16
+ var _chunk7KDOTBRXcjs = require('./chunk-7KDOTBRX.cjs');
17
+
18
+
19
+
20
+ var _chunkRSH6QSECcjs = require('./chunk-RSH6QSEC.cjs');
21
+
22
+
23
+
24
+
25
+
26
+
27
+ var _chunkAOHQCX7Kcjs = require('./chunk-AOHQCX7K.cjs');
28
+
29
+ // src/api.ts
30
+ function createKanban(options) {
31
+ const service = _chunkDINLR6E6cjs.createKanbanModule.call(void 0, options);
32
+ return {
33
+ boards: { create: service.create, get: service.read, list: service.catalog, overview: service.overview },
34
+ items: { get: service.item, query: service.query },
35
+ records: { get: service.record, query: service.records },
36
+ planning: { get: service.workflow },
37
+ references: { resolve: service.resolve, suggest: service.suggest },
38
+ currentPrincipal: service.currentPrincipal,
39
+ async execute(boardId, request) {
40
+ const board = await service.execute(boardId, request);
41
+ return { boardId, operationId: request.operationId, revision: board.revision };
42
+ },
43
+ events: service.events,
44
+ tick: service.scan,
45
+ quiesce: () => service.quiesce(),
46
+ dispose: () => service.dispose()
47
+ };
48
+ }
49
+
50
+ // src/event-policy.ts
51
+ function isKanbanEventRelevant(event, board, now) {
52
+ const item = board.items.find((i) => i.id === event.itemId);
53
+ if (event.kind === "escalated") return !!item && !_chunkEYTVC2H5cjs.terminal.call(void 0, item) && (event.data.reason === "transfer-timeout" ? !item.transfer && item.status === "claimed" : _chunkEYTVC2H5cjs.escalationReasons.call(void 0, board, item, now).includes(_nullishCoalesce(event.data.reason, () => ( ""))));
54
+ if (event.kind === "submit") return _optionalChain([item, 'optionalAccess', _ => _.status]) === "review";
55
+ if (event.kind === "request-transfer") return !!_optionalChain([item, 'optionalAccess', _2 => _2.transfer]) && item.transfer.expiresAt > now;
56
+ if (event.kind === "publish-proposal") return _optionalChain([item, 'optionalAccess', _3 => _3.status]) === "open";
57
+ return true;
58
+ }
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+ exports.DEFAULT_KANBAN_WORK_TYPES = _chunk7KDOTBRXcjs.DEFAULT_KANBAN_WORK_TYPES; exports.KanbanError = _chunkRSH6QSECcjs.KanbanError; exports.KanbanScanNotStartedError = _chunkRSH6QSECcjs.KanbanScanNotStartedError; exports.SeqKanbanStore = _chunkVMRDXOLXcjs.SeqKanbanStore; exports.TASK_START_DELAY_MS = _chunkAOHQCX7Kcjs.TASK_START_DELAY_MS; exports.createKanban = createKanban; exports.createKanbanModule = _chunkDINLR6E6cjs.createKanbanModule; exports.isKanbanEventRelevant = isKanbanEventRelevant; exports.kanbanReference = _chunk7KDOTBRXcjs.kanbanReference; exports.projectKanbanTask = _chunkAOHQCX7Kcjs.projectKanbanTask; exports.taskDue = _chunkAOHQCX7Kcjs.taskDue; exports.taskEditing = _chunkAOHQCX7Kcjs.taskEditing; exports.taskStartAt = _chunkAOHQCX7Kcjs.taskStartAt;
74
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/li/share/prj/x1/libraries/kanban/dist/index.cjs","../src/api.ts","../src/event-policy.ts"],"names":[],"mappings":"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","file":"/home/li/share/prj/x1/libraries/kanban/dist/index.cjs","sourcesContent":[null,"import {createKanbanModule} from './module';\nimport type {KanbanModuleOptions} from './ports';\nimport type {KanbanRequest} from './contracts';\n\nexport interface KanbanCommit {boardId: string; operationId: string; revision: number}\nexport type Kanban = ReturnType<typeof createKanban>;\n\n/** Grouped public API; all writes still enter the same authorized transaction path. */\nexport function createKanban(options: KanbanModuleOptions) {\n const service = createKanbanModule(options);\n return {\n boards: {create: service.create, get: service.read, list: service.catalog, overview: service.overview},\n items: {get: service.item, query: service.query},\n records: {get: service.record, query: service.records},\n planning: {get: service.workflow},\n references: {resolve: service.resolve, suggest: service.suggest},\n currentPrincipal: service.currentPrincipal,\n async execute(boardId: string, request: KanbanRequest): Promise<KanbanCommit> {\n const board = await service.execute(boardId, request);\n return {boardId, operationId: request.operationId, revision: board.revision};\n },\n events: service.events,\n tick: service.scan,\n quiesce: () => service.quiesce(),\n dispose: () => service.dispose(),\n };\n}\n","import type {KanbanEvent, KanbanBoard} from './contracts';\nimport {terminal} from './planning';\nimport {escalationReasons} from './reducer';\n\nexport function isKanbanEventRelevant(event: KanbanEvent, board: KanbanBoard, now: number): boolean {\n const item = board.items.find(i => i.id === event.itemId);\n if (event.kind === 'escalated') return !!item && !terminal(item) && (event.data.reason === 'transfer-timeout'\n ? !item.transfer && item.status === 'claimed' : escalationReasons(board, item, now).includes(event.data.reason ?? ''));\n if (event.kind === 'submit') return item?.status === 'review';\n if (event.kind === 'request-transfer') return !!item?.transfer && item.transfer.expiresAt > now;\n if (event.kind === 'publish-proposal') return item?.status === 'open';\n return true;\n}\n"]}
@@ -0,0 +1,54 @@
1
+ export { K as KanbanModuleHandle, c as createKanbanModule } from './module-Ca9L3qCn.cjs';
2
+ export { K as KanbanBodyStore, S as SeqKanbanStore } from './store-DPwHzGiz.cjs';
3
+ import { K as KanbanModuleOptions } from './ports-GQy0x-RI.cjs';
4
+ export { a as KanbanError, b as KanbanReadView, c as KanbanScanNotStartedError, d as KanbanState, e as KanbanStore } from './ports-GQy0x-RI.cjs';
5
+ import { l as KanbanBoardInput, j as KanbanBoard, m as KanbanBoardSummary, E as KanbanOverview, w as KanbanItem, a1 as KanbanTaskProjection, c as KanbanArchivedItem, y as KanbanItemQuery, x as KanbanItemPage, J as KanbanProjectRecord, P as KanbanRecordQuery, O as KanbanRecordPage, a7 as KanbanWorkflowState, R as KanbanReferenceTarget, Y as KanbanSuggestionQuery, X as KanbanSuggestionPage, I as KanbanPrincipal, S as KanbanRequest, t as KanbanEvent } from './planning-CHrOqQ6b.cjs';
6
+ export { D as DEFAULT_KANBAN_WORK_TYPES, K as KanbanActor, a as KanbanAmendment, d as KanbanArtifactRef, e as KanbanAssignment, n as KanbanColumn, o as KanbanCommand, p as KanbanDiscoveryBatch, q as KanbanDiscoveryChange, r as KanbanDispatch, s as KanbanEstimate, u as KanbanExternalReference, z as KanbanItemSummary, B as KanbanMember, C as KanbanNotificationPolicy, F as KanbanParticipant, G as KanbanPlanning, H as KanbanPolicy, L as KanbanPublishedPlan, N as KanbanRecordInput, Q as KanbanRecordSummary, T as KanbanService, U as KanbanSourceRef, V as KanbanSuggestion, W as KanbanSuggestionKind, a2 as KanbanText, a3 as KanbanWorkDefinition, a4 as KanbanWorkPlan, a5 as KanbanWorkType, a6 as KanbanWorkflowCommand, ab as kanbanReference } from './planning-CHrOqQ6b.cjs';
7
+ 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';
8
+ import '@nestos/vfs-core';
9
+ import './discovery-9E-LfwIw.cjs';
10
+
11
+ interface KanbanCommit {
12
+ boardId: string;
13
+ operationId: string;
14
+ revision: number;
15
+ }
16
+ type Kanban = ReturnType<typeof createKanban>;
17
+ /** Grouped public API; all writes still enter the same authorized transaction path. */
18
+ declare function createKanban(options: KanbanModuleOptions): {
19
+ boards: {
20
+ create: (board: KanbanBoardInput) => Promise<KanbanBoard>;
21
+ get: (boardId: string) => Promise<KanbanBoard>;
22
+ list: () => Promise<KanbanBoardSummary[]>;
23
+ overview: (boardId: string) => Promise<KanbanOverview>;
24
+ };
25
+ items: {
26
+ get: (boardId: string, itemId: string) => Promise<{
27
+ item: KanbanItem;
28
+ task?: KanbanTaskProjection;
29
+ archive?: Omit<KanbanArchivedItem, "item">;
30
+ }>;
31
+ query: (boardId: string, query?: KanbanItemQuery) => Promise<KanbanItemPage>;
32
+ };
33
+ records: {
34
+ get: (boardId: string, recordId: string) => Promise<KanbanProjectRecord>;
35
+ query: (boardId: string, query?: KanbanRecordQuery) => Promise<KanbanRecordPage>;
36
+ };
37
+ planning: {
38
+ get: (boardId: string) => Promise<KanbanWorkflowState>;
39
+ };
40
+ references: {
41
+ resolve: (reference: string) => Promise<KanbanReferenceTarget>;
42
+ suggest: (boardId: string, query: KanbanSuggestionQuery) => Promise<KanbanSuggestionPage>;
43
+ };
44
+ currentPrincipal: () => Promise<KanbanPrincipal>;
45
+ execute(boardId: string, request: KanbanRequest): Promise<KanbanCommit>;
46
+ events: (boardId: string, afterSequence?: number, limit?: number) => Promise<KanbanEvent[]>;
47
+ tick: () => Promise<void>;
48
+ quiesce: () => Promise<void>;
49
+ dispose: () => Promise<void>;
50
+ };
51
+
52
+ declare function isKanbanEventRelevant(event: KanbanEvent, board: KanbanBoard, now: number): boolean;
53
+
54
+ export { type Kanban, KanbanArchivedItem, KanbanBoard, KanbanBoardInput, KanbanBoardSummary, type KanbanCommit, KanbanEvent, KanbanItem, KanbanItemPage, KanbanItemQuery, KanbanModuleOptions, KanbanOverview, KanbanPrincipal, KanbanProjectRecord, KanbanRecordPage, KanbanRecordQuery, KanbanReferenceTarget, KanbanRequest, KanbanSuggestionPage, KanbanSuggestionQuery, KanbanWorkflowState, createKanban, isKanbanEventRelevant };
@@ -0,0 +1,54 @@
1
+ export { K as KanbanModuleHandle, c as createKanbanModule } from './module-CYfE7YhM.js';
2
+ export { K as KanbanBodyStore, S as SeqKanbanStore } from './store-DgdrPCV9.js';
3
+ import { K as KanbanModuleOptions } from './ports-B0McVg7B.js';
4
+ export { a as KanbanError, b as KanbanReadView, c as KanbanScanNotStartedError, d as KanbanState, e as KanbanStore } from './ports-B0McVg7B.js';
5
+ import { l as KanbanBoardInput, j as KanbanBoard, m as KanbanBoardSummary, E as KanbanOverview, w as KanbanItem, a1 as KanbanTaskProjection, c as KanbanArchivedItem, y as KanbanItemQuery, x as KanbanItemPage, J as KanbanProjectRecord, P as KanbanRecordQuery, O as KanbanRecordPage, a7 as KanbanWorkflowState, R as KanbanReferenceTarget, Y as KanbanSuggestionQuery, X as KanbanSuggestionPage, I as KanbanPrincipal, S as KanbanRequest, t as KanbanEvent } from './planning-CHrOqQ6b.js';
6
+ export { D as DEFAULT_KANBAN_WORK_TYPES, K as KanbanActor, a as KanbanAmendment, d as KanbanArtifactRef, e as KanbanAssignment, n as KanbanColumn, o as KanbanCommand, p as KanbanDiscoveryBatch, q as KanbanDiscoveryChange, r as KanbanDispatch, s as KanbanEstimate, u as KanbanExternalReference, z as KanbanItemSummary, B as KanbanMember, C as KanbanNotificationPolicy, F as KanbanParticipant, G as KanbanPlanning, H as KanbanPolicy, L as KanbanPublishedPlan, N as KanbanRecordInput, Q as KanbanRecordSummary, T as KanbanService, U as KanbanSourceRef, V as KanbanSuggestion, W as KanbanSuggestionKind, a2 as KanbanText, a3 as KanbanWorkDefinition, a4 as KanbanWorkPlan, a5 as KanbanWorkType, a6 as KanbanWorkflowCommand, ab as kanbanReference } from './planning-CHrOqQ6b.js';
7
+ export { T as TASK_START_DELAY_MS, p as projectKanbanTask, t as taskDue, a as taskEditing, b as taskStartAt } from './task-projection-CSorlMws.js';
8
+ import '@nestos/vfs-core';
9
+ import './discovery-D60yrjej.js';
10
+
11
+ interface KanbanCommit {
12
+ boardId: string;
13
+ operationId: string;
14
+ revision: number;
15
+ }
16
+ type Kanban = ReturnType<typeof createKanban>;
17
+ /** Grouped public API; all writes still enter the same authorized transaction path. */
18
+ declare function createKanban(options: KanbanModuleOptions): {
19
+ boards: {
20
+ create: (board: KanbanBoardInput) => Promise<KanbanBoard>;
21
+ get: (boardId: string) => Promise<KanbanBoard>;
22
+ list: () => Promise<KanbanBoardSummary[]>;
23
+ overview: (boardId: string) => Promise<KanbanOverview>;
24
+ };
25
+ items: {
26
+ get: (boardId: string, itemId: string) => Promise<{
27
+ item: KanbanItem;
28
+ task?: KanbanTaskProjection;
29
+ archive?: Omit<KanbanArchivedItem, "item">;
30
+ }>;
31
+ query: (boardId: string, query?: KanbanItemQuery) => Promise<KanbanItemPage>;
32
+ };
33
+ records: {
34
+ get: (boardId: string, recordId: string) => Promise<KanbanProjectRecord>;
35
+ query: (boardId: string, query?: KanbanRecordQuery) => Promise<KanbanRecordPage>;
36
+ };
37
+ planning: {
38
+ get: (boardId: string) => Promise<KanbanWorkflowState>;
39
+ };
40
+ references: {
41
+ resolve: (reference: string) => Promise<KanbanReferenceTarget>;
42
+ suggest: (boardId: string, query: KanbanSuggestionQuery) => Promise<KanbanSuggestionPage>;
43
+ };
44
+ currentPrincipal: () => Promise<KanbanPrincipal>;
45
+ execute(boardId: string, request: KanbanRequest): Promise<KanbanCommit>;
46
+ events: (boardId: string, afterSequence?: number, limit?: number) => Promise<KanbanEvent[]>;
47
+ tick: () => Promise<void>;
48
+ quiesce: () => Promise<void>;
49
+ dispose: () => Promise<void>;
50
+ };
51
+
52
+ declare function isKanbanEventRelevant(event: KanbanEvent, board: KanbanBoard, now: number): boolean;
53
+
54
+ export { type Kanban, KanbanArchivedItem, KanbanBoard, KanbanBoardInput, KanbanBoardSummary, type KanbanCommit, KanbanEvent, KanbanItem, KanbanItemPage, KanbanItemQuery, KanbanModuleOptions, KanbanOverview, KanbanPrincipal, KanbanProjectRecord, KanbanRecordPage, KanbanRecordQuery, KanbanReferenceTarget, KanbanRequest, KanbanSuggestionPage, KanbanSuggestionQuery, KanbanWorkflowState, createKanban, isKanbanEventRelevant };
package/dist/index.js ADDED
@@ -0,0 +1,74 @@
1
+ import {
2
+ createKanbanModule
3
+ } from "./chunk-KH3WF3K4.js";
4
+ import {
5
+ SeqKanbanStore
6
+ } from "./chunk-AHHEGTUA.js";
7
+ import {
8
+ escalationReasons,
9
+ terminal
10
+ } from "./chunk-XKDZHAUE.js";
11
+ import "./chunk-RQP77ZTY.js";
12
+ import "./chunk-3LEIHB7Y.js";
13
+ import {
14
+ DEFAULT_KANBAN_WORK_TYPES,
15
+ kanbanReference
16
+ } from "./chunk-X4UHZX6F.js";
17
+ import {
18
+ KanbanError,
19
+ KanbanScanNotStartedError
20
+ } from "./chunk-M35X5PHO.js";
21
+ import {
22
+ TASK_START_DELAY_MS,
23
+ projectKanbanTask,
24
+ taskDue,
25
+ taskEditing,
26
+ taskStartAt
27
+ } from "./chunk-3JYLJPE5.js";
28
+
29
+ // src/api.ts
30
+ function createKanban(options) {
31
+ const service = createKanbanModule(options);
32
+ return {
33
+ boards: { create: service.create, get: service.read, list: service.catalog, overview: service.overview },
34
+ items: { get: service.item, query: service.query },
35
+ records: { get: service.record, query: service.records },
36
+ planning: { get: service.workflow },
37
+ references: { resolve: service.resolve, suggest: service.suggest },
38
+ currentPrincipal: service.currentPrincipal,
39
+ async execute(boardId, request) {
40
+ const board = await service.execute(boardId, request);
41
+ return { boardId, operationId: request.operationId, revision: board.revision };
42
+ },
43
+ events: service.events,
44
+ tick: service.scan,
45
+ quiesce: () => service.quiesce(),
46
+ dispose: () => service.dispose()
47
+ };
48
+ }
49
+
50
+ // src/event-policy.ts
51
+ function isKanbanEventRelevant(event, board, now) {
52
+ const item = board.items.find((i) => i.id === event.itemId);
53
+ if (event.kind === "escalated") return !!item && !terminal(item) && (event.data.reason === "transfer-timeout" ? !item.transfer && item.status === "claimed" : escalationReasons(board, item, now).includes(event.data.reason ?? ""));
54
+ if (event.kind === "submit") return item?.status === "review";
55
+ if (event.kind === "request-transfer") return !!item?.transfer && item.transfer.expiresAt > now;
56
+ if (event.kind === "publish-proposal") return item?.status === "open";
57
+ return true;
58
+ }
59
+ export {
60
+ DEFAULT_KANBAN_WORK_TYPES,
61
+ KanbanError,
62
+ KanbanScanNotStartedError,
63
+ SeqKanbanStore,
64
+ TASK_START_DELAY_MS,
65
+ createKanban,
66
+ createKanbanModule,
67
+ isKanbanEventRelevant,
68
+ kanbanReference,
69
+ projectKanbanTask,
70
+ taskDue,
71
+ taskEditing,
72
+ taskStartAt
73
+ };
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api.ts","../src/event-policy.ts"],"sourcesContent":["import {createKanbanModule} from './module';\nimport type {KanbanModuleOptions} from './ports';\nimport type {KanbanRequest} from './contracts';\n\nexport interface KanbanCommit {boardId: string; operationId: string; revision: number}\nexport type Kanban = ReturnType<typeof createKanban>;\n\n/** Grouped public API; all writes still enter the same authorized transaction path. */\nexport function createKanban(options: KanbanModuleOptions) {\n const service = createKanbanModule(options);\n return {\n boards: {create: service.create, get: service.read, list: service.catalog, overview: service.overview},\n items: {get: service.item, query: service.query},\n records: {get: service.record, query: service.records},\n planning: {get: service.workflow},\n references: {resolve: service.resolve, suggest: service.suggest},\n currentPrincipal: service.currentPrincipal,\n async execute(boardId: string, request: KanbanRequest): Promise<KanbanCommit> {\n const board = await service.execute(boardId, request);\n return {boardId, operationId: request.operationId, revision: board.revision};\n },\n events: service.events,\n tick: service.scan,\n quiesce: () => service.quiesce(),\n dispose: () => service.dispose(),\n };\n}\n","import type {KanbanEvent, KanbanBoard} from './contracts';\nimport {terminal} from './planning';\nimport {escalationReasons} from './reducer';\n\nexport function isKanbanEventRelevant(event: KanbanEvent, board: KanbanBoard, now: number): boolean {\n const item = board.items.find(i => i.id === event.itemId);\n if (event.kind === 'escalated') return !!item && !terminal(item) && (event.data.reason === 'transfer-timeout'\n ? !item.transfer && item.status === 'claimed' : escalationReasons(board, item, now).includes(event.data.reason ?? ''));\n if (event.kind === 'submit') return item?.status === 'review';\n if (event.kind === 'request-transfer') return !!item?.transfer && item.transfer.expiresAt > now;\n if (event.kind === 'publish-proposal') return item?.status === 'open';\n return true;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQO,SAAS,aAAa,SAA8B;AACvD,QAAM,UAAU,mBAAmB,OAAO;AAC1C,SAAO;AAAA,IACH,QAAQ,EAAC,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,MAAM,MAAM,QAAQ,SAAS,UAAU,QAAQ,SAAQ;AAAA,IACrG,OAAO,EAAC,KAAK,QAAQ,MAAM,OAAO,QAAQ,MAAK;AAAA,IAC/C,SAAS,EAAC,KAAK,QAAQ,QAAQ,OAAO,QAAQ,QAAO;AAAA,IACrD,UAAU,EAAC,KAAK,QAAQ,SAAQ;AAAA,IAChC,YAAY,EAAC,SAAS,QAAQ,SAAS,SAAS,QAAQ,QAAO;AAAA,IAC/D,kBAAkB,QAAQ;AAAA,IAC1B,MAAM,QAAQ,SAAiB,SAA+C;AAC1E,YAAM,QAAQ,MAAM,QAAQ,QAAQ,SAAS,OAAO;AACpD,aAAO,EAAC,SAAS,aAAa,QAAQ,aAAa,UAAU,MAAM,SAAQ;AAAA,IAC/E;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,SAAS,MAAM,QAAQ,QAAQ;AAAA,IAC/B,SAAS,MAAM,QAAQ,QAAQ;AAAA,EACnC;AACJ;;;ACtBO,SAAS,sBAAsB,OAAoB,OAAoB,KAAsB;AAChG,QAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,MAAM;AACxD,MAAI,MAAM,SAAS,YAAa,QAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,MAAM,MAAM,KAAK,WAAW,qBACrF,CAAC,KAAK,YAAY,KAAK,WAAW,YAAY,kBAAkB,OAAO,MAAM,GAAG,EAAE,SAAS,MAAM,KAAK,UAAU,EAAE;AACxH,MAAI,MAAM,SAAS,SAAU,QAAO,MAAM,WAAW;AACrD,MAAI,MAAM,SAAS,mBAAoB,QAAO,CAAC,CAAC,MAAM,YAAY,KAAK,SAAS,YAAY;AAC5F,MAAI,MAAM,SAAS,mBAAoB,QAAO,MAAM,WAAW;AAC/D,SAAO;AACX;","names":[]}
@@ -0,0 +1,11 @@
1
+ import { T as KanbanService } from './planning-CHrOqQ6b.js';
2
+ import { K as KanbanModuleOptions } from './ports-B0McVg7B.js';
3
+
4
+ /** Optional host-owned service; no timer or model calls are started implicitly. */
5
+ declare function createKanbanModule(options: KanbanModuleOptions): KanbanModuleHandle;
6
+ interface KanbanModuleHandle extends KanbanService {
7
+ quiesce(): Promise<void>;
8
+ dispose(): Promise<void>;
9
+ }
10
+
11
+ export { type KanbanModuleHandle as K, createKanbanModule as c };
@@ -0,0 +1,11 @@
1
+ import { T as KanbanService } from './planning-CHrOqQ6b.cjs';
2
+ import { K as KanbanModuleOptions } from './ports-GQy0x-RI.cjs';
3
+
4
+ /** Optional host-owned service; no timer or model calls are started implicitly. */
5
+ declare function createKanbanModule(options: KanbanModuleOptions): KanbanModuleHandle;
6
+ interface KanbanModuleHandle extends KanbanService {
7
+ quiesce(): Promise<void>;
8
+ dispose(): Promise<void>;
9
+ }
10
+
11
+ export { type KanbanModuleHandle as K, createKanbanModule as c };