@nestos/kanban 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +73 -29
  3. package/dist/{activity-C6xDM-cg.d.cts → activity-BbC4sgKL.d.cts} +28 -2
  4. package/dist/{activity-Dw8DOw0L.d.ts → activity-Czlan5xW.d.ts} +28 -2
  5. package/dist/activity-module-DaO1Rry0.d.cts +22 -0
  6. package/dist/activity-module-T22wliZu.d.ts +22 -0
  7. package/dist/activity-ports-Dqxa86zT.d.cts +12 -0
  8. package/dist/activity-ports-cxfrelaL.d.ts +12 -0
  9. package/dist/activity.cjs +10 -282
  10. package/dist/activity.cjs.map +1 -1
  11. package/dist/activity.d.cts +8 -30
  12. package/dist/activity.d.ts +8 -30
  13. package/dist/activity.js +9 -281
  14. package/dist/activity.js.map +1 -1
  15. package/dist/{chunk-O4OGAAV4.js → chunk-3JYLJPE5.js} +29 -5
  16. package/dist/chunk-3JYLJPE5.js.map +1 -0
  17. package/dist/{chunk-ATUFFNLV.js → chunk-3LEIHB7Y.js} +5 -5
  18. package/dist/chunk-4XF6LQSU.cjs.map +1 -1
  19. package/dist/chunk-5Q7WB63A.cjs +282 -0
  20. package/dist/chunk-5Q7WB63A.cjs.map +1 -0
  21. package/dist/{chunk-PSKQAFDF.cjs → chunk-7KDOTBRX.cjs} +1 -1
  22. package/dist/chunk-7KDOTBRX.cjs.map +1 -0
  23. package/dist/{chunk-5DLZWW5Y.js → chunk-AHHEGTUA.js} +3 -3
  24. package/dist/chunk-AOHQCX7K.cjs +95 -0
  25. package/dist/chunk-AOHQCX7K.cjs.map +1 -0
  26. package/dist/{chunk-IUI5CI2S.cjs → chunk-DINLR6E6.cjs} +96 -92
  27. package/dist/chunk-DINLR6E6.cjs.map +1 -0
  28. package/dist/{chunk-L44TM4EE.cjs → chunk-EYTVC2H5.cjs} +568 -454
  29. package/dist/chunk-EYTVC2H5.cjs.map +1 -0
  30. package/dist/chunk-FEE2YBZ7.js +1972 -0
  31. package/dist/chunk-FEE2YBZ7.js.map +1 -0
  32. package/dist/chunk-FNO5K3A7.js +282 -0
  33. package/dist/chunk-FNO5K3A7.js.map +1 -0
  34. package/dist/chunk-IHHDXZPZ.js +382 -0
  35. package/dist/chunk-IHHDXZPZ.js.map +1 -0
  36. package/dist/chunk-J3EAIVA3.js +280 -0
  37. package/dist/chunk-J3EAIVA3.js.map +1 -0
  38. package/dist/{chunk-DFTOTBGF.js → chunk-KH3WF3K4.js} +20 -16
  39. package/dist/chunk-KH3WF3K4.js.map +1 -0
  40. package/dist/{chunk-TB2RZGDV.js → chunk-M35X5PHO.js} +14 -1
  41. package/dist/chunk-M35X5PHO.js.map +1 -0
  42. package/dist/chunk-QRGZD2JU.cjs +1972 -0
  43. package/dist/chunk-QRGZD2JU.cjs.map +1 -0
  44. package/dist/{chunk-4KF7KUAI.cjs → chunk-RBOER6EW.cjs} +6 -6
  45. package/dist/chunk-RBOER6EW.cjs.map +1 -0
  46. package/dist/{chunk-6MN3H3YF.cjs → chunk-RSH6QSEC.cjs} +16 -3
  47. package/dist/chunk-RSH6QSEC.cjs.map +1 -0
  48. package/dist/{chunk-T7P5EIC4.cjs → chunk-VMRDXOLX.cjs} +33 -33
  49. package/dist/chunk-VMRDXOLX.cjs.map +1 -0
  50. package/dist/{chunk-5XKOCKY2.js → chunk-X4UHZX6F.js} +1 -1
  51. package/dist/chunk-XBSGUVCY.cjs +382 -0
  52. package/dist/chunk-XBSGUVCY.cjs.map +1 -0
  53. package/dist/{chunk-OHQTKGQN.js → chunk-XKDZHAUE.js} +242 -128
  54. package/dist/chunk-XKDZHAUE.js.map +1 -0
  55. package/dist/chunk-ZUZGAO6G.cjs +280 -0
  56. package/dist/chunk-ZUZGAO6G.cjs.map +1 -0
  57. package/dist/{content-CAIp1njn.d.cts → content-C5aJZFlw.d.cts} +1 -1
  58. package/dist/{content-CGMJdyH_.d.ts → content-hLH5BNud.d.ts} +1 -1
  59. package/dist/contracts/index.cjs +13 -3
  60. package/dist/contracts/index.cjs.map +1 -1
  61. package/dist/contracts/index.d.cts +5 -4
  62. package/dist/contracts/index.d.ts +5 -4
  63. package/dist/contracts/index.js +14 -4
  64. package/dist/{discovery-DxpirOz3.d.cts → discovery-9E-LfwIw.d.cts} +1 -1
  65. package/dist/{discovery-gSqWpuRm.d.ts → discovery-D60yrjej.d.ts} +1 -1
  66. package/dist/discovery.cjs +63 -65
  67. package/dist/discovery.cjs.map +1 -1
  68. package/dist/discovery.d.cts +4 -4
  69. package/dist/discovery.d.ts +4 -4
  70. package/dist/discovery.js +5 -7
  71. package/dist/discovery.js.map +1 -1
  72. package/dist/execution-bridge-fpCnH6z5.d.cts +52 -0
  73. package/dist/execution-bridge-rk0uVy_n.d.ts +52 -0
  74. package/dist/execution.cjs +6 -356
  75. package/dist/execution.cjs.map +1 -1
  76. package/dist/execution.d.cts +4 -51
  77. package/dist/execution.d.ts +4 -51
  78. package/dist/execution.js +9 -359
  79. package/dist/execution.js.map +1 -1
  80. package/dist/index.cjs +10 -12
  81. package/dist/index.cjs.map +1 -1
  82. package/dist/index.d.cts +9 -16
  83. package/dist/index.d.ts +9 -16
  84. package/dist/index.js +10 -12
  85. package/dist/index.js.map +1 -1
  86. package/dist/{module-CWNK2BMj.d.ts → module-CYfE7YhM.d.ts} +2 -2
  87. package/dist/{module-BbvwdCDF.d.cts → module-Ca9L3qCn.d.cts} +2 -2
  88. package/dist/{planning-CcFZYdIL.d.cts → planning-CHrOqQ6b.d.cts} +45 -10
  89. package/dist/{planning-CcFZYdIL.d.ts → planning-CHrOqQ6b.d.ts} +45 -10
  90. package/dist/{ports-Bn6ro2FB.d.ts → ports-B0McVg7B.d.ts} +4 -3
  91. package/dist/ports-BeGO1VRI.d.cts +49 -0
  92. package/dist/{ports-CaL6geqR.d.cts → ports-GQy0x-RI.d.cts} +4 -3
  93. package/dist/ports-ykGiNUSx.d.ts +49 -0
  94. package/dist/runtime/index.cjs +205 -0
  95. package/dist/runtime/index.cjs.map +1 -0
  96. package/dist/runtime/index.d.cts +75 -0
  97. package/dist/runtime/index.d.ts +75 -0
  98. package/dist/runtime/index.js +205 -0
  99. package/dist/runtime/index.js.map +1 -0
  100. package/dist/runtime/integration.cjs +423 -0
  101. package/dist/runtime/integration.cjs.map +1 -0
  102. package/dist/runtime/integration.d.cts +658 -0
  103. package/dist/runtime/integration.d.ts +658 -0
  104. package/dist/runtime/integration.js +423 -0
  105. package/dist/runtime/integration.js.map +1 -0
  106. package/dist/storage.cjs +9 -277
  107. package/dist/storage.cjs.map +1 -1
  108. package/dist/storage.d.cts +6 -6
  109. package/dist/storage.d.ts +6 -6
  110. package/dist/storage.js +11 -279
  111. package/dist/storage.js.map +1 -1
  112. package/dist/{store-q63eSMoT.d.cts → store-DPwHzGiz.d.cts} +2 -2
  113. package/dist/{store-Ct0gOAAg.d.ts → store-DgdrPCV9.d.ts} +2 -2
  114. package/dist/task-projection-CSorlMws.d.ts +11 -0
  115. package/dist/task-projection-DKKB_ueb.d.cts +11 -0
  116. package/examples/standalone.ts +22 -0
  117. package/package.json +117 -87
  118. package/dist/chunk-2YFPV5GF.cjs +0 -16
  119. package/dist/chunk-2YFPV5GF.cjs.map +0 -1
  120. package/dist/chunk-4KF7KUAI.cjs.map +0 -1
  121. package/dist/chunk-6MN3H3YF.cjs.map +0 -1
  122. package/dist/chunk-DFTOTBGF.js.map +0 -1
  123. package/dist/chunk-G6FCDLDF.js +0 -16
  124. package/dist/chunk-G6FCDLDF.js.map +0 -1
  125. package/dist/chunk-IUI5CI2S.cjs.map +0 -1
  126. package/dist/chunk-KYNYPKKH.cjs +0 -71
  127. package/dist/chunk-KYNYPKKH.cjs.map +0 -1
  128. package/dist/chunk-L44TM4EE.cjs.map +0 -1
  129. package/dist/chunk-LSE6JG5I.cjs +0 -20
  130. package/dist/chunk-LSE6JG5I.cjs.map +0 -1
  131. package/dist/chunk-O4OGAAV4.js.map +0 -1
  132. package/dist/chunk-OHQTKGQN.js.map +0 -1
  133. package/dist/chunk-PSKQAFDF.cjs.map +0 -1
  134. package/dist/chunk-QTMTBEBA.js +0 -20
  135. package/dist/chunk-QTMTBEBA.js.map +0 -1
  136. package/dist/chunk-T7P5EIC4.cjs.map +0 -1
  137. package/dist/chunk-TB2RZGDV.js.map +0 -1
  138. package/dist/ui/index.cjs +0 -1961
  139. package/dist/ui/index.cjs.map +0 -1
  140. package/dist/ui/index.d.cts +0 -209
  141. package/dist/ui/index.d.ts +0 -209
  142. package/dist/ui/index.js +0 -1961
  143. package/dist/ui/index.js.map +0 -1
  144. package/dist/ui/kanban.css +0 -194
  145. /package/dist/{chunk-ATUFFNLV.js.map → chunk-3LEIHB7Y.js.map} +0 -0
  146. /package/dist/{chunk-5DLZWW5Y.js.map → chunk-AHHEGTUA.js.map} +0 -0
  147. /package/dist/{chunk-5XKOCKY2.js.map → chunk-X4UHZX6F.js.map} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,11 +1,12 @@
1
- export { K as KanbanModuleHandle, c as createKanbanModule } from './module-CWNK2BMj.js';
2
- export { K as KanbanBodyStore, S as SeqKanbanStore } from './store-Ct0gOAAg.js';
3
- import { K as KanbanModuleOptions } from './ports-Bn6ro2FB.js';
4
- export { i as KanbanError, b as KanbanReadView, g as KanbanScanNotStartedError, c as KanbanState, a as KanbanStore } from './ports-Bn6ro2FB.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, z as KanbanItemSummary } from './planning-CcFZYdIL.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, 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-CcFZYdIL.js';
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';
7
8
  import '@nestos/vfs-core';
8
- import './discovery-gSqWpuRm.js';
9
+ import './discovery-D60yrjej.js';
9
10
 
10
11
  interface KanbanCommit {
11
12
  boardId: string;
@@ -50,12 +51,4 @@ declare function createKanban(options: KanbanModuleOptions): {
50
51
 
51
52
  declare function isKanbanEventRelevant(event: KanbanEvent, board: KanbanBoard, now: number): boolean;
52
53
 
53
- type Item = Pick<KanbanItem, 'id' | 'status' | 'createdAt' | 'launch' | 'analysis' | 'control' | 'issues' | 'blocked' | 'externalRefs' | 'planning'>;
54
- declare const TASK_START_DELAY_MS = 300000;
55
- declare function taskStartAt(item: Pick<Item, 'createdAt' | 'launch'>): number;
56
- declare function taskEditing(item: Pick<Item, 'launch'>, now: number): boolean;
57
- declare function taskDue(item: Item, now: number): boolean;
58
- /** Ordered evidence projection shared by storage queries, CLI and UI. Session idle never proves acceptance. */
59
- declare function projectKanbanTask(item: Item, workflow?: KanbanWorkflowState, now?: number, all?: Array<Pick<KanbanItemSummary, 'id' | 'status'>>): KanbanTaskProjection;
60
-
61
- export { type Kanban, KanbanArchivedItem, KanbanBoard, KanbanBoardInput, KanbanBoardSummary, type KanbanCommit, KanbanEvent, KanbanItem, KanbanItemPage, KanbanItemQuery, KanbanItemSummary, KanbanModuleOptions, KanbanOverview, KanbanPrincipal, KanbanProjectRecord, KanbanRecordPage, KanbanRecordQuery, KanbanReferenceTarget, KanbanRequest, KanbanSuggestionPage, KanbanSuggestionQuery, KanbanWorkflowState, TASK_START_DELAY_MS, createKanban, isKanbanEventRelevant, projectKanbanTask, taskDue, taskEditing, taskStartAt };
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 CHANGED
@@ -1,32 +1,30 @@
1
1
  import {
2
2
  createKanbanModule
3
- } from "./chunk-DFTOTBGF.js";
3
+ } from "./chunk-KH3WF3K4.js";
4
4
  import {
5
5
  SeqKanbanStore
6
- } from "./chunk-5DLZWW5Y.js";
6
+ } from "./chunk-AHHEGTUA.js";
7
7
  import {
8
8
  escalationReasons,
9
9
  terminal
10
- } from "./chunk-OHQTKGQN.js";
10
+ } from "./chunk-XKDZHAUE.js";
11
11
  import "./chunk-RQP77ZTY.js";
12
- import "./chunk-ATUFFNLV.js";
12
+ import "./chunk-3LEIHB7Y.js";
13
+ import {
14
+ DEFAULT_KANBAN_WORK_TYPES,
15
+ kanbanReference
16
+ } from "./chunk-X4UHZX6F.js";
13
17
  import {
14
18
  KanbanError,
15
19
  KanbanScanNotStartedError
16
- } from "./chunk-G6FCDLDF.js";
20
+ } from "./chunk-M35X5PHO.js";
17
21
  import {
18
22
  TASK_START_DELAY_MS,
19
23
  projectKanbanTask,
20
24
  taskDue,
21
25
  taskEditing,
22
26
  taskStartAt
23
- } from "./chunk-O4OGAAV4.js";
24
- import {
25
- DEFAULT_KANBAN_WORK_TYPES,
26
- kanbanReference
27
- } from "./chunk-5XKOCKY2.js";
28
- import "./chunk-TB2RZGDV.js";
29
- import "./chunk-QTMTBEBA.js";
27
+ } from "./chunk-3JYLJPE5.js";
30
28
 
31
29
  // src/api.ts
32
30
  function createKanban(options) {
package/dist/index.js.map CHANGED
@@ -1 +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":[]}
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":[]}
@@ -1,5 +1,5 @@
1
- import { T as KanbanService } from './planning-CcFZYdIL.js';
2
- import { K as KanbanModuleOptions } from './ports-Bn6ro2FB.js';
1
+ import { T as KanbanService } from './planning-CHrOqQ6b.js';
2
+ import { K as KanbanModuleOptions } from './ports-B0McVg7B.js';
3
3
 
4
4
  /** Optional host-owned service; no timer or model calls are started implicitly. */
5
5
  declare function createKanbanModule(options: KanbanModuleOptions): KanbanModuleHandle;
@@ -1,5 +1,5 @@
1
- import { T as KanbanService } from './planning-CcFZYdIL.cjs';
2
- import { K as KanbanModuleOptions } from './ports-CaL6geqR.cjs';
1
+ import { T as KanbanService } from './planning-CHrOqQ6b.cjs';
2
+ import { K as KanbanModuleOptions } from './ports-GQy0x-RI.cjs';
3
3
 
4
4
  /** Optional host-owned service; no timer or model calls are started implicitly. */
5
5
  declare function createKanbanModule(options: KanbanModuleOptions): KanbanModuleHandle;
@@ -144,10 +144,10 @@ interface KanbanBoardControl {
144
144
  controls: Record<string, string>;
145
145
  }
146
146
  /** Manual mode still honors an explicit per-task run request. */
147
- declare function boardAllowsStart(board: Pick<KanbanBoard, 'executionControl'>, item?: Pick<KanbanItem, 'launch'>): boolean;
148
- declare function boardControlPhase(board: Pick<KanbanBoard, 'executionControl'> & {
147
+ declare function boardAllowsStart(board: Pick<KanbanBoard, 'executionControl' | 'lifecycle'>, item?: Pick<KanbanItem, 'launch'>): boolean;
148
+ declare function boardControlPhase(board: Pick<KanbanBoard, 'executionControl' | 'lifecycle'> & {
149
149
  items: Array<Pick<KanbanItem, 'id' | 'status' | 'control'>>;
150
- }): 'automatic' | 'manual' | 'pausing' | 'paused' | 'resuming' | 'error';
150
+ }): 'automatic' | 'manual' | 'pausing' | 'paused' | 'resuming' | 'error' | 'cancelling' | 'cancelled' | 'waiting-deletion';
151
151
 
152
152
  interface KanbanLaunch {
153
153
  mode?: 'automatic' | 'manual';
@@ -164,8 +164,8 @@ interface KanbanLaunch {
164
164
  interface KanbanTaskControl {
165
165
  id: string;
166
166
  dispatchId?: string;
167
- action: 'pause' | 'resume';
168
- state: 'requested' | 'accepted' | 'paused' | 'resumed' | 'failed' | 'unknown';
167
+ action: 'pause' | 'resume' | 'cancel';
168
+ state: 'requested' | 'accepted' | 'paused' | 'resumed' | 'cancelled' | 'failed' | 'unknown';
169
169
  code?: string;
170
170
  }
171
171
  interface KanbanTaskIssue {
@@ -174,14 +174,14 @@ interface KanbanTaskIssue {
174
174
  type: 'clarification' | 'error';
175
175
  resolvedBy?: string;
176
176
  }
177
- type KanbanTaskPhase = 'waiting-start' | 'analyzing' | 'queued' | 'waiting-dependency' | 'preparing' | 'running' | 'pausing' | 'paused' | 'resuming' | 'waiting-input' | 'error' | 'review' | 'completed' | 'cancelled' | 'unknown';
177
+ type KanbanTaskPhase = 'waiting-start' | 'analyzing' | 'queued' | 'waiting-dependency' | 'preparing' | 'running' | 'cancelling' | 'pausing' | 'paused' | 'resuming' | 'waiting-input' | 'error' | 'review' | 'completed' | 'cancelled' | 'unknown';
178
178
  interface KanbanTaskProjection {
179
179
  phase: KanbanTaskPhase;
180
180
  reason?: string;
181
181
  startAt?: number;
182
182
  sessionId?: string;
183
183
  dispatchId?: string;
184
- actions: Array<'run' | 'edit' | 'cancel' | 'pause' | 'resume' | 'fix' | 'open-session' | 'resolve' | 'review'>;
184
+ actions: Array<'delete' | 'run' | 'edit' | 'cancel' | 'pause' | 'resume' | 'fix' | 'open-session' | 'resolve' | 'review'>;
185
185
  }
186
186
  type KanbanTaskCommand = {
187
187
  type: 'begin-edit';
@@ -226,7 +226,7 @@ type KanbanTaskCommand = {
226
226
  type: 'request-control';
227
227
  itemId: string;
228
228
  controlId: string;
229
- action: 'pause' | 'resume';
229
+ action: 'pause' | 'resume' | 'cancel';
230
230
  } | {
231
231
  type: 'control-receipt';
232
232
  itemId: string;
@@ -245,11 +245,12 @@ type KanbanTaskCommand = {
245
245
  resolvedBy: string;
246
246
  };
247
247
  interface KanbanFixSession {
248
+ code?: string;
248
249
  id: string;
249
250
  boardId: string;
250
251
  itemId: string;
251
252
  sessionId: string;
252
- state: 'clarifying' | 'frozen' | 'accepted';
253
+ state: 'clarifying' | 'frozen' | 'accepted' | 'cancelling' | 'cancelled';
253
254
  createdItemId?: string;
254
255
  }
255
256
 
@@ -325,7 +326,8 @@ interface KanbanProjectRecord {
325
326
  title: string;
326
327
  content: string;
327
328
  rationale?: string;
328
- status: 'draft' | 'confirmed' | 'rejected' | 'superseded';
329
+ deletedAt?: number;
330
+ status: 'draft' | 'confirmed' | 'rejected' | 'superseded' | 'cancelling' | 'cancelled';
329
331
  itemIds: string[];
330
332
  sources: KanbanSourceRef[];
331
333
  author: KanbanPrincipal;
@@ -342,6 +344,7 @@ type KanbanRecordSummary = Omit<KanbanProjectRecord, 'content' | 'rationale' | '
342
344
  sessionIds: string[];
343
345
  };
344
346
  interface KanbanRecordQuery {
347
+ includeDeleted?: boolean;
345
348
  kind?: KanbanProjectRecord['kind'];
346
349
  itemId?: string;
347
350
  status?: KanbanProjectRecord['status'];
@@ -404,6 +407,7 @@ interface KanbanItem {
404
407
  analysis?: KanbanAnalysisStatus;
405
408
  control?: KanbanTaskControl;
406
409
  issues?: KanbanTaskIssue[];
410
+ deletedAt?: number;
407
411
  number?: number;
408
412
  origin?: {
409
413
  kind: 'direct' | 'discovery';
@@ -448,6 +452,13 @@ interface KanbanItem {
448
452
  closureReason?: string;
449
453
  }
450
454
  interface KanbanBoard {
455
+ lifecycle?: {
456
+ operationId: string;
457
+ intent: 'cancel' | 'delete';
458
+ mode: 'drain' | 'cancel';
459
+ phase: 'waiting' | 'ready' | 'blocked';
460
+ code?: string;
461
+ };
451
462
  /** Logical deletion retains audit, Session and resource associations. */
452
463
  deletedAt?: number;
453
464
  executionControl?: KanbanBoardControl;
@@ -508,6 +519,28 @@ interface KanbanEvent {
508
519
  };
509
520
  }
510
521
  type KanbanCommand = KanbanTaskCommand | KanbanWorkflowCommand | {
522
+ type: 'delete-item';
523
+ itemId: string;
524
+ } | {
525
+ type: 'request-record-cancellation';
526
+ recordId: string;
527
+ } | {
528
+ type: 'cancel-record';
529
+ recordId: string;
530
+ } | {
531
+ type: 'delete-record';
532
+ recordId: string;
533
+ } | {
534
+ type: 'request-board-stop';
535
+ controlId: string;
536
+ intent: 'cancel' | 'delete';
537
+ mode: 'drain' | 'cancel';
538
+ } | {
539
+ type: 'observe-board-stop';
540
+ controlId: string;
541
+ phase: 'waiting' | 'ready' | 'blocked';
542
+ code?: string;
543
+ } | {
511
544
  type: 'delete-board';
512
545
  } | {
513
546
  type: 'set-board-control';
@@ -770,6 +803,7 @@ interface KanbanPlanning {
770
803
  references: string[];
771
804
  }
772
805
  interface KanbanItemSummary {
806
+ deletedAt?: number;
773
807
  launch?: KanbanLaunch;
774
808
  analysis?: KanbanAnalysisStatus;
775
809
  control?: KanbanTaskControl;
@@ -804,6 +838,7 @@ interface KanbanArchivedItem {
804
838
  reason: string;
805
839
  }
806
840
  interface KanbanItemQuery {
841
+ includeDeleted?: boolean;
807
842
  phase?: KanbanTaskPhase;
808
843
  view?: 'ready' | 'backlog' | 'in-progress' | 'review' | 'closed' | 'proposed' | 'archive' | 'all';
809
844
  area?: string;
@@ -144,10 +144,10 @@ interface KanbanBoardControl {
144
144
  controls: Record<string, string>;
145
145
  }
146
146
  /** Manual mode still honors an explicit per-task run request. */
147
- declare function boardAllowsStart(board: Pick<KanbanBoard, 'executionControl'>, item?: Pick<KanbanItem, 'launch'>): boolean;
148
- declare function boardControlPhase(board: Pick<KanbanBoard, 'executionControl'> & {
147
+ declare function boardAllowsStart(board: Pick<KanbanBoard, 'executionControl' | 'lifecycle'>, item?: Pick<KanbanItem, 'launch'>): boolean;
148
+ declare function boardControlPhase(board: Pick<KanbanBoard, 'executionControl' | 'lifecycle'> & {
149
149
  items: Array<Pick<KanbanItem, 'id' | 'status' | 'control'>>;
150
- }): 'automatic' | 'manual' | 'pausing' | 'paused' | 'resuming' | 'error';
150
+ }): 'automatic' | 'manual' | 'pausing' | 'paused' | 'resuming' | 'error' | 'cancelling' | 'cancelled' | 'waiting-deletion';
151
151
 
152
152
  interface KanbanLaunch {
153
153
  mode?: 'automatic' | 'manual';
@@ -164,8 +164,8 @@ interface KanbanLaunch {
164
164
  interface KanbanTaskControl {
165
165
  id: string;
166
166
  dispatchId?: string;
167
- action: 'pause' | 'resume';
168
- state: 'requested' | 'accepted' | 'paused' | 'resumed' | 'failed' | 'unknown';
167
+ action: 'pause' | 'resume' | 'cancel';
168
+ state: 'requested' | 'accepted' | 'paused' | 'resumed' | 'cancelled' | 'failed' | 'unknown';
169
169
  code?: string;
170
170
  }
171
171
  interface KanbanTaskIssue {
@@ -174,14 +174,14 @@ interface KanbanTaskIssue {
174
174
  type: 'clarification' | 'error';
175
175
  resolvedBy?: string;
176
176
  }
177
- type KanbanTaskPhase = 'waiting-start' | 'analyzing' | 'queued' | 'waiting-dependency' | 'preparing' | 'running' | 'pausing' | 'paused' | 'resuming' | 'waiting-input' | 'error' | 'review' | 'completed' | 'cancelled' | 'unknown';
177
+ type KanbanTaskPhase = 'waiting-start' | 'analyzing' | 'queued' | 'waiting-dependency' | 'preparing' | 'running' | 'cancelling' | 'pausing' | 'paused' | 'resuming' | 'waiting-input' | 'error' | 'review' | 'completed' | 'cancelled' | 'unknown';
178
178
  interface KanbanTaskProjection {
179
179
  phase: KanbanTaskPhase;
180
180
  reason?: string;
181
181
  startAt?: number;
182
182
  sessionId?: string;
183
183
  dispatchId?: string;
184
- actions: Array<'run' | 'edit' | 'cancel' | 'pause' | 'resume' | 'fix' | 'open-session' | 'resolve' | 'review'>;
184
+ actions: Array<'delete' | 'run' | 'edit' | 'cancel' | 'pause' | 'resume' | 'fix' | 'open-session' | 'resolve' | 'review'>;
185
185
  }
186
186
  type KanbanTaskCommand = {
187
187
  type: 'begin-edit';
@@ -226,7 +226,7 @@ type KanbanTaskCommand = {
226
226
  type: 'request-control';
227
227
  itemId: string;
228
228
  controlId: string;
229
- action: 'pause' | 'resume';
229
+ action: 'pause' | 'resume' | 'cancel';
230
230
  } | {
231
231
  type: 'control-receipt';
232
232
  itemId: string;
@@ -245,11 +245,12 @@ type KanbanTaskCommand = {
245
245
  resolvedBy: string;
246
246
  };
247
247
  interface KanbanFixSession {
248
+ code?: string;
248
249
  id: string;
249
250
  boardId: string;
250
251
  itemId: string;
251
252
  sessionId: string;
252
- state: 'clarifying' | 'frozen' | 'accepted';
253
+ state: 'clarifying' | 'frozen' | 'accepted' | 'cancelling' | 'cancelled';
253
254
  createdItemId?: string;
254
255
  }
255
256
 
@@ -325,7 +326,8 @@ interface KanbanProjectRecord {
325
326
  title: string;
326
327
  content: string;
327
328
  rationale?: string;
328
- status: 'draft' | 'confirmed' | 'rejected' | 'superseded';
329
+ deletedAt?: number;
330
+ status: 'draft' | 'confirmed' | 'rejected' | 'superseded' | 'cancelling' | 'cancelled';
329
331
  itemIds: string[];
330
332
  sources: KanbanSourceRef[];
331
333
  author: KanbanPrincipal;
@@ -342,6 +344,7 @@ type KanbanRecordSummary = Omit<KanbanProjectRecord, 'content' | 'rationale' | '
342
344
  sessionIds: string[];
343
345
  };
344
346
  interface KanbanRecordQuery {
347
+ includeDeleted?: boolean;
345
348
  kind?: KanbanProjectRecord['kind'];
346
349
  itemId?: string;
347
350
  status?: KanbanProjectRecord['status'];
@@ -404,6 +407,7 @@ interface KanbanItem {
404
407
  analysis?: KanbanAnalysisStatus;
405
408
  control?: KanbanTaskControl;
406
409
  issues?: KanbanTaskIssue[];
410
+ deletedAt?: number;
407
411
  number?: number;
408
412
  origin?: {
409
413
  kind: 'direct' | 'discovery';
@@ -448,6 +452,13 @@ interface KanbanItem {
448
452
  closureReason?: string;
449
453
  }
450
454
  interface KanbanBoard {
455
+ lifecycle?: {
456
+ operationId: string;
457
+ intent: 'cancel' | 'delete';
458
+ mode: 'drain' | 'cancel';
459
+ phase: 'waiting' | 'ready' | 'blocked';
460
+ code?: string;
461
+ };
451
462
  /** Logical deletion retains audit, Session and resource associations. */
452
463
  deletedAt?: number;
453
464
  executionControl?: KanbanBoardControl;
@@ -508,6 +519,28 @@ interface KanbanEvent {
508
519
  };
509
520
  }
510
521
  type KanbanCommand = KanbanTaskCommand | KanbanWorkflowCommand | {
522
+ type: 'delete-item';
523
+ itemId: string;
524
+ } | {
525
+ type: 'request-record-cancellation';
526
+ recordId: string;
527
+ } | {
528
+ type: 'cancel-record';
529
+ recordId: string;
530
+ } | {
531
+ type: 'delete-record';
532
+ recordId: string;
533
+ } | {
534
+ type: 'request-board-stop';
535
+ controlId: string;
536
+ intent: 'cancel' | 'delete';
537
+ mode: 'drain' | 'cancel';
538
+ } | {
539
+ type: 'observe-board-stop';
540
+ controlId: string;
541
+ phase: 'waiting' | 'ready' | 'blocked';
542
+ code?: string;
543
+ } | {
511
544
  type: 'delete-board';
512
545
  } | {
513
546
  type: 'set-board-control';
@@ -770,6 +803,7 @@ interface KanbanPlanning {
770
803
  references: string[];
771
804
  }
772
805
  interface KanbanItemSummary {
806
+ deletedAt?: number;
773
807
  launch?: KanbanLaunch;
774
808
  analysis?: KanbanAnalysisStatus;
775
809
  control?: KanbanTaskControl;
@@ -804,6 +838,7 @@ interface KanbanArchivedItem {
804
838
  reason: string;
805
839
  }
806
840
  interface KanbanItemQuery {
841
+ includeDeleted?: boolean;
807
842
  phase?: KanbanTaskPhase;
808
843
  view?: 'ready' | 'backlog' | 'in-progress' | 'review' | 'closed' | 'proposed' | 'archive' | 'all';
809
844
  area?: string;
@@ -1,5 +1,5 @@
1
- import { q as KanbanDiscoveryChange, N as KanbanRecordInput, S as KanbanRequest, T as KanbanService, j as KanbanBoard, W as KanbanSuggestionKind, V as KanbanSuggestion, d as KanbanArtifactRef, a7 as KanbanWorkflowState, J as KanbanProjectRecord, z as KanbanItemSummary, c as KanbanArchivedItem, t as KanbanEvent, Q as KanbanRecordSummary, K as KanbanActor, o as KanbanCommand, w as KanbanItem } from './planning-CcFZYdIL.js';
2
- import { b as KanbanScanInput, d as KanbanScanSession, e as KanbanScanText, K as KanbanDiscoveryResult, c as KanbanScanPolicy } from './discovery-gSqWpuRm.js';
1
+ import { q as KanbanDiscoveryChange, N as KanbanRecordInput, S as KanbanRequest, T as KanbanService, j as KanbanBoard, W as KanbanSuggestionKind, V as KanbanSuggestion, d as KanbanArtifactRef, a7 as KanbanWorkflowState, J as KanbanProjectRecord, z as KanbanItemSummary, c as KanbanArchivedItem, t as KanbanEvent, Q as KanbanRecordSummary, K as KanbanActor, o as KanbanCommand, w as KanbanItem } from './planning-CHrOqQ6b.js';
2
+ import { b as KanbanScanInput, d as KanbanScanSession, e as KanbanScanText, K as KanbanDiscoveryResult, c as KanbanScanPolicy } from './discovery-D60yrjej.js';
3
3
 
4
4
  interface KanbanDiscoveryState {
5
5
  checkpoints: Record<string, string>;
@@ -115,6 +115,7 @@ interface KanbanModuleOptions {
115
115
  }): Promise<void>;
116
116
  /** Confirm an automated owner has settled before releasing responsibility. */
117
117
  verifyDeletion?(board: KanbanBoard): Promise<void>;
118
+ verifyLifecycle?(board: KanbanBoard, command: KanbanCommand): Promise<void>;
118
119
  verifyRelease?(input: {
119
120
  actor: KanbanActor;
120
121
  board: KanbanBoard;
@@ -139,4 +140,4 @@ declare class KanbanError extends Error {
139
140
  declare class KanbanScanNotStartedError extends KanbanError {
140
141
  }
141
142
 
142
- export { type KanbanModuleOptions as K, type KanbanStore as a, type KanbanReadView as b, type KanbanState as c, type KanbanDiscoveryOptions as d, type KanbanDiscoveryState as e, type KanbanScanExecutor as f, KanbanScanNotStartedError as g, type KanbanScanSource as h, KanbanError as i };
143
+ export { type KanbanModuleOptions as K, KanbanError as a, type KanbanReadView as b, KanbanScanNotStartedError as c, type KanbanState as d, type KanbanStore as e, type KanbanDiscoveryOptions as f, type KanbanDiscoveryState as g, type KanbanScanExecutor as h, type KanbanScanSource as i };
@@ -0,0 +1,49 @@
1
+ import { u as KanbanExternalReference, J as KanbanProjectRecord } from './planning-CHrOqQ6b.cjs';
2
+
3
+ interface KanbanRuntimeDiagnostic {
4
+ operationId: string;
5
+ stage: string;
6
+ result: 'started' | 'success' | 'failure';
7
+ durationMs: number;
8
+ code?: string;
9
+ operation?: string;
10
+ boardId?: string;
11
+ itemId?: string;
12
+ count?: number;
13
+ }
14
+ interface KanbanJournalOptions {
15
+ directory?: string;
16
+ artifactScheme?: string;
17
+ diagnostic?(event: KanbanRuntimeDiagnostic): void;
18
+ }
19
+ interface KanbanReferencePolicy {
20
+ resource: string;
21
+ decision: string;
22
+ execution: string;
23
+ nativeExecution?: string;
24
+ workspace?: string;
25
+ inherit?(references: readonly KanbanExternalReference[]): KanbanExternalReference[];
26
+ }
27
+ declare const defaultReferences: KanbanReferencePolicy;
28
+ interface KanbanResourceCatalog {
29
+ system: string;
30
+ decisionSystem?: string;
31
+ list(): Promise<Array<{
32
+ reference: KanbanExternalReference;
33
+ label: string;
34
+ }>>;
35
+ validate(references: readonly KanbanExternalReference[]): Promise<void>;
36
+ }
37
+ interface KanbanWorkLogOptions {
38
+ directory?: string;
39
+ references?: KanbanReferencePolicy;
40
+ label?(stage: string): string;
41
+ diagnostic?(event: KanbanRuntimeDiagnostic): void;
42
+ onRecord?(input: {
43
+ boardId: string;
44
+ itemId: string;
45
+ record: KanbanProjectRecord;
46
+ }): Promise<void>;
47
+ }
48
+
49
+ export { type KanbanResourceCatalog as K, type KanbanRuntimeDiagnostic as a, type KanbanJournalOptions as b, type KanbanWorkLogOptions as c, type KanbanReferencePolicy as d, defaultReferences as e };
@@ -1,5 +1,5 @@
1
- import { q as KanbanDiscoveryChange, N as KanbanRecordInput, S as KanbanRequest, T as KanbanService, j as KanbanBoard, W as KanbanSuggestionKind, V as KanbanSuggestion, d as KanbanArtifactRef, a7 as KanbanWorkflowState, J as KanbanProjectRecord, z as KanbanItemSummary, c as KanbanArchivedItem, t as KanbanEvent, Q as KanbanRecordSummary, K as KanbanActor, o as KanbanCommand, w as KanbanItem } from './planning-CcFZYdIL.cjs';
2
- import { b as KanbanScanInput, d as KanbanScanSession, e as KanbanScanText, K as KanbanDiscoveryResult, c as KanbanScanPolicy } from './discovery-DxpirOz3.cjs';
1
+ import { q as KanbanDiscoveryChange, N as KanbanRecordInput, S as KanbanRequest, T as KanbanService, j as KanbanBoard, W as KanbanSuggestionKind, V as KanbanSuggestion, d as KanbanArtifactRef, a7 as KanbanWorkflowState, J as KanbanProjectRecord, z as KanbanItemSummary, c as KanbanArchivedItem, t as KanbanEvent, Q as KanbanRecordSummary, K as KanbanActor, o as KanbanCommand, w as KanbanItem } from './planning-CHrOqQ6b.cjs';
2
+ import { b as KanbanScanInput, d as KanbanScanSession, e as KanbanScanText, K as KanbanDiscoveryResult, c as KanbanScanPolicy } from './discovery-9E-LfwIw.cjs';
3
3
 
4
4
  interface KanbanDiscoveryState {
5
5
  checkpoints: Record<string, string>;
@@ -115,6 +115,7 @@ interface KanbanModuleOptions {
115
115
  }): Promise<void>;
116
116
  /** Confirm an automated owner has settled before releasing responsibility. */
117
117
  verifyDeletion?(board: KanbanBoard): Promise<void>;
118
+ verifyLifecycle?(board: KanbanBoard, command: KanbanCommand): Promise<void>;
118
119
  verifyRelease?(input: {
119
120
  actor: KanbanActor;
120
121
  board: KanbanBoard;
@@ -139,4 +140,4 @@ declare class KanbanError extends Error {
139
140
  declare class KanbanScanNotStartedError extends KanbanError {
140
141
  }
141
142
 
142
- export { type KanbanModuleOptions as K, type KanbanStore as a, type KanbanReadView as b, type KanbanState as c, type KanbanDiscoveryOptions as d, type KanbanDiscoveryState as e, type KanbanScanExecutor as f, KanbanScanNotStartedError as g, type KanbanScanSource as h, KanbanError as i };
143
+ export { type KanbanModuleOptions as K, KanbanError as a, type KanbanReadView as b, KanbanScanNotStartedError as c, type KanbanState as d, type KanbanStore as e, type KanbanDiscoveryOptions as f, type KanbanDiscoveryState as g, type KanbanScanExecutor as h, type KanbanScanSource as i };
@@ -0,0 +1,49 @@
1
+ import { u as KanbanExternalReference, J as KanbanProjectRecord } from './planning-CHrOqQ6b.js';
2
+
3
+ interface KanbanRuntimeDiagnostic {
4
+ operationId: string;
5
+ stage: string;
6
+ result: 'started' | 'success' | 'failure';
7
+ durationMs: number;
8
+ code?: string;
9
+ operation?: string;
10
+ boardId?: string;
11
+ itemId?: string;
12
+ count?: number;
13
+ }
14
+ interface KanbanJournalOptions {
15
+ directory?: string;
16
+ artifactScheme?: string;
17
+ diagnostic?(event: KanbanRuntimeDiagnostic): void;
18
+ }
19
+ interface KanbanReferencePolicy {
20
+ resource: string;
21
+ decision: string;
22
+ execution: string;
23
+ nativeExecution?: string;
24
+ workspace?: string;
25
+ inherit?(references: readonly KanbanExternalReference[]): KanbanExternalReference[];
26
+ }
27
+ declare const defaultReferences: KanbanReferencePolicy;
28
+ interface KanbanResourceCatalog {
29
+ system: string;
30
+ decisionSystem?: string;
31
+ list(): Promise<Array<{
32
+ reference: KanbanExternalReference;
33
+ label: string;
34
+ }>>;
35
+ validate(references: readonly KanbanExternalReference[]): Promise<void>;
36
+ }
37
+ interface KanbanWorkLogOptions {
38
+ directory?: string;
39
+ references?: KanbanReferencePolicy;
40
+ label?(stage: string): string;
41
+ diagnostic?(event: KanbanRuntimeDiagnostic): void;
42
+ onRecord?(input: {
43
+ boardId: string;
44
+ itemId: string;
45
+ record: KanbanProjectRecord;
46
+ }): Promise<void>;
47
+ }
48
+
49
+ export { type KanbanResourceCatalog as K, type KanbanRuntimeDiagnostic as a, type KanbanJournalOptions as b, type KanbanWorkLogOptions as c, type KanbanReferencePolicy as d, defaultReferences as e };