@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.
- package/LICENSE +674 -0
- package/README.md +165 -2
- package/dist/activity-BbC4sgKL.d.cts +258 -0
- package/dist/activity-Czlan5xW.d.ts +258 -0
- package/dist/activity-module-DaO1Rry0.d.cts +22 -0
- package/dist/activity-module-T22wliZu.d.ts +22 -0
- package/dist/activity-ports-Dqxa86zT.d.cts +12 -0
- package/dist/activity-ports-cxfrelaL.d.ts +12 -0
- package/dist/activity.cjs +16 -0
- package/dist/activity.cjs.map +1 -0
- package/dist/activity.d.cts +12 -0
- package/dist/activity.d.ts +12 -0
- package/dist/activity.js +16 -0
- package/dist/activity.js.map +1 -0
- package/dist/chunk-3JYLJPE5.js +95 -0
- package/dist/chunk-3JYLJPE5.js.map +1 -0
- package/dist/chunk-3LEIHB7Y.js +221 -0
- package/dist/chunk-3LEIHB7Y.js.map +1 -0
- package/dist/chunk-4XF6LQSU.cjs +9 -0
- package/dist/chunk-4XF6LQSU.cjs.map +1 -0
- package/dist/chunk-5Q7WB63A.cjs +282 -0
- package/dist/chunk-5Q7WB63A.cjs.map +1 -0
- package/dist/chunk-7KDOTBRX.cjs +58 -0
- package/dist/chunk-7KDOTBRX.cjs.map +1 -0
- package/dist/chunk-AHHEGTUA.js +148 -0
- package/dist/chunk-AHHEGTUA.js.map +1 -0
- package/dist/chunk-AOHQCX7K.cjs +95 -0
- package/dist/chunk-AOHQCX7K.cjs.map +1 -0
- package/dist/chunk-DINLR6E6.cjs +443 -0
- package/dist/chunk-DINLR6E6.cjs.map +1 -0
- package/dist/chunk-EYTVC2H5.cjs +1612 -0
- package/dist/chunk-EYTVC2H5.cjs.map +1 -0
- package/dist/chunk-FEE2YBZ7.js +1972 -0
- package/dist/chunk-FEE2YBZ7.js.map +1 -0
- package/dist/chunk-FNO5K3A7.js +282 -0
- package/dist/chunk-FNO5K3A7.js.map +1 -0
- package/dist/chunk-IHHDXZPZ.js +382 -0
- package/dist/chunk-IHHDXZPZ.js.map +1 -0
- package/dist/chunk-J3EAIVA3.js +280 -0
- package/dist/chunk-J3EAIVA3.js.map +1 -0
- package/dist/chunk-KH3WF3K4.js +443 -0
- package/dist/chunk-KH3WF3K4.js.map +1 -0
- package/dist/chunk-M35X5PHO.js +196 -0
- package/dist/chunk-M35X5PHO.js.map +1 -0
- package/dist/chunk-QRGZD2JU.cjs +1972 -0
- package/dist/chunk-QRGZD2JU.cjs.map +1 -0
- package/dist/chunk-RBOER6EW.cjs +221 -0
- package/dist/chunk-RBOER6EW.cjs.map +1 -0
- package/dist/chunk-RQP77ZTY.js +9 -0
- package/dist/chunk-RQP77ZTY.js.map +1 -0
- package/dist/chunk-RSH6QSEC.cjs +196 -0
- package/dist/chunk-RSH6QSEC.cjs.map +1 -0
- package/dist/chunk-VMRDXOLX.cjs +148 -0
- package/dist/chunk-VMRDXOLX.cjs.map +1 -0
- package/dist/chunk-X4UHZX6F.js +58 -0
- package/dist/chunk-X4UHZX6F.js.map +1 -0
- package/dist/chunk-XBSGUVCY.cjs +382 -0
- package/dist/chunk-XBSGUVCY.cjs.map +1 -0
- package/dist/chunk-XKDZHAUE.js +1612 -0
- package/dist/chunk-XKDZHAUE.js.map +1 -0
- package/dist/chunk-ZUZGAO6G.cjs +280 -0
- package/dist/chunk-ZUZGAO6G.cjs.map +1 -0
- package/dist/content-C5aJZFlw.d.cts +35 -0
- package/dist/content-hLH5BNud.d.ts +35 -0
- package/dist/contracts/index.cjs +31 -0
- package/dist/contracts/index.cjs.map +1 -0
- package/dist/contracts/index.d.cts +5 -0
- package/dist/contracts/index.d.ts +5 -0
- package/dist/contracts/index.js +31 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/discovery-9E-LfwIw.d.cts +61 -0
- package/dist/discovery-D60yrjej.d.ts +61 -0
- package/dist/discovery.cjs +377 -0
- package/dist/discovery.cjs.map +1 -0
- package/dist/discovery.d.cts +22 -0
- package/dist/discovery.d.ts +22 -0
- package/dist/discovery.js +377 -0
- package/dist/discovery.js.map +1 -0
- package/dist/execution-bridge-fpCnH6z5.d.cts +52 -0
- package/dist/execution-bridge-rk0uVy_n.d.ts +52 -0
- package/dist/execution.cjs +18 -0
- package/dist/execution.cjs.map +1 -0
- package/dist/execution.d.cts +42 -0
- package/dist/execution.d.ts +42 -0
- package/dist/execution.js +18 -0
- package/dist/execution.js.map +1 -0
- package/dist/index.cjs +74 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +54 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/module-CYfE7YhM.d.ts +11 -0
- package/dist/module-Ca9L3qCn.d.cts +11 -0
- package/dist/planning-CHrOqQ6b.d.cts +879 -0
- package/dist/planning-CHrOqQ6b.d.ts +879 -0
- package/dist/ports-B0McVg7B.d.ts +143 -0
- package/dist/ports-BeGO1VRI.d.cts +49 -0
- package/dist/ports-GQy0x-RI.d.cts +143 -0
- package/dist/ports-ykGiNUSx.d.ts +49 -0
- package/dist/runtime/index.cjs +205 -0
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.cts +75 -0
- package/dist/runtime/index.d.ts +75 -0
- package/dist/runtime/index.js +205 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/integration.cjs +423 -0
- package/dist/runtime/integration.cjs.map +1 -0
- package/dist/runtime/integration.d.cts +658 -0
- package/dist/runtime/integration.d.ts +658 -0
- package/dist/runtime/integration.js +423 -0
- package/dist/runtime/integration.js.map +1 -0
- package/dist/storage.cjs +21 -0
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.d.cts +71 -0
- package/dist/storage.d.ts +71 -0
- package/dist/storage.js +21 -0
- package/dist/storage.js.map +1 -0
- package/dist/store-DPwHzGiz.d.cts +28 -0
- package/dist/store-DgdrPCV9.d.ts +28 -0
- package/dist/task-projection-CSorlMws.d.ts +11 -0
- package/dist/task-projection-DKKB_ueb.d.cts +11 -0
- package/examples/standalone.ts +22 -0
- 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"]}
|
package/dist/index.d.cts
ADDED
|
@@ -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 };
|
package/dist/index.d.ts
ADDED
|
@@ -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 };
|