@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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/planning.ts","../src/amendments.ts","../src/project-records.ts","../src/board.ts","../src/storage-codec.ts","../src/numbering.ts","../src/archives.ts","../src/planning-commands.ts","../src/workflow-plans.ts","../src/task-commands.ts","../src/board-control.ts","../src/scan-commit.ts","../src/automation.ts","../src/workflow-continuation.ts","../src/workflow.ts","../src/transitions.ts","../src/reducer.ts"],"sourcesContent":["import type {KanbanItem, KanbanItemSummary, KanbanPlanning} from './contracts';\nimport type {KanbanState} from './ports';\nimport {workType, executable} from './configuration';\nimport {identity, requireValue, text} from './rules';\n\nexport function plan(item: KanbanItem): KanbanPlanning {\n return item.planning ?? {kind: 'task', priority: 2, dependencies: [], references: []};\n}\nexport function summary(item: KanbanItem): KanbanItemSummary {\n return {launch:item.launch, analysis:item.analysis, control:item.control, issues:item.issues, blocked:item.blocked, id: item.id, number: item.number, title: item.title, status: item.status, revision: item.revision, createdAt: item.createdAt,\n updatedAt: item.updatedAt, discoveryFingerprint: item.origin?.fingerprint, pendingAmendments: item.amendments?.filter(proposal => proposal.status === 'pending').length, externalRefs: item.externalRefs, closedAt: item.closedAt, planning: plan(item), sessionIds: item.participants.map(p => p.sessionId)};\n}\nexport function terminal(item: Pick<KanbanItem, 'status'>): boolean {return item.status === 'completed' || item.status === 'cancelled';}\nexport function catalog(state: KanbanState): KanbanItemSummary[] {return [...state.board.items.map(summary), ...(state.archiveIndex ?? [])];}\nexport function limits(state: KanbanState) {\n const p = state.board.policy;\n return {ready: p.maxReady ?? 20, inProgress: p.maxInProgress ?? 3, perAgent: p.maxInProgressPerAssignee ?? p.maxInProgressPerAgent ?? 1, perAssignee: p.maxInProgressPerAssignee ?? p.maxInProgressPerAgent ?? 1};\n}\nexport function validatePlan(state: KanbanState, item: KanbanItem, value: KanbanPlanning): void {\n requireValue(typeof value.kind === 'string' && Number.isInteger(value.priority) && value.priority >= 0 && value.priority <= 4, 'INVALID_PLANNING');\n requireValue(Array.isArray(value.dependencies) && value.dependencies.length <= 100 && Array.isArray(value.references) && value.references.length <= 100, 'PLANNING_LIMIT');\n value.dependencies.forEach(identity); value.references.forEach(text);\n if (value.area !== undefined) identity(value.area); if (value.milestone !== undefined) identity(value.milestone);\n requireValue(value.execution===undefined||['direct','children'].includes(value.execution),'INVALID_EXECUTION_MODE');\n const type = workType(state.board, value.kind);\n if (value.dueAt !== undefined) requireValue(Number.isFinite(value.dueAt) && value.dueAt >= 0, 'INVALID_DUE_DATE');\n const all = catalog(state), parent = all.find(i => i.id === value.parentId);\n if (value.parentId) {\n identity(value.parentId); requireValue(parent && !parent.archivedAt && !terminal(parent) && !['claimed','review'].includes(parent.status), 'PARENT_UNAVAILABLE');\n requireValue(parent.id !== item.id && workType(state.board, parent.planning.kind).rank < type.rank, 'INVALID_PARENT_KIND');\n }\n requireValue(value.execution==='children'||!all.some(child=>child.planning.parentId===item.id),'CHILDREN_REQUIRE_AGGREGATION');\n requireValue(!all.some(child => child.planning.parentId === item.id && workType(state.board, child.planning.kind).rank <= type.rank), 'INVALID_CHILD_KIND');\n for (const id of value.dependencies) requireValue(id !== item.id && all.some(i => i.id === id), 'INVALID_DEPENDENCY');\n const visited = new Set<string>(), pending = [...value.dependencies];\n while (pending.length) {\n const id = pending.pop()!; requireValue(id !== item.id, 'DEPENDENCY_CYCLE');\n if (visited.has(id)) continue; visited.add(id);\n pending.push(...(all.find(i => i.id === id)?.planning.dependencies ?? []));\n }\n}\nexport function assertReady(state: KanbanState, item: KanbanItem): void {\n requireValue(executable(state.board, item), 'PLAN_NOT_EXECUTABLE');\n requireValue(!item.blocked, 'ITEM_BLOCKED');\n const all = catalog(state);\n requireValue(plan(item).dependencies.every(id => all.find(i => i.id === id)?.status === 'completed'), 'DEPENDENCIES_UNFINISHED');\n}\nexport function setStage(state: KanbanState, item: KanbanItem, stage: 'backlog' | 'open', now: number): void {\n requireValue(['proposed', 'backlog', 'open'].includes(item.status), 'ITEM_NOT_PLANNABLE');\n requireValue(stage === 'backlog' || stage === 'open', 'INVALID_STAGE');\n if (stage === 'open') {\n assertReady(state, item);\n requireValue(item.status === 'open' || state.board.items.filter(i => i.status === 'open').length < limits(state).ready, 'READY_LIMIT');\n }\n item.status = stage; item.readyAt = now; item.updatedAt = now; item.revision++;\n}\n\nexport function automaticStage(state: KanbanState, item: KanbanItem): 'open' | 'backlog' {\n const all = catalog(state);\n const dependenciesComplete = plan(item).dependencies.every(id => all.find(i => i.id === id)?.status === 'completed');\n return executable(state.board, item) && !item.blocked && dependenciesComplete && state.board.items.filter(i => i.status === 'open').length < limits(state).ready ? 'open' : 'backlog';\n}\n","import {plan} from './planning';\nimport {sha256HexSync} from './utils';\nimport type {KanbanActor, KanbanBoard, KanbanCommand, KanbanDiscoveryChange, KanbanItem, KanbanText} from './contracts';\nimport {identity, requireValue, text} from './rules';\nimport {principal, principalKey} from './identity';\nexport const textOf = (item: KanbanText): KanbanText => ({title: item.title, responsibility: item.responsibility, acceptance: item.acceptance});\nexport const textDigest = (item: KanbanText): string => sha256HexSync(JSON.stringify(textOf(item)));\nexport function workFingerprint(item: KanbanItem): string {\n const planning = plan(item);\n return sha256HexSync(JSON.stringify({text: textOf(item), kind: planning.kind, parentId: planning.parentId ?? null,\n area: planning.area ?? null, milestone: planning.milestone ?? null, priority: planning.priority,\n dependencies: [...planning.dependencies].sort(), dueAt: planning.dueAt ?? null}));\n}\nexport function validateSources(sources: KanbanDiscoveryChange['sources']): void {\n requireValue(Array.isArray(sources) && sources.length <= 100, 'SOURCE_LIMIT');\n for (const source of sources) {\n identity(source.sessionId); identity(source.messageId); identity(source.revision);\n requireValue(source.role === 'user' || source.role === 'assistant', 'INVALID_SOURCE');\n }\n}\nexport function proposeAmendment(item: KanbanItem, change: KanbanDiscoveryChange, actor: KanbanActor, now: number, runId: string): void {\n text(change.title); text(change.responsibility); text(change.acceptance); validateSources(change.sources);\n const proposed = textOf(change), fingerprint = textDigest(proposed);\n if (textDigest(item) === fingerprint || item.amendments?.some(p => p.fingerprint === fingerprint)) return;\n requireValue((item.amendments?.length ?? 0) < 20, 'AMENDMENT_LIMIT');\n (item.amendments ??= []).push({runId, id: `amendment-${sha256HexSync(JSON.stringify([runId, item.id, fingerprint]))}`, fingerprint,\n baseRevision: item.revision, baseDigest: textDigest(item), proposed, proposedBy: principal(actor), sources: structuredClone(change.sources),\n createdAt: now, status: 'pending'});\n}\nexport function requireReviewer(board: KanbanBoard, actor: KanbanActor): void {\n const key = principalKey(principal(actor));\n requireValue(board.members?.some(m => principalKey(m) === key && m.roles?.some(role => role === 'coordinator' || role === 'reviewer')),\n 'REVIEWER_REQUIRED');\n}\nexport function reviewAmendment(board: KanbanBoard, command: Extract<KanbanCommand, {type: 'review-amendment'}>, actor: KanbanActor, now: number): void {\n requireReviewer(board, actor);\n const item = board.items.find(i => i.id === command.itemId), proposal = item?.amendments?.find(p => p.id === command.amendmentId);\n requireValue(item && proposal?.status === 'pending', 'AMENDMENT_NOT_PENDING');\n if (command.accept) {\n requireValue(principal(actor).kind === 'human' || principalKey(proposal.proposedBy) !== principalKey(principal(actor)), 'INDEPENDENT_REVIEW_REQUIRED');\n requireValue(['proposed', 'backlog', 'open'].includes(item.status), 'ITEM_NOT_PLANNABLE');\n requireValue(textDigest(item) === proposal.baseDigest, 'AMENDMENT_STALE');\n Object.assign(item, proposal.proposed);\n if (item.status === 'open') {item.status = 'backlog'; item.readyAt = now;}\n } else {requireValue(!!command.reason?.trim(), 'AMENDMENT_REASON_REQUIRED'); text(command.reason!);}\n proposal.status = command.accept ? 'accepted' : 'rejected'; proposal.reviewedAt = now; proposal.reviewedBy = principal(actor); proposal.reason = command.reason;\n item.updatedAt = now; item.revision++;\n}\n","import {sha256HexSync} from './utils';\nimport type {KanbanActor, KanbanCommand, KanbanProjectRecord, KanbanRecordPage, KanbanRecordQuery} from './contracts';\nimport type {KanbanState} from './ports';\nimport {identity, requireValue, text} from './rules';\nimport {principal, principalKey} from './identity';\nimport {requireReviewer, validateSources} from './amendments';\nexport type RecordCommand = Extract<KanbanCommand, {type: 'append-record' | 'review-record' | 'link-record'}>;\nexport function isRecordCommand(command: KanbanCommand): command is RecordCommand {\n return ['append-record', 'review-record', 'link-record'].includes(command.type);\n}\nexport function applyRecord(state: KanbanState, command: RecordCommand, actor: KanbanActor, now: number, forceDraft = false): void {\n if (command.type === 'append-record') {append(state, command, actor, now, forceDraft); return;}\n const record = state.records?.find(record => record.id === command.recordId); requireValue(record, 'RECORD_NOT_FOUND');\n if (command.type === 'link-record') {\n validateItems(state, [command.itemId]);\n if (!record.itemIds.includes(command.itemId)) {requireValue(record.itemIds.length < 100, 'RECORD_LINK_LIMIT'); record.itemIds.push(command.itemId);}\n } else {\n requireReviewer(state.board, actor); requireValue(record.status === 'draft', 'RECORD_NOT_DRAFT');\n if (command.accept) {\n requireValue(principal(actor).kind === 'human' || principalKey(record.author) !== principalKey(principal(actor)), 'INDEPENDENT_REVIEW_REQUIRED');\n supersede(state, record, now); record.status = 'confirmed';\n } else record.status = 'rejected';\n record.reviewedBy = principal(actor);\n }\n record.updatedAt = now; record.revision++;\n}\nfunction append(state: KanbanState, command: Extract<RecordCommand, {type: 'append-record'}>, actor: KanbanActor, now: number, forceDraft: boolean): void {\n validateSources(command.record.sources);\n const {id, kind, title, content, rationale, itemIds, sources, supersedes, coordination, externalRefs} = command.record;\n const input = structuredClone({id, kind, title, content, rationale, itemIds, sources: sources.map(source => ({sessionId: source.sessionId, messageId: source.messageId, revision: source.revision, role: source.role})), supersedes, ...(coordination ? {coordination}: {}), ...(externalRefs ? {externalRefs} : {})}); identity(input.id); text(input.title); text(input.content);\n validateRecordReferences(externalRefs);\n requireValue(input.kind === 'log' || input.kind === 'decision', 'INVALID_RECORD_KIND');\n requireValue(!state.records?.some(record => record.id === input.id), 'RECORD_EXISTS');\n requireValue((state.records?.length ?? 0) < 200, 'RECORD_LIMIT'); validateItems(state, input.itemIds); validateSources(input.sources);\n if (input.rationale !== undefined) text(input.rationale);\n if (input.kind === 'decision') text(input.rationale ?? '');\n if (coordination) validateCoordination(state, input);\n if (input.supersedes) {identity(input.supersedes); requireValue(input.kind === 'decision' && input.supersedes !== input.id\n && state.records?.some(record => record.id === input.supersedes && record.kind === 'decision' && record.status === 'confirmed'), 'INVALID_SUPERSEDED_RECORD');}\n const author = principal(actor), manual = author.kind === 'human' && !forceDraft;\n (state.records ??= []).push({...input, author, origin: manual ? 'manual' : 'flow',\n status: manual && input.kind === 'log' ? 'confirmed' : 'draft', revision: 1, createdAt: now, updatedAt: now});\n}\nfunction validateCoordination(state: KanbanState, input: import('./contracts').KanbanRecordInput): void {\n requireValue(input.kind === 'decision', 'DECISION_COORDINATION_ONLY');\n for (const owner of [input.coordination!.manager, input.coordination!.executor].filter(Boolean)) {\n requireValue(owner && ['agent','human','service'].includes(owner.kind), 'INVALID_PRINCIPAL');identity(owner.id);\n const member=state.board.members?.find(member=>principalKey(member)===principalKey(owner));\n requireValue(member, 'ASSIGNEE_NOT_REGISTERED');\n if(owner===input.coordination!.manager) requireValue(member.roles?.includes('coordinator'), 'COORDINATOR_REQUIRED');\n }\n}\nfunction validateItems(state: KanbanState, ids: string[]): void {\n requireValue(Array.isArray(ids) && ids.length <= 100 && new Set(ids).size === ids.length, 'RECORD_LINK_LIMIT');\n for (const id of ids) {identity(id); requireValue(state.board.items.some(item => item.id === id) || state.archiveIndex?.some(item => item.id === id), 'ITEM_NOT_FOUND');}\n}\nfunction supersede(state: KanbanState, record: KanbanProjectRecord, now: number): void {\n if (!record.supersedes) return;\n const previous = state.records?.find(entry => entry.id === record.supersedes);\n requireValue(previous?.kind === 'decision' && previous.status === 'confirmed', 'SUPERSEDED_RECORD_CHANGED');\n previous.status = 'superseded'; previous.supersededBy = record.id; previous.revision++; previous.updatedAt = now;\n}\nexport function queryRecords(state: KanbanState, query: KanbanRecordQuery = {}, summaries = (state.records ?? []).map(recordSummary)): KanbanRecordPage {\n const {cursor, ...filter} = query, limit = query.limit ?? 50;\n requireValue(Number.isSafeInteger(limit) && limit > 0 && limit <= 200, 'INVALID_LIMIT');\n if (query.kind) requireValue(['log', 'decision'].includes(query.kind), 'INVALID_RECORD_KIND');\n if (query.itemId !== undefined) identity(query.itemId);\n if (query.status) requireValue(['draft', 'confirmed', 'rejected', 'superseded'].includes(query.status), 'INVALID_RECORD_STATUS');\n const digest = sha256HexSync(JSON.stringify(filter)); let offset = 0;\n if (cursor) {\n let decoded; try {decoded = JSON.parse(decodeURIComponent(cursor));} catch {requireValue(false, 'INVALID_CURSOR');}\n requireValue(decoded && typeof decoded === 'object' && !Array.isArray(decoded) && typeof decoded.filter === 'string'\n && typeof decoded.revision === 'number', 'INVALID_CURSOR');\n requireValue(decoded.revision === state.board.revision && decoded.filter === digest, 'CURSOR_STALE');\n offset = decoded.offset; requireValue(Number.isSafeInteger(offset) && offset >= 0, 'INVALID_CURSOR');\n }\n const matched = summaries.filter(record => (!query.kind || query.kind === record.kind)\n && (!query.itemId || record.itemIds.includes(query.itemId)) && (!query.status || query.status === record.status))\n .sort((a, b) => b.createdAt - a.createdAt || a.id.localeCompare(b.id));\n const items = matched.slice(offset, offset + limit);\n return {revision: state.board.revision, total: matched.length, items, ...(offset + limit < matched.length\n ? {nextCursor: encodeURIComponent(JSON.stringify({revision: state.board.revision, filter: digest, offset: offset + limit}))} : {})};\n}\n\nexport function recordFingerprint(record: import('./contracts').KanbanRecordInput): string {\n return sha256HexSync(JSON.stringify({kind: record.kind, title: record.title, content: record.content, rationale: record.rationale ?? null,\n itemIds: [...record.itemIds].sort(), sources: record.sources.map(source => JSON.stringify([source.sessionId, source.messageId, source.role])).sort(), ...(record.coordination?{coordination:record.coordination}: {}), ...(record.externalRefs ? {externalRefs: record.externalRefs} : {})}));\n}\n\nfunction validateRecordReferences(refs: import('./contracts').KanbanExternalReference[] | undefined): void {\n if (refs === undefined) return;\n requireValue(Array.isArray(refs) && refs.length <= 100, 'REFERENCE_LIMIT');\n const keys = new Set<string>();\n for (const ref of refs) {\n requireValue(ref && typeof ref === 'object', 'INVALID_REFERENCE');\n identity(ref.system); identity(ref.id); if (ref.revision !== undefined) text(ref.revision);\n const key = JSON.stringify([ref.system, ref.id]);\n requireValue(!keys.has(key), 'DUPLICATE_REFERENCE'); keys.add(key);\n }\n}\n\nexport function recordSummary(record: KanbanProjectRecord): import('./contracts').KanbanRecordSummary {\n const {content: _content, rationale: _rationale, sources, ...metadata} = record;\n return {...metadata, sessionIds: [...new Set(sources.map(source => source.sessionId))]};\n}\n","import type {KanbanActor, KanbanBoardInput} from './contracts';\nimport type {KanbanState} from './ports';\nimport {policy} from './configuration';\nimport {participant, validateBoard} from './rules';\n\nexport function createBoardState(input: KanbanBoardInput, actor: KanbanActor, now: number): KanbanState {\n const board = {...structuredClone(input), policy: policy(input.policy), revision: 1, items: [], participants: []};\n validateBoard(board);\n if (actor.sessionId) participant(board.participants, actor.sessionId, actor.agentId, 'creator', true, now);\n for (const session of board.policy.escalationSessionIds) participant(board.participants, session, undefined, 'escalation', true, now);\n return {schema: 1, board, sequence: 0, events: [], escalations: []};\n}\n","import {randomUUID, sha256HexSync} from './utils';\nimport type {KanbanItem, KanbanProjectRecord} from './contracts';\nimport {summary} from './planning';\nimport {recordSummary} from './project-records';\nimport {KanbanError, type KanbanReadView, type KanbanState} from './ports';\nimport {requireValue} from './rules';\n\nexport interface KanbanBodyStore {\n read(sha256: string): Promise<ArrayBuffer | null>;\n write(sha256: string, bytes: ArrayBuffer): Promise<void>;\n}\ninterface Manifest {itemIndex: KanbanReadView['items']; recordIndex: KanbanReadView['records']; layout: 2; generation: string; state: KanbanState; itemIds: string[]; recordIds: string[]}\ninterface BodyRef {body: 'kanban-body/v1'; sha256: string; bytes: number}\nexport interface StoredBoard {raw: string | null; rows: Record<string, string>}\nexport const boardKey = (id: string): string => `board/${encodeURIComponent(id)}`;\nexport const archiveKey = (board: string, item: string): string => `archive/${encodeURIComponent(board)}/${encodeURIComponent(item)}`;\nconst rowKey = (kind: 'item' | 'record', board: string, id: string): string => `${kind}/${encodeURIComponent(board)}/${encodeURIComponent(id)}`;\n\nexport function rowKeys(raw: string | null): string[] {\n if (raw === null) return [];\n const saved = JSON.parse(raw) as Manifest;\n if (saved.layout !== 2) return [];\n requireValue(Array.isArray(saved.itemIds) && Array.isArray(saved.recordIds) && saved.state?.board, 'INVALID_STORAGE');\n return [...saved.itemIds.map(id => rowKey('item', saved.state.board.id, id)), ...saved.recordIds.map(id => rowKey('record', saved.state.board.id, id))];\n}\nexport async function hydrate(saved: StoredBoard, bodies?: KanbanBodyStore): Promise<KanbanState | null> {\n if (saved.raw === null) return null;\n const parsed = JSON.parse(saved.raw) as Manifest;\n if (parsed.layout !== 2) return validateState(parsed as unknown as KanbanState);\n const state = validateState(parsed.state), id = state.board.id;\n state.board.items = await Promise.all(parsed.itemIds.map(async itemId => {\n const item = await decodeRow<KanbanItem>(requiredRow(saved, rowKey('item', id, itemId)), bodies);\n requireValue(item.id === itemId, 'INVALID_STORAGE'); return item;\n }));\n state.records = await Promise.all(parsed.recordIds.map(async recordId => {\n const record = await decodeRow<KanbanProjectRecord>(requiredRow(saved, rowKey('record', id, recordId)), bodies);\n requireValue(record.id === recordId, 'INVALID_STORAGE'); return record;\n }));\n return state;\n}\nexport async function encodeBoard(state: KanbanState, bodies?: KanbanBodyStore): Promise<StoredBoard> {\n const rows: Record<string, string> = {}, id = state.board.id;\n for (const item of state.board.items) rows[rowKey('item', id, item.id)] = await encodeRow(item, bodies);\n for (const record of state.records ?? []) rows[rowKey('record', id, record.id)] = await encodeRow(record, bodies);\n const manifest: Manifest = {itemIndex: state.board.items.map(summary), recordIndex: (state.records ?? []).map(recordSummary), layout: 2, generation: randomUUID(), state: {...state, board: {...state.board, items: []}, records: []},\n itemIds: state.board.items.map(item => item.id), recordIds: (state.records ?? []).map(record => record.id)};\n return {raw: JSON.stringify(manifest), rows};\n}\nexport function rowChanges(before: StoredBoard, after: StoredBoard): Array<{key: string; value: string | null}> {\n const writes = Object.entries(after.rows).filter(([key, value]) => before.rows[key] !== value).map(([key, value]) => ({key, value: value as string | null}));\n for (const key of Object.keys(before.rows)) if (!(key in after.rows)) writes.push({key, value: null});\n return writes;\n}\nexport function receiptDigest(fingerprint: string): string {return `sha256:v1:${sha256HexSync(fingerprint)}`;}\nexport function verifyReceipt(saved: string, fingerprint: string): void {\n requireValue(saved === fingerprint || saved === receiptDigest(fingerprint), 'IDEMPOTENCY_CONFLICT');\n}\nexport async function encodeRow(value: unknown, bodies?: KanbanBodyStore): Promise<string> {\n const raw = JSON.stringify(value), bytes = new TextEncoder().encode(raw);\n if (!bodies || bytes.length <= 8192) return raw;\n const ref: BodyRef = {body: 'kanban-body/v1', sha256: sha256HexSync(bytes), bytes: bytes.length};\n // Body publication precedes the referencing transaction; unreferenced files are retained.\n const existing = await bodies.read(ref.sha256);\n if (existing !== null) verifyBody(existing, ref);\n else {\n let failure: unknown;\n try {await bodies.write(ref.sha256, bytes.buffer);} catch (error) {failure = error;}\n const confirmed = await bodies.read(ref.sha256);\n if (confirmed === null) throw failure ?? new KanbanError('BODY_WRITE_UNCONFIRMED');\n verifyBody(confirmed, ref);\n }\n return JSON.stringify(ref);\n}\nexport async function decodeRow<T>(raw: string, bodies?: KanbanBodyStore): Promise<T> {\n const parsed = JSON.parse(raw) as BodyRef;\n if (parsed?.body !== 'kanban-body/v1') return parsed as T;\n requireValue(/^[a-f0-9]{64}$/.test(parsed.sha256) && Number.isSafeInteger(parsed.bytes) && parsed.bytes > 8192, 'INVALID_BODY_REFERENCE');\n requireValue(bodies, 'BODY_STORE_REQUIRED'); const bytes = await bodies.read(parsed.sha256);\n requireValue(bytes !== null, 'BODY_MISSING'); verifyBody(bytes, parsed);\n return JSON.parse(new TextDecoder('utf-8', {fatal: true}).decode(bytes)) as T;\n}\nfunction verifyBody(bytes: ArrayBuffer, ref: BodyRef): void {\n requireValue(bytes instanceof ArrayBuffer && bytes.byteLength === ref.bytes && sha256HexSync(bytes) === ref.sha256, 'BODY_INTEGRITY');\n}\nfunction requiredRow(saved: StoredBoard, key: string): string {requireValue(typeof saved.rows[key] === 'string', 'MISSING_STORAGE_ROW'); return saved.rows[key];}\nfunction validateState(state: KanbanState): KanbanState {\n requireValue(state?.schema === 1 && state.board && Array.isArray(state.board.items) && Array.isArray(state.events), 'INVALID_STORAGE'); return state;\n}\n\nexport function indexedView(raw: string | null): KanbanReadView | null {\n if (raw === null) return null;\n const parsed = JSON.parse(raw) as Manifest;\n if (parsed.layout === 2 && Array.isArray(parsed.itemIndex) && Array.isArray(parsed.recordIndex))\n return {state: validateState(parsed.state), items: parsed.itemIndex, records: parsed.recordIndex};\n return null;\n}\nexport function viewFromState(state: KanbanState): KanbanReadView {\n return {state: {...state, board: {...state.board, items: []}, records: []}, items: state.board.items.map(summary), records: (state.records ?? []).map(recordSummary)};\n}\n","import type {KanbanState} from './ports';\nimport {requireValue} from './rules';\n\nexport const boardCounterKey = 'counter/board';\nexport const boardNumberKey = (number: number): string => `reference/board/${number}`;\nexport function counter(raw: string | null): number {\n requireValue(raw === null || /^(0|[1-9]\\d*)$/.test(raw), 'INVALID_NUMBER_COUNTER');\n const value = raw === null ? 0 : Number(raw);\n requireValue(Number.isSafeInteger(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER, 'INVALID_NUMBER_COUNTER'); return value;\n}\nexport function storedBoardNumber(raw: string | null): number | undefined {\n if (raw === null) return undefined;\n const parsed = JSON.parse(raw), number = (parsed.layout === 2 ? parsed.state?.board : parsed.board)?.number;\n if (number !== undefined) requireValue(Number.isSafeInteger(number) && number > 0, 'INVALID_NUMBERING'); return number;\n}\nexport function patchBoardNumber(raw: string, number: number): string {\n const parsed = JSON.parse(raw); parsed.state.board.number = number; return JSON.stringify(parsed);\n}\n/** Counters and identities live in the board commit, including drafts and archived items. */\nexport function numberEntities(state: KanbanState): void {\n const high = state.numbering ??= {item: 0, log: 0, decision: 0};\n const items = [...state.board.items, ...(state.archiveIndex ?? []), ...(state.archiveWrites ?? []).flatMap(write => write.value ? [write.value.item] : [])];\n high.item = assign(items, high.item);\n for (const kind of ['log', 'decision'] as const) high[kind] = assign((state.records ?? []).filter(record => record.kind === kind), high[kind]);\n}\nfunction assign(rows: Array<{id: string; number?: number}>, high: number): number {\n counter(String(high)); const used = new Map<number, string>(), known = new Map<string, number>();\n for (const row of rows) if (row.number !== undefined) {\n requireValue(Number.isSafeInteger(row.number) && row.number > 0 && (!used.has(row.number) || used.get(row.number) === row.id)\n && (!known.has(row.id) || known.get(row.id) === row.number), 'INVALID_NUMBERING');\n used.set(row.number, row.id); known.set(row.id, row.number); high = Math.max(high, row.number);\n }\n for (const row of rows) if (row.number === undefined) {\n if (!known.has(row.id)) {requireValue(high < Number.MAX_SAFE_INTEGER, 'NUMBER_COUNTER_EXHAUSTED'); known.set(row.id, ++high);}\n row.number = known.get(row.id)!;\n }\n return high;\n}\n\nexport function allocateBoardNumber(raw: string | null, high: number): number {\n const known = storedBoardNumber(raw); if (known !== undefined) return known;\n requireValue(high < Number.MAX_SAFE_INTEGER, 'NUMBER_COUNTER_EXHAUSTED'); return high + 1;\n}\n","import type {KanbanArchivedItem} from './contracts';\nimport type {KanbanState} from './ports';\nimport {requireValue, text} from './rules';\nimport {summary, terminal} from './planning';\n\nexport function archiveItems(state: KanbanState, ids: string[], reason: string, now: number): void {\n text(reason); requireValue(ids.length > 0 && ids.length <= 50 && new Set(ids).size === ids.length, 'ARCHIVE_BATCH_LIMIT');\n const items = ids.map(id => state.board.items.find(i => i.id === id));\n requireValue(items.every(item => item && terminal(item)), 'ARCHIVE_REQUIRES_CLOSED_ITEM');\n for (const item of items) {\n const archived: KanbanArchivedItem = {item: item!, archivedAt: now, reason};\n (state.archiveIndex ??= []).push({...summary(item!), archivedAt: now, archiveReason: reason});\n (state.archiveWrites ??= []).push({id: item!.id, value: archived});\n }\n const selected = new Set(ids); state.board.items = state.board.items.filter(i => !selected.has(i.id));\n}\nexport function restoreItem(state: KanbanState, id: string, now: number): void {\n const record = state.restore;\n requireValue(record?.item.id === id && state.archiveIndex?.some(i => i.id === id), 'ARCHIVED_ITEM_NOT_FOUND');\n requireValue(!state.board.items.some(i => i.id === id), 'ITEM_EXISTS');\n record.item.restoredAt = now; record.item.updatedAt = now; record.item.revision++; state.board.items.push(record.item);\n state.archiveIndex = state.archiveIndex!.filter(i => i.id !== id);\n (state.archiveWrites ??= []).push({id, value: null}); delete state.restore;\n}\nexport function archiveExpired(state: KanbanState, now: number): string[] {\n const age = state.board.policy.archiveAfterMs;\n if (age === undefined) return [];\n const ids = state.board.items.filter(i => terminal(i) && now - Math.max(i.closedAt ?? i.updatedAt, i.restoredAt ?? 0) >= age).slice(0, 50).map(i => i.id);\n if (ids.length) archiveItems(state, ids, 'retention-policy', now);\n return ids;\n}\n","import {assertDefinitionEditable} from './task-commands';\nimport type {KanbanActor, KanbanCommand, KanbanExternalReference, KanbanItem} from './contracts';\nimport type {KanbanState} from './ports';\nimport {requireValue, text, identity, owned} from './rules';\nimport {catalog, setStage, terminal, validatePlan} from './planning';\nimport {executable} from './configuration';\nimport {archiveItems, restoreItem} from './archives';\n\ntype OperationalCommand = Extract<KanbanCommand, {type: 'block-item' | 'unblock-item' | 'link-reference' | 'release-item'}>;\ntype PlanCommand = Extract<KanbanCommand, {type: 'edit-item' | 'plan-item' | 'set-stage' | 'publish-proposal' | 'cancel-item' | 'close-plan'}>;\nexport type PlanningCommand = PlanCommand | OperationalCommand | Extract<KanbanCommand, {type: 'archive-items' | 'restore-item'}>;\nexport function planningCommand(command: KanbanCommand): command is PlanningCommand {\n return ['edit-item', 'plan-item', 'set-stage', 'publish-proposal', 'cancel-item', 'close-plan', 'archive-items', 'restore-item', 'block-item', 'unblock-item', 'link-reference', 'release-item'].includes(command.type);\n}\nexport function applyPlanningCommand(state: KanbanState, command: PlanningCommand, now: number, actor: KanbanActor, internal = false): void {\n if (command.type === 'archive-items') return archiveItems(state, command.itemIds, command.reason, now);\n if (command.type === 'restore-item') return restoreItem(state, command.itemId, now);\n const item = state.board.items.find(i => i.id === command.itemId); requireValue(item, 'ITEM_NOT_FOUND');\n if (isOperational(command)) operate(item, command, now, actor);\n else {\n if (!internal && ['edit-item','plan-item','review-amendment'].includes(command.type)) assertDefinitionEditable(item, now);\n updatePlan(state, item, command, now);\n }\n}\nfunction isOperational(command: PlanCommand | OperationalCommand): command is OperationalCommand {\n return ['block-item', 'unblock-item', 'link-reference', 'release-item'].includes(command.type);\n}\nfunction operate(item: KanbanItem, command: OperationalCommand, now: number, actor: KanbanActor): void {\n if (command.type === 'release-item') {\n requireValue(['claimed', 'review'].includes(item.status) && item.owner?.token === command.token, 'OWNER_MISMATCH');\n requireValue(['backlog', 'cancelled'].includes(command.next), 'INVALID_STAGE'); text(command.reason);\n item.status = command.next;\n if (command.next === 'cancelled') {item.closedAt = now; item.closureReason = command.reason;}\n delete item.owner; delete item.transfer; delete item.estimate;\n } else if (command.type === 'link-reference') attachReference(item, command.reference);\n else {\n requireValue(!terminal(item), 'ITEM_COMPLETED');\n if (item.status === 'claimed') owned(item, actor, command.token ?? '', now);\n if (command.type === 'block-item') {text(command.reason); item.blocked = {reason: command.reason, at: now};}\n else delete item.blocked;\n }\n item.updatedAt = now; item.revision++;\n}\nfunction updatePlan(state: KanbanState, item: KanbanItem, command: PlanCommand, now: number): void {\n if(command.type==='cancel-item')requireValue(item.launch?.admittedAt===undefined,'TASK_CONTROL_REQUIRED');\n if (command.type === 'publish-proposal') {\n requireValue(item.status === 'proposed', 'NOT_PROPOSED'); return setStage(state, item, command.stage ?? 'backlog', now);\n }\n if (command.type === 'set-stage') return setStage(state, item, command.stage, now);\n requireValue(['proposed', 'backlog', 'open'].includes(item.status), 'ITEM_NOT_PLANNABLE');\n if (command.type === 'edit-item') {\n text(command.title); text(command.responsibility); text(command.acceptance);\n item.title = command.title; item.responsibility = command.responsibility; item.acceptance = command.acceptance;\n if (item.status === 'open') return setStage(state, item, 'backlog', now);\n } else if (command.type === 'plan-item') {\n validatePlan(state, item, command.planning); item.planning = command.planning;\n if (item.status === 'open') return setStage(state, item, 'backlog', now);\n } else {\n requireValue(catalog(state).filter(i => i.planning.parentId === item.id).every(terminal), 'CHILDREN_UNFINISHED');\n if (command.type === 'close-plan') {\n requireValue(!executable(state.board, item), 'TASK_REQUIRES_REVIEW'); text(command.resultRef);\n const children=catalog(state).filter(child=>child.planning.parentId===item.id);\n if(item.planning?.execution==='children')requireValue(children.length>0&&children.every(child=>child.status==='completed'),'CHILDREN_UNFINISHED');\n item.status = 'completed'; item.resultRef = command.resultRef;\n } else {text(command.reason); item.status = 'cancelled'; item.closureReason = command.reason;}\n item.closedAt = now;\n }\n item.updatedAt = now; item.revision++;\n}\nexport function attachReference(item: KanbanItem, reference: KanbanExternalReference): void {\n identity(reference.system); identity(reference.id); if (reference.revision !== undefined) text(reference.revision);\n item.externalRefs ??= [];\n if (item.externalRefs.some(r => r.system === reference.system && r.id === reference.id && r.revision === reference.revision)) return;\n requireValue(item.externalRefs.length < 100, 'REFERENCE_LIMIT'); item.externalRefs.push(reference);\n}\n","import type {KanbanActor, KanbanCommand, KanbanWorkDefinition, KanbanWorkPlan, KanbanPublishedPlan} from './contracts';\nimport type {KanbanState} from './ports';\nimport {sha256HexSync} from './utils';\nimport {identity, requireValue} from './rules';\nimport {principal, principalKey, validateCandidates} from './identity';\nimport {plan as planning} from './planning';\nexport type ApplyWorkCommand = (command: KanbanCommand, actor?: KanbanActor) => void;\n\nexport function requireCoordinator(state: KanbanState, actor: KanbanActor): void {\n requireValue(state.board.members?.some(member => principalKey(member) === principalKey(principal(actor)) && member.roles?.includes('coordinator')), 'COORDINATOR_REQUIRED');\n}\nexport function publishPlan(state: KanbanState, plan: KanbanWorkPlan, actor: KanbanActor, apply: ApplyWorkCommand): void {\n requireCoordinator(state, actor); requireValue(plan && typeof plan === 'object', 'INVALID_WORK_PLAN'); identity(plan.id);\n requireValue(plan.schema === 'kanban.plan/1' && typeof plan.sealed === 'boolean' && Array.isArray(plan.items) && plan.items.length > 0 && plan.items.length <= 100, 'INVALID_WORK_PLAN');\n const workflow = state.workflow!, previous = workflow.plans[plan.id];\n requireValue(Number.isSafeInteger(plan.revision) && plan.revision === (previous?.revision ?? 0) + 1, 'PLAN_REVISION_CONFLICT');\n requireValue(!Object.values(workflow.dispatches).some(dispatch => dispatch.planId === plan.id && ['prepared','running','unknown','succeeded'].includes(dispatch.outcome)), 'PLAN_EXECUTION_UNSETTLED');\n if (plan.decisionId) {\n const decision=state.records?.find(record => record.id === plan.decisionId && record.kind === 'decision' && record.status === 'confirmed');\n requireValue(decision, 'DECISION_NOT_CONFIRMED');\n if(decision.coordination) requireValue(principalKey(decision.coordination.manager)===principalKey(principal(actor)), 'DECISION_MANAGER_REQUIRED');\n }\n if(plan.rootItemId) {\n const root=state.board.items.find(item=>item.id===plan.rootItemId);\n requireValue(root&&!root.owner&&['backlog','open'].includes(root.status),'PLAN_ROOT_UNAVAILABLE');\n if(root.planning?.execution!=='children')apply({type:'plan-item',itemId:root.id,planning:{...planning(root),execution:'children'}});\n }\n const ordered = orderWork(plan.items, state), definitions: KanbanPublishedPlan['definitions'] = {};\n for (const item of ordered) {\n const digest = sha256HexSync(JSON.stringify(item));\n requireValue(!Object.values(workflow.plans).some(other => other.id !== plan.id && other.itemIds.includes(item.id)), 'ITEM_IN_OTHER_PLAN');\n const exists=state.board.items.some(old => old.id === item.id)||state.archiveIndex?.some(old=>old.id===item.id);\n if (exists && previous?.definitions[item.id]?.digest !== digest) {\n requireValue(!previous?.definitions[item.id], 'PLAN_ITEM_CHANGED_REQUIRES_NEW_ID');\n adoptItem(state, item, apply);\n }\n if (!exists) apply({type:'create-item', item:{id:item.id,title:item.title,responsibility:item.responsibility,acceptance:item.acceptance,eligiblePrincipals:[item.assignee],externalRefs:item.externalRefs},\n planning:{kind:item.workType??state.board.defaultWorkType ?? 'task',priority:2,dependencies:item.dependsOn,references:[],...(plan.rootItemId ? {parentId:plan.rootItemId}: {})}});\n definitions[item.id] = {digest, inputs:item.inputs, outputs:item.outputs ?? []};\n }\n workflow.plans[plan.id] = {schema:plan.schema,id:plan.id,revision:plan.revision,decisionId:plan.decisionId,rootItemId:plan.rootItemId,sealed:plan.sealed,itemIds:ordered.map(item=>item.id),definitions};\n}\nfunction adoptItem(state: KanbanState, definition: KanbanWorkDefinition, apply: ApplyWorkCommand): void {\n const item = state.board.items.find(item => item.id === definition.id);\n requireValue(item && definition.expectedRevision === item.revision && ['backlog', 'open'].includes(item.status)\n && !item.owner && !item.blocked, 'PLAN_ITEM_CHANGED_REQUIRES_NEW_ID');\n requireValue(!definition.workType||definition.workType===item.planning?.kind,'PLAN_ITEM_CHANGED_REQUIRES_NEW_ID');\n requireValue(!definition.externalRefs||definition.externalRefs.every(ref=>item.externalRefs?.some(existing=>JSON.stringify(existing)===JSON.stringify(ref))),'PLAN_RESOURCE_MISMATCH');\n requireValue(item.title === definition.title && item.responsibility === definition.responsibility\n && item.acceptance === definition.acceptance, 'PLAN_ITEM_CHANGED_REQUIRES_NEW_ID');\n requireValue(planning(item).dependencies.every(id => definition.dependsOn.includes(id)), 'EXISTING_DEPENDENCY_REQUIRED');\n apply({type: 'plan-item', itemId: item.id, planning: {...planning(item), dependencies: definition.dependsOn}});\n item.eligiblePrincipals = [definition.assignee]; delete item.eligibleAgentIds;\n validateCandidates(state.board, item, true);\n}\nfunction orderWork(items: KanbanWorkDefinition[], state: KanbanState): KanbanWorkDefinition[] {\n for (const item of items) validateDefinition(item);\n const ids = new Set(items.map(item => item.id)); requireValue(ids.size === items.length, 'DUPLICATE_PLAN_ITEM');\n for (const item of items) {\n identity(item.id); requireValue(Array.isArray(item.dependsOn) && item.dependsOn.length <= 100 && new Set(item.dependsOn).size === item.dependsOn.length, 'INVALID_DEPENDENCIES');\n requireValue(Object.keys(item.inputs ?? {}).length <= 100 && Array.isArray(item.outputs ?? []) && (item.outputs ?? []).length <= 100 && new Set(item.outputs ?? []).size === (item.outputs ?? []).length, 'PLAN_BINDING_LIMIT');\n for (const name of [...Object.keys(item.inputs ?? {}), ...(item.outputs ?? [])]) requireValue(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/.test(name), 'INVALID_OUTPUT_NAME');\n for (const binding of Object.values(item.inputs ?? {})) {\n requireValue(binding && item.dependsOn.includes(binding.fromItemId) && typeof binding.output === 'string', 'INPUT_DEPENDENCY_REQUIRED');\n const producer=items.find(other=>other.id===binding.fromItemId), existing=Object.values(state.workflow!.dispatches).some(dispatch=>dispatch.itemId===binding.fromItemId&&dispatch.outcome==='accepted'&&dispatch.outputs?.some(output=>output.name===binding.output));\n requireValue(producer ? producer.outputs?.includes(binding.output) : existing, 'OUTPUT_NOT_DECLARED');\n }\n for (const dependency of item.dependsOn) requireValue(ids.has(dependency) || [...state.board.items,...(state.archiveIndex ?? [])].some(old => old.id === dependency), 'DEPENDENCY_NOT_FOUND');\n }\n const ordered: KanbanWorkDefinition[] = [], remaining = [...items], done = new Set<string>();\n while (remaining.length) {\n const next = remaining.findIndex(item => item.dependsOn.every(id => !ids.has(id) || done.has(id)));\n requireValue(next >= 0, 'DEPENDENCY_CYCLE'); const [item] = remaining.splice(next,1); ordered.push(item); done.add(item.id);\n }\n return ordered;\n}\nfunction validateDefinition(item: KanbanWorkDefinition): void {\n requireValue(item && typeof item === 'object' && !Array.isArray(item), 'INVALID_WORK_DEFINITION');\n const assignee=item.assignee;\n requireValue(assignee && ['agent','human','service'].includes(assignee.kind), 'INVALID_PRINCIPAL'); identity(assignee.id);\n if(item.inputs!==undefined) requireValue(item.inputs && typeof item.inputs==='object' && !Array.isArray(item.inputs), 'INVALID_INPUT_BINDINGS');\n if(item.outputs!==undefined) requireValue(Array.isArray(item.outputs) && item.outputs.every(name=>typeof name==='string'), 'INVALID_OUTPUT_NAMES');\n}\n","import {boardAllowsStart} from './contracts/board-control';\nimport {sha256HexSync} from './utils';\nimport type {KanbanActor, KanbanCommand, KanbanItem, KanbanTaskCommand} from './contracts';\nimport type {KanbanState} from './ports';\nimport {principal, principalKey} from './identity';\nimport {identity, requireValue, text} from './rules';\nimport {taskDue, taskEditing, taskStartAt} from './contracts/task-projection';\nimport {validatePlan, catalog} from './planning';\nimport {attachReference} from './planning-commands';\nimport {requireCoordinator} from './workflow-plans';\n\nconst types = ['set-launch-mode', 'retry-analysis', 'begin-edit', 'end-edit', 'save-edit', 'request-run', 'admit-item', 'report-analysis', 'request-control', 'control-receipt', 'report-issue', 'resolve-issue'];\nexport function taskCommand(command: KanbanCommand): command is KanbanTaskCommand {return types.includes(command.type);}\nexport function assertDefinitionEditable(item: KanbanItem, now: number, editId?: string, actor?: KanbanActor): void {\n requireValue(['proposed', 'backlog', 'open'].includes(item.status) && !item.owner && item.launch?.admittedAt === undefined, 'TASK_DEFINITION_FROZEN');\n if (taskEditing(item, now)) requireValue(item.launch!.editing!.id === editId && !!actor && principalKey(item.launch!.editing!.principal) === principalKey(principal(actor)), 'EDIT_LEASE_ACTIVE');\n}\nexport function applyTaskCommand(state: KanbanState, command: KanbanTaskCommand, actor: KanbanActor, now: number): void {\n const item = state.board.items.find(i => i.id === command.itemId); requireValue(item, 'ITEM_NOT_FOUND');\n item.launch ??= {startAt: taskStartAt(item)};\n if (['begin-edit', 'end-edit', 'save-edit'].includes(command.type)) edit(state, item, command, actor, now);\n else if(command.type==='retry-analysis') {\n identity(command.retryId);requireValue(['failed','clarification'].includes(item.analysis?.state??'')&&!item.owner,'ANALYSIS_NOT_RETRYABLE');\n item.launch.analysisEpoch=command.retryId;delete item.analysis;\n }\n else if (command.type === 'set-launch-mode') {assertDefinitionEditable(item, now); setMode(item, command.mode);}\n else if (command.type === 'request-run') {assertDefinitionEditable(item, now); item.launch.requestedAt ??= now;}\n else if (command.type === 'admit-item') {\n requireCoordinator(state, actor); assertDefinitionEditable(item, now);\n requireValue(boardAllowsStart(state.board, item), 'BOARD_EXECUTION_PAUSED');\n requireValue(command.trigger === 'manual' ? item.launch.requestedAt !== undefined : taskDue(item, now), 'START_NOT_DUE');\n requireValue(!item.blocked && item.control?.action !== 'pause', 'ITEM_BLOCKED');\n requireValue(item.planning?.dependencies.every(id => catalog(state).find(i => i.id === id)?.status === 'completed') ?? true, 'DEPENDENCIES_UNFINISHED');\n item.launch.admittedAt = now;\n } else if (command.type === 'report-analysis') {\n requireCoordinator(state, actor); identity(command.operationId); requireValue(command.status.itemId === item.id, 'ANALYSIS_SCOPE_MISMATCH');\n item.analysis = structuredClone(command.status);\n } else if (command.type === 'request-control') requestControl(state, item, command);\n else if (command.type === 'control-receipt') {\n requireCoordinator(state, actor); requireValue(item.control?.id === command.controlId, 'STALE_CONTROL_RECEIPT');\n requireValue(['accepted', 'paused', 'resumed', 'failed', 'unknown'].includes(command.state), 'INVALID_CONTROL_STATE');\n item.control!.state = command.state; item.control!.code = command.code;\n } else issues(state, item, command, actor);\n item.updatedAt = now; item.revision++;\n}\nfunction edit(state: KanbanState, item: KanbanItem, command: KanbanTaskCommand, actor: KanbanActor, now: number): void {\n if (command.type === 'begin-edit') {\n assertDefinitionEditable(item, now, command.editId, actor); identity(command.editId);\n requireValue(Number.isSafeInteger(command.leaseMs) && command.leaseMs >= 1000 && command.leaseMs <= 300000, 'INVALID_EDIT_LEASE');\n item.launch!.editing = {id: command.editId, principal: principal(actor), expiresAt: now + command.leaseMs}; return;\n }\n if (command.type !== 'save-edit' && command.type !== 'end-edit') return;\n assertDefinitionEditable(item, now, command.editId, actor);\n requireValue(taskEditing(item, now) && item.launch!.editing!.id === command.editId, 'EDIT_LEASE_EXPIRED');\n if (command.type === 'save-edit') {\n text(command.title); text(command.responsibility); text(command.acceptance); validatePlan(state, item, command.planning);\n if (command.launchMode !== undefined) setMode(item, command.launchMode);\n Object.assign(item, {title: command.title, responsibility: command.responsibility, acceptance: command.acceptance, planning: command.planning});\n if (command.externalRefs) {item.externalRefs = []; for (const ref of command.externalRefs) attachReference(item, ref);}\n }\n if(command.type==='save-edit')for(const plan of Object.values(state.workflow?.plans??{})) {\n const definition=plan.definitions[item.id];if(!definition)continue;\n requireValue(Object.values(definition.inputs??{}).every(binding=>item.planning?.dependencies.includes(binding.fromItemId)),'EXISTING_DEPENDENCY_REQUIRED');\n definition.digest=sha256HexSync(JSON.stringify([item.title,item.responsibility,item.acceptance,item.planning,item.externalRefs,definition.inputs,definition.outputs]));\n }\n delete item.launch!.editing;\n}\nfunction requestControl(state: KanbanState, item: KanbanItem, command: Extract<KanbanTaskCommand, {type: 'request-control'}>): void {\n requireValue(!['completed', 'cancelled', 'review'].includes(item.status), 'ITEM_COMPLETED'); identity(command.controlId);\n requireValue(['pause', 'resume'].includes(command.action), 'INVALID_CONTROL_ACTION');\n if (item.control?.id === command.controlId) {requireValue(item.control.action === command.action, 'IDEMPOTENCY_CONFLICT'); return;}\n requireValue(!item.control || !['requested', 'unknown'].includes(item.control.state), 'CONTROL_UNSETTLED');\n const dispatch = Object.values(state.workflow?.dispatches ?? {}).find(d => d.itemId === item.id && ['prepared', 'running', 'unknown'].includes(d.outcome));\n requireValue(dispatch || item.launch?.admittedAt === undefined, 'TASK_CONTROL_UNSUPPORTED');\n requireValue(command.action === 'pause' || item.control?.action === 'pause', 'TASK_NOT_PAUSED');\n item.control = {id: command.controlId, dispatchId: dispatch?.id, action: command.action, state: 'requested'};\n}\nfunction issues(state: KanbanState, item: KanbanItem, command: KanbanTaskCommand, actor: KanbanActor): void {\n requireCoordinator(state, actor);\n if (command.type === 'report-issue') {\n const issue = command.issue; identity(issue.id); identity(issue.attemptId);\n requireValue(!issue.resolvedBy && ['clarification', 'error'].includes(issue.type), 'INVALID_ISSUE');\n requireValue(state.workflow?.dispatches[issue.attemptId]?.itemId === item.id && item.owner?.token === state.workflow.dispatches[issue.attemptId].fence, 'STALE_EXECUTION_RESULT');\n item.issues ??= []; const old = item.issues.find(i => i.id === issue.id && i.attemptId === issue.attemptId);\n if (!old) {requireValue(item.issues.length < 200, 'ISSUE_LIMIT'); item.issues.push(structuredClone(issue));}\n } else if (command.type === 'resolve-issue') {\n const issue = item.issues?.find(i => i.id === command.issueId && i.attemptId === command.attemptId); requireValue(issue, 'ISSUE_NOT_FOUND');\n identity(command.resolvedBy); requireValue(!issue.resolvedBy || issue.resolvedBy === command.resolvedBy, 'ISSUE_ALREADY_RESOLVED'); issue.resolvedBy = command.resolvedBy;\n }\n}\n\nexport function initializeTaskLaunch(state:KanbanState,item:KanbanItem):boolean {\n if(item.launch)return false;\n const first=Object.values(state.workflow?.dispatches??{}).filter(d=>d.itemId===item.id).sort((a,b)=>a.attempt-b.attempt)[0];\n const admittedAt=first?.preparedAt??item.owner?.claimedAt;\n item.launch={startAt:taskStartAt(item),...(admittedAt===undefined?{}:{admittedAt})};item.revision++;return true;\n}\n\nfunction setMode(item: KanbanItem, mode: 'automatic' | 'manual'): void {\n requireValue(['automatic', 'manual'].includes(mode), 'INVALID_LAUNCH_MODE');\n item.launch!.mode = mode; delete item.launch!.requestedAt;\n}\n","import type {KanbanActor, KanbanCommand} from './contracts';\nimport type {KanbanState} from './ports';\nimport {requireValue} from './rules';\nimport {applyTaskCommand} from './task-commands';\n\ntype Command = Extract<KanbanCommand, {type: 'set-board-control'}>;\n/** The scheduling barrier and original execution control requests commit together. */\nexport function setBoardControl(state: KanbanState, command: Command, actor: KanbanActor, now: number, token: string): void {\n requireValue(actor.kind === 'human', 'FORBIDDEN');\n requireValue(command.mode !== undefined || command.paused !== undefined, 'INVALID_BOARD_CONTROL');\n requireValue(command.mode === undefined || ['automatic', 'manual'].includes(command.mode), 'INVALID_LAUNCH_MODE');\n requireValue(command.paused === undefined || typeof command.paused === 'boolean', 'INVALID_BOARD_CONTROL');\n const policy = state.board.executionControl ??= {mode: 'automatic', paused: false, controls: {}};\n if (command.mode) policy.mode = command.mode;\n if (command.paused === undefined || command.paused === policy.paused) return;\n if (!command.paused) requireValue(!state.board.items.some(item => policy.controls[item.id] === item.control?.id && ['requested', 'unknown'].includes(item.control!.state)), 'CONTROL_UNSETTLED');\n policy.paused = command.paused;\n if (policy.paused) policy.controls = {};\n state.board.items.forEach((item, index) => {\n if (['completed', 'cancelled', 'review'].includes(item.status)) return;\n const active = Object.values(state.workflow?.dispatches ?? {}).some(d => d.itemId === item.id && ['prepared', 'running', 'unknown'].includes(d.outcome));\n const managed = policy.controls[item.id] === item.control?.id;\n if (policy.paused ? !active || item.control?.action === 'pause' : !managed || item.control?.action !== 'pause') return;\n if (item.control && ['requested', 'unknown'].includes(item.control.state)) return;\n const controlId = token + '-' + index;\n applyTaskCommand(state, {type: 'request-control', itemId: item.id, controlId, action: policy.paused ? 'pause' : 'resume'}, actor, now);\n policy.controls[item.id] = controlId;\n });\n}\n","import {TASK_START_DELAY_MS} from './contracts/task-projection';\nimport {discoveryState} from './discovery-state';\nimport {applyRecord, recordFingerprint} from './project-records';\nimport {principal, principalKey} from './identity';\nimport {workFingerprint, proposeAmendment, validateSources} from './amendments';\nimport type {KanbanActor, KanbanDiscoveryBatch, KanbanDiscoveryChange, KanbanItem} from './contracts';\nimport type {KanbanState} from './ports';\nimport {executable} from './configuration';\nimport {validateCandidates} from './identity';\nimport {plan, setStage, validatePlan, automaticStage} from './planning';\nimport {identity, participant, requireValue, text} from './rules';\n\n/** Commit accepted changes and source watermarks in the same board transaction. */\nexport function applyDiscovery(state: KanbanState, batch: KanbanDiscoveryBatch, actor: KanbanActor, now: number): void {\n const discovery = discoveryState(state), pending = discovery?.pending;\n requireValue(pending && pending.runId === batch.runId && pending.token === batch.leaseToken && pending.leaseUntil > now, 'SCAN_LEASE_EXPIRED');\n requireValue(pending.request?.command.type === 'apply-discovery' && JSON.stringify(pending.request.command.batch) === JSON.stringify(batch), 'SCAN_BATCH_MISMATCH');\n requireValue(batch.changes.length <= 50, 'SCAN_CHANGE_LIMIT');\n for (const change of batch.changes) {\n identity(change.itemId); validateSources(change.sources);\n requireValue(change.sources.length > 0 && change.sources.some(s => s.role === 'user'), 'USER_EVIDENCE_REQUIRED');\n const item = change.action === 'create' ? createItem(state, change, actor, now, batch.autoCreate, batch.runId) : updateItem(state, change, actor, now, batch.runId);\n if (item) attachSources(item, change, now);\n }\n requireValue((batch.records?.length ?? 0) <= 20, 'SCAN_RECORD_LIMIT');\n for (const record of batch.records ?? []) {\n requireValue(record.sources.some(source => source.role === 'user'), 'USER_EVIDENCE_REQUIRED');\n const duplicate = state.records?.some(old => recordFingerprint(old) === recordFingerprint(record));\n if (!duplicate) {applyRecord(state, {type: 'append-record', record}, actor, now, true); state.records!.find(entry => entry.id === record.id)!.originRunId = batch.runId;}\n }\n for (const checkpoint of batch.checkpoints) discovery!.checkpoints[checkpoint.sessionId] = checkpoint.revision;\n discovery!.lastRun = {runId: batch.runId, outcome: 'committed', at: now};\n delete discovery!.pending;\n}\nfunction createItem(state: KanbanState, change: KanbanDiscoveryChange, actor: KanbanActor, now: number, autoCreate: boolean, runId: string): KanbanItem | undefined {\n text(change.title); text(change.responsibility); text(change.acceptance);\n const item: KanbanItem = {origin: {kind: 'discovery', principal: principal(actor), runId}, id: change.itemId, title: change.title, responsibility: change.responsibility, acceptance: change.acceptance,\n eligibleAgentIds: change.eligibleAgentIds, eligiblePrincipals: change.eligiblePrincipals, status: 'proposed', revision: 1,\n createdAt: now, readyAt: now, updatedAt: now, workUnits: 0, participants: [], sources: []};\n item.launch={startAt:now+TASK_START_DELAY_MS};\n item.planning = change.planning ?? {...plan(item), kind: state.board.defaultWorkType ?? 'task'};\n const fingerprint = workFingerprint(item); item.origin!.fingerprint = fingerprint;\n validateCandidates(state.board, item, executable(state.board, item));\n if (state.archiveIndex?.some(old => old.discoveryFingerprint === fingerprint)) return undefined;\n const existing = state.board.items.find(old => workFingerprint(old) === fingerprint || old.origin?.fingerprint === fingerprint);\n if (existing) {existing.revision++; existing.updatedAt = now; return existing;}\n requireValue(!state.board.items.some(old => old.id === change.itemId) && !state.archiveIndex?.some(old => old.id === change.itemId), 'ITEM_EXISTS');\n validatePlan(state, item, item.planning); state.board.items.push(item);\n if (autoCreate) setStage(state, item, automaticStage(state, item), now);\n if (actor.sessionId) participant(item.participants, actor.sessionId, actor.agentId, 'creator', true, now);\n return item;\n}\nfunction updateItem(state: KanbanState, change: KanbanDiscoveryChange, actor: KanbanActor, now: number, runId: string): KanbanItem {\n const item = state.board.items.find(i => i.id === change.itemId); requireValue(item, 'ITEM_NOT_FOUND');\n if (change.action === 'update') {\n requireValue(!change.planning, 'SCAN_PLANNING_REQUIRES_REVIEW');\n const ownDraft = item.status === 'proposed' && item.origin?.kind === 'discovery'\n && principalKey(item.origin.principal) === principalKey(principal(actor));\n if (ownDraft) {\n text(change.title); text(change.responsibility); text(change.acceptance);\n item.title = change.title; item.responsibility = change.responsibility; item.acceptance = change.acceptance;\n } else proposeAmendment(item, change, actor, now, runId);\n } else requireValue(change.action === 'link', 'INVALID_CHANGE');\n item.revision++; item.updatedAt = now; return item;\n}\nfunction attachSources(item: KanbanItem, change: KanbanDiscoveryChange, now: number): void {\n for (const source of change.sources) {\n const subscribed = item.participants.find(p => p.sessionId === source.sessionId)?.subscribed ?? false;\n participant(item.participants, source.sessionId, undefined, source.role === 'user' ? 'creator' : 'consultant', subscribed, now);\n item.sources ??= [];\n if (!item.sources.some(s => s.sessionId === source.sessionId && s.messageId === source.messageId && s.revision === source.revision)) item.sources.push(source);\n }\n}\n","import type {KanbanAutomationSettings, KanbanBoard, KanbanActor, KanbanMember} from './contracts';\nimport {identity, requireValue, validateBoard} from './rules';\n\n/** Configuration grants no host authority; every execution still requires host admission. */\nexport function configureAutomation(board: KanbanBoard, settings: KanbanAutomationSettings, actor: KanbanActor): void {\n requireValue(settings && typeof settings.enabled === 'boolean' && typeof settings.autoAccept === 'boolean', 'INVALID_AUTOMATION');\n for (const ref of [settings.planner, settings.executor, ...(settings.preparation ? [settings.preparation] : [])]) {\n requireValue(ref && typeof ref === 'object', 'INVALID_AUTOMATION_TARGET');\n identity(ref.system); identity(ref.id); identity(ref.revision ?? '');\n }\n validateOptions(settings.preparationOptions);\n requireValue(settings.preparation || !Object.keys(settings.preparationOptions ?? {}).length, 'PREPARATION_REQUIRED');\n const members: KanbanMember[] = [...(board.members ?? []), ...(board.agents ?? []).filter(agent =>\n !board.members?.some(member => member.kind === 'agent' && member.id === agent.agentId))\n .map(agent => ({kind: 'agent' as const, id: agent.agentId, responsibility: agent.responsibility}))];\n for (const [principal, role] of [[settings.coordinator, 'coordinator'], [settings.worker, 'worker']] as const) {\n requireValue(principal && ['agent', 'human', 'service'].includes(principal.kind), 'INVALID_PRINCIPAL'); identity(principal.id);\n const existing = members.find(member => member.kind === principal.kind && member.id === principal.id);\n if (existing) existing.roles = [...new Set([...(existing.roles ?? []), role])];\n else members.push({...principal, responsibility: role, roles: [role]});\n }\n addReviewer(members, actor);\n board.members = members; delete board.agents; board.automation = structuredClone(settings);\n board.policy.review = settings.autoAccept ? 'assignee' : 'independent';\n validateBoard(board);\n}\nfunction addReviewer(members: KanbanMember[], actor: KanbanActor): void {\n if (actor.kind !== 'human' || !actor.id) return;\n const existing = members.find(member => member.kind === 'human' && member.id === actor.id);\n if (existing) existing.roles = [...new Set([...(existing.roles ?? []), 'reviewer' as const, 'coordinator' as const])];\n else members.push({kind: 'human', id: actor.id, responsibility: 'Review work', roles: ['reviewer', 'coordinator']});\n}\n\nfunction validateOptions(options: Record<string, string> | undefined): void {\n if (options === undefined) return;\n requireValue(options && typeof options === 'object' && !Array.isArray(options) && Object.keys(options).length <= 16, 'INVALID_PREPARATION_OPTIONS');\n for (const [key, value] of Object.entries(options)) {\n requireValue(/^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/.test(key) && typeof value === 'string' && value.length <= 4096, 'INVALID_PREPARATION_OPTIONS');\n }\n}\n","import type {KanbanActor, KanbanWorkflowCommand} from './contracts';\nimport type {KanbanState} from './ports';\nimport {identity, requireValue} from './rules';\nimport {requireCoordinator, type ApplyWorkCommand} from './workflow-plans';\n\n/** A new fenced attempt preserves terminal history and explicitly names its predecessor. */\nexport function continueExecution(state: KanbanState, command: Extract<KanbanWorkflowCommand, {type: 'continue-execution'}>,\n actor: KanbanActor, now: number, apply: ApplyWorkCommand): void {\n requireCoordinator(state, actor); identity(command.dispatchId);\n const workflow = state.workflow!, previous = workflow.dispatches[command.previousDispatchId];\n requireValue(previous && ['failed', 'cancelled'].includes(previous.outcome), 'EXECUTION_NOT_CONTINUABLE');\n requireValue(!workflow.dispatches[command.dispatchId], 'DISPATCH_EXISTS');\n const item = state.board.items.find(item => item.id === previous.itemId), plan = workflow.plans[previous.planId];\n requireValue(item && ['backlog', 'open'].includes(item.status) && !item.owner, 'ITEM_NOT_CONTINUABLE');\n const attempts = Object.values(workflow.dispatches).filter(row => row.itemId === item.id);\n requireValue(attempts.every(row => row.attempt <= previous.attempt), 'STALE_CONTINUATION');\n requireValue(!attempts.some(row => ['prepared', 'running', 'unknown', 'succeeded'].includes(row.outcome)), 'EXECUTION_UNSETTLED');\n requireValue(plan?.revision === previous.planRevision && plan.definitions[item.id]?.digest === previous.definitionDigest, 'PLAN_CHANGED');\n requireValue(command.instruction === undefined || typeof command.instruction === 'string' && command.instruction.trim().length > 0\n && command.instruction.length <= 8000, 'INVALID_CONTINUATION_INSTRUCTION');\n requireValue(!item.blocked || item.blocked.reason === (previous.code ?? 'EXECUTION_FAILED'), 'ITEM_BLOCKED');\n delete item.blocked;\n if (item.status === 'backlog') apply({type: 'set-stage', itemId: item.id, stage: 'open'});\n apply({type: 'claim', itemId: item.id, estimate: item.estimate}, previous.principal);\n workflow.dispatches[command.dispatchId] = {id: command.dispatchId, itemId: item.id, itemRevision: item.revision,\n planId: previous.planId, planRevision: previous.planRevision, principal: previous.principal,\n definitionDigest: previous.definitionDigest, attempt: previous.attempt + 1, fence: item.owner!.token,\n preparedAt: now, outcome: 'prepared', inputs: structuredClone(previous.inputs),\n continuation: {previousDispatchId: previous.id, ...(command.instruction ? {instruction: command.instruction} : {})}};\n}\n","import {boardAllowsStart} from './contracts/board-control';\nimport {taskDue, taskEditing, taskStartAt} from './contracts/task-projection';\nimport type {KanbanActor, KanbanCommand, KanbanWorkflowCommand, KanbanDispatch, KanbanArtifactRef} from './contracts';\nimport {sameAutomationBinding, executableWorkItem} from './contracts';\nimport type {KanbanState} from './ports';\nimport {identity, requireValue} from './rules';\nimport {principal} from './identity';\nimport {publishPlan, requireCoordinator, type ApplyWorkCommand} from './workflow-plans';\nimport {catalog} from './planning';\nimport {executionObservationChanged} from './execution-observation';\nimport {continueExecution} from './workflow-continuation';\nexport function isWorkflowCommand(command: KanbanCommand): command is KanbanWorkflowCommand {\n return ['publish-plan','prepare-dispatch','continue-execution','observe-execution','accept-execution'].includes(command.type);\n}\n/** Plan definitions and live admissions cannot be bypassed by ordinary board commands. */\nexport function protectWorkflowItem(state: KanbanState, command: KanbanCommand): void {\n if (command.type === 'configure-automation' && Object.values(state.workflow?.dispatches ?? {}).some(dispatch =>\n ['prepared', 'running', 'unknown', 'succeeded'].includes(dispatch.outcome))) {\n requireValue(sameAutomationBinding(state.board.automation, command.settings), 'PLAN_EXECUTION_UNSETTLED');\n }\n if (!('itemId' in command) || !command.itemId || !state.workflow) return;\n const plan=Object.values(state.workflow.plans).find(plan=>plan.itemIds.includes(command.itemId!));\n if (!plan) return;\n requireValue(!['edit-item','plan-item','review-amendment'].includes(command.type),'PLAN_ITEM_CHANGED_REQUIRES_NEW_ID');\n if (plan.sealed) requireValue(!['claim','submit','review','close-plan'].includes(command.type),'WORKFLOW_COMMAND_REQUIRED');\n const live=Object.values(state.workflow.dispatches).some(dispatch=>dispatch.itemId===command.itemId&&['prepared','running','unknown','succeeded'].includes(dispatch.outcome));\n if (live) requireValue(!['request-transfer','accept-transfer','release-item','cancel-item'].includes(command.type),'EXECUTION_UNSETTLED');\n}\nexport function applyWorkflow(state: KanbanState, command: KanbanWorkflowCommand, actor: KanbanActor, now: number, apply: ApplyWorkCommand): boolean {\n state.workflow ??= {plans:{},dispatches:{},ready:[],completedPlans:[]};\n let changed = true;\n if (command.type === 'publish-plan') publishPlan(state,command.plan,actor,apply);\n else if (command.type === 'prepare-dispatch') prepare(state,command,actor,now,apply);\n else if (command.type === 'continue-execution') {requireValue(!state.board.executionControl?.paused, 'BOARD_EXECUTION_PAUSED'); continueExecution(state, command, actor, now, apply);}\n else if (command.type === 'observe-execution') changed = observe(state,command,actor,now);\n else accept(state,command,actor,apply);\n refreshReady(state);\n return changed;\n}\nfunction prepare(state: KanbanState, command: Extract<KanbanWorkflowCommand,{type:'prepare-dispatch'}>, actor: KanbanActor, now: number, apply: ApplyWorkCommand): void {\n identity(command.dispatchId); const workflow=state.workflow!;\n requireValue(!workflow.dispatches[command.dispatchId], 'DISPATCH_EXISTS'); refreshReady(state);\n requireValue(workflow.ready.includes(command.itemId), 'WORK_NOT_READY');\n const plan=Object.values(workflow.plans).find(plan=>plan.itemIds.includes(command.itemId))!;\n requireValue(!Object.values(workflow.dispatches).some(dispatch=>dispatch.itemId===command.itemId&&['prepared','running','unknown','succeeded'].includes(dispatch.outcome)), 'EXECUTION_UNSETTLED');\n const item=state.board.items.find(item=>item.id===command.itemId)!;\n if (item.status==='backlog') apply({type:'set-stage',itemId:item.id,stage:'open'});\n requireValue(!taskEditing(item, now), 'EDIT_LEASE_ACTIVE');\n requireValue(!state.board.executionControl?.paused, 'BOARD_EXECUTION_PAUSED');\n if (command.trigger === 'automatic') requireValue(boardAllowsStart(state.board, item) && taskDue(item, now), 'START_NOT_DUE');\n item.launch ??= {startAt: taskStartAt(item)}; item.launch.admittedAt ??= now;\n apply({type:'claim',itemId:item.id,estimate:command.estimate});\n const inputs: Record<string,KanbanArtifactRef>={};\n for(const [name,binding] of Object.entries(plan.definitions[item.id].inputs ?? {})) {\n const producer=Object.values(workflow.dispatches).reverse().find(dispatch=>dispatch.itemId===binding.fromItemId&&dispatch.outcome==='accepted');\n const output=producer?.outputs?.find(output=>output.name===binding.output);requireValue(output,'DEPENDENCY_OUTPUT_MISSING');inputs[name]=structuredClone(output);\n }\n const attempt=Math.max(0,...Object.values(workflow.dispatches).filter(dispatch=>dispatch.itemId===item.id).map(dispatch=>dispatch.attempt))+1;\n workflow.dispatches[command.dispatchId]={id:command.dispatchId,itemId:item.id,itemRevision:item.revision,planId:plan.id,planRevision:plan.revision,principal:principal(actor),definitionDigest:plan.definitions[item.id].digest,attempt,fence:item.owner!.token,preparedAt:now,outcome:'prepared',inputs};\n}\nfunction observe(state: KanbanState, command: Extract<KanbanWorkflowCommand,{type:'observe-execution'}>, actor: KanbanActor, now: number): boolean {\n requireCoordinator(state,actor); const dispatch=activeDispatch(state,command.dispatchId);\n requireValue(command.fence===dispatch.fence && ['prepared','running','unknown'].includes(dispatch.outcome),'STALE_EXECUTION_RESULT');\n requireValue(['running','unknown','succeeded','failed','cancelled'].includes(command.outcome),'INVALID_EXECUTION_OUTCOME');\n if(command.code!==undefined) requireValue(/^[A-Z][A-Z0-9_]{0,79}$/.test(command.code),'INVALID_ERROR_CODE');\n const item=state.board.items.find(item=>item.id===dispatch.itemId)!;\n if (command.executionSessionId) {identity(command.executionSessionId); requireValue(!dispatch.executionSessionId || dispatch.executionSessionId === command.executionSessionId, 'EXECUTION_SESSION_LOCKED'); dispatch.executionSessionId = command.executionSessionId;}\n if(command.controlCapabilities) {\n requireValue(['boundary','none'].includes(command.controlCapabilities.pause)&&typeof command.controlCapabilities.resume==='boolean','INVALID_CONTROL_CAPABILITIES');\n dispatch.controlCapabilities=structuredClone(command.controlCapabilities);\n }\n const outputs=command.outputs ?? [];validateOutputs(outputs);\n if (['running', 'unknown'].includes(command.outcome)) item.owner!.leaseUntil = Math.max(item.owner!.leaseUntil, now + state.board.policy.leaseMs);\n if (!executionObservationChanged(dispatch, command)) return false;\n if(command.outcome==='succeeded') {\n const required=state.workflow!.plans[dispatch.planId].definitions[item.id].outputs;\n requireValue(required.every(name=>outputs.some(output=>output.name===name)),'REQUIRED_OUTPUT_MISSING');\n item.status=state.board.policy.review==='assignee'?'completed':'review';if(item.status==='completed') item.closedAt=now;item.resultRef=`kanban:dispatch:${dispatch.id}`;dispatch.outputs=structuredClone(outputs);\n } else if(command.outcome==='failed'||command.outcome==='cancelled') {\n item.status='backlog';item.blocked={reason:command.code ?? 'EXECUTION_FAILED',at:now};delete item.owner;\n }\n dispatch.outcome=command.outcome==='succeeded'&&state.board.policy.review==='assignee'?'accepted':command.outcome;dispatch.code=command.code;item.updatedAt=now;item.revision++;dispatch.itemRevision=item.revision;\n return true;\n}\nfunction accept(state: KanbanState, command: Extract<KanbanWorkflowCommand,{type:'accept-execution'}>, actor: KanbanActor, apply: ApplyWorkCommand): void {\n requireCoordinator(state,actor);const dispatch=activeDispatch(state,command.dispatchId);\n requireValue(dispatch.outcome==='succeeded','EXECUTION_NOT_SUCCEEDED');\n apply({type:'review',itemId:dispatch.itemId,accept:command.accept},actor);\n dispatch.outcome=command.accept?'accepted':'rejected';\n if(!command.accept) {const item=state.board.items.find(item=>item.id===dispatch.itemId)!;item.status='backlog';item.blocked={reason:'EXECUTION_REJECTED',at:item.updatedAt};}\n}\nfunction activeDispatch(state: KanbanState, id: string): KanbanDispatch {\n const dispatch=state.workflow!.dispatches[id];requireValue(dispatch,'DISPATCH_NOT_FOUND');\n const item=state.board.items.find(item=>item.id===dispatch.itemId), plan=state.workflow!.plans[dispatch.planId];\n requireValue(plan?.revision===dispatch.planRevision&&item?.owner?.token===dispatch.fence&&plan.definitions[dispatch.itemId]?.digest===dispatch.definitionDigest,'STALE_EXECUTION_RESULT');return dispatch;\n}\nexport function validateOutputs(outputs: KanbanArtifactRef[]): void {\n requireValue(Array.isArray(outputs)&&outputs.length<=100&&outputs.every(output=>output&&typeof output==='object'&&typeof output.name==='string')&&new Set(outputs.map(output=>output.name)).size===outputs.length,'INVALID_OUTPUTS');\n for(const output of outputs) requireValue(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/.test(output.name)&&typeof output.ref==='string'&&output.ref.length>0&&output.ref.length<=2048\n &&/^[a-f0-9]{64}$/.test(output.sha256)&&Number.isSafeInteger(output.bytes)&&output.bytes>=0,'INVALID_OUTPUT_REFERENCE');\n}\nexport function refreshReady(state: KanbanState): void {\n if(!state.workflow) return; const all=catalog(state), included=new Set(Object.values(state.workflow.plans).filter(plan=>plan.sealed).flatMap(plan=>plan.itemIds));\n state.workflow.completedPlans=Object.values(state.workflow.plans).filter(plan=>plan.sealed&&plan.itemIds.every(id=>all.find(item=>item.id===id)?.status==='completed')).map(plan=>plan.id);\n state.workflow.ready=state.board.items.filter(item=>included.has(item.id)&&executableWorkItem(state.board,item)&&['backlog','open'].includes(item.status)&&!item.owner&&!item.blocked&&item.control?.action!=='pause'\n &&(item.planning?.dependencies ?? []).every(id=>all.find(other=>other.id===id)?.status==='completed')).map(item=>item.id);\n}\n","import {taskEditing} from './contracts/task-projection';\nimport type {KanbanActor, KanbanBoard, KanbanCommand, KanbanItem, KanbanPrincipal} from './contracts';\nimport type {KanbanState} from './ports';\nimport type {PlanningCommand} from './planning-commands';\nimport {assertReady, limits, catalog, terminal} from './planning';\nimport {eligible, principal, principalKey, assigneeKey, candidates} from './identity';\nimport {owned, participant, requireValue, text, validateEstimate} from './rules';\n\ntype ItemCommand = Exclude<KanbanCommand, import('./contracts').KanbanTaskCommand | import('./contracts').KanbanWorkflowCommand | PlanningCommand | {type: 'set-board-control' | 'delete-board' | 'append-record' | 'review-record' | 'link-record' | 'review-amendment' | 'configure-automation'} | {type: 'create-item' | 'register-session' | 'message' | 'scan' | 'apply-discovery' | 'publish-proposal'}>;\nexport function transition(state: KanbanState, item: KanbanItem, command: ItemCommand, actor: KanbanActor, now: number, token: string): void {\n requireValue(item.status !== 'completed' && item.status !== 'cancelled', 'ITEM_COMPLETED');\n if (command.type === 'claim' || command.type === 'accept-transfer') claim(state, item, command, actor, now, token);\n else if (command.type === 'review') review(state, item, command.accept, actor, now);\n else {\n owned(item, actor, command.token, now);\n if (command.type === 'submit') requireValue(catalog(state).filter(i => i.planning.parentId === item.id).every(terminal), 'CHILDREN_UNFINISHED');\n ownerUpdate(state.board, item, command, now, token);}\n if (command.type !== 'renew') {item.revision++; item.updatedAt = now;}\n}\nfunction claim(state: KanbanState, item: KanbanItem, command: Extract<ItemCommand, {type: 'claim' | 'accept-transfer'}>, actor: KanbanActor, now: number, token: string): void {\n const board = state.board, key = principalKey(principal(actor));\n requireValue(!taskEditing(item,now),'EDIT_LEASE_ACTIVE');\n eligible(board, item, actor); assertReady(state, item);\n requireValue(command.estimate || board.policy.requireEstimate === false, 'ESTIMATE_REQUIRED'); if (command.estimate) validateEstimate(command.estimate);\n const wip = board.items.filter(i => i.status === 'claimed' || i.status === 'review');\n if (command.type === 'claim') requireValue(wip.length < limits(state).inProgress, 'WIP_LIMIT');\n requireValue(wip.filter(i => i.id !== item.id && i.owner && assigneeKey(i.owner) === key).length < limits(state).perAssignee, principal(actor).kind === 'agent' ? 'AGENT_WIP_LIMIT' : 'ASSIGNEE_WIP_LIMIT');\n if (command.type === 'claim') requireValue(item.status === 'open' && !item.owner, 'ALREADY_OWNED');\n else {\n requireValue(item.status === 'claimed' && item.transfer && principalKey(transferTarget(item.transfer)) === key, 'TRANSFER_NOT_OFFERED');\n requireValue(item.transfer.expiresAt > now && item.owner && item.owner.leaseUntil > now, 'TRANSFER_EXPIRED');\n requireValue(assigneeKey(item.owner) !== key, 'SELF_TRANSFER');\n }\n item.owner = {...actor, principalId: key, token, claimedAt: now, leaseUntil: now + board.policy.leaseMs};\n item.estimate = command.estimate; item.status = 'claimed'; item.progressAt = now; delete item.transfer;\n if (actor.sessionId) participant(item.participants, actor.sessionId, actor.agentId, 'owner', true, now);\n}\nfunction review(state: KanbanState, item: KanbanItem, accept: boolean, actor: KanbanActor, now: number): void {\n requireValue(item.status === 'review', 'NOT_IN_REVIEW');\n const key = principalKey(principal(actor));\n const registered = actor.sessionId && item.participants.some(p => p.sessionId === actor.sessionId && p.roles.includes('reviewer'))\n || state.board.members?.some(m => principalKey(m) === key && m.roles?.includes('reviewer'));\n requireValue(registered, 'REVIEWER_REQUIRED');\n requireValue(!item.owner || assigneeKey(item.owner) !== key, 'INDEPENDENT_REVIEW_REQUIRED');\n item.status = accept ? 'completed' : state.board.items.filter(i => i.status === 'open').length < limits(state).ready ? 'open' : 'backlog';\n if (accept) item.closedAt = now;\n if (!accept) {delete item.owner; delete item.estimate; delete item.resultRef; item.readyAt = now;}\n}\nfunction ownerUpdate(board: KanbanBoard, item: KanbanItem, command: Exclude<ItemCommand, {type: 'claim' | 'accept-transfer' | 'review'}>, now: number, token: string): void {\n switch (command.type) {\n case 'renew': item.owner!.leaseUntil = now + board.policy.leaseMs; break;\n case 'progress':\n requireValue(Number.isFinite(command.workUnits) && command.workUnits >= item.workUnits, 'INVALID_WORK_UNITS');\n item.workUnits = command.workUnits; item.progressAt = now;\n if (command.estimate) {validateEstimate(command.estimate); item.estimate = command.estimate;} break;\n case 'request-transfer': requestTransfer(board, item, command, now, token); break;\n case 'submit':\n text(command.resultRef); item.resultRef = command.resultRef; item.status = board.policy.review === 'assignee' ? 'completed' : 'review';\n if (item.status === 'completed') item.closedAt = now; delete item.transfer; break;\n }\n}\nfunction requestTransfer(board: KanbanBoard, item: KanbanItem, command: Extract<ItemCommand, {type: 'request-transfer'}>, now: number, token: string): void {\n requireValue(Boolean(command.target) !== Boolean(command.agentId), 'TRANSFER_TARGET_REQUIRED');\n const target = command.target ?? {kind: 'agent' as const, id: command.agentId!}, key = principalKey(target);\n requireValue(candidates(board, item).some(p => principalKey(p) === key), 'AGENT_NOT_ELIGIBLE');\n requireValue(assigneeKey(item.owner!) !== key, 'SELF_TRANSFER'); requireValue(!item.transfer, 'TRANSFER_ALREADY_PENDING');\n item.transfer = {id: token, target, ...(target.kind === 'agent' ? {agentId: target.id} : {}), requestedAt: now, expiresAt: now + board.policy.transferTimeoutMs};\n}\nfunction transferTarget(value: NonNullable<KanbanItem['transfer']>): KanbanPrincipal {return value.target ?? {kind: 'agent', id: value.agentId!};}\n","import {setBoardControl} from './board-control';\nimport {taskCommand, applyTaskCommand, assertDefinitionEditable, initializeTaskLaunch} from './task-commands';\nimport {TASK_START_DELAY_MS} from './contracts/task-projection';\nimport {applyDiscovery} from './scan-commit';\nimport {configureAutomation} from './automation';\nimport {applyWorkflow, isWorkflowCommand, refreshReady, protectWorkflowItem} from './workflow';\nimport {numberEntities} from './numbering';\nimport {isRecordCommand, applyRecord} from './project-records';\nimport {reviewAmendment} from './amendments';\nimport {principal} from './identity';\nimport type { KanbanActor, KanbanBoard, KanbanCommand, KanbanEvent, KanbanItem } from './contracts';\nimport type { KanbanState } from './ports';\nimport { identity, participant, requireValue, text } from './rules';\nimport { transition } from './transitions';\nimport {planningCommand, applyPlanningCommand, attachReference} from './planning-commands';\nimport {plan, setStage, validatePlan, terminal} from './planning';\nimport {executable} from './configuration';\nimport {validateCandidates} from './identity';\nimport {archiveExpired} from './archives';\n\nexport function reduce(state: KanbanState, command: KanbanCommand, actor: KanbanActor,\n operationId: string, now: number, token: string, workflowInternal = false): KanbanState {\n requireValue(state.board.deletedAt === undefined, 'BOARD_DELETED');\n numberEntities(state);\n if (!workflowInternal) protectWorkflowItem(state, command);\n const board = state.board;\n if (command.type === 'delete-board') return deleteBoard(state, actor, operationId, now);\n if (command.type === 'scan') { scan(state, actor, operationId, now); refreshReady(state); return state; }\n let recordEvent = command.type !== 'renew';\n if (command.type === 'set-board-control') setBoardControl(state, command, actor, now, token);\n else if (taskCommand(command)) applyTaskCommand(state, command, actor, now);\n else if (isWorkflowCommand(command)) recordEvent = applyWorkflow(state, command, actor, now, (inner, owner = actor) => {reduce(state,inner,owner,operationId,now,token,true);});\n else if (command.type === 'apply-discovery') applyDiscovery(state, command.batch, actor, now);\n else if (isRecordCommand(command)) applyRecord(state, command, actor, now);\n else if (command.type === 'review-amendment') {if(command.accept)assertDefinitionEditable(itemFor(board,command.itemId),now);reviewAmendment(board, command, actor, now);}\n else if (planningCommand(command)) applyPlanningCommand(state, command, now, actor, workflowInternal);\n else if (command.type === 'create-item') createItem(state, command, actor, now, token);\n else if (command.type === 'configure-automation') configureAutomation(board, command.settings, actor);\n else if (command.type === 'register-session') {\n const item = command.itemId ? itemFor(board, command.itemId) : undefined;\n const list = item ? item.participants : board.participants;\n participant(list, command.sessionId, command.agentId, command.role, command.subscribed, now);\n if (item) item.revision++;\n } else if (command.type === 'message') {\n text(command.message); command.recipientSessionIds.forEach(identity);\n if (command.itemId) itemFor(board, command.itemId);\n requireValue(command.recipientSessionIds.every(id => related(board).includes(id)), 'UNKNOWN_RECIPIENT');\n } else transition(state, itemFor(board, command.itemId), command, actor, now, token);\n numberEntities(state); refreshReady(state);\n board.revision++;\n if (recordEvent) append(state, actor, operationId, now, command.type, 'itemId' in command ? command.itemId : command.type === 'create-item' ? command.item.id : 'dispatchId' in command ? state.workflow?.dispatches[command.dispatchId]?.itemId : undefined,\n eventData(command, state),\n command.type === 'message' ? command.recipientSessionIds : undefined);\n scan(state, actor, operationId, now);\n return state;\n}\nfunction createItem(state: KanbanState, command: Extract<KanbanCommand, { type: 'create-item' }>, actor: KanbanActor, now: number, token: string): void {\n const {id, title, responsibility, acceptance, eligibleAgentIds, eligiblePrincipals, externalRefs} = command.item;\n const input = {id, title, responsibility, acceptance, eligibleAgentIds, eligiblePrincipals, externalRefs}, board = state.board;\n identity(input.id); text(input.title); text(input.responsibility); text(input.acceptance);\n requireValue(!board.items.some(i => i.id === input.id) && !state.archiveIndex?.some(i => i.id === input.id), 'ITEM_EXISTS');\n const item: KanbanItem = { ...input, origin: {kind: 'direct', principal: principal(actor)}, status: 'backlog', revision: 1, createdAt: now, readyAt: now, updatedAt: now, workUnits: 0, participants: [] };\n item.launch = {startAt: now + TASK_START_DELAY_MS};\n requireValue(command.launch?.mode === undefined || ['automatic', 'manual'].includes(command.launch.mode), 'INVALID_LAUNCH_MODE');\n requireValue(command.launch?.paused === undefined || typeof command.launch.paused === 'boolean', 'INVALID_TASK_PAUSE');\n if (command.launch?.mode) item.launch!.mode = command.launch.mode;\n if (command.launch?.paused) item.control = {id: 'initial-' + token, action: 'pause', state: 'paused'};\n item.planning = command.planning ?? {...plan(item), kind: board.defaultWorkType ?? 'task'};\n const references = item.externalRefs ?? []; item.externalRefs = [];\n for (const reference of references) attachReference(item, reference);\n validateCandidates(board, item, executable(board, item)); validatePlan(state, item, item.planning);\n if(item.planning.parentId) {\n const parent=board.items.find(parent=>parent.id===item.planning!.parentId)!;\n if(parent.planning?.execution!=='children') {parent.planning={...plan(parent),execution:'children'};parent.updatedAt=now;parent.revision++;}\n }\n if (actor.sessionId) participant(item.participants, actor.sessionId, actor.agentId, 'creator', true, now); board.items.push(item);\n if (command.stage === 'open') setStage(state, item, 'open', now);\n}\nfunction itemFor(board: KanbanBoard, id: string): KanbanItem {\n const item = board.items.find(value => value.id === id); requireValue(item, 'ITEM_NOT_FOUND'); return item;\n}\nexport function related(board: KanbanBoard): string[] {\n return [...new Set([...board.participants, ...board.items.flatMap(i => i.participants)].map(p => p.sessionId))];\n}\nfunction append(state: KanbanState, actor: KanbanActor, operationId: string, at: number, kind: string,\n itemId?: string, data: KanbanEvent['data'] = {}, recipients?: string[]): void {\n const archived = state.archiveWrites?.flatMap(write => write.value?.item.participants ?? []) ?? [];\n const members = [...archived, ...state.board.participants, ...state.board.items.filter(i => i.id === itemId).flatMap(i => i.participants)];\n state.events.push({ sequence: ++state.sequence, boardId: state.board.id, itemId, operationId, at, kind, actor,\n recipients: [...new Set(recipients ?? members.filter(p => p.subscribed).map(p => p.sessionId))], data });\n}\nfunction scan(state: KanbanState, actor: KanbanActor, operationId: string, now: number): void {\n for (const item of state.board.items) {\n if(initializeTaskLaunch(state,item)) {state.board.revision++;append(state,actor,operationId,now,'task-launch-initialized',item.id,{code:'LEGACY_LAUNCH_INITIALIZED'});}\n if (terminal(item)) continue;\n for (const reason of escalationReasons(state.board, item, now)) {\n const epoch = reason === 'transfer-timeout' ? item.transfer?.id : reason === 'backlog-review' ? item.updatedAt : item.owner?.token ?? item.readyAt;\n const key = JSON.stringify([item.id, epoch, reason]);\n if (state.escalations.includes(key)) continue;\n state.escalations.push(key); state.board.revision++;\n append(state, actor, operationId, now, 'escalated', item.id, { reason }, state.board.policy.escalationSessionIds);\n }\n if (item.transfer && item.transfer.expiresAt <= now) { delete item.transfer; item.revision++; item.updatedAt = now; state.board.revision++; }\n }\n const archived = archiveExpired(state, now);\n if (archived.length) {state.board.revision++; append(state, actor, operationId, now, 'items.archived', undefined, {reason: 'retention-policy'});}\n}\nexport function escalationReasons(board: KanbanBoard, item: KanbanItem, now: number): string[] {\n const p = board.policy, result: string[] = [];\n if (item.status === 'backlog' && p.backlogReviewMs && now - item.updatedAt >= p.backlogReviewMs) result.push('backlog-review');\n if (item.planning?.dueAt !== undefined && now >= item.planning.dueAt) result.push('due-date');\n if (item.blocked && now - item.blocked.at >= p.progressTimeoutMs) result.push('blocked-age');\n if (!item.blocked && item.status === 'open' && now - item.readyAt >= p.claimTimeoutMs) result.push('unclaimed');\n if (item.status === 'review' && now - item.updatedAt >= p.progressTimeoutMs) result.push('review-timeout');\n if (item.transfer && now >= item.transfer.expiresAt) result.push('transfer-timeout');\n if (item.status !== 'claimed' || !item.owner) return result;\n if (now >= item.owner.leaseUntil) result.push('lease-expired');\n if (now - (item.progressAt ?? item.owner.claimedAt) >= p.progressTimeoutMs) result.push('no-progress');\n if (now - item.owner.claimedAt >= Math.min(item.estimate?.durationMs ?? p.maxDurationMs, p.maxDurationMs)) result.push('execution-timeout');\n if ((item.estimate?.complexity ?? 0) >= p.maxComplexity) result.push('complexity-threshold');\n if (Math.max(item.workUnits, item.estimate?.workUnits ?? 0) >= p.maxWorkUnits) result.push('work-threshold');\n if ((item.estimate?.durationMs ?? 0) >= p.maxDurationMs) result.push('duration-threshold');\n return result;\n}\n\nfunction eventData(command: KanbanCommand, state: KanbanState): KanbanEvent['data'] {\n if (command.type === 'set-board-control') return {code: 'BOARD_' + (state.board.executionControl?.paused ? 'PAUSE_REQUESTED' : state.board.executionControl?.mode?.toUpperCase())};\n if (command.type === 'apply-discovery') return discoveryEvent(state, command.batch);\n if (command.type === 'report-analysis') return {code:command.status.code, reason:'analysis-'+command.status.state};\n if (command.type === 'control-receipt') return {code:command.code, reason:'control-'+command.state};\n if (isWorkflowCommand(command)) return {readyItemIds:state.workflow?.ready, ...('dispatchId' in command ? {dispatchId:command.dispatchId} : {planId:command.plan.id}), ...('outcome' in command ? {reason:`execution-${command.outcome}`, code: command.code, status: state.board.items.find(item => item.id === state.workflow?.dispatches[command.dispatchId]?.itemId)?.status} : command.type === 'accept-execution' ? {reason: command.accept ? 'accepted' : 'rejected'} : {})};\n if (command.type === 'create-item') return {itemTitle: command.item.title};\n if (command.type === 'link-reference') return {reference: command.reference};\n if (command.type === 'block-item') return {reason: command.reason};\n if (command.type === 'release-item') return {reason: command.next === 'cancelled' ? 'cancelled' : 'released'};\n if (command.type === 'review') return {reason: command.accept ? 'accepted' : 'rejected',\n dispatchId: Object.values(state.workflow?.dispatches ?? {}).find(dispatch => dispatch.itemId === command.itemId && dispatch.outcome === 'succeeded')?.id};\n if (command.type === 'append-record') return {recordId: command.record.id, reason: command.record.kind === 'decision' ? 'decision-draft' : 'log'};\n if (command.type === 'review-record' || command.type === 'link-record') return {recordId: command.recordId};\n if (command.type === 'archive-items') return {itemIds: command.itemIds, reason: command.reason};\n if (command.type === 'cancel-item') return {reason: command.reason};\n if (command.type === 'plan-item') return {planning: command.planning};\n if (command.type === 'message') return { message: command.message };\n if (command.type === 'submit') return { resultRef: command.resultRef };\n if (command.type === 'claim' || command.type === 'accept-transfer') return { estimate: command.estimate };\n if (command.type === 'progress') return { estimate: command.estimate, workUnits: command.workUnits };\n return {};\n}\n\nfunction discoveryEvent(state: KanbanState, batch: import('./contracts').KanbanDiscoveryBatch): KanbanEvent['data'] {\n return {itemIds: batch.changes.map(change => change.itemId), recordIds: batch.records?.filter(record => state.records?.some(entry => entry.id === record.id && entry.originRunId === batch.runId)).map(record => record.id),\n ...(state.board.items.some(item => item.amendments?.some(proposal => proposal.runId === batch.runId && proposal.status === 'pending')) ? {reason: 'amendment-proposed'} : state.board.items.some(item => item.status === 'proposed' && item.origin?.runId === batch.runId) ? {reason: 'proposal-created'} : {})};\n}\n\nfunction deleteBoard(state: KanbanState, actor: KanbanActor, operationId: string, now: number): KanbanState {\n const owner = principal(actor), board = state.board;\n requireValue(owner.kind === 'human' && board.members?.some(member => member.kind === owner.kind && member.id === owner.id && member.roles?.includes('coordinator')), 'COORDINATOR_REQUIRED');\n requireValue(!board.items.some(item => item.owner || item.transfer || item.status === 'claimed'), 'BOARD_EXECUTION_ACTIVE');\n requireValue(!Object.values(state.workflow?.dispatches ?? {}).some(dispatch => ['prepared', 'running', 'unknown', 'succeeded'].includes(dispatch.outcome)), 'BOARD_EXECUTION_UNSETTLED');\n board.deletedAt = now; board.revision++;\n if (board.automation) board.automation.enabled = false;\n if (state.workflow) state.workflow.ready = [];\n append(state, actor, operationId, now, 'delete-board');\n return state;\n}\n"],"mappings":"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","names":["record","member","plan","item","plan","policy","principal","item","plan","plan","item","output","accept","createItem","append","parent"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/li/share/prj/x1/release/local-libraries/work/1ca933a0-6fe7-4e9c-b13b-76d7f318e0fb/source/libraries/kanban/dist/chunk-PSKQAFDF.cjs","../src/contracts/references.ts","../src/contracts/configuration.ts","../src/contracts/discovery.ts","../src/contracts/automation.ts"],"names":[],"mappings":"AAAA;ACGO,SAAS,eAAA,CAAgB,KAAA,EAAsC,MAAA,EAA2E;AAC7I,EAAA,MAAM,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,CAAA,GAAA,EAAM,KAAA,CAAM,MAAM,CAAA,EAAA;AAC5B,EAAA;AAC6B,EAAA;AACR,EAAA;AAC7C;ADDmD;AACA;AECiB;AACrB,EAAA;AACF,EAAA;AACF,EAAA;AACQ,EAAA;AACJ,EAAA;AAC/C;AAKiK;AAC3H,EAAA;AAEtC;AFJmD;AACA;AGO6B;AACpE,EAAA;AAAyB,EAAA;AAAmB,EAAA;AAAyB,EAAA;AAAe,EAAA;AAAoB,EAAA;AACpH;AHAmD;AACA;AIT+D;AACvC,EAAA;AAAiB,oBAAA;AAAwB,oBAAA;AAAoB,oBAAA;AAC/G,oBAAA;AAAyB,oBAAA;AAAqB,oBAAA;AAA8B,oBAAA;AAA0B,oBAAA;AACxG,oBAAA;AAAqB,oBAAA;AAAW,oBAAA;AAAmB,oBAAA;AAA2D,IAAA;AAAyC,EAAA;AAChI,EAAA;AAC9C;AJuBmD;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/li/share/prj/x1/release/local-libraries/work/1ca933a0-6fe7-4e9c-b13b-76d7f318e0fb/source/libraries/kanban/dist/chunk-PSKQAFDF.cjs","sourcesContent":[null,"import type {KanbanBoard} from './contracts';\n\nexport interface KanbanReferenceTarget {boardId: string; itemId?: string; recordId?: string; reference: string; scope: KanbanBoard['scope']}\nexport function kanbanReference(board: {id: string; number?: number}, entity?: {id: string; number?: number; kind?: 'log' | 'decision'}): string {\n const prefix = board.number ? `KB-${board.number}` : board.id;\n if (!entity) return prefix;\n if (!entity.number) return `${prefix}/${entity.id}`;\n return entity.kind ? `${prefix}/${entity.kind === 'log' ? 'L' : 'D'}-${entity.number}` : `${prefix}#${entity.number}`;\n}\n","import type {KanbanItem, KanbanBoard} from './contracts';\n\nexport interface KanbanPrincipal {kind: 'agent' | 'human' | 'service'; id: string}\nexport interface KanbanMember extends KanbanPrincipal {\n responsibility: string; roles?: Array<'worker' | 'reviewer' | 'coordinator'>;\n}\nexport interface KanbanWorkType {id: string; label: string; rank: number; executable: boolean}\nexport interface KanbanColumn {id: string; label: string; states: KanbanItem['status'][]}\nexport interface KanbanNotificationPolicy {rules?: Record<string, 'info' | 'error' | 'none'>}\nexport const DEFAULT_KANBAN_WORK_TYPES: readonly KanbanWorkType[] = [\n {id: 'initiative', label: 'Goal', rank: 0, executable: false},\n {id: 'feature', label: 'Group', rank: 1, executable: false},\n {id: 'task', label: 'Action', rank: 2, executable: true},\n {id: 'fix', label: 'Fix', rank: 2, executable: true},\n {id: 'subtask', label: 'Subtask', rank: 3, executable: true},\n];\n\nexport interface KanbanExternalReference {system: string; id: string; revision?: string}\n\n/** A composite work item delegates execution to its children. */\nexport function executableWorkItem(board:Pick<KanbanBoard,'workTypes'|'defaultWorkType'>, item:{planning?:{kind:string;execution?:'direct'|'children'}}):boolean {\n return item.planning?.execution!=='children'&&(board.workTypes??DEFAULT_KANBAN_WORK_TYPES)\n .some(type=>type.id===(item.planning?.kind??board.defaultWorkType??'task')&&type.executable);\n}\n","import type {KanbanItemSummary} from './planning';\nimport type {KanbanBoard} from './contracts';\n\nexport type {KanbanSourceRef, KanbanDiscoveryChange, KanbanDiscoveryBatch} from './source';\nimport type {KanbanDiscoveryChange} from './source';\nexport interface KanbanScanSession {\n id: string; revision: string; updatedAt: number | null; idleSince: number | null;\n activity: 'idle' | 'active' | 'waiting' | 'unknown'; archived: boolean; scannerOwned?: boolean;\n}\nexport interface KanbanScanText {\n session: KanbanScanSession; complete: boolean;\n messages: Array<{id: string; role: 'user' | 'assistant'; text: string}>;\n}\nexport interface KanbanScanConnection {\n kind: 'local' | 'remote'; connectionId: string;\n /** Explicit consent for moving source text to a different execution boundary. */\n allowContentTransfer: boolean;\n}\nexport interface KanbanScanPolicy {\n idleMs: number; includeArchived: boolean; maxSessions: number; maxInputBytes: number; leaseMs: number;\n autoCreate: boolean; connection: KanbanScanConnection;\n}\nexport interface KanbanScanInput {\n projectContext?: {totalRecords: number; excludedRecords?: number; omittedRecords: number; records: import('./context').KanbanProjectRecord[]};\n context?: {totalItems: number; omittedItems: number; archivedTotal: number; archivedItems: KanbanItemSummary[]};\n runId: string; executorId: string; board: KanbanBoard; sessions: KanbanScanText[]; connection: KanbanScanConnection;\n}\nexport const DEFAULT_KANBAN_SCAN_POLICY: Omit<KanbanScanPolicy, 'connection'> = {\n idleMs: 300000, includeArchived: true, maxSessions: 20, maxInputBytes: 128 * 1024, leaseMs: 600000, autoCreate: false,\n};\n\nexport interface KanbanDiscoveryResult {changes: KanbanDiscoveryChange[]; records?: import('./context').KanbanRecordInput[]}\n","import type {KanbanExternalReference, KanbanPrincipal} from './configuration';\n\nexport interface KanbanAutomationSettings {\n preparation?: KanbanExternalReference;\n preparationOptions?: Record<string, string>;\n enabled: boolean; planner: KanbanExternalReference; executor: KanbanExternalReference;\n coordinator: KanbanPrincipal; worker: KanbanPrincipal; autoAccept: boolean;\n}\nexport interface KanbanAutomationOption {\n name: string; label: string; defaultValue?: string;\n choices?: Array<{value: string; label: string}>;\n}\nexport interface KanbanAutomationTarget {reference: KanbanExternalReference; label: string; options?: KanbanAutomationOption[]}\nexport interface KanbanAutomationCatalog {\n preparations?: KanbanAutomationTarget[];\n targets: KanbanAutomationTarget[]; coordinator: KanbanPrincipal; worker: KanbanPrincipal;\n}\nexport interface KanbanAnalysisStatus {\n itemId: string; state: 'analyzing' | 'ready' | 'clarification' | 'failed' | 'unknown';\n reason?: string; code?: string; dependencies?: string[];\n}\nexport function sameAutomationBinding(left?: KanbanAutomationSettings, right?: KanbanAutomationSettings): boolean {\n const signature = (value?: KanbanAutomationSettings) => JSON.stringify([value?.planner?.system, value?.planner?.id, value?.planner?.revision,\n value?.executor?.system, value?.executor?.id, value?.executor?.revision, value?.coordinator?.kind, value?.coordinator?.id,\n value?.worker?.kind, value?.worker?.id, value?.autoAccept, value?.preparation, Object.entries(value?.preparationOptions ?? {}).sort(([a], [b]) => a.localeCompare(b))]);\n return signature(left) === signature(right);\n}\n"]}
@@ -1,20 +0,0 @@
1
- // src/contracts/board-control.ts
2
- function boardAllowsStart(board, item) {
3
- return !board.executionControl?.paused && (board.executionControl?.mode !== "manual" || item?.launch?.requestedAt !== void 0);
4
- }
5
- function boardControlPhase(board) {
6
- const policy = board.executionControl;
7
- const controls = Object.entries(policy?.controls ?? {}).flatMap(([id, controlId]) => {
8
- const item = board.items.find((item2) => item2.id === id);
9
- return item && !["completed", "cancelled", "review"].includes(item.status) && item.control?.id === controlId ? [item.control] : [];
10
- });
11
- if (controls.some((control) => control?.state === "failed" || control?.state === "unknown")) return "error";
12
- if (controls.some((control) => control?.state === "requested" || control?.state === "accepted")) return policy?.paused ? "pausing" : "resuming";
13
- return policy?.paused ? "paused" : policy?.mode ?? "automatic";
14
- }
15
-
16
- export {
17
- boardAllowsStart,
18
- boardControlPhase
19
- };
20
- //# sourceMappingURL=chunk-QTMTBEBA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/contracts/board-control.ts"],"sourcesContent":["import type {KanbanBoard, KanbanItem} from './contracts';\n\nexport interface KanbanBoardControl {\n mode: 'automatic' | 'manual'; paused: boolean;\n controls: Record<string, string>;\n}\n/** Manual mode still honors an explicit per-task run request. */\nexport function boardAllowsStart(board: Pick<KanbanBoard, 'executionControl'>, item?: Pick<KanbanItem, 'launch'>): boolean {\n return !board.executionControl?.paused && (board.executionControl?.mode !== 'manual' || item?.launch?.requestedAt !== undefined);\n}\nexport function boardControlPhase(board: Pick<KanbanBoard, 'executionControl'> & {items: Array<Pick<KanbanItem, 'id' | 'status' | 'control'>>}): 'automatic' | 'manual' | 'pausing' | 'paused' | 'resuming' | 'error' {\n const policy = board.executionControl;\n const controls = Object.entries(policy?.controls ?? {}).flatMap(([id, controlId]) => {\n const item = board.items.find(item => item.id === id);\n return item && !['completed', 'cancelled', 'review'].includes(item.status) && item.control?.id === controlId ? [item.control] : [];\n });\n if (controls.some(control => control?.state === 'failed' || control?.state === 'unknown')) return 'error';\n if (controls.some(control => control?.state === 'requested' || control?.state === 'accepted')) return policy?.paused ? 'pausing' : 'resuming';\n return policy?.paused ? 'paused' : policy?.mode ?? 'automatic';\n}\n"],"mappings":";AAOO,SAAS,iBAAiB,OAA8C,MAA4C;AACvH,SAAO,CAAC,MAAM,kBAAkB,WAAW,MAAM,kBAAkB,SAAS,YAAY,MAAM,QAAQ,gBAAgB;AAC1H;AACO,SAAS,kBAAkB,OAAoL;AAClN,QAAM,SAAS,MAAM;AACrB,QAAM,WAAW,OAAO,QAAQ,QAAQ,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,SAAS,MAAM;AACjF,UAAM,OAAO,MAAM,MAAM,KAAK,CAAAA,UAAQA,MAAK,OAAO,EAAE;AACpD,WAAO,QAAQ,CAAC,CAAC,aAAa,aAAa,QAAQ,EAAE,SAAS,KAAK,MAAM,KAAK,KAAK,SAAS,OAAO,YAAY,CAAC,KAAK,OAAO,IAAI,CAAC;AAAA,EACrI,CAAC;AACD,MAAI,SAAS,KAAK,aAAW,SAAS,UAAU,YAAY,SAAS,UAAU,SAAS,EAAG,QAAO;AAClG,MAAI,SAAS,KAAK,aAAW,SAAS,UAAU,eAAe,SAAS,UAAU,UAAU,EAAG,QAAO,QAAQ,SAAS,YAAY;AACnI,SAAO,QAAQ,SAAS,WAAW,QAAQ,QAAQ;AACvD;","names":["item"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/li/share/prj/x1/release/local-libraries/work/1ca933a0-6fe7-4e9c-b13b-76d7f318e0fb/source/libraries/kanban/dist/chunk-T7P5EIC4.cjs","../src/store.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACtBA,2CAA0C;AAKnC,IAAM,eAAA,EAAN,MAAM,gBAAsC;AAAA,EAEvC,WAAA,CAA6B,EAAA,EAAkC,IAAA,EAAc,MAAA,EAA0B;AAA1E,IAAA,IAAA,CAAA,GAAA,EAAA,EAAA;AAAkC,IAAA,IAAA,CAAA,KAAA,EAAA,IAAA;AACnE,IAAA,IAAA,CAAK,OAAA,mBAAS,MAAA,UAAU,EAAC,IAAA,EAAM,MAAA,CAAM,IAAA,EAAA,GAAQ;AACzC,MAAA,MAAM,KAAA,EAAO,MAAM,EAAA,CAAG,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,CAAA,EAAA;AACC,MAAA;AACZ,MAAA;AACT,IAAA;AAA4C,MAAA;AAAiB,IAAA;AAClG,EAAA;AAPiB,EAAA;AAQ4F,EAAA;AAChE,IAAA;AACrC,IAAA;AAA2C,MAAA;AACjC,IAAA;AAAoD,MAAA;AAAuB,IAAA;AAC/C,IAAA;AAC9C,EAAA;AACsD,EAAA;AAA8C,IAAA;AAAwB,EAAA;AAC7F,EAAA;AACwB,IAAA;AACvD,EAAA;AACgG,EAAA;AACjD,IAAA;AACQ,IAAA;AAEzB,IAAA;AAE2B,IAAA;AACF,IAAA;AACvD,EAAA;AAEoF,EAAA;AAC9B,IAAA;AACjC,IAAA;AAAyE,IAAA;AACvC,IAAA;AAAqE,IAAA;AAC5H,EAAA;AACsG,EAAA;AAChD,IAAA;AACD,MAAA;AACD,MAAA;AAC/C,IAAA;AACL,EAAA;AACuB,EAAA;AAC+B,IAAA;AACnB,IAAA;AAAuB,IAAA;AACtB,IAAA;AAAyC,IAAA;AAC7E,EAAA;AACoD,EAAA;AAAgD,IAAA;AAAE,EAAA;AAExB,EAAA;AACtB,IAAA;AACJ,IAAA;AACnC,IAAA;AAAmC,MAAA;AAAuC,MAAA;AAA2B,MAAA;AAAQ,IAAA;AACzE,IAAA;AAC9B,IAAA;AAC2B,IAAA;AACG,IAAA;AACrD,EAAA;AACgG,EAAA;AAC1C,IAAA;AAEtC,IAAA;AAA8B,IAAA;AAES,IAAA;AACT,IAAA;AACO,MAAA;AAC1B,MAAA;AAAyC,QAAA;AAAU,QAAA;AAAK,MAAA;AACnC,MAAA;AACG,MAAA;AACE,MAAA;AACd,MAAA;AAAI,QAAA;AAAwC,QAAA;AAAM,QAAA;AAC3C,QAAA;AAA0C,QAAA;AAAc,MAAA;AACtC,MAAA;AACV,MAAA;AACvC,MAAA;AACV,IAAA;AACqB,IAAA;AACW,IAAA;AAAuD,IAAA;AAAU,IAAA;AACtG,EAAA;AACJ;AAC4J;AAChI,EAAA;AAC+B,IAAA;AACJ,IAAA;AACnD,EAAA;AACJ;AAEoI;AAC/E,EAAA;AACG,EAAA;AACC,EAAA;AACP,EAAA;AACI,EAAA;AACG,EAAA;AACH,EAAA;AACtD;AD2CwD;AACA;AACA;AACA","file":"/home/li/share/prj/x1/release/local-libraries/work/1ca933a0-6fe7-4e9c-b13b-76d7f318e0fb/source/libraries/kanban/dist/chunk-T7P5EIC4.cjs","sourcesContent":[null,"import {numberEntities, boardCounterKey, boardNumberKey, counter, allocateBoardNumber, patchBoardNumber} from './numbering';\nimport type { KanbanEvent, KanbanArchivedItem } from './contracts';\nimport { FSError, type IFileSystem } from '@nestos/vfs-core';\nimport { KanbanError, type KanbanState, type KanbanStore } from './ports';\nimport {indexedView, viewFromState, archiveKey, boardKey as key, rowKeys, hydrate, encodeBoard, rowChanges, encodeRow, decodeRow, receiptDigest, verifyReceipt, type StoredBoard, type KanbanBodyStore} from './storage-codec';\n\n/** One user-scoped journal, with atomic board/index/receipt commits. */\nexport class SeqKanbanStore implements KanbanStore {\n private readonly bodies: KanbanBodyStore;\n private constructor(private readonly fs: IFileSystem, private readonly path: string, bodies?: KanbanBodyStore) {\n this.bodies = bodies ?? {read: async hash => {\n const body = await fs.meta.assets.getAsset(path, `${hash}.json`);\n if (body === null || body instanceof ArrayBuffer) return body;\n throw new KanbanError('BODY_INTEGRITY');\n }, write: async (hash, bytes) => {await fs.meta.assets.putAsset(path, `${hash}.json`, bytes);}};\n }\n static async open(fs: IFileSystem, directory = '/kanban', bodies?: KanbanBodyStore): Promise<SeqKanbanStore> {\n if (!fs.meta.seq?.transaction) throw new KanbanError('TRANSACTION_REQUIRED');\n try { await fs.driver.createFile({ parentPath: directory, name: 'boards.seq', type: 'seqfile', recursive: true }); }\n catch (error) { if (!(error instanceof FSError) || error.code !== 'EEXIST') throw error; }\n return new SeqKanbanStore(fs, `${directory}/boards.seq`, bodies);\n }\n async boardId(number: number): Promise<string | null> {return this.fs.meta.seq!.getEntry(this.path, boardNumberKey(number));}\n async ids(): Promise<string[]> {\n return JSON.parse(await this.fs.meta.seq!.getEntry(this.path, 'index') ?? '[]');\n }\n async events(id: string, after: number, limit: number, through: number): Promise<KanbanEvent[]> {\n const end = Math.min(through, after + limit);\n const keys = Array.from({length: Math.max(0, end - after)}, (_, index) =>\n `event/${encodeURIComponent(id)}/${String(after + index + 1).padStart(16, '0')}`);\n if (!keys.length) return [];\n // The committed sequence freezes this immutable prefix; bulk key reads avoid history scans.\n const rows = await this.fs.meta.seq!.getEntries(this.path, keys);\n return keys.filter(key => rows[key] !== undefined).map(key => JSON.parse(rows[key]) as KanbanEvent);\n }\n\n async archived(boardId: string, itemId: string): Promise<KanbanArchivedItem | null> {\n const raw = await this.fs.meta.seq!.getEntry(this.path, archiveKey(boardId, itemId));\n if (!raw) return null; const record = await decodeRow<KanbanArchivedItem>(raw, this.bodies);\n record.item.number ??= (await this.view(boardId))?.state.archiveIndex?.find(item => item.id === itemId)?.number; return record;\n }\n private async load(id: string, receiptKey?: string): Promise<StoredBoard & {receipt?: string | null}> {\n return this.fs.meta.seq!.transaction!(async tx => {\n const raw = await tx.getEntry(this.path, key(id));\n return {raw, rows: await tx.getEntries(this.path, rowKeys(raw)), receipt: receiptKey ? await tx.getEntry(this.path, receiptKey) : undefined};\n });\n }\n async view(id: string) {\n const raw = await this.fs.meta.seq!.getEntry(this.path, key(id));\n const indexed = indexedView(raw); if (indexed) return indexed;\n const state = await this.read(id); return state ? viewFromState(state) : null;\n }\n async read(id: string): Promise<KanbanState | null> {return hydrate(await this.load(id), this.bodies);}\n async update(id: string, operationId: string, fingerprint: string,\n change: (state: KanbanState | null) => KanbanState): Promise<KanbanState> {\n const receiptKey = `receipt/${encodeURIComponent(id)}/${encodeURIComponent(operationId)}`;\n const before = await this.load(id, receiptKey), current = await hydrate(before, this.bodies), receipt = before.receipt;\n if (receipt) {verifyReceipt(receipt, fingerprint); if (!current) throw new KanbanError('CORRUPT_RECEIPT'); return current;}\n const original = JSON.stringify(current), next = change(current);\n numberEntities(next);\n if (JSON.stringify(next) === original) return next;\n return this.persist(id, receiptKey, fingerprint, before, next);\n }\n private async persist(id: string, receiptKey: string, fingerprint: string, before: StoredBoard, next: KanbanState): Promise<KanbanState> {\n const events = [...next.events], archives = await Promise.all((next.archiveWrites ?? []).map(async write =>\n ({key: archiveKey(id, write.id), value: write.value ? await encodeRow(write.value, this.bodies) : null})));\n delete next.archiveWrites; next.events = [];\n // No asset I/O runs under the SeqFile transaction: it may use the same backend.\n const encoded = await encodeBoard(next, this.bodies);\n const committed = await this.fs.meta.seq!.transaction!(async tx => {\n const latestReceipt = await tx.getEntry(this.path, receiptKey);\n if (latestReceipt) {verifyReceipt(latestReceipt, fingerprint); return null;}\n if (await tx.getEntry(this.path, key(id)) !== before.raw) throw new KanbanError('REVISION_CONFLICT');\n await commitBoardNumber(tx, this.path, id, before, next, encoded);\n const eventRows = events.map(event => ({key: `event/${encodeURIComponent(id)}/${String(event.sequence).padStart(16, '0')}`, value: JSON.stringify(event)}));\n await writeRows(tx, this.path, [...eventRows, ...rowChanges(before, encoded), ...archives,\n {key: key(id), value: encoded.raw!}, {key: receiptKey, value: receiptDigest(fingerprint)}]);\n const ids: string[] = JSON.parse(await tx.getEntry(this.path, 'index') ?? '[]');\n if (!ids.includes(id)) await tx.setEntry(this.path, 'index', JSON.stringify([...ids, id]));\n return next;\n });\n if (committed) return committed;\n const replay = await this.read(id); if (!replay) throw new KanbanError('CORRUPT_RECEIPT'); return replay;\n }\n}\nasync function writeRows(tx: import('@nestos/vfs-core').ISeqFileTransaction, path: string, rows: Array<{key: string; value: string | null}>): Promise<void> {\n for (const row of rows) {\n if (row.value === null) await tx.deleteEntry(path, row.key);\n else await tx.setEntry(path, row.key, row.value);\n }\n}\n\nasync function commitBoardNumber(tx: import('@nestos/vfs-core').ISeqFileTransaction, path: string, id: string, before: StoredBoard, next: KanbanState, encoded: StoredBoard): Promise<void> {\n const previous = counter(await tx.getEntry(path, boardCounterKey));\n next.board.number = allocateBoardNumber(before.raw, previous);\n const owner = await tx.getEntry(path, boardNumberKey(next.board.number));\n if (owner !== null && owner !== id) throw new KanbanError('INVALID_NUMBERING');\n encoded.raw = patchBoardNumber(encoded.raw!, next.board.number);\n await tx.setEntry(path, boardCounterKey, String(Math.max(previous, next.board.number)));\n await tx.setEntry(path, boardNumberKey(next.board.number), id);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/random.ts","../src/utils/digest.ts"],"sourcesContent":["/**\n * @file common/utils/random.ts\n * @description UUID v4 that also works outside a secure context.\n *\n * `crypto.randomUUID()` is secure-context-only: it is undefined over plain-HTTP\n * LAN origins (e.g. http://192.168.x.x:3000) and in WebKitGTK, so calling it\n * directly throws \"crypto.randomUUID is not a function\". `crypto.getRandomValues()`\n * stays available everywhere, so it backs the fallback below.\n */\n\n/** UUID v4 — native WebCrypto when available, `getRandomValues` otherwise. */\nexport function randomUUID(): string {\n const webCrypto = globalThis.crypto;\n if (typeof webCrypto?.randomUUID === 'function') {\n try {\n return webCrypto.randomUUID();\n } catch {\n // Present but unusable (insecure context) — fall through.\n }\n }\n return formatV4(randomBytes(16));\n}\n\nfunction randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n if (typeof globalThis.crypto?.getRandomValues === 'function') {\n globalThis.crypto.getRandomValues(bytes);\n return bytes;\n }\n for (let i = 0; i < length; i++) bytes[i] = Math.floor(Math.random() * 256);\n return bytes;\n}\n\nfunction formatV4(bytes: Uint8Array): string {\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // RFC 4122 variant\n const hex = [...bytes].map(byte => byte.toString(16).padStart(2, '0'));\n return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10).join('')}`;\n}\n","/**\n * @file common/utils/digest.ts\n * @description SHA-256 that does not require WebCrypto.\n *\n * `crypto.subtle` only exists in a secure context (HTTPS or localhost) and is\n * absent in WebKitGTK, so `crypto.subtle.digest(...)` throws \"Cannot read\n * properties of undefined (reading 'digest')\" when the app is opened over a LAN\n * HTTP origin (e.g. http://192.168.x.x:3000) or in the packaged Linux app. The\n * pure-JS fallback below computes the very same SHA-256, so digests stay stable\n * across environments.\n */\n\n/** Any input a caller may want hashed. */\nexport type DigestInput = string | ArrayBuffer | ArrayBufferView;\n\nconst SHA256_K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nconst SHA256_H = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\nconst rotateRight = (value: number, bits: number): number =>\n ((value >>> bits) | (value << (32 - bits))) >>> 0;\n\nfunction toBytes(input: DigestInput): Uint8Array<ArrayBuffer> {\n if (typeof input === 'string') return new TextEncoder().encode(input);\n if (input instanceof Uint8Array && input.buffer instanceof ArrayBuffer) {\n return input as Uint8Array<ArrayBuffer>;\n }\n if (ArrayBuffer.isView(input)) {\n // Copy so WebCrypto gets a plain ArrayBuffer (never a SharedArrayBuffer view).\n const source = new Uint8Array(input.buffer as ArrayBufferLike, input.byteOffset, input.byteLength);\n const copy = new Uint8Array(input.byteLength);\n copy.set(source);\n return copy;\n }\n return new Uint8Array(input);\n}\n\nfunction toHex(bytes: Uint8Array): string {\n return [...bytes].map(byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\nfunction paddedMessage(message: Uint8Array): Uint8Array {\n const padded = new Uint8Array((Math.floor((message.length + 8) / 64) + 1) * 64);\n padded.set(message);\n padded[message.length] = 0x80;\n const view = new DataView(padded.buffer);\n const bitLength = message.length * 8;\n view.setUint32(padded.length - 8, Math.floor(bitLength / 0x1_0000_0000));\n view.setUint32(padded.length - 4, bitLength >>> 0);\n return padded;\n}\n\nfunction blockSchedule(view: DataView, offset: number): Uint32Array {\n const words = new Uint32Array(64);\n for (let i = 0; i < 16; i++) words[i] = view.getUint32(offset + i * 4);\n for (let i = 16; i < 64; i++) {\n const s0 = rotateRight(words[i - 15], 7) ^ rotateRight(words[i - 15], 18) ^ (words[i - 15] >>> 3);\n const s1 = rotateRight(words[i - 2], 17) ^ rotateRight(words[i - 2], 19) ^ (words[i - 2] >>> 10);\n words[i] = (words[i - 16] + s0 + words[i - 7] + s1) >>> 0;\n }\n return words;\n}\n\nfunction compressBlock(state: Uint32Array, words: Uint32Array): void {\n let [a, b, c, d, e, f, g, h] = state;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);\n const choose = (e & f) ^ (~e & g);\n const temp1 = (h + sigma1 + choose + SHA256_K[i] + words[i]) >>> 0;\n const sigma0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);\n const majority = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (sigma0 + majority) >>> 0;\n h = g; g = f; f = e; e = (d + temp1) >>> 0;\n d = c; c = b; b = a; a = (temp1 + temp2) >>> 0;\n }\n const next = [a, b, c, d, e, f, g, h];\n for (let i = 0; i < 8; i++) state[i] = (state[i] + next[i]) >>> 0;\n}\n\n/** Pure-JS SHA-256 usable where WebCrypto is unavailable. */\nexport function sha256Bytes(input: DigestInput): Uint8Array {\n const padded = paddedMessage(toBytes(input));\n const view = new DataView(padded.buffer);\n const state = SHA256_H.slice();\n for (let offset = 0; offset < padded.length; offset += 64) {\n compressBlock(state, blockSchedule(view, offset));\n }\n const out = new Uint8Array(32);\n const outView = new DataView(out.buffer);\n for (let i = 0; i < 8; i++) outView.setUint32(i * 4, state[i]);\n return out;\n}\n\n/** SHA-256 hex digest — WebCrypto when available, pure JS otherwise. */\nexport async function sha256Hex(input: DigestInput): Promise<string> {\n const bytes = toBytes(input);\n const subtle = globalThis.crypto?.subtle;\n if (subtle?.digest) {\n try {\n return toHex(new Uint8Array(await subtle.digest('SHA-256', bytes)));\n } catch {\n // WebCrypto present but unusable (e.g. blocked by an insecure context).\n }\n }\n return toHex(sha256Bytes(bytes));\n}\n\n/** Synchronous SHA-256 hex digest (pure JS, no WebCrypto). */\nexport function sha256HexSync(input: DigestInput): string {\n return toHex(sha256Bytes(input));\n}\n"],"mappings":"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","names":[]}