@agimon-ai/doompi-workflow 0.0.1-alpha.16 → 0.0.1-alpha.18

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/README.md CHANGED
@@ -42,6 +42,12 @@ Replay claims the failed record atomically, transfers only `PI_SESSION_ID`, and
42
42
  controls to the exact run generation that was authorized. Recovery resumes the failed
43
43
  work; it does not quietly launch a second copy beside it.
44
44
 
45
+ ## Package guidance
46
+
47
+ The package ships a root `llms.txt` index. While the parent-only Help mode is active it
48
+ contributes `workflow-help`; deactivating Help removes that generated wrapper. The
49
+ `workflow-recovery` skill is model-visible only while Workflow mode is active.
50
+
45
51
  ## Progress without transcript noise
46
52
 
47
53
  Running workflows appear in a transient task-like list above the editor with the current
@@ -1,2 +1,2 @@
1
- const e=require("./workflow/piExtension.cjs"),t=require("./leader.cjs");function n(n){let r=t.registerLeaderContribution(n);e.createWorkflowPiExtension({onModeChange:e=>r.setMode(e)})(n)}exports.registerWorkflowExtension=n;
1
+ const e=require("./workflow/piExtension.cjs"),t=require("./leader.cjs");let n=require("@agimon-ai/doompi-extension-contracts/help");function r(r){let i=t.registerLeaderContribution(r),a=(0,n.registerDoomHelpContribution)(r,{source:`@agimon-ai/doompi-workflow`,moduleUrl:require("url").pathToFileURL(__filename).href,skills:[{name:`workflow-help`,description:`Use Doom Pi workflows, monitor long-running jobs, and recover failed runs safely.`}]});e.createWorkflowPiExtension({onModeChange:e=>i.setMode(e)})(r),r.on(`session_shutdown`,()=>{a.dispose(),i.dispose()})}exports.registerWorkflowExtension=r;
2
2
  //# sourceMappingURL=extension.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension.cjs","names":["registerLeaderContribution"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createWorkflowPiExtension } from './workflow/piExtension.ts';\nimport { registerLeaderContribution } from './leader.ts';\n\nexport function registerWorkflowExtension(pi: ExtensionAPI): void {\n const leader = registerLeaderContribution(pi);\n createWorkflowPiExtension({ onModeChange: (enabled) => leader.setMode(enabled) })(pi);\n}\n"],"mappings":"wEAIA,SAAgB,EAA0B,EAAwB,CAChE,IAAM,EAASA,EAAAA,2BAA2B,CAAE,EAC5C,EAAA,0BAA0B,CAAE,aAAe,GAAY,EAAO,QAAQ,CAAO,CAAE,CAAC,CAAC,CAAC,CAAE,CACtF"}
1
+ {"version":3,"file":"extension.cjs","names":["registerLeaderContribution","registerDoomHelpContribution"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { registerDoomHelpContribution } from '@agimon-ai/doompi-extension-contracts/help';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { registerLeaderContribution } from './leader.ts';\nimport { createWorkflowPiExtension } from './workflow/piExtension.ts';\n\nexport function registerWorkflowExtension(pi: ExtensionAPI): void {\n const leader = registerLeaderContribution(pi);\n const help = registerDoomHelpContribution(pi, {\n source: '@agimon-ai/doompi-workflow',\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'workflow-help',\n description: 'Use Doom Pi workflows, monitor long-running jobs, and recover failed runs safely.',\n },\n ],\n });\n createWorkflowPiExtension({ onModeChange: (enabled) => leader.setMode(enabled) })(pi);\n pi.on('session_shutdown', () => {\n help.dispose();\n leader.dispose();\n });\n}\n"],"mappings":"oIAKA,SAAgB,EAA0B,EAAwB,CAChE,IAAM,EAASA,EAAAA,2BAA2B,CAAE,EACtC,GAAA,EAAOC,EAAAA,6BAAAA,CAA6B,EAAI,CAC5C,OAAQ,6BACR,UAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,KACA,OAAQ,CACN,CACE,KAAM,gBACN,YAAa,mFACf,CACF,CACF,CAAC,EACD,EAAA,0BAA0B,CAAE,aAAe,GAAY,EAAO,QAAQ,CAAO,CAAE,CAAC,CAAC,CAAC,CAAE,EACpF,EAAG,GAAG,uBAA0B,CAC9B,EAAK,QAAQ,EACb,EAAO,QAAQ,CACjB,CAAC,CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"extension.d.cts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;iBAIgB,0BAA0B,IAAI"}
1
+ {"version":3,"file":"extension.d.cts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;iBAKgB,0BAA0B,IAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"extension.d.mts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;iBAIgB,0BAA0B,IAAI"}
1
+ {"version":3,"file":"extension.d.mts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;iBAKgB,0BAA0B,IAAI"}
@@ -1,2 +1,2 @@
1
- import{createWorkflowPiExtension as e}from"./workflow/piExtension.mjs";import{registerLeaderContribution as t}from"./leader.mjs";function n(n){let r=t(n);e({onModeChange:e=>r.setMode(e)})(n)}export{n as registerWorkflowExtension};
1
+ import{createWorkflowPiExtension as e}from"./workflow/piExtension.mjs";import{registerLeaderContribution as t}from"./leader.mjs";import{registerDoomHelpContribution as n}from"@agimon-ai/doompi-extension-contracts/help";function r(r){let i=t(r),a=n(r,{source:`@agimon-ai/doompi-workflow`,moduleUrl:import.meta.url,skills:[{name:`workflow-help`,description:`Use Doom Pi workflows, monitor long-running jobs, and recover failed runs safely.`}]});e({onModeChange:e=>i.setMode(e)})(r),r.on(`session_shutdown`,()=>{a.dispose(),i.dispose()})}export{r as registerWorkflowExtension};
2
2
  //# sourceMappingURL=extension.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createWorkflowPiExtension } from './workflow/piExtension.ts';\nimport { registerLeaderContribution } from './leader.ts';\n\nexport function registerWorkflowExtension(pi: ExtensionAPI): void {\n const leader = registerLeaderContribution(pi);\n createWorkflowPiExtension({ onModeChange: (enabled) => leader.setMode(enabled) })(pi);\n}\n"],"mappings":"iIAIA,SAAgB,EAA0B,EAAwB,CAChE,IAAM,EAAS,EAA2B,CAAE,EAC5C,EAA0B,CAAE,aAAe,GAAY,EAAO,QAAQ,CAAO,CAAE,CAAC,CAAC,CAAC,CAAE,CACtF"}
1
+ {"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { registerDoomHelpContribution } from '@agimon-ai/doompi-extension-contracts/help';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { registerLeaderContribution } from './leader.ts';\nimport { createWorkflowPiExtension } from './workflow/piExtension.ts';\n\nexport function registerWorkflowExtension(pi: ExtensionAPI): void {\n const leader = registerLeaderContribution(pi);\n const help = registerDoomHelpContribution(pi, {\n source: '@agimon-ai/doompi-workflow',\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'workflow-help',\n description: 'Use Doom Pi workflows, monitor long-running jobs, and recover failed runs safely.',\n },\n ],\n });\n createWorkflowPiExtension({ onModeChange: (enabled) => leader.setMode(enabled) })(pi);\n pi.on('session_shutdown', () => {\n help.dispose();\n leader.dispose();\n });\n}\n"],"mappings":"2NAKA,SAAgB,EAA0B,EAAwB,CAChE,IAAM,EAAS,EAA2B,CAAE,EACtC,EAAO,EAA6B,EAAI,CAC5C,OAAQ,6BACR,UAAW,YAAY,IACvB,OAAQ,CACN,CACE,KAAM,gBACN,YAAa,mFACf,CACF,CACF,CAAC,EACD,EAA0B,CAAE,aAAe,GAAY,EAAO,QAAQ,CAAO,CAAE,CAAC,CAAC,CAAC,CAAE,EACpF,EAAG,GAAG,uBAA0B,CAC9B,EAAK,QAAQ,EACb,EAAO,QAAQ,CACjB,CAAC,CACH"}
@@ -6,6 +6,6 @@ const e=require("../../../services/workflow/backgroundWork.cjs"),t=require("../.
6
6
  `)},Rt=async(e,t)=>{let n=Ie();if(!n)return;let r=await Ft(e),i;try{i=ge.parseWorkflowFile(r.workflowPath)}catch{return}if(!i[`launch-command`])return;let a=(0,p.resolveRootSessionId)(t.sessionManager.getSessionId()),o=await O.claimRunRecovery(r.workspace,r.runKey,a),s=r.originalRepoPath??t.cwd,c=Fe([process.execPath,n,`recover-workflow`,r.runKey,`--workspace`,r.workspace,`--recovery-claim`,o.claimId,...e.runner?[`--runner`,e.runner]:[]]),l=Pe();try{await Ee(process.execPath,[n,`launch-process`,...l?[`--launcher`,l]:[],`--name`,`${r.displayName} recover`,`--cwd`,s,`--command`,c],{cwd:s,env:Ne()})}catch(e){throw await O.releaseRunRecoveryClaim(r.workspace,r.runKey,o.claimId),e}return await K(t).recordEvent(`doom_workflow.recover_delegated`,{launcher:l??`auto`,outcome:`delegated`}),`Recovering ${r.runKey} in a launcher of its own, so this session keeps its terminal. It reports back here when it ends.`},zt=async(e,t)=>{let n=e;for(;;){let e=[`Open output`],r=n.executionState??w;r===w&&e.push(`Pause`),r===`paused`&&e.push(`Resume`),n.stage===w&&e.push(`Stop`),e.push(`Back`);let i=await o.openWorkflowChoice(t,{title:`Manage ${n.runKey}`,breadcrumb:`SPC › w / workflows › l / manage`,choices:e});if(!i||i===`Back`)return;if(n=await Q(n),n.stage!==w){t.ui.notify(`${n.runKey} is no longer running.`,`warning`);return}if(i===`Open output`){await Nt(n,t);return}if(i===`Stop`){if(!await t.ui.confirm(`Stop ${n.runKey}?`,`The workflow will be interrupted and will not be restarted automatically.`))continue;if(n=await Q(n),n.stage!==w){t.ui.notify(`${n.runKey} is no longer running.`,`warning`);return}}if(i!==`Pause`&&i!==`Resume`&&i!==`Stop`)continue;if(!n.runId)throw Error(`${n.runKey} has no controllable run generation.`);let a=await dt.execute({action:i.toLowerCase(),expectedRunId:n.runId,...i===`Stop`?{reason:`Stopped from the workflow manager.`}:{},runKey:n.runKey,workspace:n.workspace});if(a.isError)throw Error(u.toolResultText(a)||`Unable to ${i.toLowerCase()} workflow.`);t.ui.notify(u.toolResultText(a)||`${i} requested for ${n.runKey}.`,`info`),await Z(t,!1),n=await Q(n)}},Bt=(e,t)=>({editor:(t,n)=>e.ui.editor(t,n),input:(n,r)=>o.openWorkflowInput(e,{title:n,breadcrumb:t,...r?{fallback:r}:{}}),notify:(t,n)=>e.ui.notify(t,n),select:(n,r)=>o.openWorkflowChoice(e,{title:n,breadcrumb:t,choices:r})}),Vt=async e=>{if(!e.hasUI){e.ui.notify(`Workflow launch needs an interactive Pi session.`,`warning`);return}let t=await f.openWorkflowLaunchWizard({compatibleRunners:ze,cwd:e.cwd,launch:(e,t)=>mt.execute(e,t),listWorkflowsTool:y.listWorkflowsTool,parseWorkflow:e=>ge.parseWorkflowFile(e),pickWorkflow:t=>i.openWorkflowPickerOverlay(e,{title:`WORKFLOW LAUNCHER`,breadcrumb:he,unit:`workflows`,action:`launch`,filterPlaceholder:`type to filter by name, path or tag`,emptyMessage:`No workflow definitions were found in this repository.`},t.map(e=>({key:e.path,name:e.name,detail:e.relativePath,search:[e.description,...e.tags].join(` `),value:e}))),ui:Bt(e,he)},e);t&&e.ui.notify(u.launchNotice(u.toolResultText(t)),`info`)},Ht=async e=>{let t=(await N(O)).filter(e=>e.stage===D);if(t.length===0){e.ui.notify(`No failed workflows are available to recover.`,`info`);return}let n=await i.openWorkflowPickerOverlay(e,{title:`WORKFLOW RECOVERY`,breadcrumb:`SPC › w / workflows › r / recover`,unit:`failed runs`,action:`recover`,filterPlaceholder:`type to filter by name, run key or failed job`,emptyMessage:`No failed workflows are available to recover.`},t.map(e=>({key:`${e.workspace}/${e.runKey}`,name:e.displayName,detail:`${e.workspace}/${e.runKey}${e.failedJob?` · ${e.failedJob}`:``}`,...e.failedJob?{search:e.failedJob}:{},value:e})));if(!n)return;let r=await Ft(n);if(r.stage!==D)throw Error(`${r.runKey} is no longer failed.`);let a=(0,_.resolve)((0,_.dirname)((0,re.fileURLToPath)(require("url").pathToFileURL(__filename).href)),ve,`workflow-recovery`,`SKILL.md`);if(!(0,te.existsSync)(a))throw Error(`Workflow recovery skill is unavailable at ${a}.`);Ut(!0),e.ui.notify(`Workflow tools enabled. The agent will investigate this failure and choose the safe next step.`,`info`),g.sendUserMessage([`Investigate recovery for this failed workflow run. This selection is permission to investigate, not permission to recover blindly.`,`Run identity: ${JSON.stringify({runKey:r.runKey,workspace:r.workspace})}`,`Read the package-owned recovery skill with the read tool at ${JSON.stringify(a)} before acting.`,`Inspect status, every relevant log source, process state, the staged run.json, and only the repair referenced by activeRepairId.`,`Choose exactly one outcome: recover, launch fresh, or defer. Never edit issue.md or repair.json, never scan historical repairs, and never pass recovery dryRun or a job override.`,`Do not recover terminal, approval-pending, blocked, or otherwise unsafe work. If evidence is incomplete, defer and explain what is missing.`,`If recovery is justified, preserve the recorded worktree and repair metadata, then verify real process and registry progress before reporting success.`].join(`
7
7
  `),{deliverAs:`followUp`})},Ut=e=>{let t=new Set(g.getActiveTools());for(let n of d.WORKFLOW_PI_TOOL_NAMES)e?t.add(n):t.delete(n);g.setActiveTools([...t]),B=e,Ct(),h.onModeChange?.(e)},Wt=()=>B?[`${k.completed} Workflow mode on`,`Ask for workflows in plain language: the agent can list, launch, inspect, pause, resume, stop, and recover runs.`,`${S(b)} stops following a run without stopping it.`].join(`
8
8
  `):[`Workflow mode off`,`Press SPC w e to give the agent its workflow tools. Runs already going are unaffected.`].join(`
9
- `),Gt=async(e,t)=>{Ut(e),B||wt(t),t.ui.notify(Wt(),`info`),await Z(t,!1)};g.registerShortcut(b,{description:`Open workflows or move typing between a workflow run and this session`,handler:async e=>{let t=V?.handle;if(t){if(!V?.interactive){e.ui.notify(`This run is hosted natively, so the view takes no typing. Your keys stay here.`,`info`);return}t.isFocused()?(t.unfocus(),e.ui.notify(`Typing goes to this session. The run keeps going.`,`info`)):(t.focus(),e.ui.notify(`Typing goes to ${V?.runKey}.`,`info`));return}if(I){wt(e),e.ui.notify(`Workflow continues in the background.`,`info`);return}await Pt(e)}}),g.registerShortcut(x,{description:`Close the workflow run view`,handler:e=>{if(!V)return;let t=V.runKey;St(),e.ui.notify(`Closed the ${t} view. The run keeps going.`,`info`)}}),g.on(`resources_discover`,()=>{let e=(0,_.resolve)((0,_.dirname)((0,re.fileURLToPath)(require("url").pathToFileURL(__filename).href)),ve);return{skillPaths:(0,te.existsSync)(e)?[e]:[]}});let Kt=(0,_.resolve)((0,_.dirname)((0,re.fileURLToPath)(require("url").pathToFileURL(__filename).href)),ve);(0,te.existsSync)(Kt)&&(0,se.registerDoomSkillSource)(g,{source:`@agimon-ai/doompi-workflow`,directories:[Kt]}),g.registerMessageRenderer(`workflow-step`,(e,{outputPad:t},n)=>{let r=c.isWorkflowStepMessageDetails(e.details)?e.details:void 0,i=typeof e.content==`string`?e.content:JSON.stringify(e.content);return c.renderWorkflowStepMessage(r,i,t,n)}),d.registerWorkflowPiTools(g,{runTool:Te,recoverTool:ut,launchExecutor:mt,controlTool:dt,requireSessionRun:Q,requireRecoverableRun:Ft,readRecoveryEvidence:Lt,delegateRecovery:Rt,trackPendingRun:ft,observeSession:st,activeRunCount:async()=>z,onLaunch:async e=>(await K(e).recordEvent(_e,{outcome:`requested`}),Z(e,!1)),followRun:async(e,t)=>{let n=await Q(e,t.sessionManager.getSessionId());return await K(t).recordEvent(`doom_workflow.follow_started`,{outcome:`started`}),await jt(n,t),`Following ${Be(n)}. Press ${S(b)} to stop following; the run keeps going.`},tailRun:async(e,t)=>{let n=await Q(e,t.sessionManager.getSessionId());return await K(t).recordEvent(`doom_workflow.tail_requested`,{outcome:`requested`}),[`Workflow: ${Be(n)}`,`Stage: ${A(n)}`,`Raw launcher output is hidden from chat. Use action follow or open to view it.`].join(`
9
+ `),Gt=async(e,t)=>{Ut(e),B||wt(t),t.ui.notify(Wt(),`info`),await Z(t,!1)};g.registerShortcut(b,{description:`Open workflows or move typing between a workflow run and this session`,handler:async e=>{let t=V?.handle;if(t){if(!V?.interactive){e.ui.notify(`This run is hosted natively, so the view takes no typing. Your keys stay here.`,`info`);return}t.isFocused()?(t.unfocus(),e.ui.notify(`Typing goes to this session. The run keeps going.`,`info`)):(t.focus(),e.ui.notify(`Typing goes to ${V?.runKey}.`,`info`));return}if(I){wt(e),e.ui.notify(`Workflow continues in the background.`,`info`);return}await Pt(e)}}),g.registerShortcut(x,{description:`Close the workflow run view`,handler:e=>{if(!V)return;let t=V.runKey;St(),e.ui.notify(`Closed the ${t} view. The run keeps going.`,`info`)}}),g.on(`resources_discover`,()=>{if(!B)return{skillPaths:[]};let e=(0,_.resolve)((0,_.dirname)((0,re.fileURLToPath)(require("url").pathToFileURL(__filename).href)),ve);return{skillPaths:(0,te.existsSync)(e)?[e]:[]}});let Kt=(0,_.resolve)((0,_.dirname)((0,re.fileURLToPath)(require("url").pathToFileURL(__filename).href)),ve);(0,te.existsSync)(Kt)&&(0,se.registerDoomSkillSource)(g,{source:`@agimon-ai/doompi-workflow`,directories:[Kt]}),g.registerMessageRenderer(`workflow-step`,(e,{outputPad:t},n)=>{let r=c.isWorkflowStepMessageDetails(e.details)?e.details:void 0,i=typeof e.content==`string`?e.content:JSON.stringify(e.content);return c.renderWorkflowStepMessage(r,i,t,n)}),d.registerWorkflowPiTools(g,{runTool:Te,recoverTool:ut,launchExecutor:mt,controlTool:dt,requireSessionRun:Q,requireRecoverableRun:Ft,readRecoveryEvidence:Lt,delegateRecovery:Rt,trackPendingRun:ft,observeSession:st,activeRunCount:async()=>z,onLaunch:async e=>(await K(e).recordEvent(_e,{outcome:`requested`}),Z(e,!1)),followRun:async(e,t)=>{let n=await Q(e,t.sessionManager.getSessionId());return await K(t).recordEvent(`doom_workflow.follow_started`,{outcome:`started`}),await jt(n,t),`Following ${Be(n)}. Press ${S(b)} to stop following; the run keeps going.`},tailRun:async(e,t)=>{let n=await Q(e,t.sessionManager.getSessionId());return await K(t).recordEvent(`doom_workflow.tail_requested`,{outcome:`requested`}),[`Workflow: ${Be(n)}`,`Stage: ${A(n)}`,`Raw launcher output is hidden from chat. Use action follow or open to view it.`].join(`
10
10
  `)},openRun:async(e,t)=>{let n=await Q(e,t.sessionManager.getSessionId());return await K(t).recordEvent(`doom_workflow.open_requested`,{outcome:`requested`}),t.hasUI?Nt(n,t):kt(n)},rejectRunner:pt});let $=e=>e;(0,ie.registerDoomLeaderActionHandlers)(g,{source:`@agimon-ai/doompi-workflow`,handlers:{[l.LEADER_ENABLE_ACTION]:e=>Gt(!0,$(e)),[l.LEADER_DISABLE_ACTION]:e=>Gt(!1,$(e)),[l.LEADER_MANAGE_ACTION]:e=>Pt($(e),!0),[l.LEADER_LAUNCH_ACTION]:e=>Vt($(e)),[l.LEADER_RECOVER_ACTION]:e=>Ht($(e))},onError:(e,t,n)=>{$(n).ui.notify(e instanceof Error?e.message:String(e),`error`)}}),g.on(`session_start`,async(t,n)=>{let r=K(n);await r.recordEvent(`doom_workflow.session_started`,{mode:process.env.WORKFLOW_MCP_MODE===`on`?`on`:`off`,outcome:`started`}),Qe=n,at.setUICtx(n.ui),xt(),P&&clearInterval(P),P=void 0;let i=n.sessionManager.getSessionId();qe=(0,oe.createNarrationRequester)({bus:g.events,source:l.PACKAGE_SOURCE,sessionId:i});let a=(0,p.resolveRootSessionId)(i);st(a),Ge=Date.now(),Je=!1,Ue=new Map,L.clear(),We.clear(),Ke=(0,m.createProtocolRuntime)({bus:g.events,source:`@agimon-ai/doompi-workflow`,sessionId:a}),Ye?.(),Ye=Ke.onNotification(ee.WorkflowModeChanged,({mode:e})=>{let t=e===`on`;t!==B&&(Ut(t),r.recordEvent(`doom_workflow.mode_changed`,{mode:e}),Z(n,!1))}),Ut(process.env.WORKFLOW_MCP_MODE===`on`),R?.dispose(),R=e.registerRunProvider(Ke),await bt(n),await Z(n,!1),Je=!0,P&&clearInterval(P),P=setInterval(()=>void Z(n,!0),De),P.unref?.()}),g.on(`session_shutdown`,async(e,t)=>{if(q.size>0){for(let e of[we,E])e.interrupt(`SIGTERM`,{phase:`workflow`,source:`pi-session-shutdown`});await Promise.race([Promise.allSettled(q),new Promise(e=>setTimeout(e,1e4).unref?.())])}xt(),P&&clearInterval(P),P=void 0,R?.dispose(),R=void 0,Ye?.(),Ye=void 0,Ke=void 0,qe=ue,Je=!1,$e?.hide(),$e=void 0,et=!1,tt.clear(),Et.clear(),St(),z=0,wt(t),at.dispose(),B=!1,Xe=void 0,Ze.publish(me(!1,0)),await G?.recordEvent(`doom_workflow.session_finished`,{"workflow.pending_count":q.size,outcome:q.size===0?`completed`:`interrupted`}),await G?.shutdown(),G=void 0})}}exports.compatibleRunners=ze,exports.createWorkflowPiExtension=P,exports.panelHint=ye,exports.panelHints=be,exports.shortcutLabel=S;
11
11
  //# sourceMappingURL=piExtension.cjs.map