@agimon-ai/po-runner 0.0.0-alpha.2 → 0.0.0-alpha.21
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 +149 -21
- package/README.md +17 -17
- package/dist/ansiScrub.mjs +1 -2
- package/dist/apiContracts.cjs +1 -1
- package/dist/apiContracts.cjs.map +1 -1
- package/dist/apiContracts.mjs +1 -1
- package/dist/apiContracts.mjs.map +1 -1
- package/dist/{bashResult-bIVSzoj-.mjs → bashResult-BqDa7sbC.mjs} +10 -9
- package/dist/bashResult-BqDa7sbC.mjs.map +1 -0
- package/dist/{bashResult-DNgtahGR.cjs → bashResult-C2iKhHpD.cjs} +10 -9
- package/dist/bashResult-C2iKhHpD.cjs.map +1 -0
- package/dist/{bashRunService-CJ02XaAq.mjs → bashRunService-Cl3pYccr.mjs} +2 -2
- package/dist/bashRunService-Cl3pYccr.mjs.map +1 -0
- package/dist/{bashRunService-DyqxOSlx.cjs → bashRunService-DjOH5kye.cjs} +2 -2
- package/dist/bashRunService-DjOH5kye.cjs.map +1 -0
- package/dist/bashRunService.cjs +1 -1
- package/dist/bashRunService.d.mts +3 -3
- package/dist/bashRunService.mjs +1 -2
- package/dist/bashSchema.cjs +1 -1
- package/dist/bashSchema.mjs +1 -2
- package/dist/{bashTool-C-k7fmyh.mjs → bashTool-BvC3YOgG.mjs} +2 -2
- package/dist/{bashTool-C-k7fmyh.mjs.map → bashTool-BvC3YOgG.mjs.map} +1 -1
- package/dist/{bashTool-CdgtqVFD.cjs → bashTool-euL6zMDl.cjs} +2 -2
- package/dist/{bashTool-CdgtqVFD.cjs.map → bashTool-euL6zMDl.cjs.map} +1 -1
- package/dist/bashTool.cjs +3 -3
- package/dist/bashTool.d.mts +1 -1
- package/dist/bashTool.mjs +3 -3
- package/dist/bin/cli.cjs +6 -6
- package/dist/bin/cli.cjs.map +1 -1
- package/dist/bin/cli.mjs +7 -7
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/logSink.cjs +6 -6
- package/dist/bin/logSink.cjs.map +1 -1
- package/dist/bin/logSink.mjs +7 -7
- package/dist/bin/logSink.mjs.map +1 -1
- package/dist/bin/runnerHost.cjs +4 -4
- package/dist/bin/runnerHost.cjs.map +1 -1
- package/dist/bin/runnerHost.mjs +5 -5
- package/dist/bin/runnerHost.mjs.map +1 -1
- package/dist/{cliApp-Dj9nwaOv.cjs → cliApp-T8Fx_-1j.cjs} +6 -6
- package/dist/cliApp-T8Fx_-1j.cjs.map +1 -0
- package/dist/{cliApp-v8Z3rMCi.mjs → cliApp-q97eVh4E.mjs} +6 -6
- package/dist/cliApp-q97eVh4E.mjs.map +1 -0
- package/dist/cliApp.cjs +1 -1
- package/dist/cliApp.d.mts +1 -1
- package/dist/cliApp.mjs +1 -2
- package/dist/clock.mjs +1 -2
- package/dist/{compaction-4QSUsBxq.cjs → compaction-Cduebib_.cjs} +3 -3
- package/dist/compaction-Cduebib_.cjs.map +1 -0
- package/dist/{compaction-DCw80VZj.mjs → compaction-nNlE6e5I.mjs} +3 -3
- package/dist/compaction-nNlE6e5I.mjs.map +1 -0
- package/dist/compaction.cjs +1 -1
- package/dist/compaction.d.mts +1 -1
- package/dist/compaction.mjs +1 -2
- package/dist/config.cjs +1 -1
- package/dist/config.d.mts +1 -1
- package/dist/config.mjs +1 -2
- package/dist/extensions/mcp-ui.mjs.map +1 -1
- package/dist/extensions/mcp.cjs +8 -7
- package/dist/extensions/mcp.cjs.map +1 -1
- package/dist/extensions/mcp.d.mts +1 -1
- package/dist/extensions/mcp.mjs +7 -6
- package/dist/extensions/mcp.mjs.map +1 -1
- package/dist/extensions/native.mjs +1 -1
- package/dist/extensions/native.mjs.map +1 -1
- package/dist/extensions/server.cjs +233 -119
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +2 -2
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +233 -119
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +88 -62
- package/dist/extensions/web.mjs.map +1 -1
- package/dist/{headless-BGYfIlNk.mjs → headless-DOlCixyf.mjs} +5 -5
- package/dist/headless-DOlCixyf.mjs.map +1 -0
- package/dist/{headless-CHUsBGhg.cjs → headless-Dko_yBiy.cjs} +5 -5
- package/dist/headless-Dko_yBiy.cjs.map +1 -0
- package/dist/{index-Dhi8asLH.d.mts → index--xF7DvsE.d.mts} +4 -4
- package/dist/{index-Dhi8asLH.d.mts.map → index--xF7DvsE.d.mts.map} +1 -1
- package/dist/{index-BZL7keVW.d.mts → index-BCCF1sGD.d.mts} +2 -2
- package/dist/{index-BZL7keVW.d.mts.map → index-BCCF1sGD.d.mts.map} +1 -1
- package/dist/{index-BwB_jTI9.d.mts → index-BzeXJk6V.d.mts} +5 -5
- package/dist/index-BzeXJk6V.d.mts.map +1 -0
- package/dist/{index-D9-IXax4.d.mts → index-C-IC35d9.d.mts} +2 -2
- package/dist/{index-D9-IXax4.d.mts.map → index-C-IC35d9.d.mts.map} +1 -1
- package/dist/{index-DBz0DxnL.d.mts → index-CzCF_OP9.d.mts} +3 -4
- package/dist/index-CzCF_OP9.d.mts.map +1 -0
- package/dist/index.cjs +5 -5
- package/dist/index.d.mts +5 -5
- package/dist/index.mjs +5 -5
- package/dist/{launcher-BDm6-DiQ.mjs → launcher-CCYsFBM9.mjs} +3 -3
- package/dist/{launcher-BDm6-DiQ.mjs.map → launcher-CCYsFBM9.mjs.map} +1 -1
- package/dist/{launcher-SlyE8R3b.cjs → launcher-ZgDdyXpq.cjs} +8 -2
- package/dist/{launcher-SlyE8R3b.cjs.map → launcher-ZgDdyXpq.cjs.map} +1 -1
- package/dist/launcher.cjs +1 -1
- package/dist/launcher.d.mts +1 -1
- package/dist/launcher.mjs +1 -2
- package/dist/{lifeline-BZaQA0rm.mjs → lifeline-Bm-bHIjS.mjs} +6 -6
- package/dist/lifeline-Bm-bHIjS.mjs.map +1 -0
- package/dist/{lifeline-BuV_erib.cjs → lifeline-m7laIzIP.cjs} +6 -6
- package/dist/lifeline-m7laIzIP.cjs.map +1 -0
- package/dist/lifeline.cjs +1 -1
- package/dist/lifeline.d.mts +1 -1
- package/dist/lifeline.mjs +1 -1
- package/dist/{logFile-CNvepZh0.cjs → logFile-CnPKtxPy.cjs} +2 -2
- package/dist/{logFile-CNvepZh0.cjs.map → logFile-CnPKtxPy.cjs.map} +1 -1
- package/dist/{logFile-KKPbkC-a.mjs → logFile-XcDHBwu1.mjs} +2 -2
- package/dist/{logFile-KKPbkC-a.mjs.map → logFile-XcDHBwu1.mjs.map} +1 -1
- package/dist/logFile.cjs +1 -1
- package/dist/logFile.d.mts +1 -1
- package/dist/logFile.mjs +1 -2
- package/dist/{logReader-B6J7L7Ua.cjs → logReader-DHCK2BEr.cjs} +4 -4
- package/dist/{logReader-B6J7L7Ua.cjs.map → logReader-DHCK2BEr.cjs.map} +1 -1
- package/dist/{logReader-UfbDbwQl.mjs → logReader-mq9uVurh.mjs} +4 -4
- package/dist/{logReader-UfbDbwQl.mjs.map → logReader-mq9uVurh.mjs.map} +1 -1
- package/dist/logReader.cjs +1 -1
- package/dist/logReader.mjs +1 -2
- package/dist/processControl.mjs +1 -2
- package/dist/{ptyHost-DlQtTB8F.mjs → ptyHost-CwbLLr90.mjs} +2 -2
- package/dist/{ptyHost-DlQtTB8F.mjs.map → ptyHost-CwbLLr90.mjs.map} +1 -1
- package/dist/{ptyHost-MI2Z6WTG.cjs → ptyHost-D35hNmtd.cjs} +2 -2
- package/dist/{ptyHost-MI2Z6WTG.cjs.map → ptyHost-D35hNmtd.cjs.map} +1 -1
- package/dist/ptyHost.cjs +1 -1
- package/dist/ptyHost.mjs +1 -2
- package/dist/{ptySpawner-DEi1KOnd.mjs → ptySpawner-C375NJnj.mjs} +2 -2
- package/dist/ptySpawner-C375NJnj.mjs.map +1 -0
- package/dist/{ptySpawner-ijw0g5_T.cjs → ptySpawner-C39IzbRo.cjs} +2 -2
- package/dist/ptySpawner-C39IzbRo.cjs.map +1 -0
- package/dist/ptySpawner.cjs +1 -1
- package/dist/ptySpawner.d.mts +1 -1
- package/dist/ptySpawner.mjs +1 -2
- package/dist/{reconcile-DMeNSxwn.mjs → reconcile-5cZ11jSD.cjs} +12 -42
- package/dist/reconcile-5cZ11jSD.cjs.map +1 -0
- package/dist/{reconcile-BugwYFbV.cjs → reconcile-wNYQJZF-.mjs} +2 -62
- package/dist/reconcile-wNYQJZF-.mjs.map +1 -0
- package/dist/reconcile.cjs +1 -2
- package/dist/reconcile.d.mts +2 -9
- package/dist/reconcile.d.mts.map +1 -1
- package/dist/reconcile.mjs +1 -2
- package/dist/responseEnvelope.cjs +2 -2
- package/dist/responseEnvelope.d.mts +3 -3
- package/dist/responseEnvelope.mjs +2 -2
- package/dist/{rmuxBackend-DlxgqRZ1.cjs → rmuxBackend-Dh0CYVAL.cjs} +5 -5
- package/dist/rmuxBackend-Dh0CYVAL.cjs.map +1 -0
- package/dist/{rmuxBackend-DfyQwJrc.mjs → rmuxBackend-rjrVTG6K.mjs} +4 -4
- package/dist/rmuxBackend-rjrVTG6K.mjs.map +1 -0
- package/dist/rmuxBackend.cjs +1 -1
- package/dist/rmuxBackend.d.mts +1 -1
- package/dist/rmuxBackend.mjs +1 -2
- package/dist/{rtkProcessor-Bc4L4o_8.cjs → rtkProcessor-DSGbM-Cm.cjs} +4 -4
- package/dist/rtkProcessor-DSGbM-Cm.cjs.map +1 -0
- package/dist/{rtkProcessor-B9KPdyzr.mjs → rtkProcessor-Iw9gP5Xp.mjs} +3 -3
- package/dist/rtkProcessor-Iw9gP5Xp.mjs.map +1 -0
- package/dist/rtkProcessor.cjs +1 -1
- package/dist/rtkProcessor.d.mts +1 -1
- package/dist/rtkProcessor.mjs +1 -1
- package/dist/{runnerConfig-D2tGq5ZM.cjs → runnerConfig-BoLMinlx.cjs} +11 -11
- package/dist/runnerConfig-BoLMinlx.cjs.map +1 -0
- package/dist/{runnerConfig-BjtulXBI.d.mts → runnerConfig-DuWL6TJx.d.mts} +10 -10
- package/dist/{runnerConfig-BjtulXBI.d.mts.map → runnerConfig-DuWL6TJx.d.mts.map} +1 -1
- package/dist/{runnerConfig-BQBlVAXn.mjs → runnerConfig-XXMq4VQA.mjs} +11 -11
- package/dist/runnerConfig-XXMq4VQA.mjs.map +1 -0
- package/dist/{runnerDependencies-DruByBGS.mjs → runnerDependencies-7h_cxOva.mjs} +17 -17
- package/dist/runnerDependencies-7h_cxOva.mjs.map +1 -0
- package/dist/{runnerDependencies-KMZigIxB.cjs → runnerDependencies-DSun3xO-.cjs} +17 -17
- package/dist/runnerDependencies-DSun3xO-.cjs.map +1 -0
- package/dist/runnerDependencies.cjs +1 -1
- package/dist/runnerDependencies.d.mts +1 -1
- package/dist/runnerDependencies.mjs +1 -2
- package/dist/runnerNamer.d.mts +1 -1
- package/dist/runnerNamer.mjs +1 -2
- package/dist/{runnerPaths-BTEuzxw0.cjs → runnerPaths-B41rMOY6.cjs} +20 -38
- package/dist/runnerPaths-B41rMOY6.cjs.map +1 -0
- package/dist/{runnerPaths-B_dAAeco.mjs → runnerPaths-Dibbvyx_.mjs} +20 -38
- package/dist/runnerPaths-Dibbvyx_.mjs.map +1 -0
- package/dist/runnerPaths.cjs +1 -1
- package/dist/runnerPaths.d.mts +5 -7
- package/dist/runnerPaths.d.mts.map +1 -1
- package/dist/runnerPaths.mjs +1 -2
- package/dist/{runnerRegistry-CeOHEjBv.mjs → runnerRegistry-BgaR5O86.mjs} +12 -11
- package/dist/runnerRegistry-BgaR5O86.mjs.map +1 -0
- package/dist/{runnerRegistry-CtJiD02R.d.mts → runnerRegistry-V-Ocaf4N.d.mts} +1 -3
- package/dist/{runnerRegistry-CtJiD02R.d.mts.map → runnerRegistry-V-Ocaf4N.d.mts.map} +1 -1
- package/dist/{runnerRegistry-BmkZTJHi.cjs → runnerRegistry-dQYlMSpQ.cjs} +23 -10
- package/dist/runnerRegistry-dQYlMSpQ.cjs.map +1 -0
- package/dist/runnerRegistry.cjs +1 -1
- package/dist/runnerRegistry.d.mts +2 -2
- package/dist/runnerRegistry.mjs +1 -2
- package/dist/services/lifeline/client.cjs +2 -2
- package/dist/services/lifeline/client.cjs.map +1 -1
- package/dist/services/lifeline/client.d.mts +1 -1
- package/dist/services/lifeline/client.mjs +2 -2
- package/dist/services/lifeline/client.mjs.map +1 -1
- package/dist/{session-Chsb_Nh2.mjs → session-BKYnH4R6.mjs} +2 -2
- package/dist/{session-Chsb_Nh2.mjs.map → session-BKYnH4R6.mjs.map} +1 -1
- package/dist/{session-BC43uEyG.cjs → session-BvqzhXZY.cjs} +2 -2
- package/dist/{session-BC43uEyG.cjs.map → session-BvqzhXZY.cjs.map} +1 -1
- package/dist/session.cjs +1 -1
- package/dist/session.mjs +1 -1
- package/dist/spawner.mjs +1 -2
- package/dist/{type-C31e1gla.d.mts → type-Do0YxwVQ.d.mts} +4 -4
- package/dist/{type-C31e1gla.d.mts.map → type-Do0YxwVQ.d.mts.map} +1 -1
- package/dist/{type-BXM03qSw.d.mts → type-DwMZoINK.d.mts} +8 -8
- package/dist/{type-BXM03qSw.d.mts.map → type-DwMZoINK.d.mts.map} +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +31 -34
- package/skills/{doom-runner → po-runner}/SKILL.md +15 -15
- package/src/prompts/po-use-runner/SKILL.md +11 -11
- package/dist/bashResult-DNgtahGR.cjs.map +0 -1
- package/dist/bashResult-bIVSzoj-.mjs.map +0 -1
- package/dist/bashRunService-CJ02XaAq.mjs.map +0 -1
- package/dist/bashRunService-DyqxOSlx.cjs.map +0 -1
- package/dist/cliApp-Dj9nwaOv.cjs.map +0 -1
- package/dist/cliApp-v8Z3rMCi.mjs.map +0 -1
- package/dist/compaction-4QSUsBxq.cjs.map +0 -1
- package/dist/compaction-DCw80VZj.mjs.map +0 -1
- package/dist/headless-BGYfIlNk.mjs.map +0 -1
- package/dist/headless-CHUsBGhg.cjs.map +0 -1
- package/dist/index-BwB_jTI9.d.mts.map +0 -1
- package/dist/index-DBz0DxnL.d.mts.map +0 -1
- package/dist/lifeline-BZaQA0rm.mjs.map +0 -1
- package/dist/lifeline-BuV_erib.cjs.map +0 -1
- package/dist/ptySpawner-DEi1KOnd.mjs.map +0 -1
- package/dist/ptySpawner-ijw0g5_T.cjs.map +0 -1
- package/dist/reconcile-BugwYFbV.cjs.map +0 -1
- package/dist/reconcile-DMeNSxwn.mjs.map +0 -1
- package/dist/rmuxBackend-DfyQwJrc.mjs.map +0 -1
- package/dist/rmuxBackend-DlxgqRZ1.cjs.map +0 -1
- package/dist/rtkProcessor-B9KPdyzr.mjs.map +0 -1
- package/dist/rtkProcessor-Bc4L4o_8.cjs.map +0 -1
- package/dist/runnerConfig-BQBlVAXn.mjs.map +0 -1
- package/dist/runnerConfig-D2tGq5ZM.cjs.map +0 -1
- package/dist/runnerDependencies-DruByBGS.mjs.map +0 -1
- package/dist/runnerDependencies-KMZigIxB.cjs.map +0 -1
- package/dist/runnerPaths-BTEuzxw0.cjs.map +0 -1
- package/dist/runnerPaths-B_dAAeco.mjs.map +0 -1
- package/dist/runnerRegistry-BmkZTJHi.cjs.map +0 -1
- package/dist/runnerRegistry-CeOHEjBv.mjs.map +0 -1
|
@@ -1,23 +1,29 @@
|
|
|
1
|
-
import { c as getLogTtlMs } from "../runnerConfig-
|
|
2
|
-
import { r as summarizeLog, t as LogReader } from "../logReader-
|
|
3
|
-
import { n as createHeadlessRunnersCommand, t as createHeadlessBashTool } from "../headless-
|
|
4
|
-
import { n as
|
|
5
|
-
import { t as
|
|
6
|
-
import { t as
|
|
7
|
-
import {
|
|
8
|
-
import { n as
|
|
9
|
-
import {
|
|
1
|
+
import { c as getLogTtlMs } from "../runnerConfig-XXMq4VQA.mjs";
|
|
2
|
+
import { r as summarizeLog, t as LogReader } from "../logReader-mq9uVurh.mjs";
|
|
3
|
+
import { n as createHeadlessRunnersCommand, t as createHeadlessBashTool } from "../headless-DOlCixyf.mjs";
|
|
4
|
+
import { n as stopRunnerProcess, t as reconcileActiveRunners } from "../reconcile-wNYQJZF-.mjs";
|
|
5
|
+
import { t as SystemClock } from "../clock-Cv2pddgo.mjs";
|
|
6
|
+
import { t as activeRunnerRecovery } from "../compaction-nNlE6e5I.mjs";
|
|
7
|
+
import { t as RmuxBackend } from "../rmuxBackend-rjrVTG6K.mjs";
|
|
8
|
+
import { n as TERM_GRACE_MS } from "../launcher-CCYsFBM9.mjs";
|
|
9
|
+
import { n as TmuxBackend, r as PtyBackendChain, t as createRunnerDependencies } from "../runnerDependencies-7h_cxOva.mjs";
|
|
10
|
+
import { n as resolveRunnerStoreDirectory, r as runnerStateDirFor, t as RunnerPaths } from "../runnerPaths-Dibbvyx_.mjs";
|
|
11
|
+
import { a as formatRunnerStatus, i as formatRunnerFinishedNotice, n as createDefaultProcessRegistry, o as isRunnerRecord, r as formatRunnerFinished } from "../runnerRegistry-BgaR5O86.mjs";
|
|
10
12
|
import fs from "node:fs";
|
|
11
13
|
import path from "node:path";
|
|
12
14
|
import { resolveRootSessionId } from "@agimon-ai/po-core/childProcess";
|
|
13
|
-
import { composeServerProviderOverrides, defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/po-core/
|
|
14
|
-
import { composeRootHooks, defineChannel, defineHook, defineResource, defineRoot, defineRoute, defineServerCommand, defineServerTool } from "@agimon-ai/po-core/extensionFile";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { composeServerProviderOverrides, defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/po-core/serverPlugin";
|
|
16
|
+
import { composeRootHooks, composeRootInjects, defineChannel, defineHook, defineResource, defineRoot, defineRoute, defineServerCommand, defineServerTool, runCleanups } from "@agimon-ai/po-core/extensionFile";
|
|
17
|
+
import { PO_BACKGROUND_WORK_SERVICE, readPoBackgroundWorkService } from "@agimon-ai/po-core/backgroundWork";
|
|
18
|
+
import { createPoTelemetry } from "@agimon-ai/po-telemetry";
|
|
17
19
|
import { CONFIG_DIR_NAME } from "@earendil-works/pi-coding-agent";
|
|
18
20
|
import { Hono } from "hono";
|
|
19
21
|
import { streamSSE } from "hono/streaming";
|
|
20
|
-
import {
|
|
22
|
+
import { PO_HELP_WHEN } from "@agimon-ai/po-core/help";
|
|
23
|
+
const RUNNER_STATUS_KEY = "po-runner-runners";
|
|
24
|
+
const BACKGROUND_WORK_PROVIDER = "po-runner";
|
|
25
|
+
const HISTORY_SWEEP_INTERVAL_MS = 6e5;
|
|
26
|
+
//#endregion
|
|
21
27
|
//#region src/constants/runnerSettings.ts
|
|
22
28
|
const RUNNER_SETTINGS_FILE = "po-runner.json";
|
|
23
29
|
const RATIO_KEYS = ["headRatio", "errorBudgetRatio"];
|
|
@@ -25,10 +31,110 @@ const MAX_RESULT_BYTES_CEILING = 262144;
|
|
|
25
31
|
const MAX_RESULT_LINES_CEILING = 5e3;
|
|
26
32
|
const MAX_RESULT_TOKENS_CEILING = 1e5;
|
|
27
33
|
//#endregion
|
|
28
|
-
//#region src/
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
//#region src/services/runnerHost/index.ts
|
|
35
|
+
const describe = (error) => error instanceof Error ? error.message : String(error);
|
|
36
|
+
/** Runs `pass` again `ms` after the previous pass finished, so two passes never overlap. */
|
|
37
|
+
function repeat(clock, ms, pass) {
|
|
38
|
+
let stopped = false;
|
|
39
|
+
let cancel;
|
|
40
|
+
let running;
|
|
41
|
+
const arm = () => {
|
|
42
|
+
cancel = clock.after(ms, () => {
|
|
43
|
+
cancel = void 0;
|
|
44
|
+
running = pass().finally(() => {
|
|
45
|
+
running = void 0;
|
|
46
|
+
if (!stopped) arm();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
arm();
|
|
51
|
+
return { async stop() {
|
|
52
|
+
stopped = true;
|
|
53
|
+
cancel?.();
|
|
54
|
+
await running;
|
|
55
|
+
} };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The housekeeping every session running one po-runner build in one hub shares.
|
|
59
|
+
*
|
|
60
|
+
* A session used to open its own registry connection and arm its own status poll and history
|
|
61
|
+
* sweep, and each sweep walked the whole runner store. Here one loop refreshes the attached sessions
|
|
62
|
+
* one at a time, one sweep per store spares every attached session at once, and runners a crashed
|
|
63
|
+
* server left behind are reclaimed once rather than at every session start.
|
|
64
|
+
*/
|
|
65
|
+
function createRunnerHost(options) {
|
|
66
|
+
const sessions = /* @__PURE__ */ new Set();
|
|
67
|
+
let closed = false;
|
|
68
|
+
let reclaiming;
|
|
69
|
+
let sweeping;
|
|
70
|
+
const refreshAll = async () => {
|
|
71
|
+
for (const session of sessions) {
|
|
72
|
+
if (closed) return;
|
|
73
|
+
try {
|
|
74
|
+
await session.refresh();
|
|
75
|
+
} catch (error) {
|
|
76
|
+
options.onWarning(`Could not refresh po-runner session ${session.sessionId}: ${describe(error)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const sweepAll = () => {
|
|
81
|
+
sweeping ??= (async () => {
|
|
82
|
+
try {
|
|
83
|
+
const byStore = /* @__PURE__ */ new Map();
|
|
84
|
+
for (const session of sessions) {
|
|
85
|
+
const store = session.paths.storeDirectory();
|
|
86
|
+
byStore.set(store, [...byStore.get(store) ?? [], session]);
|
|
87
|
+
}
|
|
88
|
+
for (const group of byStore.values()) {
|
|
89
|
+
const [first] = group;
|
|
90
|
+
if (closed || first === void 0) return;
|
|
91
|
+
const live = new Set(group.map((session) => session.sessionId));
|
|
92
|
+
const now = options.clock.now();
|
|
93
|
+
const result = first.paths.sweepHistoryAsync ? await first.paths.sweepHistoryAsync(first.historyTtlMs, now, live) : first.paths.sweepHistory(first.historyTtlMs, now, live);
|
|
94
|
+
for (const error of result.errors) options.onWarning(error);
|
|
95
|
+
}
|
|
96
|
+
} catch (error) {
|
|
97
|
+
options.onWarning(`Could not sweep po-runner history: ${describe(error)}`);
|
|
98
|
+
}
|
|
99
|
+
})().finally(() => {
|
|
100
|
+
sweeping = void 0;
|
|
101
|
+
});
|
|
102
|
+
return sweeping;
|
|
103
|
+
};
|
|
104
|
+
const polling = repeat(options.clock, options.statusPollMs, refreshAll);
|
|
105
|
+
const sweeper = repeat(options.clock, options.historySweepMs, sweepAll);
|
|
106
|
+
return {
|
|
107
|
+
processRegistry: {
|
|
108
|
+
registerProcess: (...args) => options.processRegistry.registerProcess(...args),
|
|
109
|
+
releaseProcess: (...args) => options.processRegistry.releaseProcess(...args),
|
|
110
|
+
listProcesses: (...args) => options.processRegistry.listProcesses(...args),
|
|
111
|
+
close: () => void 0
|
|
112
|
+
},
|
|
113
|
+
attach(session) {
|
|
114
|
+
if (closed) throw new Error("The po-runner host is disposed.");
|
|
115
|
+
sessions.add(session);
|
|
116
|
+
if (reclaiming === void 0) {
|
|
117
|
+
reclaiming = session.reclaimOrphans().catch((error) => options.onWarning(`Could not reclaim orphaned runners: ${describe(error)}`));
|
|
118
|
+
sweepAll();
|
|
119
|
+
}
|
|
120
|
+
return () => {
|
|
121
|
+
sessions.delete(session);
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
async dispose() {
|
|
125
|
+
if (closed) return;
|
|
126
|
+
closed = true;
|
|
127
|
+
sessions.clear();
|
|
128
|
+
await Promise.all([
|
|
129
|
+
polling.stop(),
|
|
130
|
+
sweeper.stop(),
|
|
131
|
+
reclaiming,
|
|
132
|
+
sweeping
|
|
133
|
+
]);
|
|
134
|
+
options.processRegistry.close();
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
32
138
|
//#endregion
|
|
33
139
|
//#region src/constants/webRunners.ts
|
|
34
140
|
const RUNNER_RUNS_TYPE = "runner_runs";
|
|
@@ -84,9 +190,9 @@ function presentRunnerRuns(records, now) {
|
|
|
84
190
|
//#endregion
|
|
85
191
|
//#region src/services/runnerServerRuntime/index.ts
|
|
86
192
|
const COMPLETION_RETRY_MS = 1e3;
|
|
87
|
-
function createRunnerServerRuntime(container, directEvents, wakeAgent, execution) {
|
|
88
|
-
const telemetry = execution ?
|
|
89
|
-
serviceName: "
|
|
193
|
+
function createRunnerServerRuntime(container, host, directEvents, wakeAgent, execution) {
|
|
194
|
+
const telemetry = execution ? createPoTelemetry({
|
|
195
|
+
serviceName: "po-runner",
|
|
90
196
|
packageName: "@agimon-ai/po-runner",
|
|
91
197
|
cwd: execution.cwd,
|
|
92
198
|
env: execution.environment,
|
|
@@ -105,41 +211,31 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
105
211
|
let wakes = Promise.resolve();
|
|
106
212
|
let closing = false;
|
|
107
213
|
let retryTimer;
|
|
108
|
-
|
|
109
|
-
let
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
214
|
+
/** Stops the shared loop refreshing this session and sweeping around it. */
|
|
215
|
+
let detach;
|
|
216
|
+
/** Every runner of every session the registry knows, reclaimed when its owning process is gone. */
|
|
217
|
+
const reclaimOrphans = async () => {
|
|
218
|
+
const reclaimed = await reconcileActiveRunners({
|
|
219
|
+
registry: container.runnerRegistry,
|
|
220
|
+
launcher: container.launcher,
|
|
221
|
+
rmuxBackend: container.rmuxBackend,
|
|
222
|
+
processControl: container.processControl,
|
|
223
|
+
currentHostPid: process.pid,
|
|
224
|
+
startup: false
|
|
119
225
|
});
|
|
120
|
-
|
|
226
|
+
for (const error of reclaimed.errors) process.emitWarning(error);
|
|
121
227
|
};
|
|
122
228
|
const ensureSession = (requestedSessionId) => {
|
|
123
229
|
if (closing) return Promise.reject(/* @__PURE__ */ new Error("Runner runtime is closing."));
|
|
124
230
|
if (sessionId !== void 0 && sessionId !== requestedSessionId) throw new Error(`Runner runtime belongs to session ${sessionId}.`);
|
|
125
231
|
sessionId ??= requestedSessionId;
|
|
126
232
|
supervision ??= (async () => {
|
|
127
|
-
|
|
233
|
+
telemetry?.recordEvent("po_runner.session_started", { outcome: "started" }).catch((error) => process.emitWarning(`Could not record runner session telemetry: ${String(error)}`));
|
|
128
234
|
if (closing) return;
|
|
129
235
|
container.paths.setSessionId(requestedSessionId);
|
|
130
236
|
if (await container.lifeline.arm(requestedSessionId) === void 0) throw new Error("Could not arm runner supervision lifeline.");
|
|
131
237
|
if (closing) return;
|
|
132
238
|
const promotedIds = (await container.runnerRegistry.listAll(requestedSessionId)).filter((record) => record.state === "running" && record.promoted).map((record) => record.id);
|
|
133
|
-
const legacy = await cleanupLegacyRunnerStore({
|
|
134
|
-
registry: container.runnerRegistry,
|
|
135
|
-
launcher: container.launcher,
|
|
136
|
-
rmuxBackend: container.rmuxBackend,
|
|
137
|
-
processControl: container.processControl,
|
|
138
|
-
currentHostPid: process.pid,
|
|
139
|
-
paths: container.paths
|
|
140
|
-
});
|
|
141
|
-
for (const error of legacy.errors) process.emitWarning(error);
|
|
142
|
-
if (closing) return;
|
|
143
239
|
const reconciled = await reconcileActiveRunners({
|
|
144
240
|
registry: container.runnerRegistry,
|
|
145
241
|
launcher: container.launcher,
|
|
@@ -147,28 +243,26 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
147
243
|
processControl: container.processControl,
|
|
148
244
|
currentHostPid: process.pid,
|
|
149
245
|
startup: true,
|
|
150
|
-
startupSessionId: requestedSessionId
|
|
246
|
+
startupSessionId: requestedSessionId,
|
|
247
|
+
active: await container.runnerRegistry.listBySession(requestedSessionId)
|
|
151
248
|
});
|
|
152
249
|
for (const error of reconciled.errors) process.emitWarning(error);
|
|
153
|
-
|
|
154
|
-
"runner.reclaimed_count":
|
|
155
|
-
"runner.error_count":
|
|
156
|
-
outcome:
|
|
157
|
-
});
|
|
250
|
+
telemetry?.recordEvent("po_runner.reconciled", {
|
|
251
|
+
"runner.reclaimed_count": reconciled.reclaimed.length,
|
|
252
|
+
"runner.error_count": reconciled.errors.length,
|
|
253
|
+
outcome: reconciled.errors.length === 0 ? "completed" : "degraded"
|
|
254
|
+
}).catch((error) => process.emitWarning(`Could not record runner reconcile telemetry: ${String(error)}`));
|
|
158
255
|
if (!closing) {
|
|
159
256
|
unsubscribeRunnerUpdates ??= container.runnerRegistry.subscribe(() => requestPublish(requestedSessionId), requestedSessionId);
|
|
160
257
|
for (const id of promotedIds) watchRunner(id);
|
|
161
258
|
requestPublish(requestedSessionId);
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
sweepHistory();
|
|
170
|
-
}, HISTORY_SWEEP_INTERVAL_MS);
|
|
171
|
-
historyTimer.unref?.();
|
|
259
|
+
detach ??= host.attach({
|
|
260
|
+
sessionId: requestedSessionId,
|
|
261
|
+
paths: container.paths,
|
|
262
|
+
historyTtlMs: getLogTtlMs(container.environment),
|
|
263
|
+
refresh: () => refreshSession(requestedSessionId),
|
|
264
|
+
reclaimOrphans
|
|
265
|
+
});
|
|
172
266
|
}
|
|
173
267
|
})().catch((error) => {
|
|
174
268
|
supervision = void 0;
|
|
@@ -181,36 +275,36 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
181
275
|
await supervision?.catch((error) => process.emitWarning(`Could not initialize headless runner supervision: ${String(error)}`));
|
|
182
276
|
const ownedSessionId = sessionId;
|
|
183
277
|
if (ownedSessionId === void 0) return;
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
278
|
+
await runCleanups([
|
|
279
|
+
async () => {
|
|
280
|
+
const records = await container.runnerRegistry.listBySession(ownedSessionId);
|
|
281
|
+
const errors = (await Promise.allSettled(records.map(async (record) => {
|
|
282
|
+
await stopRunnerProcess(record, container.launcher, container.rmuxBackend, {
|
|
283
|
+
registry: container.runnerRegistry,
|
|
284
|
+
intent: {
|
|
285
|
+
reason: "stopped",
|
|
286
|
+
terminationReason: "parent_session_cleanup",
|
|
287
|
+
stopReason: "session ended"
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
const deadline = container.clock.now() + TERM_GRACE_MS;
|
|
291
|
+
while (container.processControl.isAlive(record.pid)) {
|
|
292
|
+
if (container.clock.now() >= deadline) throw new Error(`Could not stop runner ${record.id} during session shutdown`);
|
|
293
|
+
await new Promise((resolve) => container.clock.after(100, resolve));
|
|
294
|
+
}
|
|
295
|
+
await container.runnerRegistry.complete(record.id, {
|
|
190
296
|
reason: "stopped",
|
|
191
|
-
|
|
297
|
+
code: null,
|
|
298
|
+
signal: null,
|
|
192
299
|
stopReason: "session ended"
|
|
193
|
-
}
|
|
194
|
-
})
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
signal: null,
|
|
202
|
-
stopReason: "session ended"
|
|
203
|
-
}, ownedSessionId);
|
|
204
|
-
} catch (error) {
|
|
205
|
-
process.emitWarning(`Could not clean up runner ${record.id}: ${String(error)}`);
|
|
206
|
-
}
|
|
207
|
-
}));
|
|
208
|
-
try {
|
|
209
|
-
await container.ptyHost.disposeAll();
|
|
210
|
-
} finally {
|
|
211
|
-
container.lifeline.dispose();
|
|
212
|
-
container.runnerRegistry.close();
|
|
213
|
-
}
|
|
300
|
+
}, ownedSessionId);
|
|
301
|
+
}))).filter((result) => result.status === "rejected").map((result) => result.reason);
|
|
302
|
+
if (errors.length) throw new AggregateError(errors, "Runner process cleanup failed.");
|
|
303
|
+
},
|
|
304
|
+
() => container.ptyHost.disposeAll(),
|
|
305
|
+
() => container.lifeline.dispose(),
|
|
306
|
+
() => container.runnerRegistry.close()
|
|
307
|
+
], "Runner runtime cleanup failed.");
|
|
214
308
|
})();
|
|
215
309
|
return runtimeDisposal;
|
|
216
310
|
};
|
|
@@ -240,7 +334,7 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
240
334
|
wakeForFinished(ownedSessionId);
|
|
241
335
|
}
|
|
242
336
|
} catch (error) {
|
|
243
|
-
process.emitWarning(`Could not refresh
|
|
337
|
+
process.emitWarning(`Could not refresh po-runner: ${String(error)}`);
|
|
244
338
|
}
|
|
245
339
|
};
|
|
246
340
|
const publishRuns = async (ownedSessionId) => {
|
|
@@ -299,8 +393,8 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
299
393
|
const record = await container.runnerRegistry.get(id, ownedSessionId);
|
|
300
394
|
if (closing) return;
|
|
301
395
|
if (record?.state === "running") continue;
|
|
302
|
-
if (record) await wakeAgent?.(formatRunnerFinished(record), `runner-finished:${JSON.stringify([ownedSessionId, id])}
|
|
303
|
-
if (record) await telemetry?.recordEvent("
|
|
396
|
+
if (record) await wakeAgent?.(formatRunnerFinished(record), `runner-finished:${JSON.stringify([ownedSessionId, id])}`, formatRunnerFinishedNotice(record));
|
|
397
|
+
if (record) await telemetry?.recordEvent("po_runner.process_finished", {
|
|
304
398
|
outcome: "completed",
|
|
305
399
|
"runner.exit_code": record.exit?.code ?? 0,
|
|
306
400
|
"runner.backend": record.backend
|
|
@@ -342,7 +436,7 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
342
436
|
activity: {
|
|
343
437
|
name: "runner",
|
|
344
438
|
start: async (executionContext) => {
|
|
345
|
-
|
|
439
|
+
ensureSession(executionContext.sessionId).catch((error) => process.emitWarning(`Could not initialize headless runner supervision: ${String(error)}`));
|
|
346
440
|
requestPublish(executionContext.sessionId);
|
|
347
441
|
return () => {};
|
|
348
442
|
}
|
|
@@ -365,7 +459,7 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
365
459
|
const text = activeRunnerRecovery(active);
|
|
366
460
|
if (!text) return;
|
|
367
461
|
await execution.session.appendMessage?.({
|
|
368
|
-
type: "
|
|
462
|
+
type: "po-runner-compaction",
|
|
369
463
|
text,
|
|
370
464
|
display: false,
|
|
371
465
|
details: {
|
|
@@ -376,8 +470,8 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
376
470
|
if (!closing) recoveredCompactionId = event.entryId;
|
|
377
471
|
},
|
|
378
472
|
backgroundWorkPlugin: (context) => {
|
|
379
|
-
context.inject([
|
|
380
|
-
const service =
|
|
473
|
+
context.inject([PO_BACKGROUND_WORK_SERVICE], (serviceContext) => {
|
|
474
|
+
const service = readPoBackgroundWorkService(serviceContext);
|
|
381
475
|
if (!service) return void 0;
|
|
382
476
|
const registration = service.register({
|
|
383
477
|
provider: BACKGROUND_WORK_PROVIDER,
|
|
@@ -395,8 +489,8 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
395
489
|
closing = true;
|
|
396
490
|
disposal = (async () => {
|
|
397
491
|
closing = true;
|
|
398
|
-
|
|
399
|
-
|
|
492
|
+
detach?.();
|
|
493
|
+
detach = void 0;
|
|
400
494
|
clearTimeout(retryTimer);
|
|
401
495
|
retryTimer = void 0;
|
|
402
496
|
watched.clear();
|
|
@@ -406,16 +500,17 @@ function createRunnerServerRuntime(container, directEvents, wakeAgent, execution
|
|
|
406
500
|
unsubscribeRunnerUpdates = void 0;
|
|
407
501
|
await wakes;
|
|
408
502
|
await publishInFlight;
|
|
409
|
-
await historySweep;
|
|
410
503
|
await refreshInFlight;
|
|
411
504
|
try {
|
|
412
505
|
execution?.client.setStatus(RUNNER_STATUS_KEY, void 0);
|
|
413
506
|
} catch (error) {
|
|
414
507
|
process.emitWarning(`Could not clear runner status: ${String(error)}`);
|
|
415
508
|
}
|
|
416
|
-
await
|
|
417
|
-
|
|
418
|
-
|
|
509
|
+
await runCleanups([
|
|
510
|
+
disposeRuntime,
|
|
511
|
+
() => telemetry?.recordEvent("po_runner.session_finished", { outcome: "stopped" }),
|
|
512
|
+
() => telemetry?.shutdown()
|
|
513
|
+
], "Runner shutdown failed.");
|
|
419
514
|
})();
|
|
420
515
|
return disposal;
|
|
421
516
|
}
|
|
@@ -531,27 +626,41 @@ function validate(parsed) {
|
|
|
531
626
|
}
|
|
532
627
|
//#endregion
|
|
533
628
|
//#region src/extensions/workspaces/sessions/(backend)/_lib/serverRoot.ts
|
|
534
|
-
const RUNNER_SERVER_SCOPE_SERVICE = "
|
|
535
|
-
const createRunnerServerRoot = ({ host, agent, signal }) => {
|
|
536
|
-
if (!host.context.directEvents) throw new Error("Runner
|
|
537
|
-
if (!host.context.cwd || !host.context.environment) throw new Error("Runner
|
|
629
|
+
const RUNNER_SERVER_SCOPE_SERVICE = "po/runner-server-scope";
|
|
630
|
+
const createRunnerServerRoot = async ({ host, agent, signal, resources }) => {
|
|
631
|
+
if (!host.context.directEvents) throw new Error("Runner server plugin requires the session direct event bus.");
|
|
632
|
+
if (!host.context.cwd || !host.context.environment) throw new Error("Runner server plugin requires session cwd and environment.");
|
|
538
633
|
const loaded = new RunnerSettingsLoader().load(host.context.cwd, true);
|
|
539
634
|
const settings = Object.freeze({
|
|
540
635
|
...loaded.settings,
|
|
541
636
|
...loaded.settings.errorPatterns ? { errorPatterns: Object.freeze([...loaded.settings.errorPatterns]) } : {}
|
|
542
637
|
});
|
|
543
638
|
for (const issue of loaded.issues) process.emitWarning(`${RUNNER_SETTINGS_FILE}: ${issue}`);
|
|
639
|
+
const environment = host.context.environment;
|
|
640
|
+
const runnerHost = await resources.acquire(["runner-host", environment["PROCESS_REGISTRY_PATH"] ?? null], () => createRunnerHost({
|
|
641
|
+
processRegistry: createDefaultProcessRegistry(environment),
|
|
642
|
+
clock: new SystemClock(),
|
|
643
|
+
statusPollMs: 500,
|
|
644
|
+
historySweepMs: HISTORY_SWEEP_INTERVAL_MS,
|
|
645
|
+
onWarning: (message) => process.emitWarning(message)
|
|
646
|
+
}), (shared) => shared.dispose());
|
|
544
647
|
const dependencies = createRunnerDependencies({
|
|
545
648
|
settings,
|
|
546
649
|
cwd: host.context.cwd,
|
|
547
|
-
environment
|
|
650
|
+
environment,
|
|
651
|
+
processRegistry: runnerHost.processRegistry,
|
|
548
652
|
...host.context.executionBudget === void 0 ? {} : { executionBudget: host.context.executionBudget }
|
|
549
653
|
});
|
|
550
654
|
const execution = agent?.context;
|
|
551
|
-
const wakeAgent = execution && (async (content, requestId) => {
|
|
655
|
+
const wakeAgent = execution && (async (content, requestId, notice) => {
|
|
552
656
|
try {
|
|
553
|
-
if (!execution.session.
|
|
554
|
-
await execution.session.
|
|
657
|
+
if (!execution.session.admitMessage) throw new Error("The session cannot admit a runner notification.");
|
|
658
|
+
await execution.session.admitMessage({
|
|
659
|
+
type: "po-runner-finished",
|
|
660
|
+
text: content,
|
|
661
|
+
display: true,
|
|
662
|
+
details: { notice }
|
|
663
|
+
}, "steer", requestId);
|
|
555
664
|
} catch (error) {
|
|
556
665
|
await Promise.resolve().then(() => execution.client.notify({
|
|
557
666
|
body: String(error),
|
|
@@ -560,7 +669,7 @@ const createRunnerServerRoot = ({ host, agent, signal }) => {
|
|
|
560
669
|
throw error;
|
|
561
670
|
}
|
|
562
671
|
});
|
|
563
|
-
const runtime = createRunnerServerRuntime(dependencies, host.context.directEvents, wakeAgent, execution);
|
|
672
|
+
const runtime = createRunnerServerRuntime(dependencies, runnerHost, host.context.directEvents, wakeAgent, execution);
|
|
564
673
|
const bash = (wakeOnExit) => createHeadlessBashTool({ run: async (request) => {
|
|
565
674
|
await runtime.ensureSession(request.sessionId);
|
|
566
675
|
const result = await dependencies.bashRunService.run({
|
|
@@ -582,7 +691,9 @@ const createRunnerServerRoot = ({ host, agent, signal }) => {
|
|
|
582
691
|
context.plugin((providerContext) => providerContext.provide(RUNNER_SERVER_SCOPE_SERVICE, value));
|
|
583
692
|
}],
|
|
584
693
|
activities: [runtime.activity],
|
|
585
|
-
onStart: execution ? () =>
|
|
694
|
+
onStart: execution ? () => {
|
|
695
|
+
runtime.ensureSession(execution.sessionId).catch((error) => process.emitWarning(`Could not initialize headless runner supervision: ${String(error)}`));
|
|
696
|
+
} : void 0,
|
|
586
697
|
onStop: runtime.dispose
|
|
587
698
|
};
|
|
588
699
|
};
|
|
@@ -1164,8 +1275,8 @@ var session_compact_server_default = defineHook(({ root }) => ({
|
|
|
1164
1275
|
//#region src/extensions/workspaces/sessions/(backend)/resource/po-use-runner.server.ts
|
|
1165
1276
|
var po_use_runner_server_default = defineResource({
|
|
1166
1277
|
name: "po-use-runner",
|
|
1167
|
-
description: "Use
|
|
1168
|
-
when:
|
|
1278
|
+
description: "Use Po Pi Runner to supervise shell commands, inspect durable logs, provide interactive input, and stop background runs.",
|
|
1279
|
+
when: PO_HELP_WHEN,
|
|
1169
1280
|
kind: "skill",
|
|
1170
1281
|
path: packageResourcePath(import.meta.url, "src/prompts/po-use-runner/SKILL.md"),
|
|
1171
1282
|
read: () => readPackageResource(import.meta.url, "src/prompts/po-use-runner/SKILL.md")
|
|
@@ -1176,21 +1287,24 @@ var bash_server_default = defineServerTool((context) => context.root.tool);
|
|
|
1176
1287
|
//#endregion
|
|
1177
1288
|
//#region generated/server.ts
|
|
1178
1289
|
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
1290
|
+
/* v8 ignore next -- generated normalization branch */
|
|
1291
|
+
const defined = (values) => values.filter((value) => value !== void 0);
|
|
1179
1292
|
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
1180
1293
|
...identity,
|
|
1181
1294
|
...value
|
|
1182
1295
|
};
|
|
1183
|
-
const
|
|
1296
|
+
const serverPlugin = defineServerPlugin({
|
|
1184
1297
|
name: "@agimon-ai/po-runner",
|
|
1185
1298
|
providerOverrides: composeServerProviderOverrides(root_server_default),
|
|
1299
|
+
injects: composeRootInjects({ session: [root_server_default] }),
|
|
1186
1300
|
global: () => ({ get channels() {
|
|
1187
1301
|
return [() => via({ frameType: "runner_runs" }, runnerRuns_server_default())];
|
|
1188
1302
|
} }),
|
|
1189
|
-
workspace: () => ({ get channels() {
|
|
1190
|
-
return [() => via({ frameType: "runner_runs" }, runnerRuns_server_default())];
|
|
1303
|
+
workspace: (context) => ({ get channels() {
|
|
1304
|
+
return defined([context.hosted("global") ? void 0 : () => via({ frameType: "runner_runs" }, runnerRuns_server_default())]);
|
|
1191
1305
|
} }),
|
|
1192
1306
|
session: async (context) => {
|
|
1193
|
-
const scopeSession = await root_server_default
|
|
1307
|
+
const scopeSession = await context.scopeRoot("session", root_server_default, context);
|
|
1194
1308
|
const contextSession = {
|
|
1195
1309
|
...context,
|
|
1196
1310
|
root: scopeSession.value
|
|
@@ -1201,7 +1315,7 @@ const facet = defineServerPlugin({
|
|
|
1201
1315
|
return [at(route_server_default, contextSession)];
|
|
1202
1316
|
},
|
|
1203
1317
|
get channels() {
|
|
1204
|
-
return [() => via({ frameType: "runner_runs" }, runnerRuns_server_default())];
|
|
1318
|
+
return defined([context.hosted("global") ? void 0 : () => via({ frameType: "runner_runs" }, runnerRuns_server_default())]);
|
|
1205
1319
|
},
|
|
1206
1320
|
get commands() {
|
|
1207
1321
|
return [via({ name: "runners" }, at(runners_server_default, contextSession))];
|
|
@@ -1223,6 +1337,6 @@ const facet = defineServerPlugin({
|
|
|
1223
1337
|
}
|
|
1224
1338
|
});
|
|
1225
1339
|
//#endregion
|
|
1226
|
-
export {
|
|
1340
|
+
export { serverPlugin as default, serverPlugin };
|
|
1227
1341
|
|
|
1228
1342
|
//# sourceMappingURL=server.mjs.map
|