@agimon-ai/doompi-team 0.0.1-alpha.76 → 0.0.1-alpha.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/extensions/mcp.cjs +34 -0
  2. package/dist/extensions/mcp.cjs.map +1 -0
  3. package/dist/extensions/mcp.d.cts +5 -0
  4. package/dist/extensions/mcp.d.cts.map +1 -0
  5. package/dist/extensions/mcp.d.mts +5 -0
  6. package/dist/extensions/mcp.d.mts.map +1 -0
  7. package/dist/extensions/mcp.mjs +29 -0
  8. package/dist/extensions/mcp.mjs.map +1 -0
  9. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs +9 -1
  10. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs.map +1 -1
  11. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs +9 -1
  12. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs.map +1 -1
  13. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs +30 -21
  14. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs.map +1 -1
  15. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs +14 -5
  16. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs.map +1 -1
  17. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.server.cjs +2 -37
  18. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.server.cjs.map +1 -1
  19. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.server.mjs +2 -36
  20. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.server.mjs.map +1 -1
  21. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.server.cjs +2 -174
  22. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.server.cjs.map +1 -1
  23. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.server.mjs +2 -173
  24. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.server.mjs.map +1 -1
  25. package/dist/src/services/headlessIntercomTool/index.cjs +19 -0
  26. package/dist/src/services/headlessIntercomTool/index.cjs.map +1 -0
  27. package/dist/src/services/headlessIntercomTool/index.mjs +19 -0
  28. package/dist/src/services/headlessIntercomTool/index.mjs.map +1 -0
  29. package/dist/src/services/headlessSubagentTool/index.cjs +177 -0
  30. package/dist/src/services/headlessSubagentTool/index.cjs.map +1 -0
  31. package/dist/src/services/headlessSubagentTool/index.mjs +177 -0
  32. package/dist/src/services/headlessSubagentTool/index.mjs.map +1 -0
  33. package/dist/src/services/mcpTools/index.cjs +14 -0
  34. package/dist/src/services/mcpTools/index.cjs.map +1 -0
  35. package/dist/src/services/mcpTools/index.mjs +13 -0
  36. package/dist/src/services/mcpTools/index.mjs.map +1 -0
  37. package/dist/src/services/spawnPlan/index.cjs +1 -1
  38. package/dist/src/services/spawnPlan/index.cjs.map +1 -1
  39. package/dist/src/services/spawnPlan/index.mjs +1 -1
  40. package/dist/src/services/spawnPlan/index.mjs.map +1 -1
  41. package/dist/src/services/teamCollaboration/index.cjs +7 -8
  42. package/dist/src/services/teamCollaboration/index.cjs.map +1 -1
  43. package/dist/src/services/teamCollaboration/index.mjs +3 -4
  44. package/dist/src/services/teamCollaboration/index.mjs.map +1 -1
  45. package/package.json +27 -18
  46. package/dist/src/services/backgroundWorkService/index.cjs +0 -74
  47. package/dist/src/services/backgroundWorkService/index.cjs.map +0 -1
  48. package/dist/src/services/backgroundWorkService/index.mjs +0 -74
  49. package/dist/src/services/backgroundWorkService/index.mjs.map +0 -1
@@ -0,0 +1,34 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ let _agimon_ai_doompi_core_mcp_facet = require("@agimon-ai/doompi-core/mcp-facet");
6
+ //#region src/constants/remoteTeam.ts
7
+ const REMOTE_TEAM_GUIDANCE = `# Team collaboration
8
+
9
+ Use \`subagent\` to discover agents, launch bounded work, and inspect or control runs. Runs continue in the background after launch. Keep the returned run id and use the existing \`status\` operation to retrieve progress or the terminal summary. Do not resubmit a run merely because it has not completed yet.
10
+
11
+ Use \`intercom\` for active-team coordination. Call \`members\` for the current public roster. Send only new progress, blockers, or decisions, and never repeat task briefs or delegation instructions. Treat member names and run ids as routing identifiers, not authorization credentials.
12
+
13
+ Remote Team output intentionally excludes private channel capability tokens. There is no generic filesystem or server-state reader on this surface.`;
14
+ //#endregion
15
+ //#region src/extensions/workspaces/sessions/(backend)/skill/team.mcp.ts
16
+ var team_mcp_default = (0, _agimon_ai_doompi_core_mcp_facet.defineMcpSkill)({
17
+ name: "doompi-team",
18
+ description: "Coordinate persistent subagents and active team members through the explicit remote Team tools.",
19
+ read: () => REMOTE_TEAM_GUIDANCE
20
+ });
21
+ //#endregion
22
+ //#region generated/mcp.ts
23
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
24
+ const mcp = (0, _agimon_ai_doompi_core_mcp_facet.defineMcpPlugin)({
25
+ name: "@agimon-ai/doompi-team",
26
+ session: (context) => ({ get skills() {
27
+ return [at(team_mcp_default, context)];
28
+ } })
29
+ });
30
+ //#endregion
31
+ exports.default = mcp;
32
+ exports.mcp = mcp;
33
+
34
+ //# sourceMappingURL=mcp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.cjs","names":["defineMcpSkill","defineMcpPlugin","skillTeam"],"sources":["../../src/constants/remoteTeam.ts","../../src/extensions/workspaces/sessions/(backend)/skill/team.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["export const REMOTE_TEAM_GUIDANCE = `# Team collaboration\n\nUse \\`subagent\\` to discover agents, launch bounded work, and inspect or control runs. Runs continue in the background after launch. Keep the returned run id and use the existing \\`status\\` operation to retrieve progress or the terminal summary. Do not resubmit a run merely because it has not completed yet.\n\nUse \\`intercom\\` for active-team coordination. Call \\`members\\` for the current public roster. Send only new progress, blockers, or decisions, and never repeat task briefs or delegation instructions. Treat member names and run ids as routing identifiers, not authorization credentials.\n\nRemote Team output intentionally excludes private channel capability tokens. There is no generic filesystem or server-state reader on this surface.`;\n","import { defineMcpSkill } from '@agimon-ai/doompi-core/mcp-facet';\n\nimport { REMOTE_TEAM_GUIDANCE } from '../../../../../constants/remoteTeam';\n\nexport default defineMcpSkill({\n name: 'doompi-team',\n description: 'Coordinate persistent subagents and active team members through the explicit remote Team tools.',\n read: () => REMOTE_TEAM_GUIDANCE,\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcp-facet';\n\nimport skillTeam from '../src/extensions/workspaces/sessions/(backend)/skill/team.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-team',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [at(skillTeam, context)]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;AAAA,MAAa,uBAAuB;;;;;;;;;ACIpC,IAAA,oBAAA,GAAeA,iCAAAA,eAAAA,CAAe;CAC5B,MAAM;CACN,aAAa;CACb,YAAY;AACd,CAAC;;;ACFD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,OAAA,GAAMC,iCAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,SAAyC;EAAE,OAAO,CAAC,GAAGC,kBAAW,OAAO,CAAC;CAAG,EAClF;AACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ //#region generated/mcp.d.ts
2
+ export declare const mcp: import("@agimon-ai/doompi-core/mcp-facet").DoomMcpPluginDefinition;
3
+ //#endregion
4
+ export { mcp as default };
5
+ //# sourceMappingURL=mcp.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.cts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBASa,gDAAG"}
@@ -0,0 +1,5 @@
1
+ //#region generated/mcp.d.ts
2
+ export declare const mcp: import("@agimon-ai/doompi-core/mcp-facet").DoomMcpPluginDefinition;
3
+ //#endregion
4
+ export { mcp as default };
5
+ //# sourceMappingURL=mcp.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBASa,gDAAG"}
@@ -0,0 +1,29 @@
1
+ import { defineMcpPlugin, defineMcpSkill } from "@agimon-ai/doompi-core/mcp-facet";
2
+ //#region src/constants/remoteTeam.ts
3
+ const REMOTE_TEAM_GUIDANCE = `# Team collaboration
4
+
5
+ Use \`subagent\` to discover agents, launch bounded work, and inspect or control runs. Runs continue in the background after launch. Keep the returned run id and use the existing \`status\` operation to retrieve progress or the terminal summary. Do not resubmit a run merely because it has not completed yet.
6
+
7
+ Use \`intercom\` for active-team coordination. Call \`members\` for the current public roster. Send only new progress, blockers, or decisions, and never repeat task briefs or delegation instructions. Treat member names and run ids as routing identifiers, not authorization credentials.
8
+
9
+ Remote Team output intentionally excludes private channel capability tokens. There is no generic filesystem or server-state reader on this surface.`;
10
+ //#endregion
11
+ //#region src/extensions/workspaces/sessions/(backend)/skill/team.mcp.ts
12
+ var team_mcp_default = defineMcpSkill({
13
+ name: "doompi-team",
14
+ description: "Coordinate persistent subagents and active team members through the explicit remote Team tools.",
15
+ read: () => REMOTE_TEAM_GUIDANCE
16
+ });
17
+ //#endregion
18
+ //#region generated/mcp.ts
19
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
20
+ const mcp = defineMcpPlugin({
21
+ name: "@agimon-ai/doompi-team",
22
+ session: (context) => ({ get skills() {
23
+ return [at(team_mcp_default, context)];
24
+ } })
25
+ });
26
+ //#endregion
27
+ export { mcp as default, mcp };
28
+
29
+ //# sourceMappingURL=mcp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.mjs","names":["skillTeam"],"sources":["../../src/constants/remoteTeam.ts","../../src/extensions/workspaces/sessions/(backend)/skill/team.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["export const REMOTE_TEAM_GUIDANCE = `# Team collaboration\n\nUse \\`subagent\\` to discover agents, launch bounded work, and inspect or control runs. Runs continue in the background after launch. Keep the returned run id and use the existing \\`status\\` operation to retrieve progress or the terminal summary. Do not resubmit a run merely because it has not completed yet.\n\nUse \\`intercom\\` for active-team coordination. Call \\`members\\` for the current public roster. Send only new progress, blockers, or decisions, and never repeat task briefs or delegation instructions. Treat member names and run ids as routing identifiers, not authorization credentials.\n\nRemote Team output intentionally excludes private channel capability tokens. There is no generic filesystem or server-state reader on this surface.`;\n","import { defineMcpSkill } from '@agimon-ai/doompi-core/mcp-facet';\n\nimport { REMOTE_TEAM_GUIDANCE } from '../../../../../constants/remoteTeam';\n\nexport default defineMcpSkill({\n name: 'doompi-team',\n description: 'Coordinate persistent subagents and active team members through the explicit remote Team tools.',\n read: () => REMOTE_TEAM_GUIDANCE,\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcp-facet';\n\nimport skillTeam from '../src/extensions/workspaces/sessions/(backend)/skill/team.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-team',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [at(skillTeam, context)]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;AAAA,MAAa,uBAAuB;;;;;;;;;ACIpC,IAAA,mBAAe,eAAe;CAC5B,MAAM;CACN,aAAa;CACb,YAAY;AACd,CAAC;;;ACFD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,SAAyC;EAAE,OAAO,CAAC,GAAGA,kBAAW,OAAO,CAAC;CAAG,EAClF;AACF,CAAC"}
@@ -12,12 +12,14 @@ const require_index$10 = require("../../../../../services/teamCollaboration/inde
12
12
  const require_index$11 = require("../../../../../services/teamRuntime/index.cjs");
13
13
  let _agimon_ai_doompi_core_child_process = require("@agimon-ai/doompi-core/child-process");
14
14
  let _agimon_ai_doompi_core_extension_file = require("@agimon-ai/doompi-core/extension-file");
15
+ let _agimon_ai_doompi_core_background_work = require("@agimon-ai/doompi-core/background-work");
15
16
  let _agimon_ai_doompi_core_child = require("@agimon-ai/doompi-core/child");
16
17
  let _agimon_ai_doompi_core_context_contributions = require("@agimon-ai/doompi-core/context-contributions");
17
18
  let _agimon_ai_doompi_core_cordis_host = require("@agimon-ai/doompi-core/cordis-host");
18
19
  let _agimon_ai_doompi_core_mcp_tool_resolver = require("@agimon-ai/doompi-core/mcp-tool-resolver");
19
20
  let _agimon_ai_doompi_core_readiness = require("@agimon-ai/doompi-core/readiness");
20
21
  let _agimon_ai_doompi_core_ui_hub = require("@agimon-ai/doompi-core/ui-hub");
22
+ let _agimon_ai_doompi_session = require("@agimon-ai/doompi-session");
21
23
  let _agimon_ai_doompi_telemetry = require("@agimon-ai/doompi-telemetry");
22
24
  //#region src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts
23
25
  const SESSION_SHUTDOWN_REASON_FALLBACK = "unknown";
@@ -404,7 +406,13 @@ const createTeamRootExtension = (presentation) => ({ context: cordis, pi, signal
404
406
  },
405
407
  sessionShutdown
406
408
  },
407
- services: [collaboration.plugin, runtimeService],
409
+ services: [
410
+ (context) => {
411
+ if ((0, _agimon_ai_doompi_core_background_work.readDoomBackgroundWorkService)(context) === void 0) (0, _agimon_ai_doompi_session.provideBackgroundWorkService)(context);
412
+ },
413
+ collaboration.plugin,
414
+ runtimeService
415
+ ],
408
416
  onStart() {
409
417
  completionNotifier.attachHost(pi);
410
418
  pollScheduler.start();
@@ -1 +1 @@
1
- {"version":3,"file":"root.cli.cjs","names":["loadConfig","createDoomTelemetry","createTeamExtensionRuntime","readDoomChildSessionService","readDoomReadinessCoordinator","createDoomReadinessCoordinator","createTeamCollaborationMount","createDelegationBridge","createFablePlanBridge","resolveRootSessionId","createSessionScope","openScopeAsync","formatSuspendedRunsAsync","normalizeParentModel","authenticatedModelInfos","captureSessionForkSource","suspendScopeRuns","DOOM_CORDIS_SESSION_SERVICE","requireDoomCordisSession","DOOM_MCP_TOOL_RESOLVER_SERVICE","requireDoomMcpToolResolver","DOOM_CONTEXT_CONTRIBUTIONS_SERVICE","requireDoomContextContributions","formatTeamContextSnapshot","readActiveTeamSnapshot","DOOM_UI_HUB_SERVICE","requireDoomUiHub","defineRoot"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts"],"sourcesContent":["import { readDoomChildSessionService } from '@agimon-ai/doompi-core/child';\nimport { resolveRootSessionId } from '@agimon-ai/doompi-core/child-process';\nimport {\n DOOM_CONTEXT_CONTRIBUTIONS_SERVICE,\n requireDoomContextContributions,\n} from '@agimon-ai/doompi-core/context-contributions';\nimport type { DoomCordisSessionService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_CORDIS_SESSION_SERVICE, requireDoomCordisSession } from '@agimon-ai/doompi-core/cordis-host';\nimport { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport { DOOM_MCP_TOOL_RESOLVER_SERVICE, requireDoomMcpToolResolver } from '@agimon-ai/doompi-core/mcp-tool-resolver';\n/**\n * Install the Team feature into one package-local Cordis root.\n *\n * The standard Pi factory owns that root and disposes it when Pi emits\n * `session_shutdown`. Each factory invocation therefore creates fresh session\n * state; no process-global container or replacement-root handshake participates\n * in reload. Long-lived services are registered as Cordis effects, and stale\n * asynchronous session-start continuations are fenced by a generation token.\n */\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/pi-extension';\nimport {\n createDoomReadinessCoordinator,\n type DoomReadinessCoordinator,\n type DoomReadinessHandle,\n type DoomReadinessNotification,\n readDoomReadinessCoordinator,\n} from '@agimon-ai/doompi-core/readiness';\nimport type { TranscriptPage, TranscriptPageRequest } from '@agimon-ai/doompi-core/session-protocol';\nimport { DOOM_UI_HUB_SERVICE, type DoomUiHubService, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport type { Context, Fiber } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport type { SkillDiscoveryContract } from '../../../../../services/agentSkills';\nimport type { AsyncJobTrackerContract } from '../../../../../services/asyncJobTracker';\nimport { loadConfig } from '../../../../../services/config';\nimport { createDelegationBridge } from '../../../../../services/delegationBridge';\nimport { createFablePlanBridge } from '../../../../../services/fablePlanBridge';\nimport type { ManagementActionsContract } from '../../../../../services/managementActions';\nimport { normalizeParentModel } from '../../../../../services/modelFallback';\nimport { authenticatedModelInfos } from '../../../../../services/modelResolution';\nimport type { PollSchedulerContract } from '../../../../../services/pollScheduler';\nimport { openScopeAsync, suspendScopeRuns } from '../../../../../services/sessionLifecycle';\nimport { createSessionScope, type SessionScope } from '../../../../../services/sessionPaths';\nimport { captureSessionForkSource, type SpawnPlannerContract } from '../../../../../services/spawnPlan';\nimport { formatSuspendedRunsAsync } from '../../../../../services/suspendedRuns';\nimport {\n createTeamCollaborationMount,\n type TeamDelegationObservation,\n} from '../../../../../services/teamCollaboration';\nimport { createTeamExtensionRuntime } from '../../../../../services/teamRuntime';\nimport { formatTeamContextSnapshot, readActiveTeamSnapshot } from '../../../../../services/teamSnapshot';\nimport type { AgentDiscoveryContract } from '../../../../../types/agent';\nimport type { SlashCommandDeps, SlashCommandState } from '.././command/_lib/launch';\n\nconst SESSION_SHUTDOWN_REASON_FALLBACK = 'unknown';\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-team';\n\nexport interface AgentStatus {\n sessionStart(context: ExtensionContext): void;\n dispose(): void;\n}\n\nexport interface TeamRootPresentation {\n createAgentStatus(\n hub: DoomUiHubService,\n deps: {\n scheduler: PollSchedulerContract;\n tracker: AsyncJobTrackerContract;\n environment: Readonly<Record<string, string | undefined>>;\n },\n ): AgentStatus;\n registerSubagentLeaderContribution(hub: DoomUiHubService): () => void;\n}\n\nfunction readinessNotificationMessage(notification: DoomReadinessNotification): string {\n const diagnostics = notification.diagnostics.join('; ');\n const detail = (notification.error?.message ?? diagnostics) || 'Initialization did not complete.';\n return `${notification.packageId} initialization ${notification.state}: ${detail}`;\n}\n\nfunction buildSlashCommandDeps(\n discovery: AgentDiscoveryContract,\n skills: SkillDiscoveryContract,\n planner: SpawnPlannerContract,\n tracker: AsyncJobTrackerContract,\n scheduler: PollSchedulerContract,\n management: ManagementActionsContract,\n environment: Readonly<Record<string, string | undefined>>,\n): SlashCommandDeps {\n return {\n spawnPlanner: planner,\n tracker,\n scheduler,\n discovery,\n skills,\n management,\n loadConfig: () => loadConfig().config,\n environment,\n };\n}\n\nfunction recordDelegationObservation(telemetry: DoomTelemetry, observation: TeamDelegationObservation): void {\n if (observation.kind === 'requested') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_requested', {\n 'agent.name': event.agent,\n 'task.id': event.taskId,\n mode: event.runMode ?? 'foreground',\n });\n } else if (observation.kind === 'started') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.child_started', { 'run.id': event.runId, outcome: 'started' });\n } else if (observation.kind === 'updated') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_updated', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n 'team.token_count': event.tokens ?? 0,\n outcome: event.status ?? 'updated',\n });\n } else if (observation.kind === 'finished') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_finished', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n outcome: event.status,\n });\n } else {\n void telemetry.recordEvent('doom_team.delegation_cancelled', { outcome: 'cancelled' });\n }\n}\n\n/** Constructs the shared object graph once for the CLI scope root. */\nconst createTeamRootExtension =\n (presentation: TeamRootPresentation) =>\n ({ context: cordis, pi, signal: pluginSignal }: PiPluginContext) => {\n let telemetry: DoomTelemetry | undefined;\n const environment = { ...process.env };\n const getTelemetry = (ctx: ExtensionContext): DoomTelemetry => {\n telemetry ??= createDoomTelemetry({\n serviceName: 'doom-team',\n packageName: '@agimon-ai/doompi-team',\n cwd: ctx.cwd,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n return telemetry;\n };\n const reportConcurrencyEvent = (event: string, attributes: Record<string, unknown>): void => {\n void telemetry?.recordEvent(event, attributes);\n };\n\n const runtime = createTeamExtensionRuntime(reportConcurrencyEvent, {\n environment,\n childSessions: { get: () => readDoomChildSessionService(activeCordisSession?.cordis ?? cordis) },\n });\n const {\n teamChannel,\n pollScheduler,\n asyncJobTracker,\n nativeRuns,\n subagentWaiter,\n asyncSubagentSpawner,\n discovery,\n skills,\n spawnPlanner,\n completionNotifier,\n management,\n capabilityPolicies,\n } = runtime;\n\n let active = true;\n let sessionGeneration = 0;\n let readinessAbort: AbortController | undefined;\n let readinessHandle: Promise<DoomReadinessHandle<void>> | undefined;\n let readinessSessionManager: object | undefined;\n let standaloneReadiness: DoomReadinessCoordinator | undefined;\n let readinessNotificationContext: ExtensionContext | undefined;\n let activeCordisSession:\n | {\n readonly cordis: Context;\n readonly service: DoomCordisSessionService;\n }\n | undefined;\n\n const coordinatorFor = (ctx: ExtensionContext): DoomReadinessCoordinator => {\n const cordisSession = activeCordisSession;\n const sessionId = ctx.sessionManager.getSessionId();\n const activeSessionMatches =\n cordisSession?.service.context.sessionManager === ctx.sessionManager &&\n cordisSession.service.sessionId === sessionId;\n const shared = activeSessionMatches ? readDoomReadinessCoordinator(cordisSession.cordis) : undefined;\n if (shared) return shared;\n standaloneReadiness ??= createDoomReadinessCoordinator({\n notify: (notification) => {\n const message = readinessNotificationMessage(notification);\n if (readinessNotificationContext?.hasUI) readinessNotificationContext.ui.notify(message, 'warning');\n else process.emitWarning(message);\n },\n });\n return standaloneReadiness;\n };\n const waitForSessionReadiness = async (ctx: ExtensionContext, signal?: AbortSignal): Promise<void> => {\n signal?.throwIfAborted();\n const pending = readinessHandle;\n if (!pending) throw new Error('Doom Team session initialization has not started.');\n if (readinessSessionManager !== ctx.sessionManager) {\n throw new Error('Doom Team readiness belongs to a stale Pi session.');\n }\n const handle = await pending;\n signal?.throwIfAborted();\n await handle.wait(signal ? { signal } : undefined);\n if (\n !active ||\n pluginSignal.aborted ||\n pending !== readinessHandle ||\n readinessSessionManager !== ctx.sessionManager\n ) {\n throw new Error('Doom Team readiness belongs to a stale extension generation.');\n }\n };\n const teamRuntime = teamChannel.createRuntime(pi);\n let agentStatus: AgentStatus | undefined;\n\n const collaboration = createTeamCollaborationMount();\n let collaborationFiber: Fiber | undefined;\n let activeScope: SessionScope | undefined;\n const delegationBridge = createDelegationBridge({\n planner: spawnPlanner,\n management,\n waiter: subagentWaiter,\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const fablePlanBridge = createFablePlanBridge({\n spawner: asyncSubagentSpawner,\n waiter: subagentWaiter,\n management,\n policies: capabilityPolicies,\n report: (event, attributes) => {\n void telemetry?.recordEvent(event, attributes);\n },\n });\n\n const state: SlashCommandState = { baseCwd: undefined };\n\n const slashCommandDeps = buildSlashCommandDeps(\n discovery,\n skills,\n spawnPlanner,\n asyncJobTracker,\n pollScheduler,\n management,\n environment,\n );\n const readTranscriptPage = (\n runId: string,\n request: Omit<TranscriptPageRequest, 'threadId'>,\n signal?: AbortSignal,\n ): Promise<TranscriptPage> => {\n const service = readDoomChildSessionService(activeCordisSession?.cordis ?? cordis);\n if (!service?.readTranscriptPage)\n return Promise.reject(new Error('The Doom child-session transcript reader is unavailable.'));\n return service.readTranscriptPage(runId, request, signal);\n };\n\n const retireSessionBindings = async (): Promise<Error | undefined> => {\n const errors: unknown[] = [];\n const previousCollaboration = collaborationFiber;\n collaborationFiber = undefined;\n try {\n await previousCollaboration?.dispose();\n } catch (error) {\n errors.push(error);\n }\n for (const cleanup of [\n () => capabilityPolicies.clear(),\n () => delegationBridge.abandonAll(),\n () => fablePlanBridge.abandonAll(),\n ]) {\n try {\n cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 0) return undefined;\n if (errors.length === 1 && errors[0] instanceof Error) return errors[0];\n return new AggregateError(errors, 'Team session cleanup failed.');\n };\n\n // Bind the root session directly into the one intercom transport. Child\n // processes bind from the team environment written during spawn.\n const sessionStart = (_event: unknown, ctx: ExtensionContext) => {\n if (!active) return undefined;\n state.baseCwd = ctx.cwd;\n const ownGeneration = ++sessionGeneration;\n const previousReadiness = readinessHandle;\n readinessAbort?.abort(new Error('Doom Team session initialization was superseded.'));\n const ownReadinessAbort = new AbortController();\n readinessAbort = ownReadinessAbort;\n readinessSessionManager = ctx.sessionManager;\n readinessNotificationContext = ctx;\n const activeTelemetry = getTelemetry(ctx);\n void activeTelemetry.recordEvent('doom_team.session_started', {\n 'team.root_session':\n resolveRootSessionId(ctx.sessionManager.getSessionId(), environment) === ctx.sessionManager.getSessionId(),\n });\n const sessionId = ctx.sessionManager.getSessionId();\n const scope = createSessionScope(resolveRootSessionId(sessionId, environment));\n const previousScope = activeScope;\n if (previousScope) management.releaseSessionScope(previousScope);\n activeScope = scope;\n management.bindSessionScope(scope);\n const retirement = retireSessionBindings();\n const coordinator = coordinatorFor(ctx);\n const ownsSession = (): boolean =>\n active &&\n ownGeneration === sessionGeneration &&\n readinessSessionManager === ctx.sessionManager &&\n !ownReadinessAbort.signal.aborted;\n\n readinessHandle = (async (): Promise<DoomReadinessHandle<void>> => {\n if (previousReadiness) {\n await Promise.allSettled([previousReadiness.then((handle) => handle.wait())]);\n }\n if (!ownsSession()) throw new Error('Doom Team session initialization was superseded.');\n return coordinator.start(PACKAGE_SOURCE, `${sessionId}:${ownGeneration}`, async (signal) => {\n signal.throwIfAborted();\n const retirementError = await retirement;\n if (retirementError) throw retirementError;\n if (!ownsSession()) return { value: undefined };\n // Suspended records are reported as durable history only. They never\n // seed the current session's live run tracker.\n const opened = await openScopeAsync(scope);\n signal.throwIfAborted();\n if (!ownsSession()) return { value: undefined };\n if (opened.suspended.length > 0 && ctx.hasUI) {\n const message = await formatSuspendedRunsAsync(opened.suspended);\n signal.throwIfAborted();\n if (!ownsSession()) return { value: undefined };\n ctx.ui.notify(message, 'info');\n }\n void activeTelemetry.recordEvent('doom_team.runs_restored', {\n 'team.suspended_count': opened.suspended.length,\n 'team.pruned_count': opened.pruned.length,\n 'team.reaped_count': opened.reaped,\n outcome: 'reported',\n });\n const parentModel = normalizeParentModel(ctx.model);\n const nextCollaboration = await collaboration.mount(\n {\n session: {\n sessionId,\n sessionScope: scope,\n cwd: ctx.cwd,\n environment,\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(parentModel ? { parentModel } : {}),\n captureForkSource: () => captureSessionForkSource(ctx.sessionManager, 'tool'),\n },\n directRunTracker: asyncJobTracker,\n delegation: delegationBridge,\n fablePlan: fablePlanBridge,\n policies: capabilityPolicies,\n observeDelegation: (observation) => recordDelegationObservation(activeTelemetry, observation),\n },\n ctx.sessionManager,\n );\n collaborationFiber = nextCollaboration;\n await nextCollaboration.await();\n if (!ownsSession()) {\n await nextCollaboration.dispose();\n if (collaborationFiber === nextCollaboration) collaborationFiber = undefined;\n return { value: undefined };\n }\n teamRuntime.bindMainSession(sessionId);\n return { value: undefined };\n });\n })();\n // Config's coordinator owns the single user-facing failure notification.\n void Promise.allSettled([readinessHandle.then((handle) => handle.wait())]);\n return undefined;\n };\n\n /**\n * Every reason suspends, with no exception for `reload`.\n *\n * Pi emits this for `quit`, `reload`, `new`, `resume` and `fork`. Treating\n * `reload` differently - keeping children alive because `/domains`, `/major-mode`\n * and `/profile` only reload the extension - would be the one case someone\n * has to remember, and the one that silently misbehaves if Pi adds a sixth\n * reason. Suspending uniformly costs a respawn on reload; restore continues\n * the child's own transcript rather than restarting its task.\n */\n let shutdownPromise: Promise<void> | undefined;\n const shutdownSession = async (event: { reason?: string }): Promise<void> => {\n active = false;\n state.baseCwd = undefined;\n sessionGeneration += 1;\n const pendingReadiness = readinessHandle;\n readinessHandle = undefined;\n readinessSessionManager = undefined;\n readinessAbort?.abort(new Error('Doom Team session ended.'));\n readinessAbort = undefined;\n const ownedReadiness = standaloneReadiness;\n standaloneReadiness = undefined;\n await Promise.allSettled([\n ...(pendingReadiness ? [pendingReadiness.then((handle) => handle.wait())] : []),\n ...(ownedReadiness ? [ownedReadiness.dispose()] : []),\n ]);\n const scope = activeScope;\n const suspensionPromise = scope\n ? suspendScopeRuns({\n scope,\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n jobs: asyncJobTracker.forSession(scope.rootSessionId, scope).list(),\n stop: (runId, reason) => management.stop(runId, reason),\n })\n : Promise.resolve(undefined);\n let suspension: Awaited<ReturnType<typeof suspendScopeRuns>> | undefined;\n try {\n suspension = await suspensionPromise;\n await telemetry?.recordEvent('doom_team.session_finished', {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n 'team.suspended_count': suspension?.suspended.length ?? 0,\n 'team.unstoppable_count': suspension?.unstoppable.length ?? 0,\n outcome: suspension?.unstoppable.length ? 'degraded' : 'suspended',\n });\n } catch (error) {\n await telemetry?.recordError('doom_team.session_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n } finally {\n try {\n await nativeRuns.close();\n } catch (error) {\n await telemetry?.recordError('doom_team.native_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n }\n if (activeScope) management.releaseSessionScope(activeScope);\n activeScope = undefined;\n teamRuntime.dispose();\n await telemetry?.shutdown();\n telemetry = undefined;\n }\n };\n const sessionShutdown = (event: { reason?: string }) => {\n shutdownPromise ??= shutdownSession(event);\n return shutdownPromise;\n };\n\n const bindCordisSession = (sessionContext: Context, service: DoomCordisSessionService) => {\n const binding = { cordis: sessionContext, service };\n activeCordisSession = binding;\n return () => {\n if (activeCordisSession === binding) activeCordisSession = undefined;\n };\n };\n const setAgentStatus = (status: AgentStatus) => {\n agentStatus = status;\n return () => {\n if (agentStatus === status) agentStatus = undefined;\n status.dispose();\n };\n };\n const shutdownTelemetry = async () => {\n await telemetry?.shutdown();\n telemetry = undefined;\n };\n const disposeCollaborationFiber = async () => {\n await collaborationFiber?.dispose();\n collaborationFiber = undefined;\n };\n const disposeReadinessFence = async () => {\n active = false;\n sessionGeneration += 1;\n const pendingReadiness = readinessHandle;\n readinessHandle = undefined;\n readinessSessionManager = undefined;\n readinessAbort?.abort(new Error('Doom Team runtime was disposed.'));\n readinessAbort = undefined;\n const ownedReadiness = standaloneReadiness;\n standaloneReadiness = undefined;\n if (ownedReadiness) await ownedReadiness.dispose();\n else if (pendingReadiness) await Promise.allSettled([pendingReadiness.then((handle) => handle.wait())]);\n readinessNotificationContext = undefined;\n };\n\n const runtimeService = (serviceCordis: Context) => {\n serviceCordis.effect(() => shutdownTelemetry, `${PACKAGE_SOURCE}/telemetry`);\n serviceCordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const service = requireDoomCordisSession(sessionContext);\n const clearBinding = bindCordisSession(sessionContext, service);\n sessionContext.inject([DOOM_MCP_TOOL_RESOLVER_SERVICE], (resolverContext) =>\n runtime.mcpToolResolver.bind(requireDoomMcpToolResolver(resolverContext)),\n );\n sessionContext.inject([DOOM_CONTEXT_CONTRIBUTIONS_SERVICE], (contributionContext) => {\n const registration = requireDoomContextContributions(contributionContext).register({\n source: PACKAGE_SOURCE,\n id: 'runtime',\n label: 'Team',\n order: 200,\n snapshot: () => formatTeamContextSnapshot(readActiveTeamSnapshot(teamRuntime)),\n });\n return () => registration.dispose();\n });\n sessionContext.effect(() => clearBinding, `${PACKAGE_SOURCE}/cordis-session`);\n });\n serviceCordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) =>\n presentation.registerSubagentLeaderContribution(requireDoomUiHub(uiContext)),\n );\n serviceCordis.effect(\n () => () => {\n completionNotifier.dispose();\n runtime.dispose();\n },\n `${PACKAGE_SOURCE}/completions`,\n );\n serviceCordis.effect(() => () => pollScheduler.stop(), `${PACKAGE_SOURCE}/polling`);\n serviceCordis.effect(() => () => asyncJobTracker.stop(), `${PACKAGE_SOURCE}/jobs`);\n serviceCordis.effect(() => () => nativeRuns.close(), `${PACKAGE_SOURCE}/native-runs`);\n serviceCordis.effect(() => disposeCollaborationFiber, `${PACKAGE_SOURCE}/collaboration`);\n serviceCordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) =>\n setAgentStatus(\n presentation.createAgentStatus(requireDoomUiHub(uiContext), {\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n environment,\n }),\n ),\n );\n serviceCordis.effect(() => disposeReadinessFence, `${PACKAGE_SOURCE}/session-fence`);\n };\n\n return {\n value: {\n runtime,\n teamRuntime,\n collaboration,\n bindCordisSession,\n setAgentStatus,\n shutdownTelemetry,\n disposeCollaborationFiber,\n disposeReadinessFence,\n state,\n slashCommandDeps,\n environment,\n readTranscriptPage,\n contextSnapshot: () => formatTeamContextSnapshot(readActiveTeamSnapshot(teamRuntime)),\n waitForSessionReadiness,\n isActive: () => active,\n sessionStart(event: Parameters<typeof sessionStart>[0], context: Parameters<typeof sessionStart>[1]) {\n agentStatus?.sessionStart(context);\n return sessionStart(event, context);\n },\n sessionShutdown,\n },\n services: [collaboration.plugin, runtimeService],\n onStart() {\n completionNotifier.attachHost(pi);\n pollScheduler.start();\n },\n };\n };\n\nexport const createTeamRoot = (presentation: TeamRootPresentation) => defineRoot(createTeamRootExtension(presentation));\nexport type TeamPiScope = Awaited<ReturnType<ReturnType<typeof createTeamRoot>>>['value'];\n"],"mappings":"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"}
1
+ {"version":3,"file":"root.cli.cjs","names":["loadConfig","createDoomTelemetry","createTeamExtensionRuntime","readDoomChildSessionService","readDoomReadinessCoordinator","createDoomReadinessCoordinator","createTeamCollaborationMount","createDelegationBridge","createFablePlanBridge","resolveRootSessionId","createSessionScope","openScopeAsync","formatSuspendedRunsAsync","normalizeParentModel","authenticatedModelInfos","captureSessionForkSource","suspendScopeRuns","DOOM_CORDIS_SESSION_SERVICE","requireDoomCordisSession","DOOM_MCP_TOOL_RESOLVER_SERVICE","requireDoomMcpToolResolver","DOOM_CONTEXT_CONTRIBUTIONS_SERVICE","requireDoomContextContributions","formatTeamContextSnapshot","readActiveTeamSnapshot","DOOM_UI_HUB_SERVICE","requireDoomUiHub","readDoomBackgroundWorkService","defineRoot"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts"],"sourcesContent":["import { readDoomBackgroundWorkService } from '@agimon-ai/doompi-core/background-work';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/child';\nimport { resolveRootSessionId } from '@agimon-ai/doompi-core/child-process';\nimport {\n DOOM_CONTEXT_CONTRIBUTIONS_SERVICE,\n requireDoomContextContributions,\n} from '@agimon-ai/doompi-core/context-contributions';\nimport type { DoomCordisSessionService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_CORDIS_SESSION_SERVICE, requireDoomCordisSession } from '@agimon-ai/doompi-core/cordis-host';\nimport { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport { DOOM_MCP_TOOL_RESOLVER_SERVICE, requireDoomMcpToolResolver } from '@agimon-ai/doompi-core/mcp-tool-resolver';\n/**\n * Install the Team feature into one package-local Cordis root.\n *\n * The standard Pi factory owns that root and disposes it when Pi emits\n * `session_shutdown`. Each factory invocation therefore creates fresh session\n * state; no process-global container or replacement-root handshake participates\n * in reload. Long-lived services are registered as Cordis effects, and stale\n * asynchronous session-start continuations are fenced by a generation token.\n */\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/pi-extension';\nimport {\n createDoomReadinessCoordinator,\n type DoomReadinessCoordinator,\n type DoomReadinessHandle,\n type DoomReadinessNotification,\n readDoomReadinessCoordinator,\n} from '@agimon-ai/doompi-core/readiness';\nimport type { TranscriptPage, TranscriptPageRequest } from '@agimon-ai/doompi-core/session-protocol';\nimport { DOOM_UI_HUB_SERVICE, type DoomUiHubService, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport { provideBackgroundWorkService } from '@agimon-ai/doompi-session';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport type { Context, Fiber } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport type { SkillDiscoveryContract } from '../../../../../services/agentSkills';\nimport type { AsyncJobTrackerContract } from '../../../../../services/asyncJobTracker';\nimport { loadConfig } from '../../../../../services/config';\nimport { createDelegationBridge } from '../../../../../services/delegationBridge';\nimport { createFablePlanBridge } from '../../../../../services/fablePlanBridge';\nimport type { ManagementActionsContract } from '../../../../../services/managementActions';\nimport { normalizeParentModel } from '../../../../../services/modelFallback';\nimport { authenticatedModelInfos } from '../../../../../services/modelResolution';\nimport type { PollSchedulerContract } from '../../../../../services/pollScheduler';\nimport { openScopeAsync, suspendScopeRuns } from '../../../../../services/sessionLifecycle';\nimport { createSessionScope, type SessionScope } from '../../../../../services/sessionPaths';\nimport { captureSessionForkSource, type SpawnPlannerContract } from '../../../../../services/spawnPlan';\nimport { formatSuspendedRunsAsync } from '../../../../../services/suspendedRuns';\nimport {\n createTeamCollaborationMount,\n type TeamDelegationObservation,\n} from '../../../../../services/teamCollaboration';\nimport { createTeamExtensionRuntime } from '../../../../../services/teamRuntime';\nimport { formatTeamContextSnapshot, readActiveTeamSnapshot } from '../../../../../services/teamSnapshot';\nimport type { AgentDiscoveryContract } from '../../../../../types/agent';\nimport type { SlashCommandDeps, SlashCommandState } from '.././command/_lib/launch';\n\nconst SESSION_SHUTDOWN_REASON_FALLBACK = 'unknown';\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-team';\n\nexport interface AgentStatus {\n sessionStart(context: ExtensionContext): void;\n dispose(): void;\n}\n\nexport interface TeamRootPresentation {\n createAgentStatus(\n hub: DoomUiHubService,\n deps: {\n scheduler: PollSchedulerContract;\n tracker: AsyncJobTrackerContract;\n environment: Readonly<Record<string, string | undefined>>;\n },\n ): AgentStatus;\n registerSubagentLeaderContribution(hub: DoomUiHubService): () => void;\n}\n\nfunction readinessNotificationMessage(notification: DoomReadinessNotification): string {\n const diagnostics = notification.diagnostics.join('; ');\n const detail = (notification.error?.message ?? diagnostics) || 'Initialization did not complete.';\n return `${notification.packageId} initialization ${notification.state}: ${detail}`;\n}\n\nfunction buildSlashCommandDeps(\n discovery: AgentDiscoveryContract,\n skills: SkillDiscoveryContract,\n planner: SpawnPlannerContract,\n tracker: AsyncJobTrackerContract,\n scheduler: PollSchedulerContract,\n management: ManagementActionsContract,\n environment: Readonly<Record<string, string | undefined>>,\n): SlashCommandDeps {\n return {\n spawnPlanner: planner,\n tracker,\n scheduler,\n discovery,\n skills,\n management,\n loadConfig: () => loadConfig().config,\n environment,\n };\n}\n\nfunction recordDelegationObservation(telemetry: DoomTelemetry, observation: TeamDelegationObservation): void {\n if (observation.kind === 'requested') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_requested', {\n 'agent.name': event.agent,\n 'task.id': event.taskId,\n mode: event.runMode ?? 'foreground',\n });\n } else if (observation.kind === 'started') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.child_started', { 'run.id': event.runId, outcome: 'started' });\n } else if (observation.kind === 'updated') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_updated', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n 'team.token_count': event.tokens ?? 0,\n outcome: event.status ?? 'updated',\n });\n } else if (observation.kind === 'finished') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_finished', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n outcome: event.status,\n });\n } else {\n void telemetry.recordEvent('doom_team.delegation_cancelled', { outcome: 'cancelled' });\n }\n}\n\n/** Constructs the shared object graph once for the CLI scope root. */\nconst createTeamRootExtension =\n (presentation: TeamRootPresentation) =>\n ({ context: cordis, pi, signal: pluginSignal }: PiPluginContext) => {\n let telemetry: DoomTelemetry | undefined;\n const environment = { ...process.env };\n const getTelemetry = (ctx: ExtensionContext): DoomTelemetry => {\n telemetry ??= createDoomTelemetry({\n serviceName: 'doom-team',\n packageName: '@agimon-ai/doompi-team',\n cwd: ctx.cwd,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n return telemetry;\n };\n const reportConcurrencyEvent = (event: string, attributes: Record<string, unknown>): void => {\n void telemetry?.recordEvent(event, attributes);\n };\n\n const runtime = createTeamExtensionRuntime(reportConcurrencyEvent, {\n environment,\n childSessions: { get: () => readDoomChildSessionService(activeCordisSession?.cordis ?? cordis) },\n });\n const {\n teamChannel,\n pollScheduler,\n asyncJobTracker,\n nativeRuns,\n subagentWaiter,\n asyncSubagentSpawner,\n discovery,\n skills,\n spawnPlanner,\n completionNotifier,\n management,\n capabilityPolicies,\n } = runtime;\n\n let active = true;\n let sessionGeneration = 0;\n let readinessAbort: AbortController | undefined;\n let readinessHandle: Promise<DoomReadinessHandle<void>> | undefined;\n let readinessSessionManager: object | undefined;\n let standaloneReadiness: DoomReadinessCoordinator | undefined;\n let readinessNotificationContext: ExtensionContext | undefined;\n let activeCordisSession:\n | {\n readonly cordis: Context;\n readonly service: DoomCordisSessionService;\n }\n | undefined;\n\n const coordinatorFor = (ctx: ExtensionContext): DoomReadinessCoordinator => {\n const cordisSession = activeCordisSession;\n const sessionId = ctx.sessionManager.getSessionId();\n const activeSessionMatches =\n cordisSession?.service.context.sessionManager === ctx.sessionManager &&\n cordisSession.service.sessionId === sessionId;\n const shared = activeSessionMatches ? readDoomReadinessCoordinator(cordisSession.cordis) : undefined;\n if (shared) return shared;\n standaloneReadiness ??= createDoomReadinessCoordinator({\n notify: (notification) => {\n const message = readinessNotificationMessage(notification);\n if (readinessNotificationContext?.hasUI) readinessNotificationContext.ui.notify(message, 'warning');\n else process.emitWarning(message);\n },\n });\n return standaloneReadiness;\n };\n const waitForSessionReadiness = async (ctx: ExtensionContext, signal?: AbortSignal): Promise<void> => {\n signal?.throwIfAborted();\n const pending = readinessHandle;\n if (!pending) throw new Error('Doom Team session initialization has not started.');\n if (readinessSessionManager !== ctx.sessionManager) {\n throw new Error('Doom Team readiness belongs to a stale Pi session.');\n }\n const handle = await pending;\n signal?.throwIfAborted();\n await handle.wait(signal ? { signal } : undefined);\n if (\n !active ||\n pluginSignal.aborted ||\n pending !== readinessHandle ||\n readinessSessionManager !== ctx.sessionManager\n ) {\n throw new Error('Doom Team readiness belongs to a stale extension generation.');\n }\n };\n const teamRuntime = teamChannel.createRuntime(pi);\n let agentStatus: AgentStatus | undefined;\n\n const collaboration = createTeamCollaborationMount();\n let collaborationFiber: Fiber | undefined;\n let activeScope: SessionScope | undefined;\n const delegationBridge = createDelegationBridge({\n planner: spawnPlanner,\n management,\n waiter: subagentWaiter,\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const fablePlanBridge = createFablePlanBridge({\n spawner: asyncSubagentSpawner,\n waiter: subagentWaiter,\n management,\n policies: capabilityPolicies,\n report: (event, attributes) => {\n void telemetry?.recordEvent(event, attributes);\n },\n });\n\n const state: SlashCommandState = { baseCwd: undefined };\n\n const slashCommandDeps = buildSlashCommandDeps(\n discovery,\n skills,\n spawnPlanner,\n asyncJobTracker,\n pollScheduler,\n management,\n environment,\n );\n const readTranscriptPage = (\n runId: string,\n request: Omit<TranscriptPageRequest, 'threadId'>,\n signal?: AbortSignal,\n ): Promise<TranscriptPage> => {\n const service = readDoomChildSessionService(activeCordisSession?.cordis ?? cordis);\n if (!service?.readTranscriptPage)\n return Promise.reject(new Error('The Doom child-session transcript reader is unavailable.'));\n return service.readTranscriptPage(runId, request, signal);\n };\n\n const retireSessionBindings = async (): Promise<Error | undefined> => {\n const errors: unknown[] = [];\n const previousCollaboration = collaborationFiber;\n collaborationFiber = undefined;\n try {\n await previousCollaboration?.dispose();\n } catch (error) {\n errors.push(error);\n }\n for (const cleanup of [\n () => capabilityPolicies.clear(),\n () => delegationBridge.abandonAll(),\n () => fablePlanBridge.abandonAll(),\n ]) {\n try {\n cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 0) return undefined;\n if (errors.length === 1 && errors[0] instanceof Error) return errors[0];\n return new AggregateError(errors, 'Team session cleanup failed.');\n };\n\n // Bind the root session directly into the one intercom transport. Child\n // processes bind from the team environment written during spawn.\n const sessionStart = (_event: unknown, ctx: ExtensionContext) => {\n if (!active) return undefined;\n state.baseCwd = ctx.cwd;\n const ownGeneration = ++sessionGeneration;\n const previousReadiness = readinessHandle;\n readinessAbort?.abort(new Error('Doom Team session initialization was superseded.'));\n const ownReadinessAbort = new AbortController();\n readinessAbort = ownReadinessAbort;\n readinessSessionManager = ctx.sessionManager;\n readinessNotificationContext = ctx;\n const activeTelemetry = getTelemetry(ctx);\n void activeTelemetry.recordEvent('doom_team.session_started', {\n 'team.root_session':\n resolveRootSessionId(ctx.sessionManager.getSessionId(), environment) === ctx.sessionManager.getSessionId(),\n });\n const sessionId = ctx.sessionManager.getSessionId();\n const scope = createSessionScope(resolveRootSessionId(sessionId, environment));\n const previousScope = activeScope;\n if (previousScope) management.releaseSessionScope(previousScope);\n activeScope = scope;\n management.bindSessionScope(scope);\n const retirement = retireSessionBindings();\n const coordinator = coordinatorFor(ctx);\n const ownsSession = (): boolean =>\n active &&\n ownGeneration === sessionGeneration &&\n readinessSessionManager === ctx.sessionManager &&\n !ownReadinessAbort.signal.aborted;\n\n readinessHandle = (async (): Promise<DoomReadinessHandle<void>> => {\n if (previousReadiness) {\n await Promise.allSettled([previousReadiness.then((handle) => handle.wait())]);\n }\n if (!ownsSession()) throw new Error('Doom Team session initialization was superseded.');\n return coordinator.start(PACKAGE_SOURCE, `${sessionId}:${ownGeneration}`, async (signal) => {\n signal.throwIfAborted();\n const retirementError = await retirement;\n if (retirementError) throw retirementError;\n if (!ownsSession()) return { value: undefined };\n // Suspended records are reported as durable history only. They never\n // seed the current session's live run tracker.\n const opened = await openScopeAsync(scope);\n signal.throwIfAborted();\n if (!ownsSession()) return { value: undefined };\n if (opened.suspended.length > 0 && ctx.hasUI) {\n const message = await formatSuspendedRunsAsync(opened.suspended);\n signal.throwIfAborted();\n if (!ownsSession()) return { value: undefined };\n ctx.ui.notify(message, 'info');\n }\n void activeTelemetry.recordEvent('doom_team.runs_restored', {\n 'team.suspended_count': opened.suspended.length,\n 'team.pruned_count': opened.pruned.length,\n 'team.reaped_count': opened.reaped,\n outcome: 'reported',\n });\n const parentModel = normalizeParentModel(ctx.model);\n const nextCollaboration = await collaboration.mount(\n {\n session: {\n sessionId,\n sessionScope: scope,\n cwd: ctx.cwd,\n environment,\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(parentModel ? { parentModel } : {}),\n captureForkSource: () => captureSessionForkSource(ctx.sessionManager, 'tool'),\n },\n directRunTracker: asyncJobTracker,\n delegation: delegationBridge,\n fablePlan: fablePlanBridge,\n policies: capabilityPolicies,\n observeDelegation: (observation) => recordDelegationObservation(activeTelemetry, observation),\n },\n ctx.sessionManager,\n );\n collaborationFiber = nextCollaboration;\n await nextCollaboration.await();\n if (!ownsSession()) {\n await nextCollaboration.dispose();\n if (collaborationFiber === nextCollaboration) collaborationFiber = undefined;\n return { value: undefined };\n }\n teamRuntime.bindMainSession(sessionId);\n return { value: undefined };\n });\n })();\n // Config's coordinator owns the single user-facing failure notification.\n void Promise.allSettled([readinessHandle.then((handle) => handle.wait())]);\n return undefined;\n };\n\n /**\n * Every reason suspends, with no exception for `reload`.\n *\n * Pi emits this for `quit`, `reload`, `new`, `resume` and `fork`. Treating\n * `reload` differently - keeping children alive because `/domains`, `/major-mode`\n * and `/profile` only reload the extension - would be the one case someone\n * has to remember, and the one that silently misbehaves if Pi adds a sixth\n * reason. Suspending uniformly costs a respawn on reload; restore continues\n * the child's own transcript rather than restarting its task.\n */\n let shutdownPromise: Promise<void> | undefined;\n const shutdownSession = async (event: { reason?: string }): Promise<void> => {\n active = false;\n state.baseCwd = undefined;\n sessionGeneration += 1;\n const pendingReadiness = readinessHandle;\n readinessHandle = undefined;\n readinessSessionManager = undefined;\n readinessAbort?.abort(new Error('Doom Team session ended.'));\n readinessAbort = undefined;\n const ownedReadiness = standaloneReadiness;\n standaloneReadiness = undefined;\n await Promise.allSettled([\n ...(pendingReadiness ? [pendingReadiness.then((handle) => handle.wait())] : []),\n ...(ownedReadiness ? [ownedReadiness.dispose()] : []),\n ]);\n const scope = activeScope;\n const suspensionPromise = scope\n ? suspendScopeRuns({\n scope,\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n jobs: asyncJobTracker.forSession(scope.rootSessionId, scope).list(),\n stop: (runId, reason) => management.stop(runId, reason),\n })\n : Promise.resolve(undefined);\n let suspension: Awaited<ReturnType<typeof suspendScopeRuns>> | undefined;\n try {\n suspension = await suspensionPromise;\n await telemetry?.recordEvent('doom_team.session_finished', {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n 'team.suspended_count': suspension?.suspended.length ?? 0,\n 'team.unstoppable_count': suspension?.unstoppable.length ?? 0,\n outcome: suspension?.unstoppable.length ? 'degraded' : 'suspended',\n });\n } catch (error) {\n await telemetry?.recordError('doom_team.session_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n } finally {\n try {\n await nativeRuns.close();\n } catch (error) {\n await telemetry?.recordError('doom_team.native_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n }\n if (activeScope) management.releaseSessionScope(activeScope);\n activeScope = undefined;\n teamRuntime.dispose();\n await telemetry?.shutdown();\n telemetry = undefined;\n }\n };\n const sessionShutdown = (event: { reason?: string }) => {\n shutdownPromise ??= shutdownSession(event);\n return shutdownPromise;\n };\n\n const bindCordisSession = (sessionContext: Context, service: DoomCordisSessionService) => {\n const binding = { cordis: sessionContext, service };\n activeCordisSession = binding;\n return () => {\n if (activeCordisSession === binding) activeCordisSession = undefined;\n };\n };\n const setAgentStatus = (status: AgentStatus) => {\n agentStatus = status;\n return () => {\n if (agentStatus === status) agentStatus = undefined;\n status.dispose();\n };\n };\n const shutdownTelemetry = async () => {\n await telemetry?.shutdown();\n telemetry = undefined;\n };\n const disposeCollaborationFiber = async () => {\n await collaborationFiber?.dispose();\n collaborationFiber = undefined;\n };\n const disposeReadinessFence = async () => {\n active = false;\n sessionGeneration += 1;\n const pendingReadiness = readinessHandle;\n readinessHandle = undefined;\n readinessSessionManager = undefined;\n readinessAbort?.abort(new Error('Doom Team runtime was disposed.'));\n readinessAbort = undefined;\n const ownedReadiness = standaloneReadiness;\n standaloneReadiness = undefined;\n if (ownedReadiness) await ownedReadiness.dispose();\n else if (pendingReadiness) await Promise.allSettled([pendingReadiness.then((handle) => handle.wait())]);\n readinessNotificationContext = undefined;\n };\n\n const runtimeService = (serviceCordis: Context) => {\n serviceCordis.effect(() => shutdownTelemetry, `${PACKAGE_SOURCE}/telemetry`);\n serviceCordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const service = requireDoomCordisSession(sessionContext);\n const clearBinding = bindCordisSession(sessionContext, service);\n sessionContext.inject([DOOM_MCP_TOOL_RESOLVER_SERVICE], (resolverContext) =>\n runtime.mcpToolResolver.bind(requireDoomMcpToolResolver(resolverContext)),\n );\n sessionContext.inject([DOOM_CONTEXT_CONTRIBUTIONS_SERVICE], (contributionContext) => {\n const registration = requireDoomContextContributions(contributionContext).register({\n source: PACKAGE_SOURCE,\n id: 'runtime',\n label: 'Team',\n order: 200,\n snapshot: () => formatTeamContextSnapshot(readActiveTeamSnapshot(teamRuntime)),\n });\n return () => registration.dispose();\n });\n sessionContext.effect(() => clearBinding, `${PACKAGE_SOURCE}/cordis-session`);\n });\n serviceCordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) =>\n presentation.registerSubagentLeaderContribution(requireDoomUiHub(uiContext)),\n );\n serviceCordis.effect(\n () => () => {\n completionNotifier.dispose();\n runtime.dispose();\n },\n `${PACKAGE_SOURCE}/completions`,\n );\n serviceCordis.effect(() => () => pollScheduler.stop(), `${PACKAGE_SOURCE}/polling`);\n serviceCordis.effect(() => () => asyncJobTracker.stop(), `${PACKAGE_SOURCE}/jobs`);\n serviceCordis.effect(() => () => nativeRuns.close(), `${PACKAGE_SOURCE}/native-runs`);\n serviceCordis.effect(() => disposeCollaborationFiber, `${PACKAGE_SOURCE}/collaboration`);\n serviceCordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) =>\n setAgentStatus(\n presentation.createAgentStatus(requireDoomUiHub(uiContext), {\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n environment,\n }),\n ),\n );\n serviceCordis.effect(() => disposeReadinessFence, `${PACKAGE_SOURCE}/session-fence`);\n };\n\n return {\n value: {\n runtime,\n teamRuntime,\n collaboration,\n bindCordisSession,\n setAgentStatus,\n shutdownTelemetry,\n disposeCollaborationFiber,\n disposeReadinessFence,\n state,\n slashCommandDeps,\n environment,\n readTranscriptPage,\n contextSnapshot: () => formatTeamContextSnapshot(readActiveTeamSnapshot(teamRuntime)),\n waitForSessionReadiness,\n isActive: () => active,\n sessionStart(event: Parameters<typeof sessionStart>[0], context: Parameters<typeof sessionStart>[1]) {\n agentStatus?.sessionStart(context);\n return sessionStart(event, context);\n },\n sessionShutdown,\n },\n services: [\n (context: Context) => {\n if (readDoomBackgroundWorkService(context) === undefined) provideBackgroundWorkService(context);\n },\n collaboration.plugin,\n runtimeService,\n ],\n onStart() {\n completionNotifier.attachHost(pi);\n pollScheduler.start();\n },\n };\n };\n\nexport const createTeamRoot = (presentation: TeamRootPresentation) => defineRoot(createTeamRootExtension(presentation));\nexport type TeamPiScope = Awaited<ReturnType<ReturnType<typeof createTeamRoot>>>['value'];\n"],"mappings":"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"}
@@ -12,12 +12,14 @@ import { createTeamCollaborationMount } from "../../../../../services/teamCollab
12
12
  import { createTeamExtensionRuntime } from "../../../../../services/teamRuntime/index.mjs";
13
13
  import { resolveRootSessionId } from "@agimon-ai/doompi-core/child-process";
14
14
  import { defineRoot } from "@agimon-ai/doompi-core/extension-file";
15
+ import { readDoomBackgroundWorkService } from "@agimon-ai/doompi-core/background-work";
15
16
  import { readDoomChildSessionService } from "@agimon-ai/doompi-core/child";
16
17
  import { DOOM_CONTEXT_CONTRIBUTIONS_SERVICE, requireDoomContextContributions } from "@agimon-ai/doompi-core/context-contributions";
17
18
  import { DOOM_CORDIS_SESSION_SERVICE, requireDoomCordisSession } from "@agimon-ai/doompi-core/cordis-host";
18
19
  import { DOOM_MCP_TOOL_RESOLVER_SERVICE, requireDoomMcpToolResolver } from "@agimon-ai/doompi-core/mcp-tool-resolver";
19
20
  import { createDoomReadinessCoordinator, readDoomReadinessCoordinator } from "@agimon-ai/doompi-core/readiness";
20
21
  import { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from "@agimon-ai/doompi-core/ui-hub";
22
+ import { provideBackgroundWorkService } from "@agimon-ai/doompi-session";
21
23
  import { createDoomTelemetry } from "@agimon-ai/doompi-telemetry";
22
24
  //#region src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts
23
25
  const SESSION_SHUTDOWN_REASON_FALLBACK = "unknown";
@@ -404,7 +406,13 @@ const createTeamRootExtension = (presentation) => ({ context: cordis, pi, signal
404
406
  },
405
407
  sessionShutdown
406
408
  },
407
- services: [collaboration.plugin, runtimeService],
409
+ services: [
410
+ (context) => {
411
+ if (readDoomBackgroundWorkService(context) === void 0) provideBackgroundWorkService(context);
412
+ },
413
+ collaboration.plugin,
414
+ runtimeService
415
+ ],
408
416
  onStart() {
409
417
  completionNotifier.attachHost(pi);
410
418
  pollScheduler.start();
@@ -1 +1 @@
1
- {"version":3,"file":"root.cli.mjs","names":[],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts"],"sourcesContent":["import { readDoomChildSessionService } from '@agimon-ai/doompi-core/child';\nimport { resolveRootSessionId } from '@agimon-ai/doompi-core/child-process';\nimport {\n DOOM_CONTEXT_CONTRIBUTIONS_SERVICE,\n requireDoomContextContributions,\n} from '@agimon-ai/doompi-core/context-contributions';\nimport type { DoomCordisSessionService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_CORDIS_SESSION_SERVICE, requireDoomCordisSession } from '@agimon-ai/doompi-core/cordis-host';\nimport { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport { DOOM_MCP_TOOL_RESOLVER_SERVICE, requireDoomMcpToolResolver } from '@agimon-ai/doompi-core/mcp-tool-resolver';\n/**\n * Install the Team feature into one package-local Cordis root.\n *\n * The standard Pi factory owns that root and disposes it when Pi emits\n * `session_shutdown`. Each factory invocation therefore creates fresh session\n * state; no process-global container or replacement-root handshake participates\n * in reload. Long-lived services are registered as Cordis effects, and stale\n * asynchronous session-start continuations are fenced by a generation token.\n */\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/pi-extension';\nimport {\n createDoomReadinessCoordinator,\n type DoomReadinessCoordinator,\n type DoomReadinessHandle,\n type DoomReadinessNotification,\n readDoomReadinessCoordinator,\n} from '@agimon-ai/doompi-core/readiness';\nimport type { TranscriptPage, TranscriptPageRequest } from '@agimon-ai/doompi-core/session-protocol';\nimport { DOOM_UI_HUB_SERVICE, type DoomUiHubService, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport type { Context, Fiber } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport type { SkillDiscoveryContract } from '../../../../../services/agentSkills';\nimport type { AsyncJobTrackerContract } from '../../../../../services/asyncJobTracker';\nimport { loadConfig } from '../../../../../services/config';\nimport { createDelegationBridge } from '../../../../../services/delegationBridge';\nimport { createFablePlanBridge } from '../../../../../services/fablePlanBridge';\nimport type { ManagementActionsContract } from '../../../../../services/managementActions';\nimport { normalizeParentModel } from '../../../../../services/modelFallback';\nimport { authenticatedModelInfos } from '../../../../../services/modelResolution';\nimport type { PollSchedulerContract } from '../../../../../services/pollScheduler';\nimport { openScopeAsync, suspendScopeRuns } from '../../../../../services/sessionLifecycle';\nimport { createSessionScope, type SessionScope } from '../../../../../services/sessionPaths';\nimport { captureSessionForkSource, type SpawnPlannerContract } from '../../../../../services/spawnPlan';\nimport { formatSuspendedRunsAsync } from '../../../../../services/suspendedRuns';\nimport {\n createTeamCollaborationMount,\n type TeamDelegationObservation,\n} from '../../../../../services/teamCollaboration';\nimport { createTeamExtensionRuntime } from '../../../../../services/teamRuntime';\nimport { formatTeamContextSnapshot, readActiveTeamSnapshot } from '../../../../../services/teamSnapshot';\nimport type { AgentDiscoveryContract } from '../../../../../types/agent';\nimport type { SlashCommandDeps, SlashCommandState } from '.././command/_lib/launch';\n\nconst SESSION_SHUTDOWN_REASON_FALLBACK = 'unknown';\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-team';\n\nexport interface AgentStatus {\n sessionStart(context: ExtensionContext): void;\n dispose(): void;\n}\n\nexport interface TeamRootPresentation {\n createAgentStatus(\n hub: DoomUiHubService,\n deps: {\n scheduler: PollSchedulerContract;\n tracker: AsyncJobTrackerContract;\n environment: Readonly<Record<string, string | undefined>>;\n },\n ): AgentStatus;\n registerSubagentLeaderContribution(hub: DoomUiHubService): () => void;\n}\n\nfunction readinessNotificationMessage(notification: DoomReadinessNotification): string {\n const diagnostics = notification.diagnostics.join('; ');\n const detail = (notification.error?.message ?? diagnostics) || 'Initialization did not complete.';\n return `${notification.packageId} initialization ${notification.state}: ${detail}`;\n}\n\nfunction buildSlashCommandDeps(\n discovery: AgentDiscoveryContract,\n skills: SkillDiscoveryContract,\n planner: SpawnPlannerContract,\n tracker: AsyncJobTrackerContract,\n scheduler: PollSchedulerContract,\n management: ManagementActionsContract,\n environment: Readonly<Record<string, string | undefined>>,\n): SlashCommandDeps {\n return {\n spawnPlanner: planner,\n tracker,\n scheduler,\n discovery,\n skills,\n management,\n loadConfig: () => loadConfig().config,\n environment,\n };\n}\n\nfunction recordDelegationObservation(telemetry: DoomTelemetry, observation: TeamDelegationObservation): void {\n if (observation.kind === 'requested') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_requested', {\n 'agent.name': event.agent,\n 'task.id': event.taskId,\n mode: event.runMode ?? 'foreground',\n });\n } else if (observation.kind === 'started') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.child_started', { 'run.id': event.runId, outcome: 'started' });\n } else if (observation.kind === 'updated') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_updated', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n 'team.token_count': event.tokens ?? 0,\n outcome: event.status ?? 'updated',\n });\n } else if (observation.kind === 'finished') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_finished', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n outcome: event.status,\n });\n } else {\n void telemetry.recordEvent('doom_team.delegation_cancelled', { outcome: 'cancelled' });\n }\n}\n\n/** Constructs the shared object graph once for the CLI scope root. */\nconst createTeamRootExtension =\n (presentation: TeamRootPresentation) =>\n ({ context: cordis, pi, signal: pluginSignal }: PiPluginContext) => {\n let telemetry: DoomTelemetry | undefined;\n const environment = { ...process.env };\n const getTelemetry = (ctx: ExtensionContext): DoomTelemetry => {\n telemetry ??= createDoomTelemetry({\n serviceName: 'doom-team',\n packageName: '@agimon-ai/doompi-team',\n cwd: ctx.cwd,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n return telemetry;\n };\n const reportConcurrencyEvent = (event: string, attributes: Record<string, unknown>): void => {\n void telemetry?.recordEvent(event, attributes);\n };\n\n const runtime = createTeamExtensionRuntime(reportConcurrencyEvent, {\n environment,\n childSessions: { get: () => readDoomChildSessionService(activeCordisSession?.cordis ?? cordis) },\n });\n const {\n teamChannel,\n pollScheduler,\n asyncJobTracker,\n nativeRuns,\n subagentWaiter,\n asyncSubagentSpawner,\n discovery,\n skills,\n spawnPlanner,\n completionNotifier,\n management,\n capabilityPolicies,\n } = runtime;\n\n let active = true;\n let sessionGeneration = 0;\n let readinessAbort: AbortController | undefined;\n let readinessHandle: Promise<DoomReadinessHandle<void>> | undefined;\n let readinessSessionManager: object | undefined;\n let standaloneReadiness: DoomReadinessCoordinator | undefined;\n let readinessNotificationContext: ExtensionContext | undefined;\n let activeCordisSession:\n | {\n readonly cordis: Context;\n readonly service: DoomCordisSessionService;\n }\n | undefined;\n\n const coordinatorFor = (ctx: ExtensionContext): DoomReadinessCoordinator => {\n const cordisSession = activeCordisSession;\n const sessionId = ctx.sessionManager.getSessionId();\n const activeSessionMatches =\n cordisSession?.service.context.sessionManager === ctx.sessionManager &&\n cordisSession.service.sessionId === sessionId;\n const shared = activeSessionMatches ? readDoomReadinessCoordinator(cordisSession.cordis) : undefined;\n if (shared) return shared;\n standaloneReadiness ??= createDoomReadinessCoordinator({\n notify: (notification) => {\n const message = readinessNotificationMessage(notification);\n if (readinessNotificationContext?.hasUI) readinessNotificationContext.ui.notify(message, 'warning');\n else process.emitWarning(message);\n },\n });\n return standaloneReadiness;\n };\n const waitForSessionReadiness = async (ctx: ExtensionContext, signal?: AbortSignal): Promise<void> => {\n signal?.throwIfAborted();\n const pending = readinessHandle;\n if (!pending) throw new Error('Doom Team session initialization has not started.');\n if (readinessSessionManager !== ctx.sessionManager) {\n throw new Error('Doom Team readiness belongs to a stale Pi session.');\n }\n const handle = await pending;\n signal?.throwIfAborted();\n await handle.wait(signal ? { signal } : undefined);\n if (\n !active ||\n pluginSignal.aborted ||\n pending !== readinessHandle ||\n readinessSessionManager !== ctx.sessionManager\n ) {\n throw new Error('Doom Team readiness belongs to a stale extension generation.');\n }\n };\n const teamRuntime = teamChannel.createRuntime(pi);\n let agentStatus: AgentStatus | undefined;\n\n const collaboration = createTeamCollaborationMount();\n let collaborationFiber: Fiber | undefined;\n let activeScope: SessionScope | undefined;\n const delegationBridge = createDelegationBridge({\n planner: spawnPlanner,\n management,\n waiter: subagentWaiter,\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const fablePlanBridge = createFablePlanBridge({\n spawner: asyncSubagentSpawner,\n waiter: subagentWaiter,\n management,\n policies: capabilityPolicies,\n report: (event, attributes) => {\n void telemetry?.recordEvent(event, attributes);\n },\n });\n\n const state: SlashCommandState = { baseCwd: undefined };\n\n const slashCommandDeps = buildSlashCommandDeps(\n discovery,\n skills,\n spawnPlanner,\n asyncJobTracker,\n pollScheduler,\n management,\n environment,\n );\n const readTranscriptPage = (\n runId: string,\n request: Omit<TranscriptPageRequest, 'threadId'>,\n signal?: AbortSignal,\n ): Promise<TranscriptPage> => {\n const service = readDoomChildSessionService(activeCordisSession?.cordis ?? cordis);\n if (!service?.readTranscriptPage)\n return Promise.reject(new Error('The Doom child-session transcript reader is unavailable.'));\n return service.readTranscriptPage(runId, request, signal);\n };\n\n const retireSessionBindings = async (): Promise<Error | undefined> => {\n const errors: unknown[] = [];\n const previousCollaboration = collaborationFiber;\n collaborationFiber = undefined;\n try {\n await previousCollaboration?.dispose();\n } catch (error) {\n errors.push(error);\n }\n for (const cleanup of [\n () => capabilityPolicies.clear(),\n () => delegationBridge.abandonAll(),\n () => fablePlanBridge.abandonAll(),\n ]) {\n try {\n cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 0) return undefined;\n if (errors.length === 1 && errors[0] instanceof Error) return errors[0];\n return new AggregateError(errors, 'Team session cleanup failed.');\n };\n\n // Bind the root session directly into the one intercom transport. Child\n // processes bind from the team environment written during spawn.\n const sessionStart = (_event: unknown, ctx: ExtensionContext) => {\n if (!active) return undefined;\n state.baseCwd = ctx.cwd;\n const ownGeneration = ++sessionGeneration;\n const previousReadiness = readinessHandle;\n readinessAbort?.abort(new Error('Doom Team session initialization was superseded.'));\n const ownReadinessAbort = new AbortController();\n readinessAbort = ownReadinessAbort;\n readinessSessionManager = ctx.sessionManager;\n readinessNotificationContext = ctx;\n const activeTelemetry = getTelemetry(ctx);\n void activeTelemetry.recordEvent('doom_team.session_started', {\n 'team.root_session':\n resolveRootSessionId(ctx.sessionManager.getSessionId(), environment) === ctx.sessionManager.getSessionId(),\n });\n const sessionId = ctx.sessionManager.getSessionId();\n const scope = createSessionScope(resolveRootSessionId(sessionId, environment));\n const previousScope = activeScope;\n if (previousScope) management.releaseSessionScope(previousScope);\n activeScope = scope;\n management.bindSessionScope(scope);\n const retirement = retireSessionBindings();\n const coordinator = coordinatorFor(ctx);\n const ownsSession = (): boolean =>\n active &&\n ownGeneration === sessionGeneration &&\n readinessSessionManager === ctx.sessionManager &&\n !ownReadinessAbort.signal.aborted;\n\n readinessHandle = (async (): Promise<DoomReadinessHandle<void>> => {\n if (previousReadiness) {\n await Promise.allSettled([previousReadiness.then((handle) => handle.wait())]);\n }\n if (!ownsSession()) throw new Error('Doom Team session initialization was superseded.');\n return coordinator.start(PACKAGE_SOURCE, `${sessionId}:${ownGeneration}`, async (signal) => {\n signal.throwIfAborted();\n const retirementError = await retirement;\n if (retirementError) throw retirementError;\n if (!ownsSession()) return { value: undefined };\n // Suspended records are reported as durable history only. They never\n // seed the current session's live run tracker.\n const opened = await openScopeAsync(scope);\n signal.throwIfAborted();\n if (!ownsSession()) return { value: undefined };\n if (opened.suspended.length > 0 && ctx.hasUI) {\n const message = await formatSuspendedRunsAsync(opened.suspended);\n signal.throwIfAborted();\n if (!ownsSession()) return { value: undefined };\n ctx.ui.notify(message, 'info');\n }\n void activeTelemetry.recordEvent('doom_team.runs_restored', {\n 'team.suspended_count': opened.suspended.length,\n 'team.pruned_count': opened.pruned.length,\n 'team.reaped_count': opened.reaped,\n outcome: 'reported',\n });\n const parentModel = normalizeParentModel(ctx.model);\n const nextCollaboration = await collaboration.mount(\n {\n session: {\n sessionId,\n sessionScope: scope,\n cwd: ctx.cwd,\n environment,\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(parentModel ? { parentModel } : {}),\n captureForkSource: () => captureSessionForkSource(ctx.sessionManager, 'tool'),\n },\n directRunTracker: asyncJobTracker,\n delegation: delegationBridge,\n fablePlan: fablePlanBridge,\n policies: capabilityPolicies,\n observeDelegation: (observation) => recordDelegationObservation(activeTelemetry, observation),\n },\n ctx.sessionManager,\n );\n collaborationFiber = nextCollaboration;\n await nextCollaboration.await();\n if (!ownsSession()) {\n await nextCollaboration.dispose();\n if (collaborationFiber === nextCollaboration) collaborationFiber = undefined;\n return { value: undefined };\n }\n teamRuntime.bindMainSession(sessionId);\n return { value: undefined };\n });\n })();\n // Config's coordinator owns the single user-facing failure notification.\n void Promise.allSettled([readinessHandle.then((handle) => handle.wait())]);\n return undefined;\n };\n\n /**\n * Every reason suspends, with no exception for `reload`.\n *\n * Pi emits this for `quit`, `reload`, `new`, `resume` and `fork`. Treating\n * `reload` differently - keeping children alive because `/domains`, `/major-mode`\n * and `/profile` only reload the extension - would be the one case someone\n * has to remember, and the one that silently misbehaves if Pi adds a sixth\n * reason. Suspending uniformly costs a respawn on reload; restore continues\n * the child's own transcript rather than restarting its task.\n */\n let shutdownPromise: Promise<void> | undefined;\n const shutdownSession = async (event: { reason?: string }): Promise<void> => {\n active = false;\n state.baseCwd = undefined;\n sessionGeneration += 1;\n const pendingReadiness = readinessHandle;\n readinessHandle = undefined;\n readinessSessionManager = undefined;\n readinessAbort?.abort(new Error('Doom Team session ended.'));\n readinessAbort = undefined;\n const ownedReadiness = standaloneReadiness;\n standaloneReadiness = undefined;\n await Promise.allSettled([\n ...(pendingReadiness ? [pendingReadiness.then((handle) => handle.wait())] : []),\n ...(ownedReadiness ? [ownedReadiness.dispose()] : []),\n ]);\n const scope = activeScope;\n const suspensionPromise = scope\n ? suspendScopeRuns({\n scope,\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n jobs: asyncJobTracker.forSession(scope.rootSessionId, scope).list(),\n stop: (runId, reason) => management.stop(runId, reason),\n })\n : Promise.resolve(undefined);\n let suspension: Awaited<ReturnType<typeof suspendScopeRuns>> | undefined;\n try {\n suspension = await suspensionPromise;\n await telemetry?.recordEvent('doom_team.session_finished', {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n 'team.suspended_count': suspension?.suspended.length ?? 0,\n 'team.unstoppable_count': suspension?.unstoppable.length ?? 0,\n outcome: suspension?.unstoppable.length ? 'degraded' : 'suspended',\n });\n } catch (error) {\n await telemetry?.recordError('doom_team.session_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n } finally {\n try {\n await nativeRuns.close();\n } catch (error) {\n await telemetry?.recordError('doom_team.native_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n }\n if (activeScope) management.releaseSessionScope(activeScope);\n activeScope = undefined;\n teamRuntime.dispose();\n await telemetry?.shutdown();\n telemetry = undefined;\n }\n };\n const sessionShutdown = (event: { reason?: string }) => {\n shutdownPromise ??= shutdownSession(event);\n return shutdownPromise;\n };\n\n const bindCordisSession = (sessionContext: Context, service: DoomCordisSessionService) => {\n const binding = { cordis: sessionContext, service };\n activeCordisSession = binding;\n return () => {\n if (activeCordisSession === binding) activeCordisSession = undefined;\n };\n };\n const setAgentStatus = (status: AgentStatus) => {\n agentStatus = status;\n return () => {\n if (agentStatus === status) agentStatus = undefined;\n status.dispose();\n };\n };\n const shutdownTelemetry = async () => {\n await telemetry?.shutdown();\n telemetry = undefined;\n };\n const disposeCollaborationFiber = async () => {\n await collaborationFiber?.dispose();\n collaborationFiber = undefined;\n };\n const disposeReadinessFence = async () => {\n active = false;\n sessionGeneration += 1;\n const pendingReadiness = readinessHandle;\n readinessHandle = undefined;\n readinessSessionManager = undefined;\n readinessAbort?.abort(new Error('Doom Team runtime was disposed.'));\n readinessAbort = undefined;\n const ownedReadiness = standaloneReadiness;\n standaloneReadiness = undefined;\n if (ownedReadiness) await ownedReadiness.dispose();\n else if (pendingReadiness) await Promise.allSettled([pendingReadiness.then((handle) => handle.wait())]);\n readinessNotificationContext = undefined;\n };\n\n const runtimeService = (serviceCordis: Context) => {\n serviceCordis.effect(() => shutdownTelemetry, `${PACKAGE_SOURCE}/telemetry`);\n serviceCordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const service = requireDoomCordisSession(sessionContext);\n const clearBinding = bindCordisSession(sessionContext, service);\n sessionContext.inject([DOOM_MCP_TOOL_RESOLVER_SERVICE], (resolverContext) =>\n runtime.mcpToolResolver.bind(requireDoomMcpToolResolver(resolverContext)),\n );\n sessionContext.inject([DOOM_CONTEXT_CONTRIBUTIONS_SERVICE], (contributionContext) => {\n const registration = requireDoomContextContributions(contributionContext).register({\n source: PACKAGE_SOURCE,\n id: 'runtime',\n label: 'Team',\n order: 200,\n snapshot: () => formatTeamContextSnapshot(readActiveTeamSnapshot(teamRuntime)),\n });\n return () => registration.dispose();\n });\n sessionContext.effect(() => clearBinding, `${PACKAGE_SOURCE}/cordis-session`);\n });\n serviceCordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) =>\n presentation.registerSubagentLeaderContribution(requireDoomUiHub(uiContext)),\n );\n serviceCordis.effect(\n () => () => {\n completionNotifier.dispose();\n runtime.dispose();\n },\n `${PACKAGE_SOURCE}/completions`,\n );\n serviceCordis.effect(() => () => pollScheduler.stop(), `${PACKAGE_SOURCE}/polling`);\n serviceCordis.effect(() => () => asyncJobTracker.stop(), `${PACKAGE_SOURCE}/jobs`);\n serviceCordis.effect(() => () => nativeRuns.close(), `${PACKAGE_SOURCE}/native-runs`);\n serviceCordis.effect(() => disposeCollaborationFiber, `${PACKAGE_SOURCE}/collaboration`);\n serviceCordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) =>\n setAgentStatus(\n presentation.createAgentStatus(requireDoomUiHub(uiContext), {\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n environment,\n }),\n ),\n );\n serviceCordis.effect(() => disposeReadinessFence, `${PACKAGE_SOURCE}/session-fence`);\n };\n\n return {\n value: {\n runtime,\n teamRuntime,\n collaboration,\n bindCordisSession,\n setAgentStatus,\n shutdownTelemetry,\n disposeCollaborationFiber,\n disposeReadinessFence,\n state,\n slashCommandDeps,\n environment,\n readTranscriptPage,\n contextSnapshot: () => formatTeamContextSnapshot(readActiveTeamSnapshot(teamRuntime)),\n waitForSessionReadiness,\n isActive: () => active,\n sessionStart(event: Parameters<typeof sessionStart>[0], context: Parameters<typeof sessionStart>[1]) {\n agentStatus?.sessionStart(context);\n return sessionStart(event, context);\n },\n sessionShutdown,\n },\n services: [collaboration.plugin, runtimeService],\n onStart() {\n completionNotifier.attachHost(pi);\n pollScheduler.start();\n },\n };\n };\n\nexport const createTeamRoot = (presentation: TeamRootPresentation) => defineRoot(createTeamRootExtension(presentation));\nexport type TeamPiScope = Awaited<ReturnType<ReturnType<typeof createTeamRoot>>>['value'];\n"],"mappings":"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"}
1
+ {"version":3,"file":"root.cli.mjs","names":[],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts"],"sourcesContent":["import { readDoomBackgroundWorkService } from '@agimon-ai/doompi-core/background-work';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/child';\nimport { resolveRootSessionId } from '@agimon-ai/doompi-core/child-process';\nimport {\n DOOM_CONTEXT_CONTRIBUTIONS_SERVICE,\n requireDoomContextContributions,\n} from '@agimon-ai/doompi-core/context-contributions';\nimport type { DoomCordisSessionService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_CORDIS_SESSION_SERVICE, requireDoomCordisSession } from '@agimon-ai/doompi-core/cordis-host';\nimport { defineRoot } from '@agimon-ai/doompi-core/extension-file';\nimport { DOOM_MCP_TOOL_RESOLVER_SERVICE, requireDoomMcpToolResolver } from '@agimon-ai/doompi-core/mcp-tool-resolver';\n/**\n * Install the Team feature into one package-local Cordis root.\n *\n * The standard Pi factory owns that root and disposes it when Pi emits\n * `session_shutdown`. Each factory invocation therefore creates fresh session\n * state; no process-global container or replacement-root handshake participates\n * in reload. Long-lived services are registered as Cordis effects, and stale\n * asynchronous session-start continuations are fenced by a generation token.\n */\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/pi-extension';\nimport {\n createDoomReadinessCoordinator,\n type DoomReadinessCoordinator,\n type DoomReadinessHandle,\n type DoomReadinessNotification,\n readDoomReadinessCoordinator,\n} from '@agimon-ai/doompi-core/readiness';\nimport type { TranscriptPage, TranscriptPageRequest } from '@agimon-ai/doompi-core/session-protocol';\nimport { DOOM_UI_HUB_SERVICE, type DoomUiHubService, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport { provideBackgroundWorkService } from '@agimon-ai/doompi-session';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport type { Context, Fiber } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport type { SkillDiscoveryContract } from '../../../../../services/agentSkills';\nimport type { AsyncJobTrackerContract } from '../../../../../services/asyncJobTracker';\nimport { loadConfig } from '../../../../../services/config';\nimport { createDelegationBridge } from '../../../../../services/delegationBridge';\nimport { createFablePlanBridge } from '../../../../../services/fablePlanBridge';\nimport type { ManagementActionsContract } from '../../../../../services/managementActions';\nimport { normalizeParentModel } from '../../../../../services/modelFallback';\nimport { authenticatedModelInfos } from '../../../../../services/modelResolution';\nimport type { PollSchedulerContract } from '../../../../../services/pollScheduler';\nimport { openScopeAsync, suspendScopeRuns } from '../../../../../services/sessionLifecycle';\nimport { createSessionScope, type SessionScope } from '../../../../../services/sessionPaths';\nimport { captureSessionForkSource, type SpawnPlannerContract } from '../../../../../services/spawnPlan';\nimport { formatSuspendedRunsAsync } from '../../../../../services/suspendedRuns';\nimport {\n createTeamCollaborationMount,\n type TeamDelegationObservation,\n} from '../../../../../services/teamCollaboration';\nimport { createTeamExtensionRuntime } from '../../../../../services/teamRuntime';\nimport { formatTeamContextSnapshot, readActiveTeamSnapshot } from '../../../../../services/teamSnapshot';\nimport type { AgentDiscoveryContract } from '../../../../../types/agent';\nimport type { SlashCommandDeps, SlashCommandState } from '.././command/_lib/launch';\n\nconst SESSION_SHUTDOWN_REASON_FALLBACK = 'unknown';\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-team';\n\nexport interface AgentStatus {\n sessionStart(context: ExtensionContext): void;\n dispose(): void;\n}\n\nexport interface TeamRootPresentation {\n createAgentStatus(\n hub: DoomUiHubService,\n deps: {\n scheduler: PollSchedulerContract;\n tracker: AsyncJobTrackerContract;\n environment: Readonly<Record<string, string | undefined>>;\n },\n ): AgentStatus;\n registerSubagentLeaderContribution(hub: DoomUiHubService): () => void;\n}\n\nfunction readinessNotificationMessage(notification: DoomReadinessNotification): string {\n const diagnostics = notification.diagnostics.join('; ');\n const detail = (notification.error?.message ?? diagnostics) || 'Initialization did not complete.';\n return `${notification.packageId} initialization ${notification.state}: ${detail}`;\n}\n\nfunction buildSlashCommandDeps(\n discovery: AgentDiscoveryContract,\n skills: SkillDiscoveryContract,\n planner: SpawnPlannerContract,\n tracker: AsyncJobTrackerContract,\n scheduler: PollSchedulerContract,\n management: ManagementActionsContract,\n environment: Readonly<Record<string, string | undefined>>,\n): SlashCommandDeps {\n return {\n spawnPlanner: planner,\n tracker,\n scheduler,\n discovery,\n skills,\n management,\n loadConfig: () => loadConfig().config,\n environment,\n };\n}\n\nfunction recordDelegationObservation(telemetry: DoomTelemetry, observation: TeamDelegationObservation): void {\n if (observation.kind === 'requested') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_requested', {\n 'agent.name': event.agent,\n 'task.id': event.taskId,\n mode: event.runMode ?? 'foreground',\n });\n } else if (observation.kind === 'started') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.child_started', { 'run.id': event.runId, outcome: 'started' });\n } else if (observation.kind === 'updated') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_updated', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n 'team.token_count': event.tokens ?? 0,\n outcome: event.status ?? 'updated',\n });\n } else if (observation.kind === 'finished') {\n const { event } = observation;\n void telemetry.recordEvent('doom_team.delegation_finished', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n outcome: event.status,\n });\n } else {\n void telemetry.recordEvent('doom_team.delegation_cancelled', { outcome: 'cancelled' });\n }\n}\n\n/** Constructs the shared object graph once for the CLI scope root. */\nconst createTeamRootExtension =\n (presentation: TeamRootPresentation) =>\n ({ context: cordis, pi, signal: pluginSignal }: PiPluginContext) => {\n let telemetry: DoomTelemetry | undefined;\n const environment = { ...process.env };\n const getTelemetry = (ctx: ExtensionContext): DoomTelemetry => {\n telemetry ??= createDoomTelemetry({\n serviceName: 'doom-team',\n packageName: '@agimon-ai/doompi-team',\n cwd: ctx.cwd,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n return telemetry;\n };\n const reportConcurrencyEvent = (event: string, attributes: Record<string, unknown>): void => {\n void telemetry?.recordEvent(event, attributes);\n };\n\n const runtime = createTeamExtensionRuntime(reportConcurrencyEvent, {\n environment,\n childSessions: { get: () => readDoomChildSessionService(activeCordisSession?.cordis ?? cordis) },\n });\n const {\n teamChannel,\n pollScheduler,\n asyncJobTracker,\n nativeRuns,\n subagentWaiter,\n asyncSubagentSpawner,\n discovery,\n skills,\n spawnPlanner,\n completionNotifier,\n management,\n capabilityPolicies,\n } = runtime;\n\n let active = true;\n let sessionGeneration = 0;\n let readinessAbort: AbortController | undefined;\n let readinessHandle: Promise<DoomReadinessHandle<void>> | undefined;\n let readinessSessionManager: object | undefined;\n let standaloneReadiness: DoomReadinessCoordinator | undefined;\n let readinessNotificationContext: ExtensionContext | undefined;\n let activeCordisSession:\n | {\n readonly cordis: Context;\n readonly service: DoomCordisSessionService;\n }\n | undefined;\n\n const coordinatorFor = (ctx: ExtensionContext): DoomReadinessCoordinator => {\n const cordisSession = activeCordisSession;\n const sessionId = ctx.sessionManager.getSessionId();\n const activeSessionMatches =\n cordisSession?.service.context.sessionManager === ctx.sessionManager &&\n cordisSession.service.sessionId === sessionId;\n const shared = activeSessionMatches ? readDoomReadinessCoordinator(cordisSession.cordis) : undefined;\n if (shared) return shared;\n standaloneReadiness ??= createDoomReadinessCoordinator({\n notify: (notification) => {\n const message = readinessNotificationMessage(notification);\n if (readinessNotificationContext?.hasUI) readinessNotificationContext.ui.notify(message, 'warning');\n else process.emitWarning(message);\n },\n });\n return standaloneReadiness;\n };\n const waitForSessionReadiness = async (ctx: ExtensionContext, signal?: AbortSignal): Promise<void> => {\n signal?.throwIfAborted();\n const pending = readinessHandle;\n if (!pending) throw new Error('Doom Team session initialization has not started.');\n if (readinessSessionManager !== ctx.sessionManager) {\n throw new Error('Doom Team readiness belongs to a stale Pi session.');\n }\n const handle = await pending;\n signal?.throwIfAborted();\n await handle.wait(signal ? { signal } : undefined);\n if (\n !active ||\n pluginSignal.aborted ||\n pending !== readinessHandle ||\n readinessSessionManager !== ctx.sessionManager\n ) {\n throw new Error('Doom Team readiness belongs to a stale extension generation.');\n }\n };\n const teamRuntime = teamChannel.createRuntime(pi);\n let agentStatus: AgentStatus | undefined;\n\n const collaboration = createTeamCollaborationMount();\n let collaborationFiber: Fiber | undefined;\n let activeScope: SessionScope | undefined;\n const delegationBridge = createDelegationBridge({\n planner: spawnPlanner,\n management,\n waiter: subagentWaiter,\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const fablePlanBridge = createFablePlanBridge({\n spawner: asyncSubagentSpawner,\n waiter: subagentWaiter,\n management,\n policies: capabilityPolicies,\n report: (event, attributes) => {\n void telemetry?.recordEvent(event, attributes);\n },\n });\n\n const state: SlashCommandState = { baseCwd: undefined };\n\n const slashCommandDeps = buildSlashCommandDeps(\n discovery,\n skills,\n spawnPlanner,\n asyncJobTracker,\n pollScheduler,\n management,\n environment,\n );\n const readTranscriptPage = (\n runId: string,\n request: Omit<TranscriptPageRequest, 'threadId'>,\n signal?: AbortSignal,\n ): Promise<TranscriptPage> => {\n const service = readDoomChildSessionService(activeCordisSession?.cordis ?? cordis);\n if (!service?.readTranscriptPage)\n return Promise.reject(new Error('The Doom child-session transcript reader is unavailable.'));\n return service.readTranscriptPage(runId, request, signal);\n };\n\n const retireSessionBindings = async (): Promise<Error | undefined> => {\n const errors: unknown[] = [];\n const previousCollaboration = collaborationFiber;\n collaborationFiber = undefined;\n try {\n await previousCollaboration?.dispose();\n } catch (error) {\n errors.push(error);\n }\n for (const cleanup of [\n () => capabilityPolicies.clear(),\n () => delegationBridge.abandonAll(),\n () => fablePlanBridge.abandonAll(),\n ]) {\n try {\n cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 0) return undefined;\n if (errors.length === 1 && errors[0] instanceof Error) return errors[0];\n return new AggregateError(errors, 'Team session cleanup failed.');\n };\n\n // Bind the root session directly into the one intercom transport. Child\n // processes bind from the team environment written during spawn.\n const sessionStart = (_event: unknown, ctx: ExtensionContext) => {\n if (!active) return undefined;\n state.baseCwd = ctx.cwd;\n const ownGeneration = ++sessionGeneration;\n const previousReadiness = readinessHandle;\n readinessAbort?.abort(new Error('Doom Team session initialization was superseded.'));\n const ownReadinessAbort = new AbortController();\n readinessAbort = ownReadinessAbort;\n readinessSessionManager = ctx.sessionManager;\n readinessNotificationContext = ctx;\n const activeTelemetry = getTelemetry(ctx);\n void activeTelemetry.recordEvent('doom_team.session_started', {\n 'team.root_session':\n resolveRootSessionId(ctx.sessionManager.getSessionId(), environment) === ctx.sessionManager.getSessionId(),\n });\n const sessionId = ctx.sessionManager.getSessionId();\n const scope = createSessionScope(resolveRootSessionId(sessionId, environment));\n const previousScope = activeScope;\n if (previousScope) management.releaseSessionScope(previousScope);\n activeScope = scope;\n management.bindSessionScope(scope);\n const retirement = retireSessionBindings();\n const coordinator = coordinatorFor(ctx);\n const ownsSession = (): boolean =>\n active &&\n ownGeneration === sessionGeneration &&\n readinessSessionManager === ctx.sessionManager &&\n !ownReadinessAbort.signal.aborted;\n\n readinessHandle = (async (): Promise<DoomReadinessHandle<void>> => {\n if (previousReadiness) {\n await Promise.allSettled([previousReadiness.then((handle) => handle.wait())]);\n }\n if (!ownsSession()) throw new Error('Doom Team session initialization was superseded.');\n return coordinator.start(PACKAGE_SOURCE, `${sessionId}:${ownGeneration}`, async (signal) => {\n signal.throwIfAborted();\n const retirementError = await retirement;\n if (retirementError) throw retirementError;\n if (!ownsSession()) return { value: undefined };\n // Suspended records are reported as durable history only. They never\n // seed the current session's live run tracker.\n const opened = await openScopeAsync(scope);\n signal.throwIfAborted();\n if (!ownsSession()) return { value: undefined };\n if (opened.suspended.length > 0 && ctx.hasUI) {\n const message = await formatSuspendedRunsAsync(opened.suspended);\n signal.throwIfAborted();\n if (!ownsSession()) return { value: undefined };\n ctx.ui.notify(message, 'info');\n }\n void activeTelemetry.recordEvent('doom_team.runs_restored', {\n 'team.suspended_count': opened.suspended.length,\n 'team.pruned_count': opened.pruned.length,\n 'team.reaped_count': opened.reaped,\n outcome: 'reported',\n });\n const parentModel = normalizeParentModel(ctx.model);\n const nextCollaboration = await collaboration.mount(\n {\n session: {\n sessionId,\n sessionScope: scope,\n cwd: ctx.cwd,\n environment,\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(parentModel ? { parentModel } : {}),\n captureForkSource: () => captureSessionForkSource(ctx.sessionManager, 'tool'),\n },\n directRunTracker: asyncJobTracker,\n delegation: delegationBridge,\n fablePlan: fablePlanBridge,\n policies: capabilityPolicies,\n observeDelegation: (observation) => recordDelegationObservation(activeTelemetry, observation),\n },\n ctx.sessionManager,\n );\n collaborationFiber = nextCollaboration;\n await nextCollaboration.await();\n if (!ownsSession()) {\n await nextCollaboration.dispose();\n if (collaborationFiber === nextCollaboration) collaborationFiber = undefined;\n return { value: undefined };\n }\n teamRuntime.bindMainSession(sessionId);\n return { value: undefined };\n });\n })();\n // Config's coordinator owns the single user-facing failure notification.\n void Promise.allSettled([readinessHandle.then((handle) => handle.wait())]);\n return undefined;\n };\n\n /**\n * Every reason suspends, with no exception for `reload`.\n *\n * Pi emits this for `quit`, `reload`, `new`, `resume` and `fork`. Treating\n * `reload` differently - keeping children alive because `/domains`, `/major-mode`\n * and `/profile` only reload the extension - would be the one case someone\n * has to remember, and the one that silently misbehaves if Pi adds a sixth\n * reason. Suspending uniformly costs a respawn on reload; restore continues\n * the child's own transcript rather than restarting its task.\n */\n let shutdownPromise: Promise<void> | undefined;\n const shutdownSession = async (event: { reason?: string }): Promise<void> => {\n active = false;\n state.baseCwd = undefined;\n sessionGeneration += 1;\n const pendingReadiness = readinessHandle;\n readinessHandle = undefined;\n readinessSessionManager = undefined;\n readinessAbort?.abort(new Error('Doom Team session ended.'));\n readinessAbort = undefined;\n const ownedReadiness = standaloneReadiness;\n standaloneReadiness = undefined;\n await Promise.allSettled([\n ...(pendingReadiness ? [pendingReadiness.then((handle) => handle.wait())] : []),\n ...(ownedReadiness ? [ownedReadiness.dispose()] : []),\n ]);\n const scope = activeScope;\n const suspensionPromise = scope\n ? suspendScopeRuns({\n scope,\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n jobs: asyncJobTracker.forSession(scope.rootSessionId, scope).list(),\n stop: (runId, reason) => management.stop(runId, reason),\n })\n : Promise.resolve(undefined);\n let suspension: Awaited<ReturnType<typeof suspendScopeRuns>> | undefined;\n try {\n suspension = await suspensionPromise;\n await telemetry?.recordEvent('doom_team.session_finished', {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n 'team.suspended_count': suspension?.suspended.length ?? 0,\n 'team.unstoppable_count': suspension?.unstoppable.length ?? 0,\n outcome: suspension?.unstoppable.length ? 'degraded' : 'suspended',\n });\n } catch (error) {\n await telemetry?.recordError('doom_team.session_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n } finally {\n try {\n await nativeRuns.close();\n } catch (error) {\n await telemetry?.recordError('doom_team.native_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n }\n if (activeScope) management.releaseSessionScope(activeScope);\n activeScope = undefined;\n teamRuntime.dispose();\n await telemetry?.shutdown();\n telemetry = undefined;\n }\n };\n const sessionShutdown = (event: { reason?: string }) => {\n shutdownPromise ??= shutdownSession(event);\n return shutdownPromise;\n };\n\n const bindCordisSession = (sessionContext: Context, service: DoomCordisSessionService) => {\n const binding = { cordis: sessionContext, service };\n activeCordisSession = binding;\n return () => {\n if (activeCordisSession === binding) activeCordisSession = undefined;\n };\n };\n const setAgentStatus = (status: AgentStatus) => {\n agentStatus = status;\n return () => {\n if (agentStatus === status) agentStatus = undefined;\n status.dispose();\n };\n };\n const shutdownTelemetry = async () => {\n await telemetry?.shutdown();\n telemetry = undefined;\n };\n const disposeCollaborationFiber = async () => {\n await collaborationFiber?.dispose();\n collaborationFiber = undefined;\n };\n const disposeReadinessFence = async () => {\n active = false;\n sessionGeneration += 1;\n const pendingReadiness = readinessHandle;\n readinessHandle = undefined;\n readinessSessionManager = undefined;\n readinessAbort?.abort(new Error('Doom Team runtime was disposed.'));\n readinessAbort = undefined;\n const ownedReadiness = standaloneReadiness;\n standaloneReadiness = undefined;\n if (ownedReadiness) await ownedReadiness.dispose();\n else if (pendingReadiness) await Promise.allSettled([pendingReadiness.then((handle) => handle.wait())]);\n readinessNotificationContext = undefined;\n };\n\n const runtimeService = (serviceCordis: Context) => {\n serviceCordis.effect(() => shutdownTelemetry, `${PACKAGE_SOURCE}/telemetry`);\n serviceCordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const service = requireDoomCordisSession(sessionContext);\n const clearBinding = bindCordisSession(sessionContext, service);\n sessionContext.inject([DOOM_MCP_TOOL_RESOLVER_SERVICE], (resolverContext) =>\n runtime.mcpToolResolver.bind(requireDoomMcpToolResolver(resolverContext)),\n );\n sessionContext.inject([DOOM_CONTEXT_CONTRIBUTIONS_SERVICE], (contributionContext) => {\n const registration = requireDoomContextContributions(contributionContext).register({\n source: PACKAGE_SOURCE,\n id: 'runtime',\n label: 'Team',\n order: 200,\n snapshot: () => formatTeamContextSnapshot(readActiveTeamSnapshot(teamRuntime)),\n });\n return () => registration.dispose();\n });\n sessionContext.effect(() => clearBinding, `${PACKAGE_SOURCE}/cordis-session`);\n });\n serviceCordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) =>\n presentation.registerSubagentLeaderContribution(requireDoomUiHub(uiContext)),\n );\n serviceCordis.effect(\n () => () => {\n completionNotifier.dispose();\n runtime.dispose();\n },\n `${PACKAGE_SOURCE}/completions`,\n );\n serviceCordis.effect(() => () => pollScheduler.stop(), `${PACKAGE_SOURCE}/polling`);\n serviceCordis.effect(() => () => asyncJobTracker.stop(), `${PACKAGE_SOURCE}/jobs`);\n serviceCordis.effect(() => () => nativeRuns.close(), `${PACKAGE_SOURCE}/native-runs`);\n serviceCordis.effect(() => disposeCollaborationFiber, `${PACKAGE_SOURCE}/collaboration`);\n serviceCordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) =>\n setAgentStatus(\n presentation.createAgentStatus(requireDoomUiHub(uiContext), {\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n environment,\n }),\n ),\n );\n serviceCordis.effect(() => disposeReadinessFence, `${PACKAGE_SOURCE}/session-fence`);\n };\n\n return {\n value: {\n runtime,\n teamRuntime,\n collaboration,\n bindCordisSession,\n setAgentStatus,\n shutdownTelemetry,\n disposeCollaborationFiber,\n disposeReadinessFence,\n state,\n slashCommandDeps,\n environment,\n readTranscriptPage,\n contextSnapshot: () => formatTeamContextSnapshot(readActiveTeamSnapshot(teamRuntime)),\n waitForSessionReadiness,\n isActive: () => active,\n sessionStart(event: Parameters<typeof sessionStart>[0], context: Parameters<typeof sessionStart>[1]) {\n agentStatus?.sessionStart(context);\n return sessionStart(event, context);\n },\n sessionShutdown,\n },\n services: [\n (context: Context) => {\n if (readDoomBackgroundWorkService(context) === undefined) provideBackgroundWorkService(context);\n },\n collaboration.plugin,\n runtimeService,\n ],\n onStart() {\n completionNotifier.attachHost(pi);\n pollScheduler.start();\n },\n };\n };\n\nexport const createTeamRoot = (presentation: TeamRootPresentation) => defineRoot(createTeamRootExtension(presentation));\nexport type TeamPiScope = Awaited<ReturnType<ReturnType<typeof createTeamRoot>>>['value'];\n"],"mappings":"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"}