@agimon-ai/doompi-team 0.0.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +25 -0
- package/README.md +46 -0
- package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.cjs +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.cjs +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.mjs +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateParam.cjs +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateParam.mjs +1 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/_virtual/_rolldown/runtime.mjs +1 -0
- package/dist/agents/discovery.cjs +2 -0
- package/dist/agents/discovery.cjs.map +1 -0
- package/dist/agents/discovery.mjs +2 -0
- package/dist/agents/discovery.mjs.map +1 -0
- package/dist/agents/frontmatter.cjs +10 -0
- package/dist/agents/frontmatter.cjs.map +1 -0
- package/dist/agents/frontmatter.mjs +10 -0
- package/dist/agents/frontmatter.mjs.map +1 -0
- package/dist/agents/loader.cjs +2 -0
- package/dist/agents/loader.cjs.map +1 -0
- package/dist/agents/loader.mjs +2 -0
- package/dist/agents/loader.mjs.map +1 -0
- package/dist/agents/memory.cjs +3 -0
- package/dist/agents/memory.cjs.map +1 -0
- package/dist/agents/memory.mjs +3 -0
- package/dist/agents/memory.mjs.map +1 -0
- package/dist/agents/projectRoot.cjs +2 -0
- package/dist/agents/projectRoot.cjs.map +1 -0
- package/dist/agents/projectRoot.mjs +2 -0
- package/dist/agents/projectRoot.mjs.map +1 -0
- package/dist/agents/settings.cjs +2 -0
- package/dist/agents/settings.cjs.map +1 -0
- package/dist/agents/settings.mjs +2 -0
- package/dist/agents/settings.mjs.map +1 -0
- package/dist/agents/skills.cjs +0 -0
- package/dist/agents/skills.cjs.map +1 -0
- package/dist/agents/skills.mjs +5 -0
- package/dist/agents/skills.mjs.map +1 -0
- package/dist/agents/types.d.cts +121 -0
- package/dist/agents/types.d.cts.map +1 -0
- package/dist/agents/types.d.mts +121 -0
- package/dist/agents/types.d.mts.map +1 -0
- package/dist/api/backgroundWork.cjs +1 -0
- package/dist/api/backgroundWork.d.cts +2 -0
- package/dist/api/backgroundWork.d.mts +2 -0
- package/dist/api/backgroundWork.mjs +1 -0
- package/dist/api/capabilityCeiling.cjs +1 -0
- package/dist/api/capabilityCeiling.d.cts +3 -0
- package/dist/api/capabilityCeiling.d.mts +3 -0
- package/dist/api/capabilityCeiling.mjs +2 -0
- package/dist/api/capabilityCeiling.mjs.map +1 -0
- package/dist/api/delegation.cjs +1 -0
- package/dist/api/delegation.d.cts +2 -0
- package/dist/api/delegation.d.mts +2 -0
- package/dist/api/delegation.mjs +1 -0
- package/dist/api/teamSnapshot.cjs +1 -0
- package/dist/api/teamSnapshot.d.cts +2 -0
- package/dist/api/teamSnapshot.d.mts +2 -0
- package/dist/api/teamSnapshot.mjs +2 -0
- package/dist/api/teamSnapshot.mjs.map +1 -0
- package/dist/container/bindOrRebind.cjs +2 -0
- package/dist/container/bindOrRebind.cjs.map +1 -0
- package/dist/container/bindOrRebind.mjs +2 -0
- package/dist/container/bindOrRebind.mjs.map +1 -0
- package/dist/container/globalBridge.cjs +2 -0
- package/dist/container/globalBridge.cjs.map +1 -0
- package/dist/container/globalBridge.d.cts +19 -0
- package/dist/container/globalBridge.d.cts.map +1 -0
- package/dist/container/globalBridge.d.mts +19 -0
- package/dist/container/globalBridge.d.mts.map +1 -0
- package/dist/container/globalBridge.mjs +2 -0
- package/dist/container/globalBridge.mjs.map +1 -0
- package/dist/container/index.cjs +2 -0
- package/dist/container/index.cjs.map +1 -0
- package/dist/container/index.d.cts +38 -0
- package/dist/container/index.d.cts.map +1 -0
- package/dist/container/index.d.mts +38 -0
- package/dist/container/index.d.mts.map +1 -0
- package/dist/container/index.mjs +2 -0
- package/dist/container/index.mjs.map +1 -0
- package/dist/container/modules/agents.cjs +2 -0
- package/dist/container/modules/agents.cjs.map +1 -0
- package/dist/container/modules/agents.d.cts +1 -0
- package/dist/container/modules/agents.d.mts +1 -0
- package/dist/container/modules/agents.mjs +2 -0
- package/dist/container/modules/agents.mjs.map +1 -0
- package/dist/container/modules/core.cjs +2 -0
- package/dist/container/modules/core.cjs.map +1 -0
- package/dist/container/modules/core.d.cts +1 -0
- package/dist/container/modules/core.d.mts +1 -0
- package/dist/container/modules/core.mjs +2 -0
- package/dist/container/modules/core.mjs.map +1 -0
- package/dist/container/modules/extensions.cjs +2 -0
- package/dist/container/modules/extensions.cjs.map +1 -0
- package/dist/container/modules/extensions.mjs +2 -0
- package/dist/container/modules/extensions.mjs.map +1 -0
- package/dist/container/modules/intercom.cjs +2 -0
- package/dist/container/modules/intercom.cjs.map +1 -0
- package/dist/container/modules/intercom.mjs +2 -0
- package/dist/container/modules/intercom.mjs.map +1 -0
- package/dist/container/modules/runs.cjs +2 -0
- package/dist/container/modules/runs.cjs.map +1 -0
- package/dist/container/modules/runs.mjs +2 -0
- package/dist/container/modules/runs.mjs.map +1 -0
- package/dist/container/types.cjs +2 -0
- package/dist/container/types.cjs.map +1 -0
- package/dist/container/types.d.cts +45 -0
- package/dist/container/types.d.cts.map +1 -0
- package/dist/container/types.d.mts +45 -0
- package/dist/container/types.d.mts.map +1 -0
- package/dist/container/types.mjs +2 -0
- package/dist/container/types.mjs.map +1 -0
- package/dist/env.cjs +2 -0
- package/dist/env.cjs.map +1 -0
- package/dist/env.d.cts +65 -0
- package/dist/env.d.cts.map +1 -0
- package/dist/env.d.mts +65 -0
- package/dist/env.d.mts.map +1 -0
- package/dist/env.mjs +2 -0
- package/dist/env.mjs.map +1 -0
- package/dist/extension.cjs +2 -0
- package/dist/extension.cjs.map +1 -0
- package/dist/extension.mjs +2 -0
- package/dist/extension.mjs.map +1 -0
- package/dist/extensions/config.cjs +2 -0
- package/dist/extensions/config.cjs.map +1 -0
- package/dist/extensions/config.mjs +2 -0
- package/dist/extensions/config.mjs.map +1 -0
- package/dist/extensions/delegationBridge.cjs +2 -0
- package/dist/extensions/delegationBridge.cjs.map +1 -0
- package/dist/extensions/delegationBridge.mjs +2 -0
- package/dist/extensions/delegationBridge.mjs.map +1 -0
- package/dist/extensions/doom.cjs +2 -0
- package/dist/extensions/doom.cjs.map +1 -0
- package/dist/extensions/doom.d.cts +8 -0
- package/dist/extensions/doom.d.cts.map +1 -0
- package/dist/extensions/doom.d.mts +8 -0
- package/dist/extensions/doom.d.mts.map +1 -0
- package/dist/extensions/doom.mjs +2 -0
- package/dist/extensions/doom.mjs.map +1 -0
- package/dist/extensions/fablePlanBridge.cjs +2 -0
- package/dist/extensions/fablePlanBridge.cjs.map +1 -0
- package/dist/extensions/fablePlanBridge.mjs +2 -0
- package/dist/extensions/fablePlanBridge.mjs.map +1 -0
- package/dist/extensions/managementActions.cjs +2 -0
- package/dist/extensions/managementActions.cjs.map +1 -0
- package/dist/extensions/managementActions.mjs +2 -0
- package/dist/extensions/managementActions.mjs.map +1 -0
- package/dist/extensions/operationJournal.cjs +2 -0
- package/dist/extensions/operationJournal.cjs.map +1 -0
- package/dist/extensions/operationJournal.mjs +2 -0
- package/dist/extensions/operationJournal.mjs.map +1 -0
- package/dist/extensions/orchestratorPrompt.cjs +35 -0
- package/dist/extensions/orchestratorPrompt.cjs.map +1 -0
- package/dist/extensions/orchestratorPrompt.mjs +35 -0
- package/dist/extensions/orchestratorPrompt.mjs.map +1 -0
- package/dist/extensions/pi.cjs +2 -0
- package/dist/extensions/pi.cjs.map +1 -0
- package/dist/extensions/pi.d.cts +2 -0
- package/dist/extensions/pi.d.mts +2 -0
- package/dist/extensions/pi.mjs +2 -0
- package/dist/extensions/pi.mjs.map +1 -0
- package/dist/extensions/schemas.cjs +1 -0
- package/dist/extensions/schemas.mjs +2 -0
- package/dist/extensions/schemas.mjs.map +1 -0
- package/dist/extensions/spawnPlan.cjs +3 -0
- package/dist/extensions/spawnPlan.cjs.map +1 -0
- package/dist/extensions/spawnPlan.mjs +3 -0
- package/dist/extensions/spawnPlan.mjs.map +1 -0
- package/dist/extensions/standard.cjs +2 -0
- package/dist/extensions/standard.cjs.map +1 -0
- package/dist/extensions/standard.d.cts +8 -0
- package/dist/extensions/standard.d.cts.map +1 -0
- package/dist/extensions/standard.d.mts +8 -0
- package/dist/extensions/standard.d.mts.map +1 -0
- package/dist/extensions/standard.mjs +2 -0
- package/dist/extensions/standard.mjs.map +1 -0
- package/dist/extensions/statusViews.cjs +7 -0
- package/dist/extensions/statusViews.cjs.map +1 -0
- package/dist/extensions/statusViews.mjs +7 -0
- package/dist/extensions/statusViews.mjs.map +1 -0
- package/dist/extensions/subagentPromptRuntime.cjs +18 -0
- package/dist/extensions/subagentPromptRuntime.cjs.map +1 -0
- package/dist/extensions/subagentPromptRuntime.d.cts +58 -0
- package/dist/extensions/subagentPromptRuntime.d.cts.map +1 -0
- package/dist/extensions/subagentPromptRuntime.d.mts +58 -0
- package/dist/extensions/subagentPromptRuntime.d.mts.map +1 -0
- package/dist/extensions/subagentPromptRuntime.mjs +18 -0
- package/dist/extensions/subagentPromptRuntime.mjs.map +1 -0
- package/dist/extensions/subagentPromptRuntimeEntry.cjs +2 -0
- package/dist/extensions/subagentPromptRuntimeEntry.cjs.map +1 -0
- package/dist/extensions/subagentPromptRuntimeEntry.d.cts +2 -0
- package/dist/extensions/subagentPromptRuntimeEntry.d.mts +2 -0
- package/dist/extensions/subagentPromptRuntimeEntry.mjs +2 -0
- package/dist/extensions/subagentPromptRuntimeEntry.mjs.map +1 -0
- package/dist/extensions/subagentTool.cjs +7 -0
- package/dist/extensions/subagentTool.cjs.map +1 -0
- package/dist/extensions/subagentTool.mjs +7 -0
- package/dist/extensions/subagentTool.mjs.map +1 -0
- package/dist/extensions/toolDescription.cjs +2 -0
- package/dist/extensions/toolDescription.cjs.map +1 -0
- package/dist/extensions/toolDescription.mjs +2 -0
- package/dist/extensions/toolDescription.mjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +34 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +34 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/intercom/intercomBridge.cjs +2 -0
- package/dist/intercom/intercomBridge.cjs.map +1 -0
- package/dist/intercom/intercomBridge.mjs +2 -0
- package/dist/intercom/intercomBridge.mjs.map +1 -0
- package/dist/intercom/nativeTeamChannel.cjs +5 -0
- package/dist/intercom/nativeTeamChannel.cjs.map +1 -0
- package/dist/intercom/nativeTeamChannel.d.cts +22 -0
- package/dist/intercom/nativeTeamChannel.d.cts.map +1 -0
- package/dist/intercom/nativeTeamChannel.d.mts +22 -0
- package/dist/intercom/nativeTeamChannel.d.mts.map +1 -0
- package/dist/intercom/nativeTeamChannel.mjs +5 -0
- package/dist/intercom/nativeTeamChannel.mjs.map +1 -0
- package/dist/intercom/supervisorControlChannel.cjs +2 -0
- package/dist/intercom/supervisorControlChannel.cjs.map +1 -0
- package/dist/intercom/supervisorControlChannel.mjs +2 -0
- package/dist/intercom/supervisorControlChannel.mjs.map +1 -0
- package/dist/protocol/backgroundWork.cjs +2 -0
- package/dist/protocol/backgroundWork.cjs.map +1 -0
- package/dist/protocol/backgroundWork.d.cts +52 -0
- package/dist/protocol/backgroundWork.d.cts.map +1 -0
- package/dist/protocol/backgroundWork.d.mts +52 -0
- package/dist/protocol/backgroundWork.d.mts.map +1 -0
- package/dist/protocol/backgroundWork.mjs +2 -0
- package/dist/protocol/backgroundWork.mjs.map +1 -0
- package/dist/protocol/capabilityCeiling.cjs +2 -0
- package/dist/protocol/capabilityCeiling.cjs.map +1 -0
- package/dist/protocol/capabilityCeiling.d.cts +51 -0
- package/dist/protocol/capabilityCeiling.d.cts.map +1 -0
- package/dist/protocol/capabilityCeiling.d.mts +51 -0
- package/dist/protocol/capabilityCeiling.d.mts.map +1 -0
- package/dist/protocol/capabilityCeiling.mjs +2 -0
- package/dist/protocol/capabilityCeiling.mjs.map +1 -0
- package/dist/protocol/delegation.cjs +2 -0
- package/dist/protocol/delegation.cjs.map +1 -0
- package/dist/protocol/delegation.d.cts +269 -0
- package/dist/protocol/delegation.d.cts.map +1 -0
- package/dist/protocol/delegation.d.mts +269 -0
- package/dist/protocol/delegation.d.mts.map +1 -0
- package/dist/protocol/delegation.mjs +2 -0
- package/dist/protocol/delegation.mjs.map +1 -0
- package/dist/runs/background/asyncExecution.cjs +2 -0
- package/dist/runs/background/asyncExecution.cjs.map +1 -0
- package/dist/runs/background/asyncExecution.mjs +2 -0
- package/dist/runs/background/asyncExecution.mjs.map +1 -0
- package/dist/runs/background/asyncJobTracker.cjs +2 -0
- package/dist/runs/background/asyncJobTracker.cjs.map +1 -0
- package/dist/runs/background/asyncJobTracker.mjs +2 -0
- package/dist/runs/background/asyncJobTracker.mjs.map +1 -0
- package/dist/runs/background/cliRunnerEntry.cjs +2 -0
- package/dist/runs/background/cliRunnerEntry.cjs.map +1 -0
- package/dist/runs/background/cliRunnerEntry.d.cts +1 -0
- package/dist/runs/background/cliRunnerEntry.d.mts +1 -0
- package/dist/runs/background/cliRunnerEntry.mjs +2 -0
- package/dist/runs/background/cliRunnerEntry.mjs.map +1 -0
- package/dist/runs/background/completionBatcher.cjs +2 -0
- package/dist/runs/background/completionBatcher.cjs.map +1 -0
- package/dist/runs/background/completionBatcher.mjs +2 -0
- package/dist/runs/background/completionBatcher.mjs.map +1 -0
- package/dist/runs/background/notify.cjs +4 -0
- package/dist/runs/background/notify.cjs.map +1 -0
- package/dist/runs/background/notify.mjs +4 -0
- package/dist/runs/background/notify.mjs.map +1 -0
- package/dist/runs/background/parentWatchdog.cjs +2 -0
- package/dist/runs/background/parentWatchdog.cjs.map +1 -0
- package/dist/runs/background/parentWatchdog.mjs +2 -0
- package/dist/runs/background/parentWatchdog.mjs.map +1 -0
- package/dist/runs/background/processTerminal.cjs +2 -0
- package/dist/runs/background/processTerminal.cjs.map +1 -0
- package/dist/runs/background/processTerminal.mjs +2 -0
- package/dist/runs/background/processTerminal.mjs.map +1 -0
- package/dist/runs/background/resultWatcher.cjs +2 -0
- package/dist/runs/background/resultWatcher.cjs.map +1 -0
- package/dist/runs/background/resultWatcher.mjs +2 -0
- package/dist/runs/background/resultWatcher.mjs.map +1 -0
- package/dist/runs/background/runIdResolver.cjs +2 -0
- package/dist/runs/background/runIdResolver.cjs.map +1 -0
- package/dist/runs/background/runIdResolver.mjs +2 -0
- package/dist/runs/background/runIdResolver.mjs.map +1 -0
- package/dist/runs/background/runnerBootstrap.cjs +2 -0
- package/dist/runs/background/runnerBootstrap.cjs.map +1 -0
- package/dist/runs/background/runnerBootstrap.mjs +2 -0
- package/dist/runs/background/runnerBootstrap.mjs.map +1 -0
- package/dist/runs/background/runnerExecution.cjs +2 -0
- package/dist/runs/background/runnerExecution.cjs.map +1 -0
- package/dist/runs/background/runnerExecution.mjs +2 -0
- package/dist/runs/background/runnerExecution.mjs.map +1 -0
- package/dist/runs/background/runnerReporting.cjs +3 -0
- package/dist/runs/background/runnerReporting.cjs.map +1 -0
- package/dist/runs/background/runnerReporting.mjs +3 -0
- package/dist/runs/background/runnerReporting.mjs.map +1 -0
- package/dist/runs/background/runnerTeamMembership.cjs +2 -0
- package/dist/runs/background/runnerTeamMembership.cjs.map +1 -0
- package/dist/runs/background/runnerTeamMembership.mjs +2 -0
- package/dist/runs/background/runnerTeamMembership.mjs.map +1 -0
- package/dist/runs/background/spawnHandshake.cjs +2 -0
- package/dist/runs/background/spawnHandshake.cjs.map +1 -0
- package/dist/runs/background/spawnHandshake.mjs +2 -0
- package/dist/runs/background/spawnHandshake.mjs.map +1 -0
- package/dist/runs/background/staleRunReconciler.cjs +2 -0
- package/dist/runs/background/staleRunReconciler.cjs.map +1 -0
- package/dist/runs/background/staleRunReconciler.mjs +2 -0
- package/dist/runs/background/staleRunReconciler.mjs.map +1 -0
- package/dist/runs/background/statusReader.cjs +2 -0
- package/dist/runs/background/statusReader.cjs.map +1 -0
- package/dist/runs/background/statusReader.mjs +2 -0
- package/dist/runs/background/statusReader.mjs.map +1 -0
- package/dist/runs/background/statusWriter.cjs +2 -0
- package/dist/runs/background/statusWriter.cjs.map +1 -0
- package/dist/runs/background/statusWriter.mjs +2 -0
- package/dist/runs/background/statusWriter.mjs.map +1 -0
- package/dist/runs/background/subagentWait.cjs +2 -0
- package/dist/runs/background/subagentWait.cjs.map +1 -0
- package/dist/runs/background/subagentWait.mjs +2 -0
- package/dist/runs/background/subagentWait.mjs.map +1 -0
- package/dist/runs/background/terminalPersistence.cjs +2 -0
- package/dist/runs/background/terminalPersistence.cjs.map +1 -0
- package/dist/runs/background/terminalPersistence.mjs +2 -0
- package/dist/runs/background/terminalPersistence.mjs.map +1 -0
- package/dist/runs/registry/processGroup.cjs +2 -0
- package/dist/runs/registry/processGroup.cjs.map +1 -0
- package/dist/runs/registry/processGroup.mjs +2 -0
- package/dist/runs/registry/processGroup.mjs.map +1 -0
- package/dist/runs/registry/runRegistry.cjs +2 -0
- package/dist/runs/registry/runRegistry.cjs.map +1 -0
- package/dist/runs/registry/runRegistry.mjs +2 -0
- package/dist/runs/registry/runRegistry.mjs.map +1 -0
- package/dist/runs/registry/sessionLifecycle.cjs +2 -0
- package/dist/runs/registry/sessionLifecycle.cjs.map +1 -0
- package/dist/runs/registry/sessionLifecycle.mjs +2 -0
- package/dist/runs/registry/sessionLifecycle.mjs.map +1 -0
- package/dist/runs/registry/suspendedRuns.cjs +4 -0
- package/dist/runs/registry/suspendedRuns.cjs.map +1 -0
- package/dist/runs/registry/suspendedRuns.mjs +4 -0
- package/dist/runs/registry/suspendedRuns.mjs.map +1 -0
- package/dist/runs/sdkRunnerEntry.cjs +2 -0
- package/dist/runs/sdkRunnerEntry.cjs.map +1 -0
- package/dist/runs/sdkRunnerEntry.d.cts +1 -0
- package/dist/runs/sdkRunnerEntry.d.mts +1 -0
- package/dist/runs/sdkRunnerEntry.mjs +2 -0
- package/dist/runs/sdkRunnerEntry.mjs.map +1 -0
- package/dist/runs/shared/claudeFableProfile.cjs +4 -0
- package/dist/runs/shared/claudeFableProfile.cjs.map +1 -0
- package/dist/runs/shared/claudeFableProfile.mjs +4 -0
- package/dist/runs/shared/claudeFableProfile.mjs.map +1 -0
- package/dist/runs/shared/depthGuard.cjs +2 -0
- package/dist/runs/shared/depthGuard.cjs.map +1 -0
- package/dist/runs/shared/depthGuard.mjs +2 -0
- package/dist/runs/shared/depthGuard.mjs.map +1 -0
- package/dist/runs/shared/mcpDirectToolAllowlist.cjs +2 -0
- package/dist/runs/shared/mcpDirectToolAllowlist.cjs.map +1 -0
- package/dist/runs/shared/mcpDirectToolAllowlist.mjs +2 -0
- package/dist/runs/shared/mcpDirectToolAllowlist.mjs.map +1 -0
- package/dist/runs/shared/modelFallback.cjs +2 -0
- package/dist/runs/shared/modelFallback.cjs.map +1 -0
- package/dist/runs/shared/modelFallback.mjs +2 -0
- package/dist/runs/shared/modelFallback.mjs.map +1 -0
- package/dist/runs/shared/modelScope.cjs +2 -0
- package/dist/runs/shared/modelScope.cjs.map +1 -0
- package/dist/runs/shared/modelScope.mjs +2 -0
- package/dist/runs/shared/modelScope.mjs.map +1 -0
- package/dist/runs/shared/nestedPath.cjs +2 -0
- package/dist/runs/shared/nestedPath.cjs.map +1 -0
- package/dist/runs/shared/nestedPath.mjs +2 -0
- package/dist/runs/shared/nestedPath.mjs.map +1 -0
- package/dist/runs/shared/piArgs.cjs +2 -0
- package/dist/runs/shared/piArgs.cjs.map +1 -0
- package/dist/runs/shared/piArgs.mjs +2 -0
- package/dist/runs/shared/piArgs.mjs.map +1 -0
- package/dist/runs/shared/piSpawn.cjs +2 -0
- package/dist/runs/shared/piSpawn.cjs.map +1 -0
- package/dist/runs/shared/piSpawn.mjs +2 -0
- package/dist/runs/shared/piSpawn.mjs.map +1 -0
- package/dist/runs/shared/runWithConcurrency.cjs +2 -0
- package/dist/runs/shared/runWithConcurrency.cjs.map +1 -0
- package/dist/runs/shared/runWithConcurrency.mjs +2 -0
- package/dist/runs/shared/runWithConcurrency.mjs.map +1 -0
- package/dist/runs/shared/runtimeRegistry.cjs +2 -0
- package/dist/runs/shared/runtimeRegistry.cjs.map +1 -0
- package/dist/runs/shared/runtimeRegistry.mjs +2 -0
- package/dist/runs/shared/runtimeRegistry.mjs.map +1 -0
- package/dist/runs/shared/structuredOutput.cjs +2 -0
- package/dist/runs/shared/structuredOutput.cjs.map +1 -0
- package/dist/runs/shared/structuredOutput.mjs +2 -0
- package/dist/runs/shared/structuredOutput.mjs.map +1 -0
- package/dist/runs/shared/toolAvailability.cjs +2 -0
- package/dist/runs/shared/toolAvailability.cjs.map +1 -0
- package/dist/runs/shared/toolAvailability.mjs +2 -0
- package/dist/runs/shared/toolAvailability.mjs.map +1 -0
- package/dist/runs/shared/toolBudget.cjs +2 -0
- package/dist/runs/shared/toolBudget.cjs.map +1 -0
- package/dist/runs/shared/toolBudget.mjs +2 -0
- package/dist/runs/shared/toolBudget.mjs.map +1 -0
- package/dist/shared/artifacts.cjs +2 -0
- package/dist/shared/artifacts.cjs.map +1 -0
- package/dist/shared/artifacts.mjs +2 -0
- package/dist/shared/artifacts.mjs.map +1 -0
- package/dist/shared/atomicJson.cjs +2 -0
- package/dist/shared/atomicJson.cjs.map +1 -0
- package/dist/shared/atomicJson.mjs +2 -0
- package/dist/shared/atomicJson.mjs.map +1 -0
- package/dist/shared/boundedKeySet.cjs +2 -0
- package/dist/shared/boundedKeySet.cjs.map +1 -0
- package/dist/shared/boundedKeySet.mjs +2 -0
- package/dist/shared/boundedKeySet.mjs.map +1 -0
- package/dist/shared/childTranscript.cjs +5 -0
- package/dist/shared/childTranscript.cjs.map +1 -0
- package/dist/shared/childTranscript.mjs +5 -0
- package/dist/shared/childTranscript.mjs.map +1 -0
- package/dist/shared/configDir.cjs +2 -0
- package/dist/shared/configDir.cjs.map +1 -0
- package/dist/shared/configDir.mjs +2 -0
- package/dist/shared/configDir.mjs.map +1 -0
- package/dist/shared/errors.cjs +2 -0
- package/dist/shared/errors.cjs.map +1 -0
- package/dist/shared/errors.mjs +2 -0
- package/dist/shared/errors.mjs.map +1 -0
- package/dist/shared/fileSystemRetry.cjs +2 -0
- package/dist/shared/fileSystemRetry.cjs.map +1 -0
- package/dist/shared/fileSystemRetry.mjs +2 -0
- package/dist/shared/fileSystemRetry.mjs.map +1 -0
- package/dist/shared/formatters.cjs +2 -0
- package/dist/shared/formatters.cjs.map +1 -0
- package/dist/shared/formatters.mjs +2 -0
- package/dist/shared/formatters.mjs.map +1 -0
- package/dist/shared/lruCache.cjs +2 -0
- package/dist/shared/lruCache.cjs.map +1 -0
- package/dist/shared/lruCache.mjs +2 -0
- package/dist/shared/lruCache.mjs.map +1 -0
- package/dist/shared/modelInfo.cjs +2 -0
- package/dist/shared/modelInfo.cjs.map +1 -0
- package/dist/shared/modelInfo.mjs +2 -0
- package/dist/shared/modelInfo.mjs.map +1 -0
- package/dist/shared/modelResolution.cjs +2 -0
- package/dist/shared/modelResolution.cjs.map +1 -0
- package/dist/shared/modelResolution.mjs +2 -0
- package/dist/shared/modelResolution.mjs.map +1 -0
- package/dist/shared/paths.cjs +2 -0
- package/dist/shared/paths.cjs.map +1 -0
- package/dist/shared/paths.mjs +2 -0
- package/dist/shared/paths.mjs.map +1 -0
- package/dist/shared/pollScheduler.cjs +2 -0
- package/dist/shared/pollScheduler.cjs.map +1 -0
- package/dist/shared/pollScheduler.mjs +2 -0
- package/dist/shared/pollScheduler.mjs.map +1 -0
- package/dist/shared/scopeOwner.cjs +2 -0
- package/dist/shared/scopeOwner.cjs.map +1 -0
- package/dist/shared/scopeOwner.mjs +2 -0
- package/dist/shared/scopeOwner.mjs.map +1 -0
- package/dist/shared/versioned.cjs +2 -0
- package/dist/shared/versioned.cjs.map +1 -0
- package/dist/shared/versioned.mjs +2 -0
- package/dist/shared/versioned.mjs.map +1 -0
- package/dist/slash/chainExpression.cjs +2 -0
- package/dist/slash/chainExpression.cjs.map +1 -0
- package/dist/slash/chainExpression.mjs +2 -0
- package/dist/slash/chainExpression.mjs.map +1 -0
- package/dist/slash/doctor.cjs +5 -0
- package/dist/slash/doctor.cjs.map +1 -0
- package/dist/slash/doctor.mjs +5 -0
- package/dist/slash/doctor.mjs.map +1 -0
- package/dist/slash/slashCommands.cjs +4 -0
- package/dist/slash/slashCommands.cjs.map +1 -0
- package/dist/slash/slashCommands.mjs +4 -0
- package/dist/slash/slashCommands.mjs.map +1 -0
- package/dist/slash/spawnRequestMapping.cjs +2 -0
- package/dist/slash/spawnRequestMapping.cjs.map +1 -0
- package/dist/slash/spawnRequestMapping.mjs +2 -0
- package/dist/slash/spawnRequestMapping.mjs.map +1 -0
- package/dist/slash/subagentLaunch.cjs +2 -0
- package/dist/slash/subagentLaunch.cjs.map +1 -0
- package/dist/slash/subagentLaunch.mjs +2 -0
- package/dist/slash/subagentLaunch.mjs.map +1 -0
- package/dist/tui/agentCatalog.cjs +2 -0
- package/dist/tui/agentCatalog.cjs.map +1 -0
- package/dist/tui/agentCatalog.mjs +2 -0
- package/dist/tui/agentCatalog.mjs.map +1 -0
- package/dist/tui/agentResourceProjection.cjs +2 -0
- package/dist/tui/agentResourceProjection.cjs.map +1 -0
- package/dist/tui/agentResourceProjection.mjs +2 -0
- package/dist/tui/agentResourceProjection.mjs.map +1 -0
- package/dist/tui/completionNotice.cjs +5 -0
- package/dist/tui/completionNotice.cjs.map +1 -0
- package/dist/tui/completionNotice.mjs +5 -0
- package/dist/tui/completionNotice.mjs.map +1 -0
- package/dist/tui/fleet.cjs +3 -0
- package/dist/tui/fleet.cjs.map +1 -0
- package/dist/tui/fleet.mjs +3 -0
- package/dist/tui/fleet.mjs.map +1 -0
- package/dist/tui/fleetAgentView.cjs +2 -0
- package/dist/tui/fleetAgentView.cjs.map +1 -0
- package/dist/tui/fleetAgentView.mjs +2 -0
- package/dist/tui/fleetAgentView.mjs.map +1 -0
- package/dist/tui/fleetStatus.cjs +2 -0
- package/dist/tui/fleetStatus.cjs.map +1 -0
- package/dist/tui/fleetStatus.mjs +2 -0
- package/dist/tui/fleetStatus.mjs.map +1 -0
- package/dist/tui/fleetTranscript.cjs +5 -0
- package/dist/tui/fleetTranscript.cjs.map +1 -0
- package/dist/tui/fleetTranscript.mjs +5 -0
- package/dist/tui/fleetTranscript.mjs.map +1 -0
- package/dist/tui/register.cjs +2 -0
- package/dist/tui/register.cjs.map +1 -0
- package/dist/tui/register.mjs +2 -0
- package/dist/tui/register.mjs.map +1 -0
- package/dist/types.d.cts +59 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +59 -0
- package/dist/types.d.mts.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagentTool.cjs","names":["SUBAGENT_ACTIONS","agentHasWriteTools","isSuspendedRunResumable","invalidRequest","SUBAGENT_ACTION_FIELDS","DoomTeamExpectedError","captureSessionForkSource","normalizeParentModel","authenticatedModelInfos","startOperation","loadConfig","listSuspendedRuns","requireCurrentSessionScope","formatFleetView","formatRunTranscript","resolveTrackedRunId","isPiRuntime","formatSuspendedRuns","SUBAGENT_TOOL_DESCRIPTION","SubagentParams","DOOM_TEAM_TYPES"],"sources":["../../src/extensions/subagentTool.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { AgentToolResult } from '@earendil-works/pi-agent-core';\nimport type { ExtensionAPI, ExtensionContext, ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport { inject, injectable } from 'inversify';\n\nimport { agentHasWriteTools } from '../agents/memory.ts';\nimport type { AgentConfig, AgentScope, IAgentDiscoveryService } from '../agents/types.ts';\nimport { DOOM_TEAM_TYPES } from '../container/types.ts';\nimport { resolveTrackedRunId, type IAsyncJobTracker } from '../runs/background/asyncJobTracker.ts';\nimport type { ISubagentWaiter, WaitForMode } from '../runs/background/subagentWait.ts';\nimport {\n clearSuspendedRun,\n formatSuspendedRuns,\n isSuspendedRunResumable,\n listSuspendedRuns,\n type SuspendedRun,\n} from '../runs/registry/suspendedRuns.ts';\nimport { isPiRuntime } from '../runs/shared/runtimeRegistry.ts';\nimport { normalizeParentModel } from '../runs/shared/modelFallback.ts';\nimport { authenticatedModelInfos } from '../shared/modelResolution.ts';\nimport { requireCurrentSessionScope } from '../shared/paths.ts';\nimport { loadConfig } from './config.ts';\nimport { DoomTeamExpectedError, invalidRequest } from '../shared/errors.ts';\nimport type { IManagementActions, StatusActionResult } from './managementActions.ts';\nimport { completeOperation, startOperation } from './operationJournal.ts';\nimport {\n SUBAGENT_ACTION_FIELDS,\n SUBAGENT_ACTIONS,\n SubagentParams,\n type SubagentAction,\n type SubagentToolParams,\n} from './schemas.ts';\nimport { DEFAULT_TRANSCRIPT_LINES, formatFleetView, formatRunTranscript } from './statusViews.ts';\nimport {\n captureSessionForkSource,\n type ISpawnPlanner,\n type SpawnPlanRequest,\n type SpawnPlanResult,\n} from './spawnPlan.ts';\nimport { SUBAGENT_TOOL_DESCRIPTION } from './toolDescription.ts';\n\nexport const SUBAGENT_TOOL_NAME = 'subagent';\nexport const IMPLEMENTED_SUBAGENT_ACTIONS: ReadonlySet<string> = new Set(Object.values(SUBAGENT_ACTIONS));\n\ntype SubagentToolDetails = Record<string, unknown>;\n\nfunction textResult<T extends SubagentToolDetails>(text: string, details: T): AgentToolResult<T> {\n return { content: [{ type: 'text', text }], details };\n}\n\nfunction progressResult(text: string, action: SubagentAction): AgentToolResult<SubagentToolDetails> {\n return textResult(text, { action, partial: true });\n}\n\nfunction progressMessage(params: SubagentToolParams): string | undefined {\n switch (params.action) {\n case SUBAGENT_ACTIONS.run:\n return `Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`;\n case SUBAGENT_ACTIONS.wait:\n return 'Waiting for subagent activity...';\n case SUBAGENT_ACTIONS.steer:\n return `Steering subagent ${params.id}...`;\n case SUBAGENT_ACTIONS.stop:\n return `Requesting stop for subagent ${params.id}...`;\n case SUBAGENT_ACTIONS.restore:\n return `Restoring subagent ${params.id}...`;\n default:\n return undefined;\n }\n}\n\nfunction waitGuidance(reason: string): string[] {\n if (reason === 'timeout') {\n return [\n 'The wait timed out; the runs may still be active.',\n 'Inspect subagent status, wait again with a deliberate timeout, or ask the user before stopping work.',\n ];\n }\n if (reason === 'attention') {\n return ['Inspect the affected run status or transcript, then steer it or ask the user for the required decision.'];\n }\n if (reason === 'no-active-runs') {\n return ['Inspect fleet status and verify the run ids instead of polling the same empty wait again.'];\n }\n if (reason === 'aborted')\n return ['The wait was cancelled; inspect current run status before deciding what to do next.'];\n return [];\n}\n\nfunction hasTool(pi: ExtensionAPI, name: string): boolean {\n try {\n return pi.getAllTools().some((tool) => tool.name === name);\n } catch {\n return false;\n }\n}\n\nfunction scopeOrDefault(scope: AgentScope | undefined): AgentScope {\n return scope ?? 'both';\n}\n\nfunction formatAgentList(agents: AgentConfig[]): string {\n return [\n 'Executable agents:',\n ...(agents.length\n ? agents\n .toSorted((left, right) => left.name.localeCompare(right.name))\n .map((agent) => `- ${agent.name} (${agent.source}): ${agent.description}`)\n : ['- (none)']),\n ].join('\\n');\n}\n\nfunction publicAgent(agent: AgentConfig): Record<string, unknown> {\n const tools = [...(agent.tools ?? []), ...(agent.mcpDirectTools ?? []).map((tool) => `mcp:${tool}`)];\n return {\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n writeCapable: agentHasWriteTools(agent),\n ...(agent.model ? { model: agent.model } : {}),\n ...(agent.fallbackModels?.length ? { fallbackModels: agent.fallbackModels } : {}),\n ...(tools.length ? { tools } : {}),\n };\n}\n\nfunction publicSuspendedRun(run: SuspendedRun): SuspendedRun & { resumable: boolean } {\n return { ...run, resumable: isSuspendedRunResumable(run) };\n}\n\nfunction formatAgentDetail(agent: AgentConfig): string {\n const detail = publicAgent(agent);\n return [\n `Agent: ${agent.name} (${agent.source})`,\n `Description: ${agent.description}`,\n `Runtime: ${String(detail.runtime)}`,\n `Write capable: ${detail.writeCapable ? 'yes' : 'no'}`,\n ...(agent.model ? [`Model: ${agent.model}`] : []),\n ...(Array.isArray(detail.tools) ? [`Tools: ${detail.tools.join(', ')}`] : []),\n ].join('\\n');\n}\n\nfunction requireNonblank(record: Record<string, unknown>, field: string, action: string): void {\n if (typeof record[field] !== 'string' || !record[field].trim()) {\n throw invalidRequest(`action='${action}' requires nonblank '${field}'.`, 'Correct the request and retry.');\n }\n}\n\n/** Remove the one legacy field emitted by Doom Plan before strict validation. */\nfunction normalizeCompatibilityParams(raw: unknown): unknown {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return raw;\n const record = raw as Record<string, unknown>;\n if (\n typeof record.action !== 'string' ||\n !IMPLEMENTED_SUBAGENT_ACTIONS.has(record.action) ||\n record.action === SUBAGENT_ACTIONS.run ||\n typeof record.model !== 'string'\n ) {\n return raw;\n }\n const { model: _model, ...normalized } = record;\n return normalized;\n}\n\nfunction validateParams(input: unknown): SubagentToolParams {\n const raw = normalizeCompatibilityParams(input);\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n throw invalidRequest('subagent parameters must be an object.', 'Call subagent with one documented action shape.');\n }\n const record = raw as Record<string, unknown>;\n const action = record.action;\n if (typeof action !== 'string' || !IMPLEMENTED_SUBAGENT_ACTIONS.has(action)) {\n throw invalidRequest(\n `Unsupported or missing subagent action ${JSON.stringify(action)}.`,\n `Use one of: ${[...IMPLEMENTED_SUBAGENT_ACTIONS].join(', ')}.`,\n );\n }\n const allowed = SUBAGENT_ACTION_FIELDS[action as SubagentAction] as readonly string[];\n const unknown = Object.keys(record).filter((field) => !allowed.includes(field));\n if (unknown.length) {\n throw invalidRequest(\n `action='${action}' does not accept: ${unknown.join(', ')}.`,\n 'Remove unknown fields and retry.',\n );\n }\n if (action === 'run' && (!Array.isArray(record.requests) || record.requests.length === 0)) {\n throw invalidRequest(\"action='run' requires a nonempty 'requests' array.\", 'Add at least one agent and task.');\n }\n if (action === 'steer') {\n requireNonblank(record, 'id', action);\n requireNonblank(record, 'message', action);\n }\n if (action === 'stop' || action === 'restore') requireNonblank(record, 'id', action);\n return raw as SubagentToolParams;\n}\n\nexport interface ISubagentToolService {\n registerTool(pi: ExtensionAPI): void;\n}\n\n@injectable()\nexport class SubagentToolService implements ISubagentToolService {\n private readonly registeredHosts = new WeakSet<ExtensionAPI>();\n\n constructor(\n @inject(DOOM_TEAM_TYPES.SpawnPlanner) private readonly planner: ISpawnPlanner,\n @inject(DOOM_TEAM_TYPES.ManagementActions) private readonly management: IManagementActions,\n @inject(DOOM_TEAM_TYPES.AsyncJobTracker) private readonly tracker: IAsyncJobTracker,\n @inject(DOOM_TEAM_TYPES.AgentDiscoveryService) private readonly discovery: IAgentDiscoveryService,\n @inject(DOOM_TEAM_TYPES.SubagentWaiter) private readonly waiter: ISubagentWaiter,\n ) {}\n\n registerTool(pi: ExtensionAPI): void {\n if (this.registeredHosts.has(pi)) return;\n if (hasTool(pi, SUBAGENT_TOOL_NAME)) {\n throw new DoomTeamExpectedError(\n 'tool_conflict',\n `A foreign '${SUBAGENT_TOOL_NAME}' tool is already registered.`,\n false,\n 'Disable the competing extension, then reload Doom Team.',\n );\n }\n pi.registerTool(this.buildTool());\n this.registeredHosts.add(pi);\n }\n\n private trackOutcomes(result: SpawnPlanResult, ctx: ExtensionContext): SpawnPlanResult {\n const jobs = this.tracker.forSession(ctx.sessionManager.getSessionId());\n for (const outcome of result.outcomes) {\n if (outcome.runId) jobs.track(outcome.runId);\n }\n return result;\n }\n\n private buildSpawnRequest(\n operationId: string,\n params: Extract<SubagentToolParams, { action: 'run' }>,\n ctx: ExtensionContext,\n preallocatedRunIds: string[],\n ): SpawnPlanRequest {\n const tasks = params.requests.map((request) => {\n if (!request.agent.trim() || !request.task.trim()) {\n throw invalidRequest(\n 'Every run request requires nonblank agent and task values.',\n 'Correct the request and retry.',\n );\n }\n return {\n agent: request.agent.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n task: request.task.trim(),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n };\n });\n const parentForkSource = captureSessionForkSource(ctx.sessionManager, 'tool');\n const parentModel = normalizeParentModel(ctx.model);\n return {\n tasks,\n cwd: ctx.cwd,\n agentScope: scopeOrDefault(params.scope),\n parentSessionId: ctx.sessionManager.getSessionId(),\n ...(parentForkSource\n ? { parentSessionFile: parentForkSource.sessionFile, parentLeafId: parentForkSource.leafId }\n : {}),\n ...(params.concurrency !== undefined ? { concurrency: params.concurrency } : {}),\n ...(params.artifacts !== undefined ? { artifacts: params.artifacts } : {}),\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(parentModel ? { parentModel } : {}),\n operationId,\n preallocatedRunIds,\n };\n }\n\n private async executeRun(\n operationId: string,\n params: Extract<SubagentToolParams, { action: 'run' }>,\n ctx: ExtensionContext,\n ): Promise<AgentToolResult<SubagentToolDetails>> {\n const operation = startOperation<AgentToolResult<SubagentToolDetails>>(\n operationId,\n params,\n params.requests.map(() => randomUUID()),\n );\n if (operation.kind === 'replay') {\n if (operation.record.state === 'completed' && operation.record.result) return operation.record.result;\n throw new DoomTeamExpectedError(\n 'delivery_unconfirmed',\n `Operation '${operationId}' is already pending for runs: ${operation.record.runIds.join(', ')}.`,\n true,\n 'Call subagent({\"action\":\"status\"}) and do not submit the run again.',\n );\n }\n const result = this.trackOutcomes(\n await this.planner.spawn(\n this.buildSpawnRequest(operationId, params, ctx, operation.record.runIds),\n loadConfig().config,\n ),\n ctx,\n );\n const started = result.outcomes.filter((outcome) => outcome.runId);\n const failed = result.outcomes.filter((outcome) => !outcome.runId);\n const lines = result.outcomes.map(\n (outcome) =>\n `- ${outcome.agent}: ${outcome.runId ? `started as ${outcome.runId}` : `failed: ${outcome.error ?? 'unknown error'}`}${outcome.warning ? `\\n Warning: ${outcome.warning}` : ''}`,\n );\n if (started.length === 0 && failed.length > 0) {\n throw new DoomTeamExpectedError(\n 'runtime_unavailable',\n `No requested subagent started.\\n${lines.join('\\n')}`,\n true,\n 'Call subagent({\"action\":\"agents\"}) to verify exact agent names, correct only the failed requests, or ask the user if a different delegation approach is needed.',\n );\n }\n const response = textResult(\n [\n `Run request: started ${started.length}/${result.outcomes.length} background agents; failed ${failed.length}.`,\n ...lines,\n ...(started.length > 0\n ? [\n '',\n 'They run independently of this turn and will send completion notifications. Continue non-overlapping work, or end the turn and wait.',\n ]\n : []),\n ...(failed.length > 0\n ? [\n '',\n 'Do not retry the whole request because some runs already started. Inspect the failed entries and submit only corrected replacements for those items.',\n ]\n : []),\n ].join('\\n'),\n { spawn: result, started: started.length, failed: failed.length },\n );\n completeOperation(operationId, operation.record, response);\n return response;\n }\n\n private executeAgents(\n params: Extract<SubagentToolParams, { action: 'agents' }>,\n ctx: ExtensionContext,\n ): AgentToolResult<SubagentToolDetails> {\n const cwd = params.cwd ?? ctx.cwd;\n const scope = scopeOrDefault(params.scope);\n if (!params.name) {\n const result = this.discovery.discover(cwd, scope);\n return textResult(formatAgentList(result.agents), { agents: result.agents.map(publicAgent) });\n }\n const agent = this.discovery.find(cwd, scope, params.name);\n if (!agent) {\n const candidates = this.discovery\n .discover(cwd, scope)\n .agents.map((candidate) => candidate.name)\n .toSorted();\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.${candidates.length ? ` Available: ${candidates.join(', ')}.` : ''}`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact name.',\n );\n }\n return textResult(formatAgentDetail(agent), { agent: publicAgent(agent) });\n }\n\n private async executeManagement(\n params: Exclude<SubagentToolParams, { action: 'run' } | { action: 'agents' }>,\n ctx: ExtensionContext,\n signal?: AbortSignal,\n preallocatedRunIds?: string[],\n operationId?: string,\n ): Promise<AgentToolResult<SubagentToolDetails>> {\n const jobs = this.tracker.forSession(ctx.sessionManager.getSessionId());\n switch (params.action) {\n case SUBAGENT_ACTIONS.status: {\n const suspendedRuns = listSuspendedRuns(requireCurrentSessionScope());\n if (!('id' in params)) {\n if ('transcriptLines' in params && params.transcriptLines !== undefined) {\n throw invalidRequest(\n 'transcriptLines requires a run id.',\n 'Add id or omit transcriptLines for fleet status.',\n );\n }\n const runs = jobs.list();\n return textResult(formatFleetView(runs, Date.now(), suspendedRuns), {\n fleet: runs,\n suspended: suspendedRuns.map(publicSuspendedRun),\n });\n }\n const runId = params.id;\n if (!runId) {\n throw invalidRequest(\n 'transcriptLines requires a run id.',\n 'Add id or omit transcriptLines for fleet status.',\n );\n }\n const suspended = suspendedRuns.find((run) => run.runId === runId);\n if (suspended && params.transcriptLines === undefined) {\n const resumable = isSuspendedRunResumable(suspended);\n const recovery = resumable\n ? `Restore it with { action: \"restore\", id: \"${suspended.runId}\" }.`\n : 'It is not resumable; submit a new explicit run.';\n return textResult(`Run '${suspended.runId}' is suspended. ${recovery}`, {\n suspended: publicSuspendedRun(suspended),\n });\n }\n const result: StatusActionResult = this.management.status(runId);\n if (!result.runDir && !result.resultPath && !suspended) {\n throw new DoomTeamExpectedError(\n 'run_not_found',\n `No run matches '${runId}'.`,\n false,\n 'Call subagent({\"action\":\"status\"}) and retry with an exact id.',\n );\n }\n if (params.transcriptLines !== undefined) {\n return textResult(formatRunTranscript(result.status, params.transcriptLines ?? DEFAULT_TRANSCRIPT_LINES), {\n transcript: { runId: result.runId },\n });\n }\n return textResult(\n result.status ? `Run '${result.runId}': ${result.status.state}` : `Run '${result.runId}' has no status yet.`,\n { status: result },\n );\n }\n case SUBAGENT_ACTIONS.wait: {\n const ids = params.ids?.map((id) => resolveTrackedRunId(jobs, id));\n const outcome = await this.waiter.wait({\n target: ids ? { ids } : { all: true },\n sessionId: ctx.sessionManager.getSessionId(),\n waitFor: params.until as WaitForMode | undefined,\n timeoutMs: params.timeoutMs,\n signal,\n });\n return textResult([`Subagent wait: ${outcome.reason}.`, ...waitGuidance(outcome.reason)].join('\\n'), {\n outcome,\n });\n }\n case SUBAGENT_ACTIONS.stop: {\n const id = resolveTrackedRunId(jobs, params.id);\n const result = this.management.stop(id, params.reason);\n return textResult(`Stop requested for '${id}'.`, { control: result });\n }\n case SUBAGENT_ACTIONS.steer: {\n const id = resolveTrackedRunId(jobs, params.id);\n const runtime = this.tracker.get(id)?.runtime;\n if (runtime && !isPiRuntime(runtime)) {\n throw new DoomTeamExpectedError(\n 'unsupported_operation',\n `Run '${id}' uses '${runtime}', which does not support steering.`,\n false,\n `Use subagent({\"action\":\"stop\",\"id\":\"${id}\"}) to terminate it.`,\n );\n }\n const result = await this.management.steer(id, params.message, undefined, signal);\n return textResult(`Steer request '${result.requestId}' for '${id}' is ${result.state}: ${result.message}`, {\n steer: result,\n });\n }\n case SUBAGENT_ACTIONS.suspended: {\n const runs = listSuspendedRuns(requireCurrentSessionScope());\n return textResult(runs.length ? formatSuspendedRuns(runs) : 'No suspended subagents in this session.', {\n suspended: runs.map(publicSuspendedRun),\n });\n }\n case SUBAGENT_ACTIONS.restore: {\n const scope = requireCurrentSessionScope();\n const record = listSuspendedRuns(scope).find((run) => run.runId === params.id);\n if (!record) {\n throw new DoomTeamExpectedError(\n 'run_not_found',\n `No suspended run matches '${params.id}'.`,\n false,\n 'Call subagent({\"action\":\"suspended\"}) and retry with an exact id.',\n );\n }\n if (!isSuspendedRunResumable(record)) {\n throw new DoomTeamExpectedError(\n 'not_resumable',\n `Suspended run '${params.id}' does not have complete, readable Pi recovery state.`,\n false,\n 'Submit a new explicit run request instead of restoring this record.',\n );\n }\n const result = this.trackOutcomes(\n await this.planner.spawn(\n {\n single: {\n agent: record.agent,\n ...(record.inlineAgent ? { inlineAgent: record.inlineAgent } : {}),\n task: record.task,\n cwd: record.cwd,\n ...(record.model ? { model: record.model } : {}),\n sessionFile: record.sessionFile,\n },\n cwd: record.cwd,\n agentScope: 'both',\n runtime: 'pi',\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(operationId ? { operationId } : {}),\n ...(preallocatedRunIds ? { preallocatedRunIds } : {}),\n },\n loadConfig().config,\n ),\n ctx,\n );\n const outcome = result.outcomes[0];\n if (!outcome?.runId) {\n throw new DoomTeamExpectedError(\n 'not_resumable',\n `Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`,\n true,\n 'Inspect suspended state, then submit a new explicit run if recovery is not possible.',\n );\n }\n clearSuspendedRun(scope, params.id);\n return textResult(`Restored '${params.id}' as '${outcome.runId}', continuing its transcript.`, {\n restore: { ...outcome, restoredFrom: params.id },\n });\n }\n }\n }\n\n private buildTool(): ToolDefinition<typeof SubagentParams, SubagentToolDetails> {\n return {\n name: SUBAGENT_TOOL_NAME,\n label: 'Subagent',\n description: SUBAGENT_TOOL_DESCRIPTION,\n parameters: SubagentParams,\n prepareArguments: validateParams,\n execute: async (id, rawParams, signal, onUpdate, ctx): Promise<AgentToolResult<SubagentToolDetails>> => {\n const params = validateParams(rawParams);\n const progress = progressMessage(params);\n if (progress) onUpdate?.(progressResult(progress, params.action));\n if (params.action === SUBAGENT_ACTIONS.run) return this.executeRun(id, params, ctx);\n if (params.action === SUBAGENT_ACTIONS.agents) return this.executeAgents(params, ctx);\n const journaled =\n params.action === SUBAGENT_ACTIONS.steer ||\n params.action === SUBAGENT_ACTIONS.stop ||\n params.action === SUBAGENT_ACTIONS.restore;\n if (!journaled) return this.executeManagement(params, ctx, signal);\n\n const operation = startOperation<AgentToolResult<SubagentToolDetails>>(\n id,\n params,\n params.action === SUBAGENT_ACTIONS.restore ? [randomUUID()] : [],\n );\n if (operation.kind === 'replay') {\n if (operation.record.state === 'completed' && operation.record.result) return operation.record.result;\n throw new DoomTeamExpectedError(\n 'delivery_unconfirmed',\n `Operation '${id}' is already pending.`,\n true,\n 'Inspect run status before retrying this control operation.',\n );\n }\n const response = await this.executeManagement(params, ctx, signal, operation.record.runIds, id);\n completeOperation(id, operation.record, response);\n return response;\n },\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{__esmMin as e}from"../_virtual/_rolldown/runtime.mjs";import{agentHasWriteTools as t,init_memory as n}from"../agents/memory.mjs";import{__decorate as r,init_decorate as i}from"../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";import{DOOM_TEAM_TYPES as a,init_types as o}from"../container/types.mjs";import{__decorateMetadata as s,init_decorateMetadata as c}from"../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.mjs";import{__decorateParam as l,init_decorateParam as u}from"../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateParam.mjs";import{init_paths as ee,requireCurrentSessionScope as d}from"../shared/paths.mjs";import{DoomTeamExpectedError as f,init_errors as p,invalidRequest as m}from"../shared/errors.mjs";import{init_runtimeRegistry as te,isPiRuntime as ne}from"../runs/shared/runtimeRegistry.mjs";import{authenticatedModelInfos as h,init_modelResolution as g}from"../shared/modelResolution.mjs";import{init_modelFallback as re,normalizeParentModel as ie}from"../runs/shared/modelFallback.mjs";import{captureSessionForkSource as _,init_spawnPlan as v}from"./spawnPlan.mjs";import{init_asyncJobTracker as ae,resolveTrackedRunId as y}from"../runs/background/asyncJobTracker.mjs";import{clearSuspendedRun as oe,formatSuspendedRuns as b,init_suspendedRuns as x,isSuspendedRunResumable as S,listSuspendedRuns as C}from"../runs/registry/suspendedRuns.mjs";import{init_config as w,loadConfig as T}from"./config.mjs";import{completeOperation as E,init_operationJournal as se,startOperation as D}from"./operationJournal.mjs";import{SUBAGENT_ACTIONS as O,SUBAGENT_ACTION_FIELDS as k,SubagentParams as A,init_schemas as j}from"./schemas.mjs";import{formatFleetView as M,formatRunTranscript as N,init_statusViews as P}from"./statusViews.mjs";import{SUBAGENT_TOOL_DESCRIPTION as F,init_toolDescription as I}from"./toolDescription.mjs";import{inject as L,injectable as R}from"inversify";import{randomUUID as z}from"node:crypto";function B(e,t){return{content:[{type:`text`,text:e}],details:t}}function V(e,t){return B(e,{action:t,partial:!0})}function H(e){switch(e.action){case O.run:return`Starting ${e.requests.length} subagent${e.requests.length===1?``:`s`}...`;case O.wait:return`Waiting for subagent activity...`;case O.steer:return`Steering subagent ${e.id}...`;case O.stop:return`Requesting stop for subagent ${e.id}...`;case O.restore:return`Restoring subagent ${e.id}...`;default:return}}function U(e){return e===`timeout`?[`The wait timed out; the runs may still be active.`,`Inspect subagent status, wait again with a deliberate timeout, or ask the user before stopping work.`]:e===`attention`?[`Inspect the affected run status or transcript, then steer it or ask the user for the required decision.`]:e===`no-active-runs`?[`Inspect fleet status and verify the run ids instead of polling the same empty wait again.`]:e===`aborted`?[`The wait was cancelled; inspect current run status before deciding what to do next.`]:[]}function W(e,t){try{return e.getAllTools().some(e=>e.name===t)}catch{return!1}}function G(e){return e??`both`}function ce(e){return[`Executable agents:`,...e.length?e.toSorted((e,t)=>e.name.localeCompare(t.name)).map(e=>`- ${e.name} (${e.source}): ${e.description}`):[`- (none)`]].join(`
|
|
2
|
+
`)}function K(e){let n=[...e.tools??[],...(e.mcpDirectTools??[]).map(e=>`mcp:${e}`)];return{name:e.name,source:e.source,description:e.description,runtime:e.runtime??`pi`,writeCapable:t(e),...e.model?{model:e.model}:{},...e.fallbackModels?.length?{fallbackModels:e.fallbackModels}:{},...n.length?{tools:n}:{}}}function q(e){return{...e,resumable:S(e)}}function le(e){let t=K(e);return[`Agent: ${e.name} (${e.source})`,`Description: ${e.description}`,`Runtime: ${String(t.runtime)}`,`Write capable: ${t.writeCapable?`yes`:`no`}`,...e.model?[`Model: ${e.model}`]:[],...Array.isArray(t.tools)?[`Tools: ${t.tools.join(`, `)}`]:[]].join(`
|
|
3
|
+
`)}function J(e,t,n){if(typeof e[t]!=`string`||!e[t].trim())throw m(`action='${n}' requires nonblank '${t}'.`,`Correct the request and retry.`)}function ue(e){if(!e||typeof e!=`object`||Array.isArray(e))return e;let t=e;if(typeof t.action!=`string`||!Z.has(t.action)||t.action===O.run||typeof t.model!=`string`)return e;let{model:n,...r}=t;return r}function Y(e){let t=ue(e);if(!t||typeof t!=`object`||Array.isArray(t))throw m(`subagent parameters must be an object.`,`Call subagent with one documented action shape.`);let n=t,r=n.action;if(typeof r!=`string`||!Z.has(r))throw m(`Unsupported or missing subagent action ${JSON.stringify(r)}.`,`Use one of: ${[...Z].join(`, `)}.`);let i=k[r],a=Object.keys(n).filter(e=>!i.includes(e));if(a.length)throw m(`action='${r}' does not accept: ${a.join(`, `)}.`,`Remove unknown fields and retry.`);if(r===`run`&&(!Array.isArray(n.requests)||n.requests.length===0))throw m(`action='run' requires a nonempty 'requests' array.`,`Add at least one agent and task.`);return r===`steer`&&(J(n,`id`,r),J(n,`message`,r)),(r===`stop`||r===`restore`)&&J(n,`id`,r),t}var X,Z,Q,$=e((()=>{n(),o(),ae(),x(),te(),re(),g(),ee(),w(),p(),se(),j(),P(),v(),I(),c(),u(),i(),X=`subagent`,Z=new Set(Object.values(O)),Q=class{registeredHosts=new WeakSet;constructor(e,t,n,r,i){this.planner=e,this.management=t,this.tracker=n,this.discovery=r,this.waiter=i}registerTool(e){if(!this.registeredHosts.has(e)){if(W(e,`subagent`))throw new f(`tool_conflict`,`A foreign '${X}' tool is already registered.`,!1,`Disable the competing extension, then reload Doom Team.`);e.registerTool(this.buildTool()),this.registeredHosts.add(e)}}trackOutcomes(e,t){let n=this.tracker.forSession(t.sessionManager.getSessionId());for(let t of e.outcomes)t.runId&&n.track(t.runId);return e}buildSpawnRequest(e,t,n,r){let i=t.requests.map(e=>{if(!e.agent.trim()||!e.task.trim())throw m(`Every run request requires nonblank agent and task values.`,`Correct the request and retry.`);return{agent:e.agent.trim(),...e.inlineAgent?{inlineAgent:e.inlineAgent}:{},task:e.task.trim(),...e.cwd?{cwd:e.cwd}:{},...e.model?{model:e.model}:{},...e.runtime?{runtime:e.runtime}:{}}}),a=_(n.sessionManager,`tool`),o=ie(n.model);return{tasks:i,cwd:n.cwd,agentScope:G(t.scope),parentSessionId:n.sessionManager.getSessionId(),...a?{parentSessionFile:a.sessionFile,parentLeafId:a.leafId}:{},...t.concurrency===void 0?{}:{concurrency:t.concurrency},...t.artifacts===void 0?{}:{artifacts:t.artifacts},availableModels:h(n.modelRegistry),...o?{parentModel:o}:{},operationId:e,preallocatedRunIds:r}}async executeRun(e,t,n){let r=D(e,t,t.requests.map(()=>z()));if(r.kind===`replay`){if(r.record.state===`completed`&&r.record.result)return r.record.result;throw new f(`delivery_unconfirmed`,`Operation '${e}' is already pending for runs: ${r.record.runIds.join(`, `)}.`,!0,`Call subagent({"action":"status"}) and do not submit the run again.`)}let i=this.trackOutcomes(await this.planner.spawn(this.buildSpawnRequest(e,t,n,r.record.runIds),T().config),n),a=i.outcomes.filter(e=>e.runId),o=i.outcomes.filter(e=>!e.runId),s=i.outcomes.map(e=>`- ${e.agent}: ${e.runId?`started as ${e.runId}`:`failed: ${e.error??`unknown error`}`}${e.warning?`\n Warning: ${e.warning}`:``}`);if(a.length===0&&o.length>0)throw new f(`runtime_unavailable`,`No requested subagent started.\n${s.join(`
|
|
4
|
+
`)}`,!0,`Call subagent({"action":"agents"}) to verify exact agent names, correct only the failed requests, or ask the user if a different delegation approach is needed.`);let c=B([`Run request: started ${a.length}/${i.outcomes.length} background agents; failed ${o.length}.`,...s,...a.length>0?[``,`They run independently of this turn and will send completion notifications. Continue non-overlapping work, or end the turn and wait.`]:[],...o.length>0?[``,`Do not retry the whole request because some runs already started. Inspect the failed entries and submit only corrected replacements for those items.`]:[]].join(`
|
|
5
|
+
`),{spawn:i,started:a.length,failed:o.length});return E(e,r.record,c),c}executeAgents(e,t){let n=e.cwd??t.cwd,r=G(e.scope);if(!e.name){let e=this.discovery.discover(n,r);return B(ce(e.agents),{agents:e.agents.map(K)})}let i=this.discovery.find(n,r,e.name);if(!i){let t=this.discovery.discover(n,r).agents.map(e=>e.name).toSorted();throw new f(`agent_not_found`,`No executable agent matches '${e.name}'.${t.length?` Available: ${t.join(`, `)}.`:``}`,!1,`Call subagent({"action":"agents"}) and retry with an exact name.`)}return B(le(i),{agent:K(i)})}async executeManagement(e,t,n,r,i){let a=this.tracker.forSession(t.sessionManager.getSessionId());switch(e.action){case O.status:{let t=C(d());if(!(`id`in e)){if(`transcriptLines`in e&&e.transcriptLines!==void 0)throw m(`transcriptLines requires a run id.`,`Add id or omit transcriptLines for fleet status.`);let n=a.list();return B(M(n,Date.now(),t),{fleet:n,suspended:t.map(q)})}let n=e.id;if(!n)throw m(`transcriptLines requires a run id.`,`Add id or omit transcriptLines for fleet status.`);let r=t.find(e=>e.runId===n);if(r&&e.transcriptLines===void 0){let e=S(r)?`Restore it with { action: "restore", id: "${r.runId}" }.`:`It is not resumable; submit a new explicit run.`;return B(`Run '${r.runId}' is suspended. ${e}`,{suspended:q(r)})}let i=this.management.status(n);if(!i.runDir&&!i.resultPath&&!r)throw new f(`run_not_found`,`No run matches '${n}'.`,!1,`Call subagent({"action":"status"}) and retry with an exact id.`);return e.transcriptLines===void 0?B(i.status?`Run '${i.runId}': ${i.status.state}`:`Run '${i.runId}' has no status yet.`,{status:i}):B(N(i.status,e.transcriptLines??80),{transcript:{runId:i.runId}})}case O.wait:{let r=e.ids?.map(e=>y(a,e)),i=await this.waiter.wait({target:r?{ids:r}:{all:!0},sessionId:t.sessionManager.getSessionId(),waitFor:e.until,timeoutMs:e.timeoutMs,signal:n});return B([`Subagent wait: ${i.reason}.`,...U(i.reason)].join(`
|
|
6
|
+
`),{outcome:i})}case O.stop:{let t=y(a,e.id),n=this.management.stop(t,e.reason);return B(`Stop requested for '${t}'.`,{control:n})}case O.steer:{let t=y(a,e.id),r=this.tracker.get(t)?.runtime;if(r&&!ne(r))throw new f(`unsupported_operation`,`Run '${t}' uses '${r}', which does not support steering.`,!1,`Use subagent({"action":"stop","id":"${t}"}) to terminate it.`);let i=await this.management.steer(t,e.message,void 0,n);return B(`Steer request '${i.requestId}' for '${t}' is ${i.state}: ${i.message}`,{steer:i})}case O.suspended:{let e=C(d());return B(e.length?b(e):`No suspended subagents in this session.`,{suspended:e.map(q)})}case O.restore:{let n=d(),a=C(n).find(t=>t.runId===e.id);if(!a)throw new f(`run_not_found`,`No suspended run matches '${e.id}'.`,!1,`Call subagent({"action":"suspended"}) and retry with an exact id.`);if(!S(a))throw new f(`not_resumable`,`Suspended run '${e.id}' does not have complete, readable Pi recovery state.`,!1,`Submit a new explicit run request instead of restoring this record.`);let o=this.trackOutcomes(await this.planner.spawn({single:{agent:a.agent,...a.inlineAgent?{inlineAgent:a.inlineAgent}:{},task:a.task,cwd:a.cwd,...a.model?{model:a.model}:{},sessionFile:a.sessionFile},cwd:a.cwd,agentScope:`both`,runtime:`pi`,availableModels:h(t.modelRegistry),...i?{operationId:i}:{},...r?{preallocatedRunIds:r}:{}},T().config),t).outcomes[0];if(!o?.runId)throw new f(`not_resumable`,`Could not restore '${e.id}': ${o?.error??`the spawn produced no run.`}`,!0,`Inspect suspended state, then submit a new explicit run if recovery is not possible.`);return oe(n,e.id),B(`Restored '${e.id}' as '${o.runId}', continuing its transcript.`,{restore:{...o,restoredFrom:e.id}})}}}buildTool(){return{name:X,label:`Subagent`,description:F,parameters:A,prepareArguments:Y,execute:async(e,t,n,r,i)=>{let a=Y(t),o=H(a);if(o&&r?.(V(o,a.action)),a.action===O.run)return this.executeRun(e,a,i);if(a.action===O.agents)return this.executeAgents(a,i);if(!(a.action===O.steer||a.action===O.stop||a.action===O.restore))return this.executeManagement(a,i,n);let s=D(e,a,a.action===O.restore?[z()]:[]);if(s.kind===`replay`){if(s.record.state===`completed`&&s.record.result)return s.record.result;throw new f(`delivery_unconfirmed`,`Operation '${e}' is already pending.`,!0,`Inspect run status before retrying this control operation.`)}let c=await this.executeManagement(a,i,n,s.record.runIds,e);return E(e,s.record,c),c}}}},Q=r([R(),l(0,L(a.SpawnPlanner)),l(1,L(a.ManagementActions)),l(2,L(a.AsyncJobTracker)),l(3,L(a.AgentDiscoveryService)),l(4,L(a.SubagentWaiter)),s(`design:paramtypes`,[Object,Object,Object,Object,Object])],Q)}));$();export{Q as SubagentToolService,$ as init_subagentTool};
|
|
7
|
+
//# sourceMappingURL=subagentTool.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagentTool.mjs","names":[],"sources":["../../src/extensions/subagentTool.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { AgentToolResult } from '@earendil-works/pi-agent-core';\nimport type { ExtensionAPI, ExtensionContext, ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport { inject, injectable } from 'inversify';\n\nimport { agentHasWriteTools } from '../agents/memory.ts';\nimport type { AgentConfig, AgentScope, IAgentDiscoveryService } from '../agents/types.ts';\nimport { DOOM_TEAM_TYPES } from '../container/types.ts';\nimport { resolveTrackedRunId, type IAsyncJobTracker } from '../runs/background/asyncJobTracker.ts';\nimport type { ISubagentWaiter, WaitForMode } from '../runs/background/subagentWait.ts';\nimport {\n clearSuspendedRun,\n formatSuspendedRuns,\n isSuspendedRunResumable,\n listSuspendedRuns,\n type SuspendedRun,\n} from '../runs/registry/suspendedRuns.ts';\nimport { isPiRuntime } from '../runs/shared/runtimeRegistry.ts';\nimport { normalizeParentModel } from '../runs/shared/modelFallback.ts';\nimport { authenticatedModelInfos } from '../shared/modelResolution.ts';\nimport { requireCurrentSessionScope } from '../shared/paths.ts';\nimport { loadConfig } from './config.ts';\nimport { DoomTeamExpectedError, invalidRequest } from '../shared/errors.ts';\nimport type { IManagementActions, StatusActionResult } from './managementActions.ts';\nimport { completeOperation, startOperation } from './operationJournal.ts';\nimport {\n SUBAGENT_ACTION_FIELDS,\n SUBAGENT_ACTIONS,\n SubagentParams,\n type SubagentAction,\n type SubagentToolParams,\n} from './schemas.ts';\nimport { DEFAULT_TRANSCRIPT_LINES, formatFleetView, formatRunTranscript } from './statusViews.ts';\nimport {\n captureSessionForkSource,\n type ISpawnPlanner,\n type SpawnPlanRequest,\n type SpawnPlanResult,\n} from './spawnPlan.ts';\nimport { SUBAGENT_TOOL_DESCRIPTION } from './toolDescription.ts';\n\nexport const SUBAGENT_TOOL_NAME = 'subagent';\nexport const IMPLEMENTED_SUBAGENT_ACTIONS: ReadonlySet<string> = new Set(Object.values(SUBAGENT_ACTIONS));\n\ntype SubagentToolDetails = Record<string, unknown>;\n\nfunction textResult<T extends SubagentToolDetails>(text: string, details: T): AgentToolResult<T> {\n return { content: [{ type: 'text', text }], details };\n}\n\nfunction progressResult(text: string, action: SubagentAction): AgentToolResult<SubagentToolDetails> {\n return textResult(text, { action, partial: true });\n}\n\nfunction progressMessage(params: SubagentToolParams): string | undefined {\n switch (params.action) {\n case SUBAGENT_ACTIONS.run:\n return `Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`;\n case SUBAGENT_ACTIONS.wait:\n return 'Waiting for subagent activity...';\n case SUBAGENT_ACTIONS.steer:\n return `Steering subagent ${params.id}...`;\n case SUBAGENT_ACTIONS.stop:\n return `Requesting stop for subagent ${params.id}...`;\n case SUBAGENT_ACTIONS.restore:\n return `Restoring subagent ${params.id}...`;\n default:\n return undefined;\n }\n}\n\nfunction waitGuidance(reason: string): string[] {\n if (reason === 'timeout') {\n return [\n 'The wait timed out; the runs may still be active.',\n 'Inspect subagent status, wait again with a deliberate timeout, or ask the user before stopping work.',\n ];\n }\n if (reason === 'attention') {\n return ['Inspect the affected run status or transcript, then steer it or ask the user for the required decision.'];\n }\n if (reason === 'no-active-runs') {\n return ['Inspect fleet status and verify the run ids instead of polling the same empty wait again.'];\n }\n if (reason === 'aborted')\n return ['The wait was cancelled; inspect current run status before deciding what to do next.'];\n return [];\n}\n\nfunction hasTool(pi: ExtensionAPI, name: string): boolean {\n try {\n return pi.getAllTools().some((tool) => tool.name === name);\n } catch {\n return false;\n }\n}\n\nfunction scopeOrDefault(scope: AgentScope | undefined): AgentScope {\n return scope ?? 'both';\n}\n\nfunction formatAgentList(agents: AgentConfig[]): string {\n return [\n 'Executable agents:',\n ...(agents.length\n ? agents\n .toSorted((left, right) => left.name.localeCompare(right.name))\n .map((agent) => `- ${agent.name} (${agent.source}): ${agent.description}`)\n : ['- (none)']),\n ].join('\\n');\n}\n\nfunction publicAgent(agent: AgentConfig): Record<string, unknown> {\n const tools = [...(agent.tools ?? []), ...(agent.mcpDirectTools ?? []).map((tool) => `mcp:${tool}`)];\n return {\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n writeCapable: agentHasWriteTools(agent),\n ...(agent.model ? { model: agent.model } : {}),\n ...(agent.fallbackModels?.length ? { fallbackModels: agent.fallbackModels } : {}),\n ...(tools.length ? { tools } : {}),\n };\n}\n\nfunction publicSuspendedRun(run: SuspendedRun): SuspendedRun & { resumable: boolean } {\n return { ...run, resumable: isSuspendedRunResumable(run) };\n}\n\nfunction formatAgentDetail(agent: AgentConfig): string {\n const detail = publicAgent(agent);\n return [\n `Agent: ${agent.name} (${agent.source})`,\n `Description: ${agent.description}`,\n `Runtime: ${String(detail.runtime)}`,\n `Write capable: ${detail.writeCapable ? 'yes' : 'no'}`,\n ...(agent.model ? [`Model: ${agent.model}`] : []),\n ...(Array.isArray(detail.tools) ? [`Tools: ${detail.tools.join(', ')}`] : []),\n ].join('\\n');\n}\n\nfunction requireNonblank(record: Record<string, unknown>, field: string, action: string): void {\n if (typeof record[field] !== 'string' || !record[field].trim()) {\n throw invalidRequest(`action='${action}' requires nonblank '${field}'.`, 'Correct the request and retry.');\n }\n}\n\n/** Remove the one legacy field emitted by Doom Plan before strict validation. */\nfunction normalizeCompatibilityParams(raw: unknown): unknown {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return raw;\n const record = raw as Record<string, unknown>;\n if (\n typeof record.action !== 'string' ||\n !IMPLEMENTED_SUBAGENT_ACTIONS.has(record.action) ||\n record.action === SUBAGENT_ACTIONS.run ||\n typeof record.model !== 'string'\n ) {\n return raw;\n }\n const { model: _model, ...normalized } = record;\n return normalized;\n}\n\nfunction validateParams(input: unknown): SubagentToolParams {\n const raw = normalizeCompatibilityParams(input);\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n throw invalidRequest('subagent parameters must be an object.', 'Call subagent with one documented action shape.');\n }\n const record = raw as Record<string, unknown>;\n const action = record.action;\n if (typeof action !== 'string' || !IMPLEMENTED_SUBAGENT_ACTIONS.has(action)) {\n throw invalidRequest(\n `Unsupported or missing subagent action ${JSON.stringify(action)}.`,\n `Use one of: ${[...IMPLEMENTED_SUBAGENT_ACTIONS].join(', ')}.`,\n );\n }\n const allowed = SUBAGENT_ACTION_FIELDS[action as SubagentAction] as readonly string[];\n const unknown = Object.keys(record).filter((field) => !allowed.includes(field));\n if (unknown.length) {\n throw invalidRequest(\n `action='${action}' does not accept: ${unknown.join(', ')}.`,\n 'Remove unknown fields and retry.',\n );\n }\n if (action === 'run' && (!Array.isArray(record.requests) || record.requests.length === 0)) {\n throw invalidRequest(\"action='run' requires a nonempty 'requests' array.\", 'Add at least one agent and task.');\n }\n if (action === 'steer') {\n requireNonblank(record, 'id', action);\n requireNonblank(record, 'message', action);\n }\n if (action === 'stop' || action === 'restore') requireNonblank(record, 'id', action);\n return raw as SubagentToolParams;\n}\n\nexport interface ISubagentToolService {\n registerTool(pi: ExtensionAPI): void;\n}\n\n@injectable()\nexport class SubagentToolService implements ISubagentToolService {\n private readonly registeredHosts = new WeakSet<ExtensionAPI>();\n\n constructor(\n @inject(DOOM_TEAM_TYPES.SpawnPlanner) private readonly planner: ISpawnPlanner,\n @inject(DOOM_TEAM_TYPES.ManagementActions) private readonly management: IManagementActions,\n @inject(DOOM_TEAM_TYPES.AsyncJobTracker) private readonly tracker: IAsyncJobTracker,\n @inject(DOOM_TEAM_TYPES.AgentDiscoveryService) private readonly discovery: IAgentDiscoveryService,\n @inject(DOOM_TEAM_TYPES.SubagentWaiter) private readonly waiter: ISubagentWaiter,\n ) {}\n\n registerTool(pi: ExtensionAPI): void {\n if (this.registeredHosts.has(pi)) return;\n if (hasTool(pi, SUBAGENT_TOOL_NAME)) {\n throw new DoomTeamExpectedError(\n 'tool_conflict',\n `A foreign '${SUBAGENT_TOOL_NAME}' tool is already registered.`,\n false,\n 'Disable the competing extension, then reload Doom Team.',\n );\n }\n pi.registerTool(this.buildTool());\n this.registeredHosts.add(pi);\n }\n\n private trackOutcomes(result: SpawnPlanResult, ctx: ExtensionContext): SpawnPlanResult {\n const jobs = this.tracker.forSession(ctx.sessionManager.getSessionId());\n for (const outcome of result.outcomes) {\n if (outcome.runId) jobs.track(outcome.runId);\n }\n return result;\n }\n\n private buildSpawnRequest(\n operationId: string,\n params: Extract<SubagentToolParams, { action: 'run' }>,\n ctx: ExtensionContext,\n preallocatedRunIds: string[],\n ): SpawnPlanRequest {\n const tasks = params.requests.map((request) => {\n if (!request.agent.trim() || !request.task.trim()) {\n throw invalidRequest(\n 'Every run request requires nonblank agent and task values.',\n 'Correct the request and retry.',\n );\n }\n return {\n agent: request.agent.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n task: request.task.trim(),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n };\n });\n const parentForkSource = captureSessionForkSource(ctx.sessionManager, 'tool');\n const parentModel = normalizeParentModel(ctx.model);\n return {\n tasks,\n cwd: ctx.cwd,\n agentScope: scopeOrDefault(params.scope),\n parentSessionId: ctx.sessionManager.getSessionId(),\n ...(parentForkSource\n ? { parentSessionFile: parentForkSource.sessionFile, parentLeafId: parentForkSource.leafId }\n : {}),\n ...(params.concurrency !== undefined ? { concurrency: params.concurrency } : {}),\n ...(params.artifacts !== undefined ? { artifacts: params.artifacts } : {}),\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(parentModel ? { parentModel } : {}),\n operationId,\n preallocatedRunIds,\n };\n }\n\n private async executeRun(\n operationId: string,\n params: Extract<SubagentToolParams, { action: 'run' }>,\n ctx: ExtensionContext,\n ): Promise<AgentToolResult<SubagentToolDetails>> {\n const operation = startOperation<AgentToolResult<SubagentToolDetails>>(\n operationId,\n params,\n params.requests.map(() => randomUUID()),\n );\n if (operation.kind === 'replay') {\n if (operation.record.state === 'completed' && operation.record.result) return operation.record.result;\n throw new DoomTeamExpectedError(\n 'delivery_unconfirmed',\n `Operation '${operationId}' is already pending for runs: ${operation.record.runIds.join(', ')}.`,\n true,\n 'Call subagent({\"action\":\"status\"}) and do not submit the run again.',\n );\n }\n const result = this.trackOutcomes(\n await this.planner.spawn(\n this.buildSpawnRequest(operationId, params, ctx, operation.record.runIds),\n loadConfig().config,\n ),\n ctx,\n );\n const started = result.outcomes.filter((outcome) => outcome.runId);\n const failed = result.outcomes.filter((outcome) => !outcome.runId);\n const lines = result.outcomes.map(\n (outcome) =>\n `- ${outcome.agent}: ${outcome.runId ? `started as ${outcome.runId}` : `failed: ${outcome.error ?? 'unknown error'}`}${outcome.warning ? `\\n Warning: ${outcome.warning}` : ''}`,\n );\n if (started.length === 0 && failed.length > 0) {\n throw new DoomTeamExpectedError(\n 'runtime_unavailable',\n `No requested subagent started.\\n${lines.join('\\n')}`,\n true,\n 'Call subagent({\"action\":\"agents\"}) to verify exact agent names, correct only the failed requests, or ask the user if a different delegation approach is needed.',\n );\n }\n const response = textResult(\n [\n `Run request: started ${started.length}/${result.outcomes.length} background agents; failed ${failed.length}.`,\n ...lines,\n ...(started.length > 0\n ? [\n '',\n 'They run independently of this turn and will send completion notifications. Continue non-overlapping work, or end the turn and wait.',\n ]\n : []),\n ...(failed.length > 0\n ? [\n '',\n 'Do not retry the whole request because some runs already started. Inspect the failed entries and submit only corrected replacements for those items.',\n ]\n : []),\n ].join('\\n'),\n { spawn: result, started: started.length, failed: failed.length },\n );\n completeOperation(operationId, operation.record, response);\n return response;\n }\n\n private executeAgents(\n params: Extract<SubagentToolParams, { action: 'agents' }>,\n ctx: ExtensionContext,\n ): AgentToolResult<SubagentToolDetails> {\n const cwd = params.cwd ?? ctx.cwd;\n const scope = scopeOrDefault(params.scope);\n if (!params.name) {\n const result = this.discovery.discover(cwd, scope);\n return textResult(formatAgentList(result.agents), { agents: result.agents.map(publicAgent) });\n }\n const agent = this.discovery.find(cwd, scope, params.name);\n if (!agent) {\n const candidates = this.discovery\n .discover(cwd, scope)\n .agents.map((candidate) => candidate.name)\n .toSorted();\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.${candidates.length ? ` Available: ${candidates.join(', ')}.` : ''}`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact name.',\n );\n }\n return textResult(formatAgentDetail(agent), { agent: publicAgent(agent) });\n }\n\n private async executeManagement(\n params: Exclude<SubagentToolParams, { action: 'run' } | { action: 'agents' }>,\n ctx: ExtensionContext,\n signal?: AbortSignal,\n preallocatedRunIds?: string[],\n operationId?: string,\n ): Promise<AgentToolResult<SubagentToolDetails>> {\n const jobs = this.tracker.forSession(ctx.sessionManager.getSessionId());\n switch (params.action) {\n case SUBAGENT_ACTIONS.status: {\n const suspendedRuns = listSuspendedRuns(requireCurrentSessionScope());\n if (!('id' in params)) {\n if ('transcriptLines' in params && params.transcriptLines !== undefined) {\n throw invalidRequest(\n 'transcriptLines requires a run id.',\n 'Add id or omit transcriptLines for fleet status.',\n );\n }\n const runs = jobs.list();\n return textResult(formatFleetView(runs, Date.now(), suspendedRuns), {\n fleet: runs,\n suspended: suspendedRuns.map(publicSuspendedRun),\n });\n }\n const runId = params.id;\n if (!runId) {\n throw invalidRequest(\n 'transcriptLines requires a run id.',\n 'Add id or omit transcriptLines for fleet status.',\n );\n }\n const suspended = suspendedRuns.find((run) => run.runId === runId);\n if (suspended && params.transcriptLines === undefined) {\n const resumable = isSuspendedRunResumable(suspended);\n const recovery = resumable\n ? `Restore it with { action: \"restore\", id: \"${suspended.runId}\" }.`\n : 'It is not resumable; submit a new explicit run.';\n return textResult(`Run '${suspended.runId}' is suspended. ${recovery}`, {\n suspended: publicSuspendedRun(suspended),\n });\n }\n const result: StatusActionResult = this.management.status(runId);\n if (!result.runDir && !result.resultPath && !suspended) {\n throw new DoomTeamExpectedError(\n 'run_not_found',\n `No run matches '${runId}'.`,\n false,\n 'Call subagent({\"action\":\"status\"}) and retry with an exact id.',\n );\n }\n if (params.transcriptLines !== undefined) {\n return textResult(formatRunTranscript(result.status, params.transcriptLines ?? DEFAULT_TRANSCRIPT_LINES), {\n transcript: { runId: result.runId },\n });\n }\n return textResult(\n result.status ? `Run '${result.runId}': ${result.status.state}` : `Run '${result.runId}' has no status yet.`,\n { status: result },\n );\n }\n case SUBAGENT_ACTIONS.wait: {\n const ids = params.ids?.map((id) => resolveTrackedRunId(jobs, id));\n const outcome = await this.waiter.wait({\n target: ids ? { ids } : { all: true },\n sessionId: ctx.sessionManager.getSessionId(),\n waitFor: params.until as WaitForMode | undefined,\n timeoutMs: params.timeoutMs,\n signal,\n });\n return textResult([`Subagent wait: ${outcome.reason}.`, ...waitGuidance(outcome.reason)].join('\\n'), {\n outcome,\n });\n }\n case SUBAGENT_ACTIONS.stop: {\n const id = resolveTrackedRunId(jobs, params.id);\n const result = this.management.stop(id, params.reason);\n return textResult(`Stop requested for '${id}'.`, { control: result });\n }\n case SUBAGENT_ACTIONS.steer: {\n const id = resolveTrackedRunId(jobs, params.id);\n const runtime = this.tracker.get(id)?.runtime;\n if (runtime && !isPiRuntime(runtime)) {\n throw new DoomTeamExpectedError(\n 'unsupported_operation',\n `Run '${id}' uses '${runtime}', which does not support steering.`,\n false,\n `Use subagent({\"action\":\"stop\",\"id\":\"${id}\"}) to terminate it.`,\n );\n }\n const result = await this.management.steer(id, params.message, undefined, signal);\n return textResult(`Steer request '${result.requestId}' for '${id}' is ${result.state}: ${result.message}`, {\n steer: result,\n });\n }\n case SUBAGENT_ACTIONS.suspended: {\n const runs = listSuspendedRuns(requireCurrentSessionScope());\n return textResult(runs.length ? formatSuspendedRuns(runs) : 'No suspended subagents in this session.', {\n suspended: runs.map(publicSuspendedRun),\n });\n }\n case SUBAGENT_ACTIONS.restore: {\n const scope = requireCurrentSessionScope();\n const record = listSuspendedRuns(scope).find((run) => run.runId === params.id);\n if (!record) {\n throw new DoomTeamExpectedError(\n 'run_not_found',\n `No suspended run matches '${params.id}'.`,\n false,\n 'Call subagent({\"action\":\"suspended\"}) and retry with an exact id.',\n );\n }\n if (!isSuspendedRunResumable(record)) {\n throw new DoomTeamExpectedError(\n 'not_resumable',\n `Suspended run '${params.id}' does not have complete, readable Pi recovery state.`,\n false,\n 'Submit a new explicit run request instead of restoring this record.',\n );\n }\n const result = this.trackOutcomes(\n await this.planner.spawn(\n {\n single: {\n agent: record.agent,\n ...(record.inlineAgent ? { inlineAgent: record.inlineAgent } : {}),\n task: record.task,\n cwd: record.cwd,\n ...(record.model ? { model: record.model } : {}),\n sessionFile: record.sessionFile,\n },\n cwd: record.cwd,\n agentScope: 'both',\n runtime: 'pi',\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(operationId ? { operationId } : {}),\n ...(preallocatedRunIds ? { preallocatedRunIds } : {}),\n },\n loadConfig().config,\n ),\n ctx,\n );\n const outcome = result.outcomes[0];\n if (!outcome?.runId) {\n throw new DoomTeamExpectedError(\n 'not_resumable',\n `Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`,\n true,\n 'Inspect suspended state, then submit a new explicit run if recovery is not possible.',\n );\n }\n clearSuspendedRun(scope, params.id);\n return textResult(`Restored '${params.id}' as '${outcome.runId}', continuing its transcript.`, {\n restore: { ...outcome, restoredFrom: params.id },\n });\n }\n }\n }\n\n private buildTool(): ToolDefinition<typeof SubagentParams, SubagentToolDetails> {\n return {\n name: SUBAGENT_TOOL_NAME,\n label: 'Subagent',\n description: SUBAGENT_TOOL_DESCRIPTION,\n parameters: SubagentParams,\n prepareArguments: validateParams,\n execute: async (id, rawParams, signal, onUpdate, ctx): Promise<AgentToolResult<SubagentToolDetails>> => {\n const params = validateParams(rawParams);\n const progress = progressMessage(params);\n if (progress) onUpdate?.(progressResult(progress, params.action));\n if (params.action === SUBAGENT_ACTIONS.run) return this.executeRun(id, params, ctx);\n if (params.action === SUBAGENT_ACTIONS.agents) return this.executeAgents(params, ctx);\n const journaled =\n params.action === SUBAGENT_ACTIONS.steer ||\n params.action === SUBAGENT_ACTIONS.stop ||\n params.action === SUBAGENT_ACTIONS.restore;\n if (!journaled) return this.executeManagement(params, ctx, signal);\n\n const operation = startOperation<AgentToolResult<SubagentToolDetails>>(\n id,\n params,\n params.action === SUBAGENT_ACTIONS.restore ? [randomUUID()] : [],\n );\n if (operation.kind === 'replay') {\n if (operation.record.state === 'completed' && operation.record.result) return operation.record.result;\n throw new DoomTeamExpectedError(\n 'delivery_unconfirmed',\n `Operation '${id}' is already pending.`,\n true,\n 'Inspect run status before retrying this control operation.',\n );\n }\n const response = await this.executeManagement(params, ctx, signal, operation.record.runIds, id);\n completeOperation(id, operation.record, response);\n return response;\n },\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`),require(`./schemas.cjs`);let e=require(`@agimon-ai/doompi-extension-contracts/subagent-tool`);const t=[`Run and manage background subagents through one strict action-based contract.`,`Actions: ${[`${e.SUBAGENT_ACTIONS.agents}: list executable agents or inspect one by name`,`${e.SUBAGENT_ACTIONS.run}: start one or more fresh background runs`,`${e.SUBAGENT_ACTIONS.status}: inspect the fleet or one run`,`${e.SUBAGENT_ACTIONS.wait}: wait for completion or attention`,`${e.SUBAGENT_ACTIONS.steer}: send acknowledged guidance to a Pi run`,`${e.SUBAGENT_ACTIONS.stop}: request idempotent termination`,`${e.SUBAGENT_ACTIONS.suspended}: list suspended work`,`${e.SUBAGENT_ACTIONS.restore}: continue a suspended Pi transcript`].join(`; `)}.`,`A run call uses requests:[{agent,task,cwd?,model?,runtime?}]. It returns after startup; completion arrives asynchronously.`,`Fleet status is {action:"status"}. transcriptLines is valid only with an id. Fleet status includes suspended runs and restore instructions.`,`External CLI runtimes do not support steering or intercom, and layer tool exclusions are best effort for them.`,`Give every child a self-contained task; coordination and further delegation depend on the selected layer policy.`].join(` `);exports.SUBAGENT_TOOL_DESCRIPTION=t;
|
|
2
|
+
//# sourceMappingURL=toolDescription.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolDescription.cjs","names":["SUBAGENT_ACTIONS"],"sources":["../../src/extensions/toolDescription.ts"],"sourcesContent":["import { SUBAGENT_ACTIONS } from './schemas.ts';\n\nconst ACTION_SUMMARY = [\n `${SUBAGENT_ACTIONS.agents}: list executable agents or inspect one by name`,\n `${SUBAGENT_ACTIONS.run}: start one or more fresh background runs`,\n `${SUBAGENT_ACTIONS.status}: inspect the fleet or one run`,\n `${SUBAGENT_ACTIONS.wait}: wait for completion or attention`,\n `${SUBAGENT_ACTIONS.steer}: send acknowledged guidance to a Pi run`,\n `${SUBAGENT_ACTIONS.stop}: request idempotent termination`,\n `${SUBAGENT_ACTIONS.suspended}: list suspended work`,\n `${SUBAGENT_ACTIONS.restore}: continue a suspended Pi transcript`,\n].join('; ');\n\nexport const SUBAGENT_SAFETY_GUIDANCE =\n 'Give every child a self-contained task; coordination and further delegation depend on the selected layer policy.';\n\nexport const SUBAGENT_TOOL_DESCRIPTION = [\n 'Run and manage background subagents through one strict action-based contract.',\n `Actions: ${ACTION_SUMMARY}.`,\n 'A run call uses requests:[{agent,task,cwd?,model?,runtime?}]. It returns after startup; completion arrives asynchronously.',\n 'Fleet status is {action:\"status\"}. transcriptLines is valid only with an id. Fleet status includes suspended runs and restore instructions.',\n 'External CLI runtimes do not support steering or intercom, and layer tool exclusions are best effort for them.',\n SUBAGENT_SAFETY_GUIDANCE,\n].join(' ');\n"],"mappings":"2IAEA,MAca,EAA4B,CACvC,gFACA,YAhBqB,CACrB,GAAGA,EAAAA,iBAAiB,OAAO,iDAC3B,GAAGA,EAAAA,iBAAiB,IAAI,2CACxB,GAAGA,EAAAA,iBAAiB,OAAO,gCAC3B,GAAGA,EAAAA,iBAAiB,KAAK,oCACzB,GAAGA,EAAAA,iBAAiB,MAAM,0CAC1B,GAAGA,EAAAA,iBAAiB,KAAK,kCACzB,GAAGA,EAAAA,iBAAiB,UAAU,uBAC9B,GAAGA,EAAAA,iBAAiB,QAAQ,sCAC7B,CAAC,KAAK,KAOO,CAAe,GAC3B,6HACA,8IACA,iHACA,mHACD,CAAC,KAAK,IAAI"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{__esmMin as e}from"../_virtual/_rolldown/runtime.mjs";import{SUBAGENT_ACTIONS as t,init_schemas as n}from"./schemas.mjs";var r,i,a,o=e((()=>{n(),r=[`${t.agents}: list executable agents or inspect one by name`,`${t.run}: start one or more fresh background runs`,`${t.status}: inspect the fleet or one run`,`${t.wait}: wait for completion or attention`,`${t.steer}: send acknowledged guidance to a Pi run`,`${t.stop}: request idempotent termination`,`${t.suspended}: list suspended work`,`${t.restore}: continue a suspended Pi transcript`].join(`; `),i=`Give every child a self-contained task; coordination and further delegation depend on the selected layer policy.`,a=[`Run and manage background subagents through one strict action-based contract.`,`Actions: ${r}.`,`A run call uses requests:[{agent,task,cwd?,model?,runtime?}]. It returns after startup; completion arrives asynchronously.`,`Fleet status is {action:"status"}. transcriptLines is valid only with an id. Fleet status includes suspended runs and restore instructions.`,`External CLI runtimes do not support steering or intercom, and layer tool exclusions are best effort for them.`,i].join(` `)}));o();export{a as SUBAGENT_TOOL_DESCRIPTION,o as init_toolDescription};
|
|
2
|
+
//# sourceMappingURL=toolDescription.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolDescription.mjs","names":[],"sources":["../../src/extensions/toolDescription.ts"],"sourcesContent":["import { SUBAGENT_ACTIONS } from './schemas.ts';\n\nconst ACTION_SUMMARY = [\n `${SUBAGENT_ACTIONS.agents}: list executable agents or inspect one by name`,\n `${SUBAGENT_ACTIONS.run}: start one or more fresh background runs`,\n `${SUBAGENT_ACTIONS.status}: inspect the fleet or one run`,\n `${SUBAGENT_ACTIONS.wait}: wait for completion or attention`,\n `${SUBAGENT_ACTIONS.steer}: send acknowledged guidance to a Pi run`,\n `${SUBAGENT_ACTIONS.stop}: request idempotent termination`,\n `${SUBAGENT_ACTIONS.suspended}: list suspended work`,\n `${SUBAGENT_ACTIONS.restore}: continue a suspended Pi transcript`,\n].join('; ');\n\nexport const SUBAGENT_SAFETY_GUIDANCE =\n 'Give every child a self-contained task; coordination and further delegation depend on the selected layer policy.';\n\nexport const SUBAGENT_TOOL_DESCRIPTION = [\n 'Run and manage background subagents through one strict action-based contract.',\n `Actions: ${ACTION_SUMMARY}.`,\n 'A run call uses requests:[{agent,task,cwd?,model?,runtime?}]. It returns after startup; completion arrives asynchronously.',\n 'Fleet status is {action:\"status\"}. transcriptLines is valid only with an id. Fleet status includes suspended runs and restore instructions.',\n 'External CLI runtimes do not support steering or intercom, and layer tool exclusions are best effort for them.',\n SUBAGENT_SAFETY_GUIDANCE,\n].join(' ');\n"],"mappings":"uJAAgD,CAE1C,EAAiB,CACrB,GAAG,EAAiB,OAAO,iDAC3B,GAAG,EAAiB,IAAI,2CACxB,GAAG,EAAiB,OAAO,gCAC3B,GAAG,EAAiB,KAAK,oCACzB,GAAG,EAAiB,MAAM,0CAC1B,GAAG,EAAiB,KAAK,kCACzB,GAAG,EAAiB,UAAU,uBAC9B,GAAG,EAAiB,QAAQ,sCAC7B,CAAC,KAAK,KAAK,CAEC,EACX,mHAEW,EAA4B,CACvC,gFACA,YAAY,EAAe,GAC3B,6HACA,8IACA,iHACA,EACD,CAAC,KAAK,IAAI"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./_virtual/_rolldown/runtime.cjs`),t=require(`./agents/discovery.cjs`),n=require(`./container/types.cjs`),r=require(`./container/globalBridge.cjs`),i=require(`./container/index.cjs`);let a=require(`node:fs`);a=e.__toESM(a,1);let o=require(`node:path`);o=e.__toESM(o,1);async function s(e){let n=o.resolve(e.cwd);try{if(!a.statSync(n).isDirectory())return{ok:!1,code:`invalid_cwd`,message:`cwd '${n}' is not a directory.`}}catch(e){return{ok:!1,code:`invalid_cwd`,message:`cwd '${n}' is not a directory.${e instanceof Error?` ${e.message}`:``}`}}let r=new t.AgentDiscoveryService().find(n,e.agentScope??`both`,e.agent);return r?{ok:!0,contract:{agent:r,cwd:n,context:e.context??r.defaultContext??`fresh`}}:{ok:!1,code:`missing_agent`,message:`Unknown agent: ${e.agent}`}}exports.DOOM_TEAM_TYPES=n.DOOM_TEAM_TYPES,Object.defineProperty(exports,`GlobalStateBridge`,{enumerable:!0,get:function(){return r.GlobalStateBridge}}),exports.createExtensionContainer=i.createExtensionContainer,exports.createPromptRuntimeContainer=i.createPromptRuntimeContainer,exports.resolveSubagentLaunchContract=s;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["path","fs","AgentDiscoveryService"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Package root barrel.\n *\n * DESIGN PATTERNS:\n * - Named exports only, so consumers tree-shake cleanly\n * - Protocol surfaces use dedicated `./api/*` subpaths; cross-domain launch\n * composition lives here because the package root is an allowed composition\n * boundary\n *\n * AVOID:\n * - Re-exporting internals; anything exported here is public API\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { AgentDiscoveryService } from './agents/discovery.ts';\nimport type { AgentConfig, AgentScope } from './agents/types.ts';\n\nexport {\n createExtensionContainer,\n createPromptRuntimeContainer,\n DOOM_TEAM_TYPES,\n GlobalStateBridge,\n} from './container/index.ts';\nexport type { IGlobalStateBridge } from './types.ts';\n\nexport interface SubagentLaunchContractInput {\n agent: string;\n cwd: string;\n task?: string;\n agentScope?: AgentScope;\n context?: 'fresh' | 'fork';\n skill?: string | string[] | boolean;\n artifacts?: boolean;\n}\n\nexport interface SubagentLaunchContract {\n agent: AgentConfig;\n cwd: string;\n context: 'fresh' | 'fork';\n}\n\nexport type SubagentLaunchContractResult =\n | { ok: true; contract: SubagentLaunchContract }\n | { ok: false; code: 'invalid_cwd' | 'missing_agent'; message: string };\n\n/** Lightweight public availability check using Doom Team's discovery rules. */\nexport async function resolveSubagentLaunchContract(\n input: SubagentLaunchContractInput,\n): Promise<SubagentLaunchContractResult> {\n const cwd = path.resolve(input.cwd);\n try {\n if (!fs.statSync(cwd).isDirectory()) {\n return { ok: false, code: 'invalid_cwd', message: `cwd '${cwd}' is not a directory.` };\n }\n } catch (error) {\n const detail = error instanceof Error ? ` ${error.message}` : '';\n return { ok: false, code: 'invalid_cwd', message: `cwd '${cwd}' is not a directory.${detail}` };\n }\n\n const agent = new AgentDiscoveryService().find(cwd, input.agentScope ?? 'both', input.agent);\n if (!agent) return { ok: false, code: 'missing_agent', message: `Unknown agent: ${input.agent}` };\n\n return {\n ok: true,\n contract: { agent, cwd, context: input.context ?? agent.defaultContext ?? 'fresh' },\n };\n}\n"],"mappings":"iWAgDA,eAAsB,EACpB,EACuC,CACvC,IAAM,EAAMA,EAAK,QAAQ,EAAM,IAAI,CACnC,GAAI,CACF,GAAI,CAACC,EAAG,SAAS,EAAI,CAAC,aAAa,CACjC,MAAO,CAAE,GAAI,GAAO,KAAM,cAAe,QAAS,QAAQ,EAAI,uBAAwB,OAEjF,EAAO,CAEd,MAAO,CAAE,GAAI,GAAO,KAAM,cAAe,QAAS,QAAQ,EAAI,uBAD/C,aAAiB,MAAQ,IAAI,EAAM,UAAY,KACiC,CAGjG,IAAM,EAAQ,IAAIC,EAAAA,uBAAuB,CAAC,KAAK,EAAK,EAAM,YAAc,OAAQ,EAAM,MAAM,CAG5F,OAFK,EAEE,CACL,GAAI,GACJ,SAAU,CAAE,QAAO,MAAK,QAAS,EAAM,SAAW,EAAM,gBAAkB,QAAS,CACpF,CALkB,CAAE,GAAI,GAAO,KAAM,gBAAiB,QAAS,kBAAkB,EAAM,QAAS"}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { IGlobalStateBridge } from "./types.cjs";
|
|
2
|
+
import { AgentConfig, AgentScope } from "./agents/types.cjs";
|
|
3
|
+
import { GlobalStateBridge } from "./container/globalBridge.cjs";
|
|
4
|
+
import { DOOM_TEAM_TYPES } from "./container/types.cjs";
|
|
5
|
+
import { createExtensionContainer, createPromptRuntimeContainer } from "./container/index.cjs";
|
|
6
|
+
|
|
7
|
+
//#region src/index.d.ts
|
|
8
|
+
interface SubagentLaunchContractInput {
|
|
9
|
+
agent: string;
|
|
10
|
+
cwd: string;
|
|
11
|
+
task?: string;
|
|
12
|
+
agentScope?: AgentScope;
|
|
13
|
+
context?: 'fresh' | 'fork';
|
|
14
|
+
skill?: string | string[] | boolean;
|
|
15
|
+
artifacts?: boolean;
|
|
16
|
+
}
|
|
17
|
+
interface SubagentLaunchContract {
|
|
18
|
+
agent: AgentConfig;
|
|
19
|
+
cwd: string;
|
|
20
|
+
context: 'fresh' | 'fork';
|
|
21
|
+
}
|
|
22
|
+
type SubagentLaunchContractResult = {
|
|
23
|
+
ok: true;
|
|
24
|
+
contract: SubagentLaunchContract;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
code: 'invalid_cwd' | 'missing_agent';
|
|
28
|
+
message: string;
|
|
29
|
+
};
|
|
30
|
+
/** Lightweight public availability check using Doom Team's discovery rules. */
|
|
31
|
+
declare function resolveSubagentLaunchContract(input: SubagentLaunchContractInput): Promise<SubagentLaunchContractResult>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { DOOM_TEAM_TYPES, GlobalStateBridge, type IGlobalStateBridge, SubagentLaunchContract, SubagentLaunchContractInput, SubagentLaunchContractResult, createExtensionContainer, createPromptRuntimeContainer, resolveSubagentLaunchContract };
|
|
34
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;UA2BiB,2BAAA;EACf,KAAA;EACA,GAAA;EACA,IAAA;EACA,UAAA,GAAa,UAAA;EACb,OAAA;EACA,KAAA;EACA,SAAA;AAAA;AAAA,UAGe,sBAAA;EACf,KAAA,EAAO,WAAA;EACP,GAAA;EACA,OAAA;AAAA;AAAA,KAGU,4BAAA;EACN,EAAA;EAAU,QAAA,EAAU,sBAAA;AAAA;EACpB,EAAA;EAAW,IAAA;EAAuC,OAAA;AAAA;;iBAGlC,6BAAA,CACpB,KAAA,EAAO,2BAAA,GACN,OAAA,CAAQ,4BAAA"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { IGlobalStateBridge } from "./types.mjs";
|
|
2
|
+
import { AgentConfig, AgentScope } from "./agents/types.mjs";
|
|
3
|
+
import { GlobalStateBridge } from "./container/globalBridge.mjs";
|
|
4
|
+
import { DOOM_TEAM_TYPES } from "./container/types.mjs";
|
|
5
|
+
import { createExtensionContainer, createPromptRuntimeContainer } from "./container/index.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/index.d.ts
|
|
8
|
+
interface SubagentLaunchContractInput {
|
|
9
|
+
agent: string;
|
|
10
|
+
cwd: string;
|
|
11
|
+
task?: string;
|
|
12
|
+
agentScope?: AgentScope;
|
|
13
|
+
context?: 'fresh' | 'fork';
|
|
14
|
+
skill?: string | string[] | boolean;
|
|
15
|
+
artifacts?: boolean;
|
|
16
|
+
}
|
|
17
|
+
interface SubagentLaunchContract {
|
|
18
|
+
agent: AgentConfig;
|
|
19
|
+
cwd: string;
|
|
20
|
+
context: 'fresh' | 'fork';
|
|
21
|
+
}
|
|
22
|
+
type SubagentLaunchContractResult = {
|
|
23
|
+
ok: true;
|
|
24
|
+
contract: SubagentLaunchContract;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
code: 'invalid_cwd' | 'missing_agent';
|
|
28
|
+
message: string;
|
|
29
|
+
};
|
|
30
|
+
/** Lightweight public availability check using Doom Team's discovery rules. */
|
|
31
|
+
declare function resolveSubagentLaunchContract(input: SubagentLaunchContractInput): Promise<SubagentLaunchContractResult>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { DOOM_TEAM_TYPES, GlobalStateBridge, type IGlobalStateBridge, SubagentLaunchContract, SubagentLaunchContractInput, SubagentLaunchContractResult, createExtensionContainer, createPromptRuntimeContainer, resolveSubagentLaunchContract };
|
|
34
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;UA2BiB,2BAAA;EACf,KAAA;EACA,GAAA;EACA,IAAA;EACA,UAAA,GAAa,UAAA;EACb,OAAA;EACA,KAAA;EACA,SAAA;AAAA;AAAA,UAGe,sBAAA;EACf,KAAA,EAAO,WAAA;EACP,GAAA;EACA,OAAA;AAAA;AAAA,KAGU,4BAAA;EACN,EAAA;EAAU,QAAA,EAAU,sBAAA;AAAA;EACpB,EAAA;EAAW,IAAA;EAAuC,OAAA;AAAA;;iBAGlC,6BAAA,CACpB,KAAA,EAAO,2BAAA,GACN,OAAA,CAAQ,4BAAA"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AgentDiscoveryService as e,init_discovery as t}from"./agents/discovery.mjs";import{DOOM_TEAM_TYPES as n}from"./container/types.mjs";import{GlobalStateBridge as r}from"./container/globalBridge.mjs";import{createExtensionContainer as i,createPromptRuntimeContainer as a,init_container as o}from"./container/index.mjs";import*as s from"node:fs";import*as c from"node:path";t(),o();async function l(t){let n=c.resolve(t.cwd);try{if(!s.statSync(n).isDirectory())return{ok:!1,code:`invalid_cwd`,message:`cwd '${n}' is not a directory.`}}catch(e){return{ok:!1,code:`invalid_cwd`,message:`cwd '${n}' is not a directory.${e instanceof Error?` ${e.message}`:``}`}}let r=new e().find(n,t.agentScope??`both`,t.agent);return r?{ok:!0,contract:{agent:r,cwd:n,context:t.context??r.defaultContext??`fresh`}}:{ok:!1,code:`missing_agent`,message:`Unknown agent: ${t.agent}`}}export{n as DOOM_TEAM_TYPES,r as GlobalStateBridge,i as createExtensionContainer,a as createPromptRuntimeContainer,l as resolveSubagentLaunchContract};
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Package root barrel.\n *\n * DESIGN PATTERNS:\n * - Named exports only, so consumers tree-shake cleanly\n * - Protocol surfaces use dedicated `./api/*` subpaths; cross-domain launch\n * composition lives here because the package root is an allowed composition\n * boundary\n *\n * AVOID:\n * - Re-exporting internals; anything exported here is public API\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { AgentDiscoveryService } from './agents/discovery.ts';\nimport type { AgentConfig, AgentScope } from './agents/types.ts';\n\nexport {\n createExtensionContainer,\n createPromptRuntimeContainer,\n DOOM_TEAM_TYPES,\n GlobalStateBridge,\n} from './container/index.ts';\nexport type { IGlobalStateBridge } from './types.ts';\n\nexport interface SubagentLaunchContractInput {\n agent: string;\n cwd: string;\n task?: string;\n agentScope?: AgentScope;\n context?: 'fresh' | 'fork';\n skill?: string | string[] | boolean;\n artifacts?: boolean;\n}\n\nexport interface SubagentLaunchContract {\n agent: AgentConfig;\n cwd: string;\n context: 'fresh' | 'fork';\n}\n\nexport type SubagentLaunchContractResult =\n | { ok: true; contract: SubagentLaunchContract }\n | { ok: false; code: 'invalid_cwd' | 'missing_agent'; message: string };\n\n/** Lightweight public availability check using Doom Team's discovery rules. */\nexport async function resolveSubagentLaunchContract(\n input: SubagentLaunchContractInput,\n): Promise<SubagentLaunchContractResult> {\n const cwd = path.resolve(input.cwd);\n try {\n if (!fs.statSync(cwd).isDirectory()) {\n return { ok: false, code: 'invalid_cwd', message: `cwd '${cwd}' is not a directory.` };\n }\n } catch (error) {\n const detail = error instanceof Error ? ` ${error.message}` : '';\n return { ok: false, code: 'invalid_cwd', message: `cwd '${cwd}' is not a directory.${detail}` };\n }\n\n const agent = new AgentDiscoveryService().find(cwd, input.agentScope ?? 'both', input.agent);\n if (!agent) return { ok: false, code: 'missing_agent', message: `Unknown agent: ${input.agent}` };\n\n return {\n ok: true,\n contract: { agent, cwd, context: input.context ?? agent.defaultContext ?? 'fresh' },\n };\n}\n"],"mappings":"4XAgB8D,IAQhC,CAwB9B,eAAsB,EACpB,EACuC,CACvC,IAAM,EAAM,EAAK,QAAQ,EAAM,IAAI,CACnC,GAAI,CACF,GAAI,CAAC,EAAG,SAAS,EAAI,CAAC,aAAa,CACjC,MAAO,CAAE,GAAI,GAAO,KAAM,cAAe,QAAS,QAAQ,EAAI,uBAAwB,OAEjF,EAAO,CAEd,MAAO,CAAE,GAAI,GAAO,KAAM,cAAe,QAAS,QAAQ,EAAI,uBAD/C,aAAiB,MAAQ,IAAI,EAAM,UAAY,KACiC,CAGjG,IAAM,EAAQ,IAAI,GAAuB,CAAC,KAAK,EAAK,EAAM,YAAc,OAAQ,EAAM,MAAM,CAG5F,OAFK,EAEE,CACL,GAAI,GACJ,SAAU,CAAE,QAAO,MAAK,QAAS,EAAM,SAAW,EAAM,gBAAkB,QAAS,CACpF,CALkB,CAAE,GAAI,GAAO,KAAM,gBAAiB,QAAS,kBAAkB,EAAM,QAAS"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return e===`off`||e===`always`||e===`fork-only`?e:`always`}function t(t){return!t||typeof t!=`object`||Array.isArray(t)?{mode:`always`,resultDelivery:!0}:{mode:e(t.mode),resultDelivery:t.resultDelivery!==!1}}function n(e,t,n){if(e===`off`)return`bridge mode is off`;if(e===`fork-only`&&t!==`fork`)return`bridge mode is fork-only and context is not fork`;if(!n)return`orchestrator target is not available`}function r(e){let{mode:r}=t(e.config),i=e.orchestratorTarget?.trim(),a=r!==`off`&&!(r===`fork-only`&&e.context!==`fork`),o=n(r,e.context,i);return{active:o===void 0,mode:r,wantsIntercom:a,intercomAvailable:!0,extensionDir:`native:doom-team-intercom`,...i?{orchestratorTarget:i}:{},...o?{reason:o}:{}}}exports.diagnoseIntercomBridge=r;
|
|
2
|
+
//# sourceMappingURL=intercomBridge.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intercomBridge.cjs","names":[],"sources":["../../src/intercom/intercomBridge.ts"],"sourcesContent":["/**\n * Whether a child would be wired to talk back to the session that spawned it,\n * reported for diagnostics.\n *\n * WHY THIS IS ONLY A DIAGNOSTIC NOW:\n * Children receive the native intercom runtime directly. This module retains\n * only the human-facing doctor diagnostic and does not register or alias tools.\n *\n * AVOID:\n * - Re-adding a resolution path here without a caller. If the bridge needs to\n * shape an agent again, wire it in the same change\n */\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = 'native:doom-team-intercom';\n\nexport type IntercomBridgeMode = 'off' | 'always' | 'fork-only';\n\n/** The intercom-bridge slice of this package's extension config. Narrow on purpose. */\nexport interface IntercomBridgeConfigInput {\n mode?: unknown;\n instructionFile?: unknown;\n resultDelivery?: unknown;\n}\n\ninterface ResolvedIntercomBridgeConfig {\n mode: IntercomBridgeMode;\n resultDelivery: boolean;\n}\n\nexport interface IntercomBridgeDiagnostic {\n active: boolean;\n mode: IntercomBridgeMode;\n wantsIntercom: boolean;\n intercomAvailable: boolean;\n extensionDir: string;\n orchestratorTarget?: string;\n reason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n config: IntercomBridgeConfigInput | undefined;\n context: 'fresh' | 'fork' | undefined;\n orchestratorTarget?: string;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n if (value === 'off' || value === 'always' || value === 'fork-only') return value;\n return 'always';\n}\n\nfunction resolveIntercomBridgeConfig(value: IntercomBridgeConfigInput | undefined): ResolvedIntercomBridgeConfig {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { mode: 'always', resultDelivery: true };\n }\n return { mode: resolveIntercomBridgeMode(value.mode), resultDelivery: value.resultDelivery !== false };\n}\n\n/** Why the bridge is not active, or `undefined` when it is. */\nfunction inactiveReason(\n mode: IntercomBridgeMode,\n context: 'fresh' | 'fork' | undefined,\n orchestratorTarget: string | undefined,\n): string | undefined {\n if (mode === 'off') return 'bridge mode is off';\n if (mode === 'fork-only' && context !== 'fork') return 'bridge mode is fork-only and context is not fork';\n if (!orchestratorTarget) return 'orchestrator target is not available';\n return undefined;\n}\n\n/**\n * Report the bridge's state without changing anything.\n *\n * `wantsIntercom` and `active` differ deliberately: the first says the\n * configuration asks for a bridge, the second says one is actually available.\n * A doctor report needs to distinguish \"you turned it off\" from \"it is on but\n * has no orchestrator to reach\".\n */\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n const { mode } = resolveIntercomBridgeConfig(input.config);\n const orchestratorTarget = input.orchestratorTarget?.trim();\n const wantsIntercom = mode !== 'off' && !(mode === 'fork-only' && input.context !== 'fork');\n const reason = inactiveReason(mode, input.context, orchestratorTarget);\n return {\n active: reason === undefined,\n mode,\n wantsIntercom,\n intercomAvailable: true,\n extensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n ...(orchestratorTarget ? { orchestratorTarget } : {}),\n ...(reason ? { reason } : {}),\n };\n}\n"],"mappings":"AA6CA,SAAgB,EAA0B,EAAoC,CAE5E,OADI,IAAU,OAAS,IAAU,UAAY,IAAU,YAAoB,EACpE,SAGT,SAAS,EAA4B,EAA4E,CAI/G,MAHI,CAAC,GAAS,OAAO,GAAU,UAAY,MAAM,QAAQ,EAAM,CACtD,CAAE,KAAM,SAAU,eAAgB,GAAM,CAE1C,CAAE,KAAM,EAA0B,EAAM,KAAK,CAAE,eAAgB,EAAM,iBAAmB,GAAO,CAIxG,SAAS,EACP,EACA,EACA,EACoB,CACpB,GAAI,IAAS,MAAO,MAAO,qBAC3B,GAAI,IAAS,aAAe,IAAY,OAAQ,MAAO,mDACvD,GAAI,CAAC,EAAoB,MAAO,uCAYlC,SAAgB,EAAuB,EAA6D,CAClG,GAAM,CAAE,QAAS,EAA4B,EAAM,OAAO,CACpD,EAAqB,EAAM,oBAAoB,MAAM,CACrD,EAAgB,IAAS,OAAS,EAAE,IAAS,aAAe,EAAM,UAAY,QAC9E,EAAS,EAAe,EAAM,EAAM,QAAS,EAAmB,CACtE,MAAO,CACL,OAAQ,IAAW,IAAA,GACnB,OACA,gBACA,kBAAmB,GACnB,aAAc,4BACd,GAAI,EAAqB,CAAE,qBAAoB,CAAG,EAAE,CACpD,GAAI,EAAS,CAAE,SAAQ,CAAG,EAAE,CAC7B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return e===`off`||e===`always`||e===`fork-only`?e:`always`}function t(t){return!t||typeof t!=`object`||Array.isArray(t)?{mode:`always`,resultDelivery:!0}:{mode:e(t.mode),resultDelivery:t.resultDelivery!==!1}}function n(e,t,n){if(e===`off`)return`bridge mode is off`;if(e===`fork-only`&&t!==`fork`)return`bridge mode is fork-only and context is not fork`;if(!n)return`orchestrator target is not available`}function r(e){let{mode:r}=t(e.config),i=e.orchestratorTarget?.trim(),a=r!==`off`&&!(r===`fork-only`&&e.context!==`fork`),o=n(r,e.context,i);return{active:o===void 0,mode:r,wantsIntercom:a,intercomAvailable:!0,extensionDir:`native:doom-team-intercom`,...i?{orchestratorTarget:i}:{},...o?{reason:o}:{}}}export{r as diagnoseIntercomBridge};
|
|
2
|
+
//# sourceMappingURL=intercomBridge.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intercomBridge.mjs","names":[],"sources":["../../src/intercom/intercomBridge.ts"],"sourcesContent":["/**\n * Whether a child would be wired to talk back to the session that spawned it,\n * reported for diagnostics.\n *\n * WHY THIS IS ONLY A DIAGNOSTIC NOW:\n * Children receive the native intercom runtime directly. This module retains\n * only the human-facing doctor diagnostic and does not register or alias tools.\n *\n * AVOID:\n * - Re-adding a resolution path here without a caller. If the bridge needs to\n * shape an agent again, wire it in the same change\n */\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = 'native:doom-team-intercom';\n\nexport type IntercomBridgeMode = 'off' | 'always' | 'fork-only';\n\n/** The intercom-bridge slice of this package's extension config. Narrow on purpose. */\nexport interface IntercomBridgeConfigInput {\n mode?: unknown;\n instructionFile?: unknown;\n resultDelivery?: unknown;\n}\n\ninterface ResolvedIntercomBridgeConfig {\n mode: IntercomBridgeMode;\n resultDelivery: boolean;\n}\n\nexport interface IntercomBridgeDiagnostic {\n active: boolean;\n mode: IntercomBridgeMode;\n wantsIntercom: boolean;\n intercomAvailable: boolean;\n extensionDir: string;\n orchestratorTarget?: string;\n reason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n config: IntercomBridgeConfigInput | undefined;\n context: 'fresh' | 'fork' | undefined;\n orchestratorTarget?: string;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n if (value === 'off' || value === 'always' || value === 'fork-only') return value;\n return 'always';\n}\n\nfunction resolveIntercomBridgeConfig(value: IntercomBridgeConfigInput | undefined): ResolvedIntercomBridgeConfig {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { mode: 'always', resultDelivery: true };\n }\n return { mode: resolveIntercomBridgeMode(value.mode), resultDelivery: value.resultDelivery !== false };\n}\n\n/** Why the bridge is not active, or `undefined` when it is. */\nfunction inactiveReason(\n mode: IntercomBridgeMode,\n context: 'fresh' | 'fork' | undefined,\n orchestratorTarget: string | undefined,\n): string | undefined {\n if (mode === 'off') return 'bridge mode is off';\n if (mode === 'fork-only' && context !== 'fork') return 'bridge mode is fork-only and context is not fork';\n if (!orchestratorTarget) return 'orchestrator target is not available';\n return undefined;\n}\n\n/**\n * Report the bridge's state without changing anything.\n *\n * `wantsIntercom` and `active` differ deliberately: the first says the\n * configuration asks for a bridge, the second says one is actually available.\n * A doctor report needs to distinguish \"you turned it off\" from \"it is on but\n * has no orchestrator to reach\".\n */\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n const { mode } = resolveIntercomBridgeConfig(input.config);\n const orchestratorTarget = input.orchestratorTarget?.trim();\n const wantsIntercom = mode !== 'off' && !(mode === 'fork-only' && input.context !== 'fork');\n const reason = inactiveReason(mode, input.context, orchestratorTarget);\n return {\n active: reason === undefined,\n mode,\n wantsIntercom,\n intercomAvailable: true,\n extensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n ...(orchestratorTarget ? { orchestratorTarget } : {}),\n ...(reason ? { reason } : {}),\n };\n}\n"],"mappings":"AA6CA,SAAgB,EAA0B,EAAoC,CAE5E,OADI,IAAU,OAAS,IAAU,UAAY,IAAU,YAAoB,EACpE,SAGT,SAAS,EAA4B,EAA4E,CAI/G,MAHI,CAAC,GAAS,OAAO,GAAU,UAAY,MAAM,QAAQ,EAAM,CACtD,CAAE,KAAM,SAAU,eAAgB,GAAM,CAE1C,CAAE,KAAM,EAA0B,EAAM,KAAK,CAAE,eAAgB,EAAM,iBAAmB,GAAO,CAIxG,SAAS,EACP,EACA,EACA,EACoB,CACpB,GAAI,IAAS,MAAO,MAAO,qBAC3B,GAAI,IAAS,aAAe,IAAY,OAAQ,MAAO,mDACvD,GAAI,CAAC,EAAoB,MAAO,uCAYlC,SAAgB,EAAuB,EAA6D,CAClG,GAAM,CAAE,QAAS,EAA4B,EAAM,OAAO,CACpD,EAAqB,EAAM,oBAAoB,MAAM,CACrD,EAAgB,IAAS,OAAS,EAAE,IAAS,aAAe,EAAM,UAAY,QAC9E,EAAS,EAAe,EAAM,EAAM,QAAS,EAAmB,CACtE,MAAO,CACL,OAAQ,IAAW,IAAA,GACnB,OACA,gBACA,kBAAmB,GACnB,aAAc,4BACd,GAAI,EAAqB,CAAE,qBAAoB,CAAG,EAAE,CACpD,GAAI,EAAS,CAAE,SAAQ,CAAG,EAAE,CAC7B"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../shared/lruCache.cjs`),n=require(`../shared/atomicJson.cjs`),r=require(`../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.cjs`),i=require(`../env.cjs`),a=require(`../shared/paths.cjs`),o=require(`../shared/errors.cjs`),s=require(`../shared/versioned.cjs`),c=require(`../shared/boundedKeySet.cjs`);let l=require(`node:fs`);l=e.__toESM(l,1);let u=require(`node:path`);u=e.__toESM(u,1);let d=require(`inversify`),f=require(`node:crypto`);const p=`intercom`,m=`subagent.team.message`,h=`subagent.team.reply`,g=`members`,_=`heartbeats`,ee=`inboxes`,v=`replies`,te=`receipts`,ne=`team.json`,y=`.json`,b=`main`,x=`agent`,S=64*1024,C=4*1024,re=[`members`,`send`,`ask`,`reply`,`pending`],ie=/^[A-Za-z0-9._-]{1,256}$/,ae=/[^a-z0-9._-]+/g,w=/^[-.]+|[-.]+$/g,oe=`sha256`,T=`delivered`,se=`failed`,ce={oneOf:[...[`members`,`pending`].map(e=>({type:`object`,properties:{action:{const:e}},required:[`action`],additionalProperties:!1})),{type:`object`,properties:{action:{const:`send`},to:{type:`string`},message:{type:`string`}},required:[`action`,`to`,`message`],additionalProperties:!1},{type:`object`,properties:{action:{const:`ask`},to:{type:`string`},message:{type:`string`},timeoutMs:{type:`integer`,minimum:1}},required:[`action`,`to`,`message`],additionalProperties:!1},{type:`object`,properties:{action:{const:`reply`},requestId:{type:`string`},message:{type:`string`}},required:[`action`,`requestId`,`message`],additionalProperties:!1}]};function E(e){return typeof e==`string`&&ie.test(e)}function D(e){return typeof e==`number`&&Number.isInteger(e)}function O(e){return typeof e==`number`&&Number.isFinite(e)}function k(e){return typeof e==`string`&&e.trim().length>0}function A(e){return e===void 0||typeof e==`string`}function le(e){return e===void 0||D(e)}function ue(e){return e===`main`||e===`subagent`}function de(e){return e===`send`||e===`ask`}function j(e,t){return Buffer.byteLength(e,`utf-8`)<=t}function fe(e){return e instanceof Error?e.message:String(e)}function M(e){return process.env[e]?.trim()||void 0}function N(e){return(0,f.createHash)(oe).update(e).digest(`hex`)}function pe(){return(0,f.randomBytes)(32).toString(`base64url`)}function me(e){return`session-${N(e).slice(0,32)}`}function P(e){return e.trim().toLowerCase().replace(ae,`-`).replace(w,``).slice(0,48).replace(w,``)||x}function he(e,t){let n=`-${t+1}`,r=48-n.length;return`${e.slice(0,Math.max(r,0)).replace(w,``)||x}${n}`}function ge(e,t){if(e!==b)return e;if(t)throw Error(`Native team member name '${b}' is reserved for the root session.`);return`main-agent`}function F(e){if(!E(e))throw Error(`Invalid native team id.`);return u.join(a.scopeTeamDir(a.requireCurrentSessionScope()),e)}function I(e,t){if(!E(t))throw Error(`Invalid native team member id.`);return u.join(F(e.teamId),g,`${t}${y}`)}function L(e,t){if(!E(t))throw Error(`Invalid native team member id.`);return u.join(F(e.teamId),_,`${t}${y}`)}function R(e,t){if(!E(t))throw Error(`Invalid native team member id.`);return u.join(F(e.teamId),ee,t)}function z(e){return`${e}${y}`}function B(e,t,n){if(!E(n))throw Error(`Invalid native team message id.`);return u.join(R(e,t),z(n))}function _e(e,t){if(!E(t))throw Error(`Invalid native team request id.`);return u.join(F(e.teamId),v,`${t}${y}`)}function V(e,t,n){if(!E(t)||!E(n))throw Error(`Invalid intercom receipt identity.`);return u.join(F(e.teamId),te,t,`${n}${y}`)}function ve(e,t){return(0,f.createHash)(oe).update(`${e}:${t}`).digest(`hex`)}function ye(e){let t=F(e.teamId);for(let e of[g,_,ee,v,te])l.mkdirSync(u.join(t,e),{recursive:!0,mode:448})}function H(e){try{let t=JSON.parse(l.readFileSync(e,`utf-8`));return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}catch{return}}function U(e){try{return l.rmSync(e,{force:!0}),!0}catch(e){return e.code===`ENOENT`}}function be(e){try{l.rmSync(e,{recursive:!0,force:!0})}catch{}}function W(e){if(!(!s.parseVersioned(e,[1]).ok||!e)&&!(!E(e.teamId)||!k(e.rootSessionId)||e.mainMemberId!==b||!O(e.createdAt)||!O(e.updatedAt)))return{version:1,teamId:e.teamId,rootSessionId:e.rootSessionId,mainMemberId:b,createdAt:e.createdAt,updatedAt:e.updatedAt}}function xe(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(!(!k(t.id)||!k(t.subject))&&!(!j(t.id,256)||!j(t.subject,C)))return{id:t.id,subject:t.subject}}function Se(e){if(!s.parseVersioned(e,[1]).ok||!e||!E(e.teamId)||!k(e.rootSessionId)||!k(e.mainMemberId)||!E(e.memberId)||!ue(e.role)||!k(e.tokenHash)||!D(e.pid)||typeof e.active!=`boolean`||!O(e.joinedAt)||!A(e.agent)||!A(e.runId)||!le(e.childIndex)||!A(e.parentMemberId))return;let t=e.task===void 0?void 0:xe(e.task);if(!(e.task!==void 0&&!t))return{version:1,teamId:e.teamId,rootSessionId:e.rootSessionId,mainMemberId:e.mainMemberId,memberId:e.memberId,role:e.role,tokenHash:e.tokenHash,pid:e.pid,active:e.active,joinedAt:e.joinedAt,...O(e.leftAt)?{leftAt:e.leftAt}:{},...e.agent===void 0?{}:{agent:e.agent},...e.runId===void 0?{}:{runId:e.runId},...e.childIndex===void 0?{}:{childIndex:e.childIndex},...e.parentMemberId===void 0?{}:{parentMemberId:e.parentMemberId},...t?{task:t}:{}}}function Ce(e){if(!(!s.parseVersioned(e,[1]).ok||!e)&&!(!E(e.memberId)||!k(e.tokenHash)||!D(e.pid)||!O(e.heartbeatAt)))return{version:1,memberId:e.memberId,tokenHash:e.tokenHash,pid:e.pid,heartbeatAt:e.heartbeatAt}}function we(e){if(!(!s.parseVersioned(e,[2]).ok||!e)&&!(e.type!==m||!E(e.id)||!E(e.teamId)||!de(e.kind)||!E(e.fromMemberId)||!E(e.toMemberId)||!k(e.senderTokenHash)||!D(e.seq)||typeof e.message!=`string`||!j(e.message,S)||!O(e.createdAt)||!O(e.expiresAt)))return{type:m,version:2,id:e.id,teamId:e.teamId,kind:e.kind,fromMemberId:e.fromMemberId,toMemberId:e.toMemberId,senderTokenHash:e.senderTokenHash,seq:e.seq,message:e.message,createdAt:e.createdAt,expiresAt:e.expiresAt}}function Te(e){if(!(!s.parseVersioned(e,[2]).ok||!e)&&!(e.type!==h||!E(e.requestId)||!E(e.teamId)||!E(e.fromMemberId)||!E(e.toMemberId)||!k(e.senderTokenHash)||typeof e.message!=`string`||!j(e.message,S)||!O(e.createdAt)))return{type:h,version:2,requestId:e.requestId,teamId:e.teamId,fromMemberId:e.fromMemberId,toMemberId:e.toMemberId,senderTokenHash:e.senderTokenHash,message:e.message,createdAt:e.createdAt}}function Ee(e){if(!e||typeof e!=`object`||Array.isArray(e))throw o.invalidRequest(`Intercom params must be an object.`,`Use one documented intercom action shape.`);let t=e,n=re.find(e=>e===t.action);if(!n)throw new o.DoomTeamExpectedError(`unsupported_operation`,`Unsupported intercom action: ${String(t.action)}.`,!1,`Use members, send, ask, pending, or reply.`);if(!A(t.to)||!A(t.message)||!A(t.requestId))throw o.invalidRequest(`Intercom to, message and requestId values must be strings.`,`Correct the action fields and retry.`);if(t.timeoutMs!==void 0&&(!D(t.timeoutMs)||t.timeoutMs<1))throw o.invalidRequest(`Intercom timeoutMs must be a positive integer.`,`Correct timeoutMs and retry.`);let r=new Set(n===`members`||n===`pending`?[`action`]:n===`reply`?[`action`,`requestId`,`message`]:n===`ask`?[`action`,`to`,`message`,`timeoutMs`]:[`action`,`to`,`message`]),i=Object.keys(t).filter(e=>!r.has(e));if(i.length)throw o.invalidRequest(`Intercom action '${n}' does not accept: ${i.join(`, `)}.`,`Remove unknown fields and retry.`);return{action:n,...t.to===void 0?{}:{to:t.to},...t.message===void 0?{}:{message:t.message},...t.requestId===void 0?{}:{requestId:t.requestId},...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}}function G(e,t){return Se(H(I(e,t)))}function De(e,t){let n=Ce(H(L(e,t.memberId)));if(!(!n||n.memberId!==t.memberId||n.tokenHash!==t.tokenHash))return n}function Oe(e){if(e===process.pid)return!0;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function ke(e,t){return De(e,t)?.heartbeatAt??t.leftAt??t.joinedAt}function K(e,t,n){return t.active&&Oe(t.pid)&&n-ke(e,t)<=3e4}function Ae(e){l.mkdirSync(R(e,e.memberId),{recursive:!0,mode:448}),n.writePrivateAtomicJson(I(e,e.memberId),e)}function q(e,t,r){let i={version:1,memberId:t.memberId,tokenHash:t.tokenHash,pid:t.pid,heartbeatAt:r};n.writePrivateAtomicJson(L(e,t.memberId),i)}function je(e){let t=u.join(F(e.teamId),g),n;try{n=l.readdirSync(t,{withFileTypes:!0})}catch{return[]}return n.filter(e=>e.isFile()&&e.name.endsWith(y)).map(e=>Se(H(u.join(t,e.name)))).filter(e=>!!e).filter(t=>t.teamId===e.teamId&&t.rootSessionId===e.rootSessionId)}function J(e,t){return je(e).filter(n=>K(e,n,t)).sort((e,t)=>e.joinedAt-t.joinedAt||e.memberId.localeCompare(t.memberId))}function Me(e=Date.now()){let t=X();if(t)return{members:J(t,e).map(Je)}}function Ne(e,t,n){let r=0;for(let i of je(e))i.memberId!==t&&(K(e,i,n)||n-ke(e,i)<=33e4||(be(R(e,i.memberId)),U(L(e,i.memberId)),U(I(e,i.memberId)),r+=1));return r}function Pe(e){let t=e.trim();if(!t)throw Error(`A root session id is required for native team communication.`);let r={version:1,teamId:me(t),rootSessionId:t,mainMemberId:b};ye(r);let i=u.join(F(r.teamId),ne),a=W(H(i));if(a&&a.rootSessionId!==t)throw Error(`Native team identity collision detected.`);let o=Date.now();return n.writePrivateAtomicJson(i,{...r,createdAt:a?.createdAt??o,updatedAt:o}),r}function Y(e){return{[i.SUBAGENT_TEAM_ID_ENV]:e.teamId,[i.SUBAGENT_TEAM_ROOT_SESSION_ENV]:e.rootSessionId,[i.SUBAGENT_TEAM_MAIN_MEMBER_ENV]:e.mainMemberId}}function Fe(e){return{...Y(e),[i.SUBAGENT_TEAM_MEMBER_ID_ENV]:e.memberId,[i.SUBAGENT_TEAM_MEMBER_TOKEN_ENV]:e.token}}function Ie(){return{[i.SUBAGENT_TEAM_MEMBER_ID_ENV]:void 0,[i.SUBAGENT_TEAM_MEMBER_TOKEN_ENV]:void 0}}function Le(e){Object.assign(process.env,Y(e))}function Re(e){e&&process.env.PI_SUBAGENT_TEAM_ID!==e.teamId||(delete process.env[i.SUBAGENT_TEAM_ID_ENV],delete process.env[i.SUBAGENT_TEAM_ROOT_SESSION_ENV],delete process.env[i.SUBAGENT_TEAM_MAIN_MEMBER_ENV])}function X(){let e=M(i.SUBAGENT_TEAM_ID_ENV),t=M(i.SUBAGENT_TEAM_ROOT_SESSION_ENV),n=M(i.SUBAGENT_TEAM_MAIN_MEMBER_ENV);if(!e||!E(e)||!t||n!==b||e!==me(t))return;let r=W(H(u.join(F(e),ne)));if(!(!r||r.rootSessionId!==t||r.teamId!==e))return{version:1,teamId:e,rootSessionId:t,mainMemberId:n}}function ze(e){if(!e)return;let t=e.id.trim(),n=e.subject.trim();if(!t||!j(t,256))throw Error(`Native team task id must be between 1 and 256 bytes.`);if(!n||!j(n,C))throw Error(`Native team task subject must be between 1 and ${C} bytes.`);return{id:t,subject:n}}function Be(e){if(e.role===`main`)return e.root.mainMemberId;let t=e.name!==void 0;if(!t&&!e.agent)throw Error(`An intercom member needs a name or an agent to derive one from.`);let n=ge(P(e.name??e.agent??x),t);if(e.runId){let t=P(e.runId).slice(0,8),r=48-t.length-1;return`${n.slice(0,r).replace(w,``)||x}-${t}`}return e.fanoutIndex===void 0?n:he(n,e.fanoutIndex)}function Ve(e){let t=Be(e);if(!E(t))throw Error(`A safe native team member id is required.`);let n=pe(),r=N(n),i=Date.now(),a=ze(e.task),o={...e.root,memberId:t,token:n,role:e.role,...e.agent?{agent:e.agent}:{},...e.runId?{runId:e.runId}:{},...e.childIndex===void 0?{}:{childIndex:e.childIndex},...e.parentMemberId?{parentMemberId:e.parentMemberId}:{},...a?{task:a}:{}},s=G(e.root,t);s&&s.tokenHash!==r&&be(R(e.root,t));let{token:c,version:l,...u}=o,d={...u,version:1,tokenHash:r,pid:e.pid??process.pid,active:!0,joinedAt:i};Ae(d),q(e.root,d,i);let f=!1;return{context:o,dispose:()=>{if(f)return;f=!0;let n=G(e.root,t);if(!n||n.tokenHash!==r)return;let i=Date.now();Ae({...n,active:!1,leftAt:i}),q(e.root,n,i)}}}function He(){let e=X(),t=M(i.SUBAGENT_TEAM_MEMBER_ID_ENV),n=M(i.SUBAGENT_TEAM_MEMBER_TOKEN_ENV);if(!e||!t||!E(t)||!n)return;let r=G(e,t);if(!(!r||r.teamId!==e.teamId||r.rootSessionId!==e.rootSessionId)&&!(r.tokenHash!==N(n)||!r.active))return{...e,memberId:t,token:n,role:r.role,...r.agent?{agent:r.agent}:{},...r.runId?{runId:r.runId}:{},...r.childIndex===void 0?{}:{childIndex:r.childIndex},...r.parentMemberId?{parentMemberId:r.parentMemberId}:{},...r.task?{task:r.task}:{}}}function Z(e,t){let n=G(e,e.memberId);if(!n||n.tokenHash!==N(e.token)||!K(e,n,t))throw Error(`This native team member is no longer active.`);return n}function Ue(e,t,n){let r=t?.trim();if(!r)throw o.invalidRequest(`to is required for intercom send and ask.`,`Provide an explicit recipient.`);let i=J(e,n).filter(t=>t.memberId!==e.memberId),a=P(r),s=i.find(e=>e.memberId===r||e.memberId===a);if(s)return s;let c=r.toLowerCase(),l=i.filter(e=>e.agent?.toLowerCase()===c||e.runId?.toLowerCase()===c||c===b&&e.role===`main`);if(l.length===1)return l[0];throw l.length>1?new o.DoomTeamExpectedError(`recipient_ambiguous`,`Multiple active intercom members match '${r}': ${l.map(e=>e.memberId).join(`, `)}.`,!1,`Retry with one exact member id.`):new o.DoomTeamExpectedError(`recipient_not_found`,`Active intercom member '${r}' was not found.`,!0,`Call intercom({"action":"members"}) and retry with an active member id.`)}function We(e){let t=e?.trim();if(!t)throw o.invalidRequest(`message is required for intercom communication.`,`Provide a nonblank message.`);if(!j(t,S))throw o.invalidRequest(`Intercom message exceeds 64 KiB.`,`Shorten the message and retry.`);return t}function Q(e,t,n){let r=G(e,t);return!!(r&&r.tokenHash===n)}function Ge(e,t,n){let r=R(e,e.memberId),i;try{i=l.readdirSync(r,{withFileTypes:!0})}catch{return{messages:[],foreignFiles:[]}}let a=[],o=[];for(let s of i){if(!s.isFile()||!s.name.endsWith(y)||n?.(s.name))continue;let i=u.join(r,s.name),c=we(H(i));if(!c){U(i);continue}if(c.teamId!==e.teamId||c.toMemberId!==e.memberId){o.push(s.name);continue}if(c.expiresAt<t||!Q(e,c.fromMemberId,c.senderTokenHash)){U(i);continue}a.push(c)}return{messages:Ke(a),foreignFiles:o}}function Ke(e){let t=new Map;for(let n of e){let e=t.get(n.fromMemberId);e?e.push(n):t.set(n.fromMemberId,[n])}let n=[];for(let e of t.values())e.sort((e,t)=>e.seq-t.seq),n.push(e);let r=[];for(;;){let e,t;for(let r of n){let n=r[0];n&&(!t||n.createdAt<t.createdAt||n.createdAt===t.createdAt&&n.fromMemberId<t.fromMemberId)&&(e=r,t=n)}if(!e||!t)break;e.shift(),r.push(t)}return r}function qe(e){let t=e.role===`main`?b:e.agent??e.memberId,n=e.runId?` [${e.runId}]`:``,r=e.task?`, task ${e.task.id}: ${e.task.subject}`:``;return`- ${e.memberId}: ${t}${n}${r}`}function Je(e){return{name:e.memberId,role:e.role,...e.agent?{agent:e.agent}:{},...e.runId?{runId:e.runId}:{},...e.task?{task:e.task}:{}}}function Ye(e,t){return new Promise((n,r)=>{if(t?.aborted){r(Error(`Native team request cancelled.`));return}let i,a=()=>{i&&clearTimeout(i),t?.removeEventListener(`abort`,o)},o=()=>{a(),r(Error(`Native team request cancelled.`))};i=setTimeout(()=>{a(),n()},e),t?.addEventListener(`abort`,o,{once:!0})})}function Xe(e,t){let n=G(e,t.fromMemberId),r=`${t.fromMemberId}${n?.agent?` (${n.agent})`:``}`,i=n?.task?`, task ${n.task.id}`:``,a=[`${t.kind===`ask`?`Question`:`Message`} from ${r}${i}.`];return a.push(``,t.message),t.kind===`ask`&&a.push(``,`Reply with ${p}({ action: "reply", requestId: "${t.id}", message: "..." }).`),a.join(`
|
|
2
|
+
`)}function Ze(e,t){try{return e.getAllTools().some(e=>e.name===t)}catch{return!1}}var Qe=class{context;ownedMembershipDispose;poller;lastHeartbeatAt=0;lastGcAt=0;seenFiles=new c.BoundedKeySet(1024);deliveryAttempts=new t.LruCache(256);undeliverableMessages=[];outboundSeq=0;constructor(e,t){if(this.pi=e,this.options=t,Ze(e,`intercom`))throw Error(`[tool_conflict] A foreign '${p}' tool is already registered. Recovery: disable the competing extension and reload Doom Team.`);e.registerTool(this.buildTool())}current(){return this.context}undeliverable(){return this.undeliverableMessages}bindMainSession(e){let t=Pe(e);Le(t);let n=Ve({root:t,role:`main`});return this.startBinding(n.context,n.dispose)}bindChildFromEnvironment(){let e=He();if(e)return this.context?.memberId===e.memberId&&this.context.token===e.token?this.context:this.startBinding(e)}dispose(){let e=this.context;this.stopBinding(),e?.role===`main`&&Re(e)}startBinding(e,t){return this.stopBinding(),this.context=e,this.ownedMembershipDispose=t,this.poll(),this.poller=setInterval(()=>{this.poll()},this.options.pollIntervalMs),this.poller.unref?.(),e}stopBinding(){this.poller&&clearInterval(this.poller),this.poller=void 0,this.ownedMembershipDispose?.(),this.ownedMembershipDispose=void 0,this.seenFiles.clear(),this.deliveryAttempts.clear(),this.lastHeartbeatAt=0,this.lastGcAt=0,this.outboundSeq=0,this.context=void 0}poll(){let e=this.context;if(!e)return;let t=this.options.now();this.heartbeat(e,t),this.collectGarbageIfDue(e,t);let n=Ge(e,t,e=>this.seenFiles.has(e));for(let e of n.foreignFiles)this.seenFiles.add(e);for(let t of n.messages)this.deliverOnce(e,t)}deliverOnce(e,t){let r=z(t.id);try{this.deliver(e,t)}catch(n){let i=(this.deliveryAttempts.get(r)??0)+1;if(i<this.options.maxDeliveryAttempts){this.deliveryAttempts.set(r,i);return}this.deliveryAttempts.delete(r),this.seenFiles.add(r),this.reportUndeliverable(e,t,i,n);return}this.seenFiles.add(r),this.deliveryAttempts.delete(r),n.writePrivateAtomicJson(V(e,t.fromMemberId,t.id),{version:1,messageId:t.id,state:T,deliveredAt:this.options.now()}),t.kind===`send`&&U(B(e,e.memberId,t.id))}deliver(e,t){let n=Xe(e,t);if(e.role===`subagent`){this.pi.sendUserMessage(n,{deliverAs:`steer`});return}this.pi.sendMessage({customType:`intercom_message`,content:n,display:!0,details:{id:t.id,kind:t.kind,from:t.fromMemberId,to:t.toMemberId,seq:t.seq}},{triggerTurn:!0,deliverAs:`steer`})}reportUndeliverable(e,t,r,i){let a={messageId:t.id,fromMemberId:t.fromMemberId,kind:t.kind,attempts:r,reason:fe(i),at:this.options.now()};for(this.undeliverableMessages.push(a),n.writePrivateAtomicJson(V(e,t.fromMemberId,t.id),{version:1,messageId:t.id,state:se,reason:a.reason,failedAt:a.at});this.undeliverableMessages.length>32;)this.undeliverableMessages.shift();try{this.pi.sendMessage({customType:`intercom_undeliverable`,content:`Native team message ${t.id} from ${t.fromMemberId} could not be delivered after ${r} attempts: ${a.reason}`,display:!0,details:{...a}},{triggerTurn:!0,deliverAs:`steer`})}catch{}}heartbeat(e,t){if(t-this.lastHeartbeatAt<this.options.heartbeatIntervalMs)return;let n=G(e,e.memberId);!n||n.tokenHash!==N(e.token)||!n.active||(this.lastHeartbeatAt=t,q(e,n,t))}collectGarbageIfDue(e,t){if(!(t-this.lastGcAt<this.options.gcIntervalMs)){this.lastGcAt=t;try{Ne(e,e.memberId,t)}catch(n){for(this.undeliverableMessages.push({messageId:``,fromMemberId:e.memberId,kind:`send`,attempts:0,reason:`Native team directory sweep failed: ${fe(n)}`,at:t});this.undeliverableMessages.length>32;)this.undeliverableMessages.shift()}}}nextSeq(){return this.outboundSeq+=1,this.outboundSeq}queueMessage(e,t,r,i,a,o){if(Z(e,a),!K(e,t,a))throw Error(`Native team member '${t.memberId}' is no longer active.`);let s={type:m,version:2,id:o,teamId:e.teamId,kind:r,fromMemberId:e.memberId,toMemberId:t.memberId,senderTokenHash:N(e.token),seq:this.nextSeq(),message:i,createdAt:a,expiresAt:a+864e5};return l.mkdirSync(R(e,t.memberId),{recursive:!0,mode:448}),n.writePrivateAtomicJson(B(e,t.memberId,s.id),s),s}replyToRequest(e,t,r,i){if(!t||!E(t))throw Error(`requestId must be a valid intercom request id.`);Z(e,i);let a=B(e,e.memberId,t),s=we(H(a));if(!s||s.kind!==`ask`||s.teamId!==e.teamId||s.toMemberId!==e.memberId||!Q(e,s.fromMemberId,s.senderTokenHash))throw new o.DoomTeamExpectedError(`recipient_not_found`,`No pending intercom ask matches requestId '${t}'.`,!1,`Call intercom({"action":"pending"}) and retry with an exact requestId.`);let c={type:h,version:2,requestId:t,teamId:e.teamId,fromMemberId:e.memberId,toMemberId:s.fromMemberId,senderTokenHash:N(e.token),message:r,createdAt:i};return n.writePrivateAtomicJson(_e(e,t),c),U(a),this.seenFiles.delete(z(t)),c}async waitForReply(e,t,n,r,i){let a=_e(e,n.id),s=this.options.now()+(i??this.options.askTimeoutMs);for(;this.options.now()<=s;){if(r?.aborted)throw Error(`Native team request cancelled.`);let i=Te(H(a));if(i&&i.teamId===e.teamId&&i.requestId===n.id&&i.fromMemberId===t.memberId&&i.toMemberId===e.memberId&&Q(e,i.fromMemberId,i.senderTokenHash))return U(a),i;let s=G(e,t.memberId);if(!s||!K(e,s,this.options.now()))throw new o.DoomTeamExpectedError(`communication_unavailable`,`Intercom member '${t.memberId}' became unreachable before replying.`,!0,`Call intercom({"action":"members"}) and decide whether to retry with an active member.`);await Ye(this.options.replyPollIntervalMs,r)}throw new o.DoomTeamExpectedError(`reply_timeout`,`Timed out waiting for intercom member '${t.memberId}' to reply.`,!0,`Check member status before deciding whether to ask again.`)}buildTool(){return{name:p,label:`Intercom`,description:`Communicate with active agents in this root session. Use members, send, ask, pending, or reply. The stable root identity is main.`,promptGuidelines:[`Send only new progress, blockers, or decisions. Do not repeat the task brief, sender task, or delegation instructions because the recipient already has them.`],parameters:ce,execute:async(e,t,n,r)=>{let i=this.context;if(!i)throw new o.DoomTeamExpectedError(`communication_unavailable`,`Intercom is not active for this session.`,!0,`Wait for session startup or reload Doom Team.`);let a=Ee(t),s=this.options.now();if(Z(i,s),a.action===`members`){let e=J(i,s);return{content:[{type:`text`,text:e.length?e.map(qe).join(`
|
|
3
|
+
`):`No active members.`}],details:{members:e.map(Je)}}}if(a.action===`pending`){let e=Ge(i,s).messages.filter(e=>e.kind===`ask`),t=e.map(e=>`- ${e.id}: from ${e.fromMemberId}. Reply with ${p}({ action: "reply", requestId: "${e.id}", message: "..." }).`);return{content:[{type:`text`,text:t.length?t.join(`
|
|
4
|
+
`):`No pending native team asks.`}],details:{pending:e.map(e=>({id:e.id,from:e.fromMemberId,message:e.message}))}}}let c=We(a.message);if(a.action===`reply`){let e=this.replyToRequest(i,a.requestId,c,s);return{content:[{type:`text`,text:`Replied to native team request ${e.requestId}.`}],details:{requestId:e.requestId,to:e.toMemberId}}}let l=Ue(i,a.to,s);a.action===`ask`&&r?.({content:[{type:`text`,text:`Waiting for ${l.memberId} to reply...`}],details:{action:`ask`,to:l.memberId,partial:!0}});let u=ve(i.memberId,e),d=H(V(i,i.memberId,u));if(d?.state===se)throw new o.DoomTeamExpectedError(`delivery_unconfirmed`,`Intercom message ${u} failed: ${typeof d.reason==`string`?d.reason:`unknown error`}`,!1,`Call intercom({"action":"members"}) and do not resend automatically.`);if(a.action===`send`&&d?.state===T)return{content:[{type:`text`,text:`Message ${u} delivered to ${l.memberId}.`}],details:{state:T,delivered:!0,messageId:u,to:l.memberId}};let f=this.queueMessage(i,l,a.action,c,s,u);if(a.action===`send`)return{content:[{type:`text`,text:`Message ${f.id} queued for ${l.memberId}; delivery is not yet confirmed. Do not resend.`}],details:{state:`queued`,delivered:!1,messageId:f.id,to:l.memberId,seq:f.seq}};try{let e=await this.waitForReply(i,l,f,n,a.timeoutMs);return{content:[{type:`text`,text:`Reply from ${l.memberId}:\n${e.message}`}],details:{requestId:f.id,from:l.memberId,reply:e.message}}}finally{U(B(i,l.memberId,f.id))}}}}};let $=class{runtimes=new WeakMap;pollIntervalMs=250;replyPollIntervalMs=250;heartbeatIntervalMs=5e3;gcIntervalMs=6e4;askTimeoutMs=6e5;maxDeliveryAttempts=5;now(){return Date.now()}createRuntime(e){let t=this.runtimes.get(e);if(t)return t;let n=new Qe(e,{pollIntervalMs:this.pollIntervalMs,replyPollIntervalMs:this.replyPollIntervalMs,heartbeatIntervalMs:this.heartbeatIntervalMs,gcIntervalMs:this.gcIntervalMs,askTimeoutMs:this.askTimeoutMs,maxDeliveryAttempts:this.maxDeliveryAttempts,now:()=>this.now()});return this.runtimes.set(e,n),e.on(`session_shutdown`,()=>{this.runtimes.get(e)?.dispose()}),n}registerClient(e){a.tryCurrentSessionScope()&&He()&&this.createRuntime(e).bindChildFromEnvironment()}};$=r.__decorate([(0,d.injectable)()],$),exports.NATIVE_TEAM_TOOL_NAME=p,Object.defineProperty(exports,`NativeTeamChannelService`,{enumerable:!0,get:function(){return $}}),exports.clearNativeTeamMemberEnvironment=Ie,exports.nativeTeamMemberEnvironment=Fe,exports.nativeTeamRootEnvironment=Y,exports.readActiveNativeTeamSnapshot=Me,exports.readNativeTeamRootFromEnvironment=X,exports.registerNativeTeamMember=Ve;
|
|
5
|
+
//# sourceMappingURL=nativeTeamChannel.cjs.map
|