@agimon-ai/doompi-workflow 0.0.1-alpha.125 → 0.0.1-alpha.126

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
@@ -175,3 +175,9 @@ readiness discovery; dependent calls await that session's readiness. On shutdown
175
175
  also handles startup failure. Both use the same idempotent cleanup. A generation
176
176
  fence prevents retired callbacks from sending messages or updating the UI; only
177
177
  explicit resource teardown may use a retired UI context.
178
+
179
+ ## Step completion
180
+
181
+ In-process steps wait, without a timeout or decision reminders, for the child session to be idle with no queued messages or owned subagent/task/runner work. Cancellation interrupts this wait. Missing coordinator snapshots and holding-provider errors defer the decision gate; a failed inspection fails the step. Workflow monitoring itself does not hold completion.
182
+
183
+ Pi terminal steps must load this package: its native settled handler owns the decision gate, not generic `hooks.yaml`. It skips host-steered sessions and subagents, and defers the gate while owned background work remains. Missing pane coordinators retain the no-work fallback; snapshot failures defer gating with a diagnostic.
@@ -2,17 +2,18 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_workflowTerminal = require("../workflowTerminal-DeJ9BBta.cjs");
5
+ const require_workflowTerminal = require("../workflowTerminal-CR4-wbOZ.cjs");
6
6
  const require_workflowLaunchCommand = require("../workflowLaunchCommand-DJyDB96d.cjs");
7
7
  let _agimon_ai_doompi_core_piExtension = require("@agimon-ai/doompi-core/piExtension");
8
8
  let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
9
+ let _agimon_ai_doompi_core_backgroundWork = require("@agimon-ai/doompi-core/backgroundWork");
9
10
  let _agimon_ai_doompi_core_skills = require("@agimon-ai/doompi-core/skills");
10
11
  let _agimon_ai_doompi_core_uiHub = require("@agimon-ai/doompi-core/uiHub");
12
+ let _agimon_ai_workflow_mcp = require("@agimon-ai/workflow-mcp");
11
13
  let _agimon_ai_doompi_core_childProcess = require("@agimon-ai/doompi-core/childProcess");
12
14
  let node_fs = require("node:fs");
13
15
  let node_fs_promises = require("node:fs/promises");
14
16
  let node_path = require("node:path");
15
- let _agimon_ai_workflow_mcp = require("@agimon-ai/workflow-mcp");
16
17
  let zod = require("zod");
17
18
  let node_crypto = require("node:crypto");
18
19
  let _agimon_ai_doompi_ui_toolChrome = require("@agimon-ai/doompi-ui/toolChrome");
@@ -23,6 +24,18 @@ let _agimon_ai_doompi_core_readiness = require("@agimon-ai/doompi-core/readiness
23
24
  let _agimon_ai_doompi_minor_mode = require("@agimon-ai/doompi-minor-mode");
24
25
  let _agimon_ai_doompi_telemetry = require("@agimon-ai/doompi-telemetry");
25
26
  let _earendil_works_pi_tui = require("@earendil-works/pi-tui");
27
+ //#region src/services/stepStopGate/index.ts
28
+ function isStepStopGateEligible(environment) {
29
+ return Boolean(environment[_agimon_ai_workflow_mcp.WORKFLOW_DECISION_FILE_ENV] && environment[_agimon_ai_workflow_mcp.WORKFLOW_DECISION_STEERING_ENV] !== _agimon_ai_workflow_mcp.WORKFLOW_DECISION_STEERING_HOST && !environment.PI_SUBAGENT_CHILD);
30
+ }
31
+ /** A pane's root agent may settle to wait without spending a workflow reminder. */
32
+ async function stepStopGate(environment, snapshot) {
33
+ if (!isStepStopGateEligible(environment)) return void 0;
34
+ if (snapshot?.items.some(_agimon_ai_doompi_core_backgroundWork.holdsSettledSession) || snapshot?.errors.some((error) => _agimon_ai_doompi_core_backgroundWork.BACKGROUND_WORK_HOLDING_PROVIDERS.includes(error.provider))) return void 0;
35
+ const gate = await (0, _agimon_ai_workflow_mcp.gateStepDecision)(environment);
36
+ return gate.action === "block" ? gate.message : void 0;
37
+ }
38
+ //#endregion
26
39
  //#region src/services/workflowTools/index.ts
27
40
  const PI_LAUNCH_FIELDS = {
28
41
  workflowPath: true,
@@ -4521,6 +4534,7 @@ function createWorkflowPiRuntime(pi, options) {
4521
4534
  var index_cli_default = (({ pi, context, options, signal }) => {
4522
4535
  const environment = options?.environment ?? Object.freeze({ ...process.env });
4523
4536
  const dispatcher = require_workflowTerminal.isWorkflowDispatcherProcess(environment);
4537
+ let backgroundWork;
4524
4538
  const fence = require_workflowTerminal.createWorkflowFence(pi, signal);
4525
4539
  let workflowMode = false;
4526
4540
  let leader;
@@ -4547,6 +4561,13 @@ var index_cli_default = (({ pi, context, options, signal }) => {
4547
4561
  const selectedTools = dispatcher ? require_workflowTerminal.dispatcherTools(nativeTools, require_workflowTerminal.resolveDispatcherParentSession(environment), environment) : nativeTools;
4548
4562
  return {
4549
4563
  services: [...runtime.services ?? [], (cordis) => {
4564
+ cordis.inject([_agimon_ai_doompi_core_backgroundWork.DOOM_BACKGROUND_WORK_SERVICE], (serviceContext) => {
4565
+ const service = (0, _agimon_ai_doompi_core_backgroundWork.readDoomBackgroundWorkService)(serviceContext);
4566
+ backgroundWork = service;
4567
+ return () => {
4568
+ if (backgroundWork === service) backgroundWork = void 0;
4569
+ };
4570
+ });
4550
4571
  cordis.inject([_agimon_ai_doompi_core_skills.DOOM_SKILL_SOURCES_SERVICE], (skillContext) => {
4551
4572
  const directory = require_workflowTerminal.workflowSkillDirectory();
4552
4573
  const contribution = (0, _agimon_ai_doompi_core_skills.requireDoomSkillSourcesService)(skillContext).register({
@@ -4573,7 +4594,32 @@ var index_cli_default = (({ pi, context, options, signal }) => {
4573
4594
  }))),
4574
4595
  commands: runtime.commands.map(([name, command]) => fence.command(name, command)),
4575
4596
  shortcuts: runtime.shortcuts?.map(([key, shortcut]) => fence.shortcut(key, shortcut)),
4576
- events: fence.events(runtime.events ?? {}),
4597
+ events: fence.events({
4598
+ ...runtime.events,
4599
+ async agent_settled(_event, ctx) {
4600
+ if (!fence.isCurrentInvocation() || !isStepStopGateEligible(environment)) return;
4601
+ let snapshot;
4602
+ try {
4603
+ snapshot = backgroundWork?.snapshot(ctx.sessionManager.getSessionId());
4604
+ } catch (error) {
4605
+ pi.sendMessage({
4606
+ customType: "workflow-step",
4607
+ content: `Cannot inspect step background work: ${String(error)}`,
4608
+ display: true
4609
+ });
4610
+ return;
4611
+ }
4612
+ const message = await stepStopGate(environment, snapshot);
4613
+ if (message && fence.isCurrentInvocation()) pi.sendMessage({
4614
+ customType: "workflow-step",
4615
+ content: message,
4616
+ display: true
4617
+ }, {
4618
+ triggerTurn: true,
4619
+ deliverAs: "followUp"
4620
+ });
4621
+ }
4622
+ }),
4577
4623
  toolRestrictions: [...runtime.toolRestrictions ?? [], ...dispatcher ? [{
4578
4624
  source: `${require_workflowTerminal.PACKAGE_SOURCE}/dispatcher`,
4579
4625
  restrict: require_workflowTerminal.dispatcherToolRestriction()
@@ -4618,6 +4664,9 @@ var root_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)((con
4618
4664
  //#region src/extensions/workspaces/sessions/(backend)/command/workflow-launch.cli.ts
4619
4665
  var workflow_launch_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)((context) => context.root.commands[0], { cardinality: "optional" });
4620
4666
  //#endregion
4667
+ //#region src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.ts
4668
+ var agent_settled_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)((context) => context.root.events?.agent_settled, { cardinality: "optional" });
4669
+ //#endregion
4621
4670
  //#region src/extensions/workspaces/sessions/(backend)/hook/resources-discover.cli.ts
4622
4671
  var resources_discover_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)((context) => context.root.events?.resources_discover, { cardinality: "optional" });
4623
4672
  //#endregion
@@ -4750,6 +4799,7 @@ const extension = (0, _agimon_ai_doompi_core_piExtension.definePiExtension)("@ag
4750
4799
  return defined([at(workflow_launch_cli_default, contextSession)]);
4751
4800
  },
4752
4801
  events: {
4802
+ ...keyed("agent_settled", at(agent_settled_cli_default, contextSession)),
4753
4803
  ...keyed("resources_discover", at(resources_discover_cli_default, contextSession)),
4754
4804
  ...keyed("session_start", at(session_start_cli_default, contextSession))
4755
4805
  },