@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.
- package/LICENSE +674 -0
- package/README.md +73 -29
- package/dist/{activity-C6xDM-cg.d.cts → activity-BbC4sgKL.d.cts} +28 -2
- package/dist/{activity-Dw8DOw0L.d.ts → activity-Czlan5xW.d.ts} +28 -2
- package/dist/activity-module-DaO1Rry0.d.cts +22 -0
- package/dist/activity-module-T22wliZu.d.ts +22 -0
- package/dist/activity-ports-Dqxa86zT.d.cts +12 -0
- package/dist/activity-ports-cxfrelaL.d.ts +12 -0
- package/dist/activity.cjs +10 -282
- package/dist/activity.cjs.map +1 -1
- package/dist/activity.d.cts +8 -30
- package/dist/activity.d.ts +8 -30
- package/dist/activity.js +9 -281
- package/dist/activity.js.map +1 -1
- package/dist/{chunk-O4OGAAV4.js → chunk-3JYLJPE5.js} +29 -5
- package/dist/chunk-3JYLJPE5.js.map +1 -0
- package/dist/{chunk-ATUFFNLV.js → chunk-3LEIHB7Y.js} +5 -5
- package/dist/chunk-4XF6LQSU.cjs.map +1 -1
- package/dist/chunk-5Q7WB63A.cjs +282 -0
- package/dist/chunk-5Q7WB63A.cjs.map +1 -0
- package/dist/{chunk-PSKQAFDF.cjs → chunk-7KDOTBRX.cjs} +1 -1
- package/dist/chunk-7KDOTBRX.cjs.map +1 -0
- package/dist/{chunk-5DLZWW5Y.js → chunk-AHHEGTUA.js} +3 -3
- package/dist/chunk-AOHQCX7K.cjs +95 -0
- package/dist/chunk-AOHQCX7K.cjs.map +1 -0
- package/dist/{chunk-IUI5CI2S.cjs → chunk-DINLR6E6.cjs} +96 -92
- package/dist/chunk-DINLR6E6.cjs.map +1 -0
- package/dist/{chunk-L44TM4EE.cjs → chunk-EYTVC2H5.cjs} +568 -454
- package/dist/chunk-EYTVC2H5.cjs.map +1 -0
- package/dist/chunk-FEE2YBZ7.js +1972 -0
- package/dist/chunk-FEE2YBZ7.js.map +1 -0
- package/dist/chunk-FNO5K3A7.js +282 -0
- package/dist/chunk-FNO5K3A7.js.map +1 -0
- package/dist/chunk-IHHDXZPZ.js +382 -0
- package/dist/chunk-IHHDXZPZ.js.map +1 -0
- package/dist/chunk-J3EAIVA3.js +280 -0
- package/dist/chunk-J3EAIVA3.js.map +1 -0
- package/dist/{chunk-DFTOTBGF.js → chunk-KH3WF3K4.js} +20 -16
- package/dist/chunk-KH3WF3K4.js.map +1 -0
- package/dist/{chunk-TB2RZGDV.js → chunk-M35X5PHO.js} +14 -1
- package/dist/chunk-M35X5PHO.js.map +1 -0
- package/dist/chunk-QRGZD2JU.cjs +1972 -0
- package/dist/chunk-QRGZD2JU.cjs.map +1 -0
- package/dist/{chunk-4KF7KUAI.cjs → chunk-RBOER6EW.cjs} +6 -6
- package/dist/chunk-RBOER6EW.cjs.map +1 -0
- package/dist/{chunk-6MN3H3YF.cjs → chunk-RSH6QSEC.cjs} +16 -3
- package/dist/chunk-RSH6QSEC.cjs.map +1 -0
- package/dist/{chunk-T7P5EIC4.cjs → chunk-VMRDXOLX.cjs} +33 -33
- package/dist/chunk-VMRDXOLX.cjs.map +1 -0
- package/dist/{chunk-5XKOCKY2.js → chunk-X4UHZX6F.js} +1 -1
- package/dist/chunk-XBSGUVCY.cjs +382 -0
- package/dist/chunk-XBSGUVCY.cjs.map +1 -0
- package/dist/{chunk-OHQTKGQN.js → chunk-XKDZHAUE.js} +242 -128
- package/dist/chunk-XKDZHAUE.js.map +1 -0
- package/dist/chunk-ZUZGAO6G.cjs +280 -0
- package/dist/chunk-ZUZGAO6G.cjs.map +1 -0
- package/dist/{content-CAIp1njn.d.cts → content-C5aJZFlw.d.cts} +1 -1
- package/dist/{content-CGMJdyH_.d.ts → content-hLH5BNud.d.ts} +1 -1
- package/dist/contracts/index.cjs +13 -3
- package/dist/contracts/index.cjs.map +1 -1
- package/dist/contracts/index.d.cts +5 -4
- package/dist/contracts/index.d.ts +5 -4
- package/dist/contracts/index.js +14 -4
- package/dist/{discovery-DxpirOz3.d.cts → discovery-9E-LfwIw.d.cts} +1 -1
- package/dist/{discovery-gSqWpuRm.d.ts → discovery-D60yrjej.d.ts} +1 -1
- package/dist/discovery.cjs +63 -65
- package/dist/discovery.cjs.map +1 -1
- package/dist/discovery.d.cts +4 -4
- package/dist/discovery.d.ts +4 -4
- package/dist/discovery.js +5 -7
- package/dist/discovery.js.map +1 -1
- package/dist/execution-bridge-fpCnH6z5.d.cts +52 -0
- package/dist/execution-bridge-rk0uVy_n.d.ts +52 -0
- package/dist/execution.cjs +6 -356
- package/dist/execution.cjs.map +1 -1
- package/dist/execution.d.cts +4 -51
- package/dist/execution.d.ts +4 -51
- package/dist/execution.js +9 -359
- package/dist/execution.js.map +1 -1
- package/dist/index.cjs +10 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -16
- package/dist/index.d.ts +9 -16
- package/dist/index.js +10 -12
- package/dist/index.js.map +1 -1
- package/dist/{module-CWNK2BMj.d.ts → module-CYfE7YhM.d.ts} +2 -2
- package/dist/{module-BbvwdCDF.d.cts → module-Ca9L3qCn.d.cts} +2 -2
- package/dist/{planning-CcFZYdIL.d.cts → planning-CHrOqQ6b.d.cts} +45 -10
- package/dist/{planning-CcFZYdIL.d.ts → planning-CHrOqQ6b.d.ts} +45 -10
- package/dist/{ports-Bn6ro2FB.d.ts → ports-B0McVg7B.d.ts} +4 -3
- package/dist/ports-BeGO1VRI.d.cts +49 -0
- package/dist/{ports-CaL6geqR.d.cts → ports-GQy0x-RI.d.cts} +4 -3
- package/dist/ports-ykGiNUSx.d.ts +49 -0
- package/dist/runtime/index.cjs +205 -0
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.cts +75 -0
- package/dist/runtime/index.d.ts +75 -0
- package/dist/runtime/index.js +205 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/integration.cjs +423 -0
- package/dist/runtime/integration.cjs.map +1 -0
- package/dist/runtime/integration.d.cts +658 -0
- package/dist/runtime/integration.d.ts +658 -0
- package/dist/runtime/integration.js +423 -0
- package/dist/runtime/integration.js.map +1 -0
- package/dist/storage.cjs +9 -277
- package/dist/storage.cjs.map +1 -1
- package/dist/storage.d.cts +6 -6
- package/dist/storage.d.ts +6 -6
- package/dist/storage.js +11 -279
- package/dist/storage.js.map +1 -1
- package/dist/{store-q63eSMoT.d.cts → store-DPwHzGiz.d.cts} +2 -2
- package/dist/{store-Ct0gOAAg.d.ts → store-DgdrPCV9.d.ts} +2 -2
- package/dist/task-projection-CSorlMws.d.ts +11 -0
- package/dist/task-projection-DKKB_ueb.d.cts +11 -0
- package/examples/standalone.ts +22 -0
- package/package.json +117 -87
- package/dist/chunk-2YFPV5GF.cjs +0 -16
- package/dist/chunk-2YFPV5GF.cjs.map +0 -1
- package/dist/chunk-4KF7KUAI.cjs.map +0 -1
- package/dist/chunk-6MN3H3YF.cjs.map +0 -1
- package/dist/chunk-DFTOTBGF.js.map +0 -1
- package/dist/chunk-G6FCDLDF.js +0 -16
- package/dist/chunk-G6FCDLDF.js.map +0 -1
- package/dist/chunk-IUI5CI2S.cjs.map +0 -1
- package/dist/chunk-KYNYPKKH.cjs +0 -71
- package/dist/chunk-KYNYPKKH.cjs.map +0 -1
- package/dist/chunk-L44TM4EE.cjs.map +0 -1
- package/dist/chunk-LSE6JG5I.cjs +0 -20
- package/dist/chunk-LSE6JG5I.cjs.map +0 -1
- package/dist/chunk-O4OGAAV4.js.map +0 -1
- package/dist/chunk-OHQTKGQN.js.map +0 -1
- package/dist/chunk-PSKQAFDF.cjs.map +0 -1
- package/dist/chunk-QTMTBEBA.js +0 -20
- package/dist/chunk-QTMTBEBA.js.map +0 -1
- package/dist/chunk-T7P5EIC4.cjs.map +0 -1
- package/dist/chunk-TB2RZGDV.js.map +0 -1
- package/dist/ui/index.cjs +0 -1961
- package/dist/ui/index.cjs.map +0 -1
- package/dist/ui/index.d.cts +0 -209
- package/dist/ui/index.d.ts +0 -209
- package/dist/ui/index.js +0 -1961
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/kanban.css +0 -194
- /package/dist/{chunk-ATUFFNLV.js.map → chunk-3LEIHB7Y.js.map} +0 -0
- /package/dist/{chunk-5DLZWW5Y.js.map → chunk-AHHEGTUA.js.map} +0 -0
- /package/dist/{chunk-5XKOCKY2.js.map → chunk-X4UHZX6F.js.map} +0 -0
package/dist/activity.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/li/share/prj/x1/release/local-libraries/work/1ca933a0-6fe7-4e9c-b13b-76d7f318e0fb/source/libraries/kanban/dist/activity.cjs","../src/session-activity-query.ts","../src/session-relations.ts","../src/session-activity.ts","../src/activity-module.ts"],"names":["page","board","item"],"mappings":"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","file":"/home/li/share/prj/x1/release/local-libraries/work/1ca933a0-6fe7-4e9c-b13b-76d7f318e0fb/source/libraries/kanban/dist/activity.cjs","sourcesContent":[null,"import {sha256HexSync} from './utils';\nimport type {KanbanService, KanbanSessionActivityQuery, KanbanSessionItemPage, KanbanSessionItemSummary} from './contracts';\nimport {KanbanError} from './ports';\n/** Filter before pagination; Session activity changes invalidate the filtered keyset. */\nexport async function querySessionItems(core: KanbanService, boardId: string, input: KanbanSessionActivityQuery,\n project: (rows: KanbanSessionItemSummary[])=>Promise<KanbanSessionItemSummary[]>): Promise<KanbanSessionItemPage> {\n const {execution='all',...query}=input;\n if(!['all','running','recent','active'].includes(execution)) throw new KanbanError('INVALID_EXECUTION_FILTER');\n if(execution==='all') {const page=await core.query(boardId,query);return {...page,items:await project(page.items)};}\n const {cursor,limit=50,...filters}=query;\n if(!Number.isSafeInteger(limit)||limit<1||limit>200) throw new KanbanError('INVALID_PAGE_SIZE');\n let page=await core.query(boardId,{...filters,limit:200}), rows=[...page.items];const revision=page.revision;\n while(page.nextCursor) {\n if(rows.length>=10000) throw new KanbanError('ACTIVITY_QUERY_LIMIT');\n page=await core.query(boardId,{...filters,limit:200,cursor:page.nextCursor});\n if(page.revision!==revision) throw new KanbanError('CURSOR_STALE');rows.push(...page.items);\n }\n const matching=(await project(rows)).filter(row=>matchesExecution(row,execution));\n if((await core.query(boardId,{...filters,limit:1})).revision!==revision) throw new KanbanError('CURSOR_STALE');\n const scope=sha256HexSync(JSON.stringify({filters,execution,limit})), signature=sha256HexSync(JSON.stringify(matching.map(row=>row.id)));\n let start=0;\n if(cursor) {\n let saved;try {saved=JSON.parse(cursor);} catch {throw new KanbanError('INVALID_CURSOR');}\n if(saved.scope!==scope) throw new KanbanError('CURSOR_SCOPE_MISMATCH');\n if(saved.revision!==revision||saved.signature!==signature) throw new KanbanError('CURSOR_STALE');\n start=matching.findIndex(row=>row.id===saved.after)+1;if(start<1) throw new KanbanError('INVALID_CURSOR');\n }\n const items=matching.slice(start,start+limit);\n return {revision,total:matching.length,items,...(start+items.length<matching.length?{nextCursor:JSON.stringify({scope,revision,signature,after:items.at(-1)!.id})}: {})};\n}\nfunction matchesExecution(row: KanbanSessionItemSummary, filter: string): boolean {\n const session=row.execution;if(!session||session.stale) return false;\n return filter==='running'?session.state==='running':filter==='recent'?session.recent:session.state==='running'||session.recent;\n}\n","import type {KanbanItem, KanbanExternalReference, KanbanWorkflowState, KanbanSessionAssociation, KanbanRelatedSession, KanbanSessionExecution, KanbanExecutionSession} from './contracts';\n\nexport function sessionAssociations(item: KanbanItem, bindings: KanbanExternalReference[], workflow: KanbanWorkflowState): KanbanSessionAssociation[] {\n return [...bindings.map(ref => {\n const dispatch = workflow.dispatches[ref.revision ?? ''];\n const execution: KanbanSessionExecution | undefined = dispatch?.itemId === item.id ? {\n id: dispatch.id, purpose: 'execution', dispatchId: dispatch.id, attempt: dispatch.attempt,\n outcome: dispatch.outcome, createdAt: dispatch.preparedAt, code: dispatch.code,\n ...(dispatch.continuation ? {previousDispatchId: dispatch.continuation.previousDispatchId} : {}),\n } : undefined;\n return {sessionId: ref.id, purpose: 'execution' as const, ...(execution ? {execution} : {})};\n }), ...item.participants.filter(row => !bindings.some(ref => ref.id === row.sessionId)).map(row => ({sessionId: row.sessionId, purpose: 'discussion' as const}))];\n}\n\n/** Session identity and run identity are independent; neither activity nor a hook selects the primary. */\nexport async function projectRelatedSessions(associations: KanbanSessionAssociation[], currentId: string | undefined,\n inspect: (id: string) => Promise<KanbanExecutionSession>): Promise<KanbanRelatedSession[]> {\n const grouped = new Map<string, {purposes: Set<KanbanSessionAssociation['purpose']>; executions: Map<string, KanbanSessionExecution>}>();\n for (const row of associations) {\n let group = grouped.get(row.sessionId);\n if (!group) grouped.set(row.sessionId, group = {purposes: new Set(), executions: new Map()});\n group.purposes.add(row.purpose);\n if (row.execution) group.executions.set(row.execution.id, {...group.executions.get(row.execution.id), ...row.execution});\n }\n const rows: KanbanRelatedSession[] = [], entries = [...grouped]; let next = 0;\n await Promise.all(Array.from({length: Math.min(entries.length, 8)}, async () => {\n while (next < entries.length) {\n const [sessionId, group] = entries[next++], state = await inspect(sessionId);\n rows.push({...state, current: sessionId === currentId, purposes: [...group.purposes].sort(),\n executions: [...group.executions.values()].sort((a, b) => (a.createdAt ?? 0) - (b.createdAt ?? 0) || a.id.localeCompare(b.id))});\n }\n }));\n return rows.sort((a, b) => Number(b.current) - Number(a.current) || a.sessionId.localeCompare(b.sessionId));\n}\n","import type {KanbanBoard, KanbanCommand, KanbanActor, KanbanService, KanbanExecutionSession, KanbanExternalReference, KanbanSessionItemSummary, KanbanWorkflowState} from './contracts';\nimport type {KanbanSessionSource} from './activity-ports';\nimport {principal,principalKey,candidates} from './identity';\nimport {KanbanError} from './ports';\nimport {querySessionItems} from './session-activity-query';\nimport {randomUUID} from './utils';\nimport {sessionAssociations, projectRelatedSessions} from './session-relations';\nexport interface KanbanSessionActivityOptions {source: KanbanSessionSource; now?:()=>number}\nexport function executionBindings(refs: KanbanExternalReference[] | undefined, referenceSystem: string) {return (refs ?? []).filter(ref=>ref.system===referenceSystem);}\nfunction currentBinding(refs: KanbanExternalReference[]|undefined, itemId:string, workflow:KanbanWorkflowState, referenceSystem: string) {\n const binding=executionBindings(refs, referenceSystem).at(-1),latest=Object.values(workflow.dispatches).filter(dispatch=>dispatch.itemId===itemId).sort((a,b)=>b.attempt-a.attempt)[0];\n if(!binding||!latest||binding.revision===latest.id) return binding;\n return ['prepared','running','unknown','succeeded'].includes(latest.outcome)||workflow.dispatches[binding.revision ?? '']?undefined:binding;\n}\n\n/** Optional resource projection; access checks remain owned by the injected source. */\nexport function createKanbanSessionActivity(core: KanbanService, options: KanbanSessionActivityOptions | undefined, log: (event: {operationId:string;sessionId?:string;stage:string;result:'failure';code:string;durationMs:number})=>void, referenceSystem: string) {\n const inspect=createSessionInspector(options,log);\n const project=async(boardId:string,rows:KanbanSessionItemSummary[])=>{\n if(!rows.some(row=>executionBindings(row.externalRefs,referenceSystem).length))return rows;\n const [board,workflow]=await Promise.all([boardMetadata(core,boardId),core.workflow(boardId)]), bindings=new Map(rows.map(row=>[row.id,currentBinding(row.externalRefs,row.id,workflow,referenceSystem)]));\n const ids=[...new Set([...bindings.values()].flatMap(ref=>ref?[ref.id]:[]))], states=new Map<string,KanbanExecutionSession>();let next=0;\n await Promise.all(Array.from({length:Math.min(ids.length,8)},async()=>{while(next<ids.length) {const id=ids[next++];states.set(id,await inspect(board,id));}}));\n return rows.map(row=>{const binding=bindings.get(row.id);return {...row,...(binding?{execution:states.get(binding.id)}: {})};});\n };\n return {\n queryActivity:(boardId:string,query:import('./contracts').KanbanSessionActivityQuery={})=>querySessionItems(core,boardId,query,rows=>project(boardId,rows)),\n async executionSession(boardId:string,itemId:string, query: import('./contracts').KanbanSessionDetailQuery = {}) {\n const started = Date.now();\n if (!query || typeof query !== 'object' || Array.isArray(query) || Object.keys(query).some(key => key !== 'includeRelated') || query.includeRelated !== undefined && typeof query.includeRelated !== 'boolean') throw new KanbanError('INVALID_QUERY');\n const {item}=await core.item(boardId,itemId),bindings=executionBindings(item.externalRefs,referenceSystem);\n if(!bindings.length && !query.includeRelated)return {history:[]};\n const [board,workflow]=await Promise.all([boardMetadata(core,boardId),core.workflow(boardId)]),last=currentBinding(item.externalRefs,itemId,workflow,referenceSystem);\n let sessionsCode: string | undefined;\n const related = query.includeRelated ? await options?.source.related?.(board, item, workflow).catch(error => {\n const candidate = (error as {code?: string})?.code;\n sessionsCode = candidate && /^[A-Z][A-Z0-9_]{0,79}$/.test(candidate) ? candidate : 'SESSION_RELATIONS_FAILED';\n try {log({operationId: randomUUID(), stage: 'session.relations', result: 'failure', code: sessionsCode, durationMs: Date.now() - started});} catch { /* Diagnostics cannot hide known associations. */ }\n return [];\n }) : [];\n const sessions = query.includeRelated ? await projectRelatedSessions([\n ...sessionAssociations(item, bindings, workflow), ...related ?? [],\n ], last?.id, id => inspect(board, id)) : undefined;\n return {current:last?(sessions?.find(row=>row.sessionId===last.id) ?? await inspect(board,last.id)):undefined,\n history:bindings.map(ref=>({sessionId:ref.id,bindingId:ref.revision,current:ref===last})).reverse(), ...(sessions ? {sessions} : {}), ...(sessionsCode ? {sessionsCode} : {})};\n },\n validate:(board:KanbanBoard,command:KanbanCommand|undefined,actor:KanbanActor)=>validateBinding(core,options,board,command,actor,referenceSystem),\n };\n}\nfunction createSessionInspector(options:KanbanSessionActivityOptions|undefined,log:Parameters<typeof createKanbanSessionActivity>[2]) {\n const now=options?.now ?? Date.now, cache=new Map<string,KanbanExecutionSession>();\n return async(board:KanbanBoard,sessionId:string):Promise<KanbanExecutionSession>=>{\n const started=now(),key=JSON.stringify([board.id,sessionId]);\n try {\n if(!options) throw new KanbanError('EXECUTION_SESSION_UNAVAILABLE');\n const row=await options.source.inspect(board,sessionId);\n if(row.sessionId!==sessionId) throw new KanbanError('SESSION_ACTIVITY_SCOPE_MISMATCH');\n const stale=row.stale||row.observedAt===undefined||now()-row.observedAt>90000;\n const value:KanbanExecutionSession={sessionId,...(typeof row.resourceId==='string'&&row.resourceId.length<=4096&&!row.resourceId.includes('\\0')?{resourceId:row.resourceId}:{}),title:row.title?.slice(0,256),state:row.state,createdAt:row.createdAt,lastActivityAt:row.lastActivityAt,observedAt:row.observedAt,stale,\n recent:!stale&&row.lastActivityAt!==undefined&&row.lastActivityAt<=now()&&now()-row.lastActivityAt<=600000,...(row.code&&/^[A-Z][A-Z0-9_]{0,79}$/.test(row.code)?{code:row.code}:{})};\n if(cache.size>=256) cache.delete(cache.keys().next().value!);cache.set(key,value);return value;\n } catch(error) {\n const candidate=(error as {code?:string})?.code,code=candidate&&/^[A-Z][A-Z0-9_]{0,79}$/.test(candidate)?candidate:'SESSION_ACTIVITY_FAILED';\n try {log({operationId:randomUUID(),sessionId,stage:'session.activity',result:'failure',code,durationMs:now()-started});} catch { /* Observation diagnostics cannot change assignments. */ }\n const prior=['EIO','ETIMEDOUT','ECONNRESET','ECONNREFUSED','SESSION_ACTIVITY_FAILED'].includes(code)?cache.get(key):undefined;\n return {...prior,sessionId,state:prior?.state ?? 'unknown',stale:true,recent:false,code};\n }\n };\n}\nasync function boardMetadata(core: KanbanService, boardId: string): Promise<KanbanBoard> {\n const board=(await core.catalog()).find(board=>board.id===boardId) ?? await core.read(boardId);\n return {...board,items:[]};\n}\nasync function validateBinding(core: KanbanService, options:KanbanSessionActivityOptions|undefined, board:KanbanBoard, command:KanbanCommand|undefined, actor:KanbanActor, referenceSystem: string): Promise<void> {\n if(command?.type!=='link-reference'||command.reference.system!==referenceSystem) return;\n if(!options||!command.reference.revision) throw new KanbanError('EXECUTION_SESSION_UNAVAILABLE');\n const item=board.items.find(item=>item.id===command.itemId);if(!item) throw new KanbanError('ITEM_NOT_FOUND');\n const key=principalKey(principal(actor)), coordinator=board.members?.some(member=>principalKey(member)===key&&member.roles?.includes('coordinator'));\n if(!coordinator&&item.owner?.principalId!==key&&!(item.owner===undefined&&candidates(board,item).some(candidate=>principalKey(candidate)===key))) throw new KanbanError('EXECUTION_SESSION_ASSIGNMENT_DENIED');\n const active=Object.values((await core.workflow(board.id)).dispatches).filter(dispatch=>dispatch.itemId===item.id).sort((a,b)=>b.attempt-a.attempt)[0];\n if(active&&command.reference.revision!==active.id) throw new KanbanError('EXECUTION_SESSION_LOCKED');\n if(active&&executionBindings(item.externalRefs,referenceSystem).some(ref=>ref.revision===active.id&&ref.id!==command.reference.id)) throw new KanbanError('EXECUTION_SESSION_LOCKED');\n if(options.source.authorizeBinding) return options.source.authorizeBinding(board,command.reference.id);\n const state=await options.source.inspect(board,command.reference.id);\n if(state.sessionId!==command.reference.id||state.stale) throw new KanbanError('EXECUTION_SESSION_UNAVAILABLE');\n}\n","import {createKanbanModule as createCore, type KanbanModuleHandle as CoreHandle} from './module';\nimport type {KanbanModuleOptions} from './ports';\nimport {KanbanError} from './ports';\nimport type {KanbanSessionActivityQuery, KanbanSessionItemPage, KanbanExecutionSessionDetail} from './contracts';\nimport {createKanbanSessionActivity, type KanbanSessionActivityOptions} from './session-activity';\nexport interface KanbanActivityModuleOptions extends KanbanModuleOptions {\n executionSessions?: KanbanSessionActivityOptions;\n referenceSystem: string;\n}\nexport interface KanbanActivityHandle extends CoreHandle {\n queryActivity: (boardId: string, query?: KanbanSessionActivityQuery) => Promise<KanbanSessionItemPage>;\n executionSession: (boardId: string, itemId: string, query?: import('./contracts').KanbanSessionDetailQuery) => Promise<KanbanExecutionSessionDetail>;\n}\n\n/** Application integrations stay outside the portable core. */\nexport function createKanbanActivityModule(options: KanbanActivityModuleOptions): KanbanActivityHandle {\n const {executionSessions, referenceSystem, ...core} = options;\n let activity: ReturnType<typeof createKanbanSessionActivity>;\n const service=createCore({...core,\n authorize:async input=>{await core.authorize(input);await activity.validate(input.board,input.command,input.actor);},\n });\n activity=createKanbanSessionActivity(service,executionSessions,core.log,referenceSystem);\n let stopping = false;\n const pending = new Set<Promise<unknown>>();\n const track = <T>(run: () => Promise<T>): Promise<T> => {\n if (stopping) return Promise.reject(new KanbanError('SERVICE_STOPPING'));\n const work = Promise.resolve().then(run).finally(() => {pending.delete(work);});\n pending.add(work); return work;\n };\n const quiesce = async () => {\n stopping = true;\n await Promise.allSettled([...pending]);\n await service.quiesce();\n };\n return {\n ...forwardCore(service, track),\n queryActivity: (...args) => track(() => activity.queryActivity(...args)),\n executionSession: (...args) => track(() => activity.executionSession(...args)),\n related: sessionId => track(() => relatedBoards(service, referenceSystem, sessionId)),\n quiesce, dispose: quiesce,\n };\n}\n\nfunction forwardCore(service: CoreHandle, track: <T>(run: () => Promise<T>) => Promise<T>): Omit<CoreHandle, 'related' | 'quiesce' | 'dispose'> {\n return {\n create: (input) => track(() => service.create(input)),\n read: (id) => track(() => service.read(id)),\n list: () => track(() => service.list()),\n catalog: () => track(() => service.catalog()),\n execute: (id, request) => track(() => service.execute(id, request)),\n events: (id, after, limit) => track(() => service.events(id, after, limit)),\n query: (id, query) => track(() => service.query(id, query)),\n item: (id, item) => track(() => service.item(id, item)),\n overview: (id) => track(() => service.overview(id)),\n scan: () => track(() => service.scan()),\n workflow: (id) => track(() => service.workflow(id)),\n resolve: (reference) => track(() => service.resolve(reference)),\n suggest: (id, query) => track(() => service.suggest(id, query)),\n records: (id, query) => track(() => service.records(id, query)),\n record: (id, record) => track(() => service.record(id, record)),\n currentPrincipal: () => track(() => service.currentPrincipal()),\n };\n}\nasync function relatedBoards(service: CoreHandle, referenceSystem: string, sessionId: string) {\n const boards = await service.related(sessionId);\n for (const board of await service.catalog()) {\n if (boards.some(old => old.id === board.id)) continue;\n const matches = await service.query(board.id, {view: 'all', reference: {system: referenceSystem, id: sessionId}, limit: 1});\n if (matches.total) boards.push(await service.read(board.id));\n }\n return boards;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/li/share/prj/x1/libraries/kanban/dist/activity.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,mJAAC","file":"/home/li/share/prj/x1/libraries/kanban/dist/activity.cjs"}
|
package/dist/activity.d.cts
CHANGED
|
@@ -1,34 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import './
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
/** Cold, authorized relations only; never submit or restore execution while listing. */
|
|
9
|
-
related?(board: KanbanBoard, item: KanbanItem, workflow: KanbanWorkflowState): Promise<KanbanSessionAssociation[]>;
|
|
10
|
-
authorizeBinding?(board: KanbanBoard, sessionId: string): Promise<void>;
|
|
11
|
-
/** Must check access within the supplied board's user/project and authority. */
|
|
12
|
-
inspect(board: KanbanBoard, sessionId: string): Promise<Omit<KanbanExecutionSession, 'recent'>>;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
interface KanbanSessionActivityOptions {
|
|
16
|
-
source: KanbanSessionSource;
|
|
17
|
-
now?: () => number;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface KanbanActivityModuleOptions extends KanbanModuleOptions {
|
|
21
|
-
executionSessions?: KanbanSessionActivityOptions;
|
|
22
|
-
referenceSystem: string;
|
|
23
|
-
}
|
|
24
|
-
interface KanbanActivityHandle extends KanbanModuleHandle {
|
|
25
|
-
queryActivity: (boardId: string, query?: KanbanSessionActivityQuery) => Promise<KanbanSessionItemPage>;
|
|
26
|
-
executionSession: (boardId: string, itemId: string, query?: KanbanSessionDetailQuery) => Promise<KanbanExecutionSessionDetail>;
|
|
27
|
-
}
|
|
28
|
-
/** Application integrations stay outside the portable core. */
|
|
29
|
-
declare function createKanbanActivityModule(options: KanbanActivityModuleOptions): KanbanActivityHandle;
|
|
1
|
+
export { K as KanbanActivityHandle, a as KanbanActivityModuleOptions, b as KanbanSessionActivityOptions, c as createKanbanActivityModule } from './activity-module-DaO1Rry0.cjs';
|
|
2
|
+
export { K as KanbanSessionSource } from './activity-ports-Dqxa86zT.cjs';
|
|
3
|
+
import { T as KanbanService } from './planning-CHrOqQ6b.cjs';
|
|
4
|
+
import { p as KanbanSessionActivityQuery, u as KanbanSessionItemSummary, t as KanbanSessionItemPage } from './activity-BbC4sgKL.cjs';
|
|
5
|
+
import './module-Ca9L3qCn.cjs';
|
|
6
|
+
import './ports-GQy0x-RI.cjs';
|
|
7
|
+
import './discovery-9E-LfwIw.cjs';
|
|
30
8
|
|
|
31
9
|
/** Filter before pagination; Session activity changes invalidate the filtered keyset. */
|
|
32
10
|
declare function querySessionItems(core: KanbanService, boardId: string, input: KanbanSessionActivityQuery, project: (rows: KanbanSessionItemSummary[]) => Promise<KanbanSessionItemSummary[]>): Promise<KanbanSessionItemPage>;
|
|
33
11
|
|
|
34
|
-
export {
|
|
12
|
+
export { querySessionItems };
|
package/dist/activity.d.ts
CHANGED
|
@@ -1,34 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import './
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
/** Cold, authorized relations only; never submit or restore execution while listing. */
|
|
9
|
-
related?(board: KanbanBoard, item: KanbanItem, workflow: KanbanWorkflowState): Promise<KanbanSessionAssociation[]>;
|
|
10
|
-
authorizeBinding?(board: KanbanBoard, sessionId: string): Promise<void>;
|
|
11
|
-
/** Must check access within the supplied board's user/project and authority. */
|
|
12
|
-
inspect(board: KanbanBoard, sessionId: string): Promise<Omit<KanbanExecutionSession, 'recent'>>;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
interface KanbanSessionActivityOptions {
|
|
16
|
-
source: KanbanSessionSource;
|
|
17
|
-
now?: () => number;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface KanbanActivityModuleOptions extends KanbanModuleOptions {
|
|
21
|
-
executionSessions?: KanbanSessionActivityOptions;
|
|
22
|
-
referenceSystem: string;
|
|
23
|
-
}
|
|
24
|
-
interface KanbanActivityHandle extends KanbanModuleHandle {
|
|
25
|
-
queryActivity: (boardId: string, query?: KanbanSessionActivityQuery) => Promise<KanbanSessionItemPage>;
|
|
26
|
-
executionSession: (boardId: string, itemId: string, query?: KanbanSessionDetailQuery) => Promise<KanbanExecutionSessionDetail>;
|
|
27
|
-
}
|
|
28
|
-
/** Application integrations stay outside the portable core. */
|
|
29
|
-
declare function createKanbanActivityModule(options: KanbanActivityModuleOptions): KanbanActivityHandle;
|
|
1
|
+
export { K as KanbanActivityHandle, a as KanbanActivityModuleOptions, b as KanbanSessionActivityOptions, c as createKanbanActivityModule } from './activity-module-T22wliZu.js';
|
|
2
|
+
export { K as KanbanSessionSource } from './activity-ports-cxfrelaL.js';
|
|
3
|
+
import { T as KanbanService } from './planning-CHrOqQ6b.js';
|
|
4
|
+
import { p as KanbanSessionActivityQuery, u as KanbanSessionItemSummary, t as KanbanSessionItemPage } from './activity-Czlan5xW.js';
|
|
5
|
+
import './module-CYfE7YhM.js';
|
|
6
|
+
import './ports-B0McVg7B.js';
|
|
7
|
+
import './discovery-D60yrjej.js';
|
|
30
8
|
|
|
31
9
|
/** Filter before pagination; Session activity changes invalidate the filtered keyset. */
|
|
32
10
|
declare function querySessionItems(core: KanbanService, boardId: string, input: KanbanSessionActivityQuery, project: (rows: KanbanSessionItemSummary[]) => Promise<KanbanSessionItemSummary[]>): Promise<KanbanSessionItemPage>;
|
|
33
11
|
|
|
34
|
-
export {
|
|
12
|
+
export { querySessionItems };
|
package/dist/activity.js
CHANGED
|
@@ -1,286 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
createKanbanActivityModule,
|
|
3
|
+
querySessionItems
|
|
4
|
+
} from "./chunk-FNO5K3A7.js";
|
|
5
|
+
import "./chunk-KH3WF3K4.js";
|
|
6
|
+
import "./chunk-XKDZHAUE.js";
|
|
5
7
|
import "./chunk-RQP77ZTY.js";
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from "./chunk-ATUFFNLV.js";
|
|
11
|
-
import {
|
|
12
|
-
KanbanError
|
|
13
|
-
} from "./chunk-G6FCDLDF.js";
|
|
14
|
-
import "./chunk-O4OGAAV4.js";
|
|
15
|
-
import "./chunk-5XKOCKY2.js";
|
|
16
|
-
import {
|
|
17
|
-
randomUUID,
|
|
18
|
-
sha256HexSync
|
|
19
|
-
} from "./chunk-TB2RZGDV.js";
|
|
20
|
-
import "./chunk-QTMTBEBA.js";
|
|
21
|
-
|
|
22
|
-
// src/session-activity-query.ts
|
|
23
|
-
async function querySessionItems(core, boardId, input, project) {
|
|
24
|
-
const { execution = "all", ...query } = input;
|
|
25
|
-
if (!["all", "running", "recent", "active"].includes(execution)) throw new KanbanError("INVALID_EXECUTION_FILTER");
|
|
26
|
-
if (execution === "all") {
|
|
27
|
-
const page2 = await core.query(boardId, query);
|
|
28
|
-
return { ...page2, items: await project(page2.items) };
|
|
29
|
-
}
|
|
30
|
-
const { cursor, limit = 50, ...filters } = query;
|
|
31
|
-
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 200) throw new KanbanError("INVALID_PAGE_SIZE");
|
|
32
|
-
let page = await core.query(boardId, { ...filters, limit: 200 }), rows = [...page.items];
|
|
33
|
-
const revision = page.revision;
|
|
34
|
-
while (page.nextCursor) {
|
|
35
|
-
if (rows.length >= 1e4) throw new KanbanError("ACTIVITY_QUERY_LIMIT");
|
|
36
|
-
page = await core.query(boardId, { ...filters, limit: 200, cursor: page.nextCursor });
|
|
37
|
-
if (page.revision !== revision) throw new KanbanError("CURSOR_STALE");
|
|
38
|
-
rows.push(...page.items);
|
|
39
|
-
}
|
|
40
|
-
const matching = (await project(rows)).filter((row) => matchesExecution(row, execution));
|
|
41
|
-
if ((await core.query(boardId, { ...filters, limit: 1 })).revision !== revision) throw new KanbanError("CURSOR_STALE");
|
|
42
|
-
const scope = sha256HexSync(JSON.stringify({ filters, execution, limit })), signature = sha256HexSync(JSON.stringify(matching.map((row) => row.id)));
|
|
43
|
-
let start = 0;
|
|
44
|
-
if (cursor) {
|
|
45
|
-
let saved;
|
|
46
|
-
try {
|
|
47
|
-
saved = JSON.parse(cursor);
|
|
48
|
-
} catch {
|
|
49
|
-
throw new KanbanError("INVALID_CURSOR");
|
|
50
|
-
}
|
|
51
|
-
if (saved.scope !== scope) throw new KanbanError("CURSOR_SCOPE_MISMATCH");
|
|
52
|
-
if (saved.revision !== revision || saved.signature !== signature) throw new KanbanError("CURSOR_STALE");
|
|
53
|
-
start = matching.findIndex((row) => row.id === saved.after) + 1;
|
|
54
|
-
if (start < 1) throw new KanbanError("INVALID_CURSOR");
|
|
55
|
-
}
|
|
56
|
-
const items = matching.slice(start, start + limit);
|
|
57
|
-
return { revision, total: matching.length, items, ...start + items.length < matching.length ? { nextCursor: JSON.stringify({ scope, revision, signature, after: items.at(-1).id }) } : {} };
|
|
58
|
-
}
|
|
59
|
-
function matchesExecution(row, filter) {
|
|
60
|
-
const session = row.execution;
|
|
61
|
-
if (!session || session.stale) return false;
|
|
62
|
-
return filter === "running" ? session.state === "running" : filter === "recent" ? session.recent : session.state === "running" || session.recent;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// src/session-relations.ts
|
|
66
|
-
function sessionAssociations(item, bindings, workflow) {
|
|
67
|
-
return [...bindings.map((ref) => {
|
|
68
|
-
const dispatch = workflow.dispatches[ref.revision ?? ""];
|
|
69
|
-
const execution = dispatch?.itemId === item.id ? {
|
|
70
|
-
id: dispatch.id,
|
|
71
|
-
purpose: "execution",
|
|
72
|
-
dispatchId: dispatch.id,
|
|
73
|
-
attempt: dispatch.attempt,
|
|
74
|
-
outcome: dispatch.outcome,
|
|
75
|
-
createdAt: dispatch.preparedAt,
|
|
76
|
-
code: dispatch.code,
|
|
77
|
-
...dispatch.continuation ? { previousDispatchId: dispatch.continuation.previousDispatchId } : {}
|
|
78
|
-
} : void 0;
|
|
79
|
-
return { sessionId: ref.id, purpose: "execution", ...execution ? { execution } : {} };
|
|
80
|
-
}), ...item.participants.filter((row) => !bindings.some((ref) => ref.id === row.sessionId)).map((row) => ({ sessionId: row.sessionId, purpose: "discussion" }))];
|
|
81
|
-
}
|
|
82
|
-
async function projectRelatedSessions(associations, currentId, inspect) {
|
|
83
|
-
const grouped = /* @__PURE__ */ new Map();
|
|
84
|
-
for (const row of associations) {
|
|
85
|
-
let group = grouped.get(row.sessionId);
|
|
86
|
-
if (!group) grouped.set(row.sessionId, group = { purposes: /* @__PURE__ */ new Set(), executions: /* @__PURE__ */ new Map() });
|
|
87
|
-
group.purposes.add(row.purpose);
|
|
88
|
-
if (row.execution) group.executions.set(row.execution.id, { ...group.executions.get(row.execution.id), ...row.execution });
|
|
89
|
-
}
|
|
90
|
-
const rows = [], entries = [...grouped];
|
|
91
|
-
let next = 0;
|
|
92
|
-
await Promise.all(Array.from({ length: Math.min(entries.length, 8) }, async () => {
|
|
93
|
-
while (next < entries.length) {
|
|
94
|
-
const [sessionId, group] = entries[next++], state = await inspect(sessionId);
|
|
95
|
-
rows.push({
|
|
96
|
-
...state,
|
|
97
|
-
current: sessionId === currentId,
|
|
98
|
-
purposes: [...group.purposes].sort(),
|
|
99
|
-
executions: [...group.executions.values()].sort((a, b) => (a.createdAt ?? 0) - (b.createdAt ?? 0) || a.id.localeCompare(b.id))
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}));
|
|
103
|
-
return rows.sort((a, b) => Number(b.current) - Number(a.current) || a.sessionId.localeCompare(b.sessionId));
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// src/session-activity.ts
|
|
107
|
-
function executionBindings(refs, referenceSystem) {
|
|
108
|
-
return (refs ?? []).filter((ref) => ref.system === referenceSystem);
|
|
109
|
-
}
|
|
110
|
-
function currentBinding(refs, itemId, workflow, referenceSystem) {
|
|
111
|
-
const binding = executionBindings(refs, referenceSystem).at(-1), latest = Object.values(workflow.dispatches).filter((dispatch) => dispatch.itemId === itemId).sort((a, b) => b.attempt - a.attempt)[0];
|
|
112
|
-
if (!binding || !latest || binding.revision === latest.id) return binding;
|
|
113
|
-
return ["prepared", "running", "unknown", "succeeded"].includes(latest.outcome) || workflow.dispatches[binding.revision ?? ""] ? void 0 : binding;
|
|
114
|
-
}
|
|
115
|
-
function createKanbanSessionActivity(core, options, log, referenceSystem) {
|
|
116
|
-
const inspect = createSessionInspector(options, log);
|
|
117
|
-
const project = async (boardId, rows) => {
|
|
118
|
-
if (!rows.some((row) => executionBindings(row.externalRefs, referenceSystem).length)) return rows;
|
|
119
|
-
const [board, workflow] = await Promise.all([boardMetadata(core, boardId), core.workflow(boardId)]), bindings = new Map(rows.map((row) => [row.id, currentBinding(row.externalRefs, row.id, workflow, referenceSystem)]));
|
|
120
|
-
const ids = [...new Set([...bindings.values()].flatMap((ref) => ref ? [ref.id] : []))], states = /* @__PURE__ */ new Map();
|
|
121
|
-
let next = 0;
|
|
122
|
-
await Promise.all(Array.from({ length: Math.min(ids.length, 8) }, async () => {
|
|
123
|
-
while (next < ids.length) {
|
|
124
|
-
const id = ids[next++];
|
|
125
|
-
states.set(id, await inspect(board, id));
|
|
126
|
-
}
|
|
127
|
-
}));
|
|
128
|
-
return rows.map((row) => {
|
|
129
|
-
const binding = bindings.get(row.id);
|
|
130
|
-
return { ...row, ...binding ? { execution: states.get(binding.id) } : {} };
|
|
131
|
-
});
|
|
132
|
-
};
|
|
133
|
-
return {
|
|
134
|
-
queryActivity: (boardId, query = {}) => querySessionItems(core, boardId, query, (rows) => project(boardId, rows)),
|
|
135
|
-
async executionSession(boardId, itemId, query = {}) {
|
|
136
|
-
const started = Date.now();
|
|
137
|
-
if (!query || typeof query !== "object" || Array.isArray(query) || Object.keys(query).some((key) => key !== "includeRelated") || query.includeRelated !== void 0 && typeof query.includeRelated !== "boolean") throw new KanbanError("INVALID_QUERY");
|
|
138
|
-
const { item } = await core.item(boardId, itemId), bindings = executionBindings(item.externalRefs, referenceSystem);
|
|
139
|
-
if (!bindings.length && !query.includeRelated) return { history: [] };
|
|
140
|
-
const [board, workflow] = await Promise.all([boardMetadata(core, boardId), core.workflow(boardId)]), last = currentBinding(item.externalRefs, itemId, workflow, referenceSystem);
|
|
141
|
-
let sessionsCode;
|
|
142
|
-
const related = query.includeRelated ? await options?.source.related?.(board, item, workflow).catch((error) => {
|
|
143
|
-
const candidate = error?.code;
|
|
144
|
-
sessionsCode = candidate && /^[A-Z][A-Z0-9_]{0,79}$/.test(candidate) ? candidate : "SESSION_RELATIONS_FAILED";
|
|
145
|
-
try {
|
|
146
|
-
log({ operationId: randomUUID(), stage: "session.relations", result: "failure", code: sessionsCode, durationMs: Date.now() - started });
|
|
147
|
-
} catch {
|
|
148
|
-
}
|
|
149
|
-
return [];
|
|
150
|
-
}) : [];
|
|
151
|
-
const sessions = query.includeRelated ? await projectRelatedSessions([
|
|
152
|
-
...sessionAssociations(item, bindings, workflow),
|
|
153
|
-
...related ?? []
|
|
154
|
-
], last?.id, (id) => inspect(board, id)) : void 0;
|
|
155
|
-
return {
|
|
156
|
-
current: last ? sessions?.find((row) => row.sessionId === last.id) ?? await inspect(board, last.id) : void 0,
|
|
157
|
-
history: bindings.map((ref) => ({ sessionId: ref.id, bindingId: ref.revision, current: ref === last })).reverse(),
|
|
158
|
-
...sessions ? { sessions } : {},
|
|
159
|
-
...sessionsCode ? { sessionsCode } : {}
|
|
160
|
-
};
|
|
161
|
-
},
|
|
162
|
-
validate: (board, command, actor) => validateBinding(core, options, board, command, actor, referenceSystem)
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
function createSessionInspector(options, log) {
|
|
166
|
-
const now = options?.now ?? Date.now, cache = /* @__PURE__ */ new Map();
|
|
167
|
-
return async (board, sessionId) => {
|
|
168
|
-
const started = now(), key = JSON.stringify([board.id, sessionId]);
|
|
169
|
-
try {
|
|
170
|
-
if (!options) throw new KanbanError("EXECUTION_SESSION_UNAVAILABLE");
|
|
171
|
-
const row = await options.source.inspect(board, sessionId);
|
|
172
|
-
if (row.sessionId !== sessionId) throw new KanbanError("SESSION_ACTIVITY_SCOPE_MISMATCH");
|
|
173
|
-
const stale = row.stale || row.observedAt === void 0 || now() - row.observedAt > 9e4;
|
|
174
|
-
const value = {
|
|
175
|
-
sessionId,
|
|
176
|
-
...typeof row.resourceId === "string" && row.resourceId.length <= 4096 && !row.resourceId.includes("\0") ? { resourceId: row.resourceId } : {},
|
|
177
|
-
title: row.title?.slice(0, 256),
|
|
178
|
-
state: row.state,
|
|
179
|
-
createdAt: row.createdAt,
|
|
180
|
-
lastActivityAt: row.lastActivityAt,
|
|
181
|
-
observedAt: row.observedAt,
|
|
182
|
-
stale,
|
|
183
|
-
recent: !stale && row.lastActivityAt !== void 0 && row.lastActivityAt <= now() && now() - row.lastActivityAt <= 6e5,
|
|
184
|
-
...row.code && /^[A-Z][A-Z0-9_]{0,79}$/.test(row.code) ? { code: row.code } : {}
|
|
185
|
-
};
|
|
186
|
-
if (cache.size >= 256) cache.delete(cache.keys().next().value);
|
|
187
|
-
cache.set(key, value);
|
|
188
|
-
return value;
|
|
189
|
-
} catch (error) {
|
|
190
|
-
const candidate = error?.code, code = candidate && /^[A-Z][A-Z0-9_]{0,79}$/.test(candidate) ? candidate : "SESSION_ACTIVITY_FAILED";
|
|
191
|
-
try {
|
|
192
|
-
log({ operationId: randomUUID(), sessionId, stage: "session.activity", result: "failure", code, durationMs: now() - started });
|
|
193
|
-
} catch {
|
|
194
|
-
}
|
|
195
|
-
const prior = ["EIO", "ETIMEDOUT", "ECONNRESET", "ECONNREFUSED", "SESSION_ACTIVITY_FAILED"].includes(code) ? cache.get(key) : void 0;
|
|
196
|
-
return { ...prior, sessionId, state: prior?.state ?? "unknown", stale: true, recent: false, code };
|
|
197
|
-
}
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
async function boardMetadata(core, boardId) {
|
|
201
|
-
const board = (await core.catalog()).find((board2) => board2.id === boardId) ?? await core.read(boardId);
|
|
202
|
-
return { ...board, items: [] };
|
|
203
|
-
}
|
|
204
|
-
async function validateBinding(core, options, board, command, actor, referenceSystem) {
|
|
205
|
-
if (command?.type !== "link-reference" || command.reference.system !== referenceSystem) return;
|
|
206
|
-
if (!options || !command.reference.revision) throw new KanbanError("EXECUTION_SESSION_UNAVAILABLE");
|
|
207
|
-
const item = board.items.find((item2) => item2.id === command.itemId);
|
|
208
|
-
if (!item) throw new KanbanError("ITEM_NOT_FOUND");
|
|
209
|
-
const key = principalKey(principal(actor)), coordinator = board.members?.some((member) => principalKey(member) === key && member.roles?.includes("coordinator"));
|
|
210
|
-
if (!coordinator && item.owner?.principalId !== key && !(item.owner === void 0 && candidates(board, item).some((candidate) => principalKey(candidate) === key))) throw new KanbanError("EXECUTION_SESSION_ASSIGNMENT_DENIED");
|
|
211
|
-
const active = Object.values((await core.workflow(board.id)).dispatches).filter((dispatch) => dispatch.itemId === item.id).sort((a, b) => b.attempt - a.attempt)[0];
|
|
212
|
-
if (active && command.reference.revision !== active.id) throw new KanbanError("EXECUTION_SESSION_LOCKED");
|
|
213
|
-
if (active && executionBindings(item.externalRefs, referenceSystem).some((ref) => ref.revision === active.id && ref.id !== command.reference.id)) throw new KanbanError("EXECUTION_SESSION_LOCKED");
|
|
214
|
-
if (options.source.authorizeBinding) return options.source.authorizeBinding(board, command.reference.id);
|
|
215
|
-
const state = await options.source.inspect(board, command.reference.id);
|
|
216
|
-
if (state.sessionId !== command.reference.id || state.stale) throw new KanbanError("EXECUTION_SESSION_UNAVAILABLE");
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// src/activity-module.ts
|
|
220
|
-
function createKanbanActivityModule(options) {
|
|
221
|
-
const { executionSessions, referenceSystem, ...core } = options;
|
|
222
|
-
let activity;
|
|
223
|
-
const service = createKanbanModule({
|
|
224
|
-
...core,
|
|
225
|
-
authorize: async (input) => {
|
|
226
|
-
await core.authorize(input);
|
|
227
|
-
await activity.validate(input.board, input.command, input.actor);
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
activity = createKanbanSessionActivity(service, executionSessions, core.log, referenceSystem);
|
|
231
|
-
let stopping = false;
|
|
232
|
-
const pending = /* @__PURE__ */ new Set();
|
|
233
|
-
const track = (run) => {
|
|
234
|
-
if (stopping) return Promise.reject(new KanbanError("SERVICE_STOPPING"));
|
|
235
|
-
const work = Promise.resolve().then(run).finally(() => {
|
|
236
|
-
pending.delete(work);
|
|
237
|
-
});
|
|
238
|
-
pending.add(work);
|
|
239
|
-
return work;
|
|
240
|
-
};
|
|
241
|
-
const quiesce = async () => {
|
|
242
|
-
stopping = true;
|
|
243
|
-
await Promise.allSettled([...pending]);
|
|
244
|
-
await service.quiesce();
|
|
245
|
-
};
|
|
246
|
-
return {
|
|
247
|
-
...forwardCore(service, track),
|
|
248
|
-
queryActivity: (...args) => track(() => activity.queryActivity(...args)),
|
|
249
|
-
executionSession: (...args) => track(() => activity.executionSession(...args)),
|
|
250
|
-
related: (sessionId) => track(() => relatedBoards(service, referenceSystem, sessionId)),
|
|
251
|
-
quiesce,
|
|
252
|
-
dispose: quiesce
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
function forwardCore(service, track) {
|
|
256
|
-
return {
|
|
257
|
-
create: (input) => track(() => service.create(input)),
|
|
258
|
-
read: (id) => track(() => service.read(id)),
|
|
259
|
-
list: () => track(() => service.list()),
|
|
260
|
-
catalog: () => track(() => service.catalog()),
|
|
261
|
-
execute: (id, request) => track(() => service.execute(id, request)),
|
|
262
|
-
events: (id, after, limit) => track(() => service.events(id, after, limit)),
|
|
263
|
-
query: (id, query) => track(() => service.query(id, query)),
|
|
264
|
-
item: (id, item) => track(() => service.item(id, item)),
|
|
265
|
-
overview: (id) => track(() => service.overview(id)),
|
|
266
|
-
scan: () => track(() => service.scan()),
|
|
267
|
-
workflow: (id) => track(() => service.workflow(id)),
|
|
268
|
-
resolve: (reference) => track(() => service.resolve(reference)),
|
|
269
|
-
suggest: (id, query) => track(() => service.suggest(id, query)),
|
|
270
|
-
records: (id, query) => track(() => service.records(id, query)),
|
|
271
|
-
record: (id, record) => track(() => service.record(id, record)),
|
|
272
|
-
currentPrincipal: () => track(() => service.currentPrincipal())
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
async function relatedBoards(service, referenceSystem, sessionId) {
|
|
276
|
-
const boards = await service.related(sessionId);
|
|
277
|
-
for (const board of await service.catalog()) {
|
|
278
|
-
if (boards.some((old) => old.id === board.id)) continue;
|
|
279
|
-
const matches = await service.query(board.id, { view: "all", reference: { system: referenceSystem, id: sessionId }, limit: 1 });
|
|
280
|
-
if (matches.total) boards.push(await service.read(board.id));
|
|
281
|
-
}
|
|
282
|
-
return boards;
|
|
283
|
-
}
|
|
8
|
+
import "./chunk-3LEIHB7Y.js";
|
|
9
|
+
import "./chunk-X4UHZX6F.js";
|
|
10
|
+
import "./chunk-M35X5PHO.js";
|
|
11
|
+
import "./chunk-3JYLJPE5.js";
|
|
284
12
|
export {
|
|
285
13
|
createKanbanActivityModule,
|
|
286
14
|
querySessionItems
|
package/dist/activity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/session-activity-query.ts","../src/session-relations.ts","../src/session-activity.ts","../src/activity-module.ts"],"sourcesContent":["import {sha256HexSync} from './utils';\nimport type {KanbanService, KanbanSessionActivityQuery, KanbanSessionItemPage, KanbanSessionItemSummary} from './contracts';\nimport {KanbanError} from './ports';\n/** Filter before pagination; Session activity changes invalidate the filtered keyset. */\nexport async function querySessionItems(core: KanbanService, boardId: string, input: KanbanSessionActivityQuery,\n project: (rows: KanbanSessionItemSummary[])=>Promise<KanbanSessionItemSummary[]>): Promise<KanbanSessionItemPage> {\n const {execution='all',...query}=input;\n if(!['all','running','recent','active'].includes(execution)) throw new KanbanError('INVALID_EXECUTION_FILTER');\n if(execution==='all') {const page=await core.query(boardId,query);return {...page,items:await project(page.items)};}\n const {cursor,limit=50,...filters}=query;\n if(!Number.isSafeInteger(limit)||limit<1||limit>200) throw new KanbanError('INVALID_PAGE_SIZE');\n let page=await core.query(boardId,{...filters,limit:200}), rows=[...page.items];const revision=page.revision;\n while(page.nextCursor) {\n if(rows.length>=10000) throw new KanbanError('ACTIVITY_QUERY_LIMIT');\n page=await core.query(boardId,{...filters,limit:200,cursor:page.nextCursor});\n if(page.revision!==revision) throw new KanbanError('CURSOR_STALE');rows.push(...page.items);\n }\n const matching=(await project(rows)).filter(row=>matchesExecution(row,execution));\n if((await core.query(boardId,{...filters,limit:1})).revision!==revision) throw new KanbanError('CURSOR_STALE');\n const scope=sha256HexSync(JSON.stringify({filters,execution,limit})), signature=sha256HexSync(JSON.stringify(matching.map(row=>row.id)));\n let start=0;\n if(cursor) {\n let saved;try {saved=JSON.parse(cursor);} catch {throw new KanbanError('INVALID_CURSOR');}\n if(saved.scope!==scope) throw new KanbanError('CURSOR_SCOPE_MISMATCH');\n if(saved.revision!==revision||saved.signature!==signature) throw new KanbanError('CURSOR_STALE');\n start=matching.findIndex(row=>row.id===saved.after)+1;if(start<1) throw new KanbanError('INVALID_CURSOR');\n }\n const items=matching.slice(start,start+limit);\n return {revision,total:matching.length,items,...(start+items.length<matching.length?{nextCursor:JSON.stringify({scope,revision,signature,after:items.at(-1)!.id})}: {})};\n}\nfunction matchesExecution(row: KanbanSessionItemSummary, filter: string): boolean {\n const session=row.execution;if(!session||session.stale) return false;\n return filter==='running'?session.state==='running':filter==='recent'?session.recent:session.state==='running'||session.recent;\n}\n","import type {KanbanItem, KanbanExternalReference, KanbanWorkflowState, KanbanSessionAssociation, KanbanRelatedSession, KanbanSessionExecution, KanbanExecutionSession} from './contracts';\n\nexport function sessionAssociations(item: KanbanItem, bindings: KanbanExternalReference[], workflow: KanbanWorkflowState): KanbanSessionAssociation[] {\n return [...bindings.map(ref => {\n const dispatch = workflow.dispatches[ref.revision ?? ''];\n const execution: KanbanSessionExecution | undefined = dispatch?.itemId === item.id ? {\n id: dispatch.id, purpose: 'execution', dispatchId: dispatch.id, attempt: dispatch.attempt,\n outcome: dispatch.outcome, createdAt: dispatch.preparedAt, code: dispatch.code,\n ...(dispatch.continuation ? {previousDispatchId: dispatch.continuation.previousDispatchId} : {}),\n } : undefined;\n return {sessionId: ref.id, purpose: 'execution' as const, ...(execution ? {execution} : {})};\n }), ...item.participants.filter(row => !bindings.some(ref => ref.id === row.sessionId)).map(row => ({sessionId: row.sessionId, purpose: 'discussion' as const}))];\n}\n\n/** Session identity and run identity are independent; neither activity nor a hook selects the primary. */\nexport async function projectRelatedSessions(associations: KanbanSessionAssociation[], currentId: string | undefined,\n inspect: (id: string) => Promise<KanbanExecutionSession>): Promise<KanbanRelatedSession[]> {\n const grouped = new Map<string, {purposes: Set<KanbanSessionAssociation['purpose']>; executions: Map<string, KanbanSessionExecution>}>();\n for (const row of associations) {\n let group = grouped.get(row.sessionId);\n if (!group) grouped.set(row.sessionId, group = {purposes: new Set(), executions: new Map()});\n group.purposes.add(row.purpose);\n if (row.execution) group.executions.set(row.execution.id, {...group.executions.get(row.execution.id), ...row.execution});\n }\n const rows: KanbanRelatedSession[] = [], entries = [...grouped]; let next = 0;\n await Promise.all(Array.from({length: Math.min(entries.length, 8)}, async () => {\n while (next < entries.length) {\n const [sessionId, group] = entries[next++], state = await inspect(sessionId);\n rows.push({...state, current: sessionId === currentId, purposes: [...group.purposes].sort(),\n executions: [...group.executions.values()].sort((a, b) => (a.createdAt ?? 0) - (b.createdAt ?? 0) || a.id.localeCompare(b.id))});\n }\n }));\n return rows.sort((a, b) => Number(b.current) - Number(a.current) || a.sessionId.localeCompare(b.sessionId));\n}\n","import type {KanbanBoard, KanbanCommand, KanbanActor, KanbanService, KanbanExecutionSession, KanbanExternalReference, KanbanSessionItemSummary, KanbanWorkflowState} from './contracts';\nimport type {KanbanSessionSource} from './activity-ports';\nimport {principal,principalKey,candidates} from './identity';\nimport {KanbanError} from './ports';\nimport {querySessionItems} from './session-activity-query';\nimport {randomUUID} from './utils';\nimport {sessionAssociations, projectRelatedSessions} from './session-relations';\nexport interface KanbanSessionActivityOptions {source: KanbanSessionSource; now?:()=>number}\nexport function executionBindings(refs: KanbanExternalReference[] | undefined, referenceSystem: string) {return (refs ?? []).filter(ref=>ref.system===referenceSystem);}\nfunction currentBinding(refs: KanbanExternalReference[]|undefined, itemId:string, workflow:KanbanWorkflowState, referenceSystem: string) {\n const binding=executionBindings(refs, referenceSystem).at(-1),latest=Object.values(workflow.dispatches).filter(dispatch=>dispatch.itemId===itemId).sort((a,b)=>b.attempt-a.attempt)[0];\n if(!binding||!latest||binding.revision===latest.id) return binding;\n return ['prepared','running','unknown','succeeded'].includes(latest.outcome)||workflow.dispatches[binding.revision ?? '']?undefined:binding;\n}\n\n/** Optional resource projection; access checks remain owned by the injected source. */\nexport function createKanbanSessionActivity(core: KanbanService, options: KanbanSessionActivityOptions | undefined, log: (event: {operationId:string;sessionId?:string;stage:string;result:'failure';code:string;durationMs:number})=>void, referenceSystem: string) {\n const inspect=createSessionInspector(options,log);\n const project=async(boardId:string,rows:KanbanSessionItemSummary[])=>{\n if(!rows.some(row=>executionBindings(row.externalRefs,referenceSystem).length))return rows;\n const [board,workflow]=await Promise.all([boardMetadata(core,boardId),core.workflow(boardId)]), bindings=new Map(rows.map(row=>[row.id,currentBinding(row.externalRefs,row.id,workflow,referenceSystem)]));\n const ids=[...new Set([...bindings.values()].flatMap(ref=>ref?[ref.id]:[]))], states=new Map<string,KanbanExecutionSession>();let next=0;\n await Promise.all(Array.from({length:Math.min(ids.length,8)},async()=>{while(next<ids.length) {const id=ids[next++];states.set(id,await inspect(board,id));}}));\n return rows.map(row=>{const binding=bindings.get(row.id);return {...row,...(binding?{execution:states.get(binding.id)}: {})};});\n };\n return {\n queryActivity:(boardId:string,query:import('./contracts').KanbanSessionActivityQuery={})=>querySessionItems(core,boardId,query,rows=>project(boardId,rows)),\n async executionSession(boardId:string,itemId:string, query: import('./contracts').KanbanSessionDetailQuery = {}) {\n const started = Date.now();\n if (!query || typeof query !== 'object' || Array.isArray(query) || Object.keys(query).some(key => key !== 'includeRelated') || query.includeRelated !== undefined && typeof query.includeRelated !== 'boolean') throw new KanbanError('INVALID_QUERY');\n const {item}=await core.item(boardId,itemId),bindings=executionBindings(item.externalRefs,referenceSystem);\n if(!bindings.length && !query.includeRelated)return {history:[]};\n const [board,workflow]=await Promise.all([boardMetadata(core,boardId),core.workflow(boardId)]),last=currentBinding(item.externalRefs,itemId,workflow,referenceSystem);\n let sessionsCode: string | undefined;\n const related = query.includeRelated ? await options?.source.related?.(board, item, workflow).catch(error => {\n const candidate = (error as {code?: string})?.code;\n sessionsCode = candidate && /^[A-Z][A-Z0-9_]{0,79}$/.test(candidate) ? candidate : 'SESSION_RELATIONS_FAILED';\n try {log({operationId: randomUUID(), stage: 'session.relations', result: 'failure', code: sessionsCode, durationMs: Date.now() - started});} catch { /* Diagnostics cannot hide known associations. */ }\n return [];\n }) : [];\n const sessions = query.includeRelated ? await projectRelatedSessions([\n ...sessionAssociations(item, bindings, workflow), ...related ?? [],\n ], last?.id, id => inspect(board, id)) : undefined;\n return {current:last?(sessions?.find(row=>row.sessionId===last.id) ?? await inspect(board,last.id)):undefined,\n history:bindings.map(ref=>({sessionId:ref.id,bindingId:ref.revision,current:ref===last})).reverse(), ...(sessions ? {sessions} : {}), ...(sessionsCode ? {sessionsCode} : {})};\n },\n validate:(board:KanbanBoard,command:KanbanCommand|undefined,actor:KanbanActor)=>validateBinding(core,options,board,command,actor,referenceSystem),\n };\n}\nfunction createSessionInspector(options:KanbanSessionActivityOptions|undefined,log:Parameters<typeof createKanbanSessionActivity>[2]) {\n const now=options?.now ?? Date.now, cache=new Map<string,KanbanExecutionSession>();\n return async(board:KanbanBoard,sessionId:string):Promise<KanbanExecutionSession>=>{\n const started=now(),key=JSON.stringify([board.id,sessionId]);\n try {\n if(!options) throw new KanbanError('EXECUTION_SESSION_UNAVAILABLE');\n const row=await options.source.inspect(board,sessionId);\n if(row.sessionId!==sessionId) throw new KanbanError('SESSION_ACTIVITY_SCOPE_MISMATCH');\n const stale=row.stale||row.observedAt===undefined||now()-row.observedAt>90000;\n const value:KanbanExecutionSession={sessionId,...(typeof row.resourceId==='string'&&row.resourceId.length<=4096&&!row.resourceId.includes('\\0')?{resourceId:row.resourceId}:{}),title:row.title?.slice(0,256),state:row.state,createdAt:row.createdAt,lastActivityAt:row.lastActivityAt,observedAt:row.observedAt,stale,\n recent:!stale&&row.lastActivityAt!==undefined&&row.lastActivityAt<=now()&&now()-row.lastActivityAt<=600000,...(row.code&&/^[A-Z][A-Z0-9_]{0,79}$/.test(row.code)?{code:row.code}:{})};\n if(cache.size>=256) cache.delete(cache.keys().next().value!);cache.set(key,value);return value;\n } catch(error) {\n const candidate=(error as {code?:string})?.code,code=candidate&&/^[A-Z][A-Z0-9_]{0,79}$/.test(candidate)?candidate:'SESSION_ACTIVITY_FAILED';\n try {log({operationId:randomUUID(),sessionId,stage:'session.activity',result:'failure',code,durationMs:now()-started});} catch { /* Observation diagnostics cannot change assignments. */ }\n const prior=['EIO','ETIMEDOUT','ECONNRESET','ECONNREFUSED','SESSION_ACTIVITY_FAILED'].includes(code)?cache.get(key):undefined;\n return {...prior,sessionId,state:prior?.state ?? 'unknown',stale:true,recent:false,code};\n }\n };\n}\nasync function boardMetadata(core: KanbanService, boardId: string): Promise<KanbanBoard> {\n const board=(await core.catalog()).find(board=>board.id===boardId) ?? await core.read(boardId);\n return {...board,items:[]};\n}\nasync function validateBinding(core: KanbanService, options:KanbanSessionActivityOptions|undefined, board:KanbanBoard, command:KanbanCommand|undefined, actor:KanbanActor, referenceSystem: string): Promise<void> {\n if(command?.type!=='link-reference'||command.reference.system!==referenceSystem) return;\n if(!options||!command.reference.revision) throw new KanbanError('EXECUTION_SESSION_UNAVAILABLE');\n const item=board.items.find(item=>item.id===command.itemId);if(!item) throw new KanbanError('ITEM_NOT_FOUND');\n const key=principalKey(principal(actor)), coordinator=board.members?.some(member=>principalKey(member)===key&&member.roles?.includes('coordinator'));\n if(!coordinator&&item.owner?.principalId!==key&&!(item.owner===undefined&&candidates(board,item).some(candidate=>principalKey(candidate)===key))) throw new KanbanError('EXECUTION_SESSION_ASSIGNMENT_DENIED');\n const active=Object.values((await core.workflow(board.id)).dispatches).filter(dispatch=>dispatch.itemId===item.id).sort((a,b)=>b.attempt-a.attempt)[0];\n if(active&&command.reference.revision!==active.id) throw new KanbanError('EXECUTION_SESSION_LOCKED');\n if(active&&executionBindings(item.externalRefs,referenceSystem).some(ref=>ref.revision===active.id&&ref.id!==command.reference.id)) throw new KanbanError('EXECUTION_SESSION_LOCKED');\n if(options.source.authorizeBinding) return options.source.authorizeBinding(board,command.reference.id);\n const state=await options.source.inspect(board,command.reference.id);\n if(state.sessionId!==command.reference.id||state.stale) throw new KanbanError('EXECUTION_SESSION_UNAVAILABLE');\n}\n","import {createKanbanModule as createCore, type KanbanModuleHandle as CoreHandle} from './module';\nimport type {KanbanModuleOptions} from './ports';\nimport {KanbanError} from './ports';\nimport type {KanbanSessionActivityQuery, KanbanSessionItemPage, KanbanExecutionSessionDetail} from './contracts';\nimport {createKanbanSessionActivity, type KanbanSessionActivityOptions} from './session-activity';\nexport interface KanbanActivityModuleOptions extends KanbanModuleOptions {\n executionSessions?: KanbanSessionActivityOptions;\n referenceSystem: string;\n}\nexport interface KanbanActivityHandle extends CoreHandle {\n queryActivity: (boardId: string, query?: KanbanSessionActivityQuery) => Promise<KanbanSessionItemPage>;\n executionSession: (boardId: string, itemId: string, query?: import('./contracts').KanbanSessionDetailQuery) => Promise<KanbanExecutionSessionDetail>;\n}\n\n/** Application integrations stay outside the portable core. */\nexport function createKanbanActivityModule(options: KanbanActivityModuleOptions): KanbanActivityHandle {\n const {executionSessions, referenceSystem, ...core} = options;\n let activity: ReturnType<typeof createKanbanSessionActivity>;\n const service=createCore({...core,\n authorize:async input=>{await core.authorize(input);await activity.validate(input.board,input.command,input.actor);},\n });\n activity=createKanbanSessionActivity(service,executionSessions,core.log,referenceSystem);\n let stopping = false;\n const pending = new Set<Promise<unknown>>();\n const track = <T>(run: () => Promise<T>): Promise<T> => {\n if (stopping) return Promise.reject(new KanbanError('SERVICE_STOPPING'));\n const work = Promise.resolve().then(run).finally(() => {pending.delete(work);});\n pending.add(work); return work;\n };\n const quiesce = async () => {\n stopping = true;\n await Promise.allSettled([...pending]);\n await service.quiesce();\n };\n return {\n ...forwardCore(service, track),\n queryActivity: (...args) => track(() => activity.queryActivity(...args)),\n executionSession: (...args) => track(() => activity.executionSession(...args)),\n related: sessionId => track(() => relatedBoards(service, referenceSystem, sessionId)),\n quiesce, dispose: quiesce,\n };\n}\n\nfunction forwardCore(service: CoreHandle, track: <T>(run: () => Promise<T>) => Promise<T>): Omit<CoreHandle, 'related' | 'quiesce' | 'dispose'> {\n return {\n create: (input) => track(() => service.create(input)),\n read: (id) => track(() => service.read(id)),\n list: () => track(() => service.list()),\n catalog: () => track(() => service.catalog()),\n execute: (id, request) => track(() => service.execute(id, request)),\n events: (id, after, limit) => track(() => service.events(id, after, limit)),\n query: (id, query) => track(() => service.query(id, query)),\n item: (id, item) => track(() => service.item(id, item)),\n overview: (id) => track(() => service.overview(id)),\n scan: () => track(() => service.scan()),\n workflow: (id) => track(() => service.workflow(id)),\n resolve: (reference) => track(() => service.resolve(reference)),\n suggest: (id, query) => track(() => service.suggest(id, query)),\n records: (id, query) => track(() => service.records(id, query)),\n record: (id, record) => track(() => service.record(id, record)),\n currentPrincipal: () => track(() => service.currentPrincipal()),\n };\n}\nasync function relatedBoards(service: CoreHandle, referenceSystem: string, sessionId: string) {\n const boards = await service.related(sessionId);\n for (const board of await service.catalog()) {\n if (boards.some(old => old.id === board.id)) continue;\n const matches = await service.query(board.id, {view: 'all', reference: {system: referenceSystem, id: sessionId}, limit: 1});\n if (matches.total) boards.push(await service.read(board.id));\n }\n return boards;\n}\n"],"mappings":"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","names":["page","board","item"]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
// src/contracts/board-control.ts
|
|
2
|
+
function boardAllowsStart(board, item) {
|
|
3
|
+
return !board.lifecycle && !board.executionControl?.paused && (board.executionControl?.mode !== "manual" || item?.launch?.requestedAt !== void 0);
|
|
4
|
+
}
|
|
5
|
+
function boardControlPhase(board) {
|
|
6
|
+
if (board.lifecycle) return board.lifecycle.intent === "delete" ? "waiting-deletion" : board.lifecycle.phase === "ready" ? "cancelled" : "cancelling";
|
|
7
|
+
const policy = board.executionControl;
|
|
8
|
+
const controls = Object.entries(policy?.controls ?? {}).flatMap(([id, controlId]) => {
|
|
9
|
+
const item = board.items.find((item2) => item2.id === id);
|
|
10
|
+
return item && !["completed", "cancelled", "review"].includes(item.status) && item.control?.id === controlId ? [item.control] : [];
|
|
11
|
+
});
|
|
12
|
+
if (controls.some((control) => control?.state === "failed" || control?.state === "unknown")) return "error";
|
|
13
|
+
if (controls.some((control) => control?.state === "requested" || control?.state === "accepted")) return policy?.paused ? "pausing" : "resuming";
|
|
14
|
+
return policy?.paused ? "paused" : policy?.mode ?? "automatic";
|
|
15
|
+
}
|
|
16
|
+
|
|
1
17
|
// src/contracts/task-projection.ts
|
|
2
18
|
var TASK_START_DELAY_MS = 3e5;
|
|
3
19
|
function taskStartAt(item) {
|
|
@@ -7,21 +23,27 @@ function taskEditing(item, now) {
|
|
|
7
23
|
return (item.launch?.editing?.expiresAt ?? 0) > now;
|
|
8
24
|
}
|
|
9
25
|
function taskDue(item, now) {
|
|
10
|
-
return !taskEditing(item, now) && !item.blocked && item.control
|
|
26
|
+
return !taskEditing(item, now) && !item.blocked && (!item.control || item.control.action === "resume" && item.control.state === "resumed") && (item.launch?.requestedAt !== void 0 || item.launch?.mode !== "manual" && taskStartAt(item) <= now);
|
|
11
27
|
}
|
|
12
28
|
function projectKanbanTask(item, workflow, now = Date.now(), all = []) {
|
|
13
29
|
const dispatch = Object.values(workflow?.dispatches ?? {}).filter((d) => d.itemId === item.id).sort((a, b) => b.attempt - a.attempt)[0];
|
|
14
|
-
const fact = terminalFact(item) ??
|
|
30
|
+
const fact = terminalFact(item) ?? controlFact(item) ?? issueFact(item, dispatch) ?? failureFact(item, dispatch) ?? executionFact(item, dispatch) ?? waitingFact(item, now, all);
|
|
31
|
+
const extra = [];
|
|
32
|
+
if (!["completed", "cancelled"].includes(item.status) && item.control?.action !== "cancel") {
|
|
33
|
+
if (!fact.actions?.includes("cancel")) extra.push("cancel");
|
|
34
|
+
if (item.status !== "review" && !fact.actions?.includes("pause") && !fact.actions?.includes("resume") && (dispatch?.controlCapabilities?.pause === "boundary" || !dispatch)) extra.push("pause");
|
|
35
|
+
}
|
|
15
36
|
return {
|
|
16
37
|
...fact,
|
|
17
38
|
startAt: taskStartAt(item),
|
|
18
39
|
dispatchId: dispatch?.id,
|
|
19
40
|
sessionId: dispatch?.executionSessionId,
|
|
20
|
-
actions: [...fact.actions ?? [], ...dispatch || item.launch?.admittedAt !== void 0 || ["claimed", "review", "completed"].includes(item.status) ? ["fix"] : [], ...dispatch?.executionSessionId ? ["open-session"] : []]
|
|
41
|
+
actions: item.deletedAt === void 0 ? [...fact.actions ?? [], ...extra, ...dispatch || item.launch?.admittedAt !== void 0 || ["claimed", "review", "completed"].includes(item.status) ? ["fix"] : [], ...dispatch?.executionSessionId ? ["open-session"] : []] : []
|
|
21
42
|
};
|
|
22
43
|
}
|
|
23
44
|
function terminalFact(item) {
|
|
24
|
-
if (item.status === "completed" || item.status === "cancelled") return { phase: item.status };
|
|
45
|
+
if (item.status === "completed" || item.status === "cancelled") return { phase: item.status, actions: ["delete"] };
|
|
46
|
+
if (item.control?.action === "cancel") return { phase: item.control.state === "failed" ? "error" : item.control.state === "unknown" ? "unknown" : "cancelling", reason: item.control.code, actions: item.control.state === "failed" ? ["cancel"] : [] };
|
|
25
47
|
if (item.status === "review") return { phase: "review", actions: ["review"] };
|
|
26
48
|
}
|
|
27
49
|
function issueFact(item, dispatch) {
|
|
@@ -62,10 +84,12 @@ function analysisFact(item) {
|
|
|
62
84
|
}
|
|
63
85
|
|
|
64
86
|
export {
|
|
87
|
+
boardAllowsStart,
|
|
88
|
+
boardControlPhase,
|
|
65
89
|
TASK_START_DELAY_MS,
|
|
66
90
|
taskStartAt,
|
|
67
91
|
taskEditing,
|
|
68
92
|
taskDue,
|
|
69
93
|
projectKanbanTask
|
|
70
94
|
};
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
95
|
+
//# sourceMappingURL=chunk-3JYLJPE5.js.map
|