@xopcai/xopc 0.0.87 → 0.0.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/README.zh-CN.md +8 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/agents-B6PJB07W.js +222 -0
- package/dist/gateway/static/root/assets/apps-page-BOr0B1wv.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-BelUKggl.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-BSHqqCF1.js → channels-status-swr-DaHGkRF1.js} +1 -1
- package/dist/gateway/static/root/assets/cron-api-CjOg-BIj.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-DhoZmZXb.js +1 -0
- package/dist/gateway/static/root/assets/{dist-Cmjp2APP.js → dist-6LecgDx5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CFa9z_1N.js → extension-debug-page-CtuKJ9tE.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BI8eaTPq.js → extension-page-ykzjOkR5.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-Ce2qrdpO.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-DRqwef_Q.js → fetch-C9FFJjuH.js} +1 -1
- package/dist/gateway/static/root/assets/{field-primitives-BiNHBo2Y.js → field-primitives-BFcrNeTU.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-ZRb8qhuz.js → heartbeat-config-api-CEg4Vr9R.js} +1 -1
- package/dist/gateway/static/root/assets/{index-Cu7bKuUi.js → index-CZfy9oxs.js} +85 -85
- package/dist/gateway/static/root/assets/index-CiN1cQiQ.css +1 -0
- package/dist/gateway/static/root/assets/logs-page-BwWLfqvd.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-DV5WN8uk.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-DiqqVs6m.js → settings-form-section-BqdzA28u.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-CfOBRbPX.js +3 -0
- package/dist/gateway/static/root/assets/{share-preview-page-n1Gprylk.js → share-preview-page-Di5Bzh4g.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-D0H5Kaxg.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-CZOh1nT3.js → theme-store-CNqbmTNV.js} +1 -1
- package/dist/gateway/static/root/assets/url-aYn-Rj1C.js +7 -0
- package/dist/gateway/static/root/assets/{utils-CkWBfxs4.js → utils-BWm2tG2w.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-X2UfnHeq.js +1 -0
- package/dist/gateway/static/root/assets/workflows-page-BOPpO3NG.js +27 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +1 -0
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +15 -0
- package/dist/src/agent/child-agent-factory.js +35 -2
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/client-error-format.d.ts +20 -0
- package/dist/src/agent/client-error-format.js +97 -0
- package/dist/src/agent/client-error-format.js.map +1 -0
- package/dist/src/agent/embedded/run-turn.js +23 -4
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/goals/goal-locale.d.ts +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.js +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/orchestration/llm-turn-retry.d.ts +2 -0
- package/dist/src/agent/orchestration/llm-turn-retry.js +9 -1
- package/dist/src/agent/orchestration/llm-turn-retry.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +19 -3
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/webchat-tts.d.ts +1 -2
- package/dist/src/agent/service/webchat-tts.js +1 -1
- package/dist/src/agent/service/webchat-tts.js.map +1 -1
- package/dist/src/agent/service.js +2 -1
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +3 -1
- package/dist/src/agent/tools/cronjob-tool.js +2 -1
- package/dist/src/agent/tools/cronjob-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +3 -0
- package/dist/src/agent/tools/factory.js +2 -23
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.d.ts +6 -28
- package/dist/src/agent/tools/workflow-tool.js +61 -213
- package/dist/src/agent/tools/workflow-tool.js.map +1 -1
- package/dist/src/agent/workflow/agent-progress.d.ts +5 -0
- package/dist/src/agent/workflow/agent-progress.js +65 -0
- package/dist/src/agent/workflow/agent-progress.js.map +1 -0
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.js +14 -0
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js +14 -0
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +12 -0
- package/dist/src/agent/workflow/builtins/implementation-plan.js +175 -0
- package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -0
- package/dist/src/agent/workflow/builtins/index.d.ts +3 -1
- package/dist/src/agent/workflow/builtins/index.js +11 -1
- package/dist/src/agent/workflow/builtins/index.js.map +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +14 -0
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.js +14 -0
- package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/release-check.d.ts +11 -0
- package/dist/src/agent/workflow/builtins/release-check.js +165 -0
- package/dist/src/agent/workflow/builtins/release-check.js.map +1 -0
- package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/research.js +14 -0
- package/dist/src/agent/workflow/builtins/research.js.map +1 -1
- package/dist/src/agent/workflow/index.d.ts +2 -1
- package/dist/src/agent/workflow/index.js +3 -2
- package/dist/src/agent/workflow/meta-locale.d.ts +12 -0
- package/dist/src/agent/workflow/meta-locale.js +62 -0
- package/dist/src/agent/workflow/meta-locale.js.map +1 -0
- package/dist/src/agent/workflow/parser.js +3 -0
- package/dist/src/agent/workflow/parser.js.map +1 -1
- package/dist/src/agent/workflow/runtime.d.ts +2 -2
- package/dist/src/agent/workflow/runtime.js +21 -14
- package/dist/src/agent/workflow/runtime.js.map +1 -1
- package/dist/src/agent/workflow/snapshot.js +2 -12
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/agent/workflow/step-labels.d.ts +8 -0
- package/dist/src/agent/workflow/step-labels.js +48 -0
- package/dist/src/agent/workflow/step-labels.js.map +1 -0
- package/dist/src/agent/workflow/subagent-runner.js +46 -1
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +74 -1
- package/dist/src/agent/workflow/workflow-child-tools.d.ts +4 -0
- package/dist/src/agent/workflow/workflow-child-tools.js +21 -0
- package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -0
- package/dist/src/auth/credentials.d.ts +19 -2
- package/dist/src/auth/credentials.js +47 -13
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/auth/oauth/types.d.ts +16 -0
- package/dist/src/cli/commands/auth.js +6 -0
- package/dist/src/cli/commands/auth.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/onboard/model.js +6 -0
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +18 -0
- package/dist/src/config/agent-typed-models.js +53 -0
- package/dist/src/config/agent-typed-models.js.map +1 -0
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/schema.d.ts +52 -0
- package/dist/src/config/schema.js +39 -3
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/voice.d.ts +3 -28
- package/dist/src/config/voice.js +27 -261
- package/dist/src/config/voice.js.map +1 -1
- package/dist/src/cron/executor.d.ts +2 -0
- package/dist/src/cron/executor.js +59 -5
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/cron/job-content.js +2 -1
- package/dist/src/cron/job-content.js.map +1 -1
- package/dist/src/cron/types.d.ts +21 -1
- package/dist/src/cron/validation.d.ts +76 -0
- package/dist/src/cron/validation.js +26 -1
- package/dist/src/cron/validation.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +9 -0
- package/dist/src/gateway/agents-admin.js +16 -0
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/config-tools-web.js +3 -2
- package/dist/src/gateway/config-tools-web.js.map +1 -1
- package/dist/src/gateway/gateway-workflow-host.types.d.ts +17 -0
- package/dist/src/gateway/gateway-workflow-host.types.js +1 -0
- package/dist/src/gateway/hono/lib/agent-model.d.ts +7 -0
- package/dist/src/gateway/hono/lib/agent-model.js +36 -1
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +28 -5
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/mask-secret-length.d.ts +6 -0
- package/dist/src/gateway/hono/lib/mask-secret-length.js +16 -0
- package/dist/src/gateway/hono/lib/mask-secret-length.js.map +1 -0
- package/dist/src/gateway/hono/lib/safe-providers-config.d.ts +1 -1
- package/dist/src/gateway/hono/lib/safe-providers-config.js +2 -1
- package/dist/src/gateway/hono/lib/safe-providers-config.js.map +1 -1
- package/dist/src/gateway/hono/lib/safe-voice-config.js +2 -1
- package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
- package/dist/src/gateway/hono/oauth-async.js +40 -15
- package/dist/src/gateway/hono/oauth-async.js.map +1 -1
- package/dist/src/gateway/hono/oauth.js +31 -6
- package/dist/src/gateway/hono/oauth.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js +8 -2
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +3 -2
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -2
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +59 -0
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +84 -15
- package/dist/src/gateway/hono/routes/models.js.map +1 -1
- package/dist/src/gateway/hono/routes/voice.js +75 -0
- package/dist/src/gateway/hono/routes/voice.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.d.ts +3 -0
- package/dist/src/gateway/hono/routes/workflows.js +226 -0
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +2 -20
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service.d.ts +8 -0
- package/dist/src/gateway/service.js +28 -2
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/providers/index.d.ts +8 -0
- package/dist/src/providers/index.js +51 -12
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/share/site-share-config.d.ts +3 -2
- package/dist/src/share/site-share-config.js.map +1 -1
- package/dist/src/tui/tui-agent-events.js +2 -1
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/voice/metadata/builtin.d.ts +2 -0
- package/dist/src/voice/metadata/builtin.js +420 -0
- package/dist/src/voice/metadata/builtin.js.map +1 -0
- package/dist/src/voice/metadata/index.d.ts +4 -0
- package/dist/src/voice/metadata/index.js +3 -0
- package/dist/src/voice/metadata/registry.d.ts +5 -0
- package/dist/src/voice/metadata/registry.js +34 -0
- package/dist/src/voice/metadata/registry.js.map +1 -0
- package/dist/src/voice/metadata/types.d.ts +41 -0
- package/dist/src/voice/metadata/types.js +1 -0
- package/dist/src/voice/stt/list-providers.d.ts +3 -3
- package/dist/src/voice/stt/list-providers.js +41 -6
- package/dist/src/voice/stt/list-providers.js.map +1 -1
- package/dist/src/voice/tts/list-providers.d.ts +3 -3
- package/dist/src/voice/tts/list-providers.js +41 -6
- package/dist/src/voice/tts/list-providers.js.map +1 -1
- package/dist/src/workflows/domain/command.d.ts +19 -0
- package/dist/src/workflows/domain/command.js +1 -0
- package/dist/src/workflows/domain/definition-utils.d.ts +14 -0
- package/dist/src/workflows/domain/definition-utils.js +50 -0
- package/dist/src/workflows/domain/definition-utils.js.map +1 -0
- package/dist/src/workflows/domain/definition.d.ts +62 -0
- package/dist/src/workflows/domain/definition.js +1 -0
- package/dist/src/workflows/domain/event.d.ts +67 -0
- package/dist/src/workflows/domain/event.js +1 -0
- package/dist/src/workflows/domain/index.d.ts +7 -0
- package/dist/src/workflows/domain/index.js +4 -0
- package/dist/src/workflows/domain/result.d.ts +65 -0
- package/dist/src/workflows/domain/result.js +1 -0
- package/dist/src/workflows/domain/run.d.ts +177 -0
- package/dist/src/workflows/domain/run.js +14 -0
- package/dist/src/workflows/domain/run.js.map +1 -0
- package/dist/src/workflows/domain/validation.d.ts +19 -0
- package/dist/src/workflows/domain/validation.js +66 -0
- package/dist/src/workflows/domain/validation.js.map +1 -0
- package/dist/src/workflows/engine/index.d.ts +2 -0
- package/dist/src/workflows/engine/index.js +3 -0
- package/dist/src/workflows/engine/projector.d.ts +3 -0
- package/dist/src/workflows/engine/projector.js +205 -0
- package/dist/src/workflows/engine/projector.js.map +1 -0
- package/dist/src/workflows/engine/workflow-engine.d.ts +32 -0
- package/dist/src/workflows/engine/workflow-engine.js +189 -0
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -0
- package/dist/src/workflows/index.d.ts +10 -0
- package/dist/src/workflows/index.js +18 -0
- package/dist/src/workflows/runtime/index.d.ts +1 -0
- package/dist/src/workflows/runtime/index.js +4 -0
- package/dist/src/workflows/runtime/script-runtime.d.ts +3 -0
- package/dist/src/workflows/runtime/script-runtime.js +3 -0
- package/dist/src/workflows/service/run-view-to-snapshot.d.ts +4 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js +61 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -0
- package/dist/src/workflows/service/workflow-run-service.d.ts +36 -0
- package/dist/src/workflows/service/workflow-run-service.js +279 -0
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -0
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +47 -0
- package/dist/src/workflows/service/workflow-run-service.types.js +1 -0
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +29 -0
- package/dist/src/workflows/service/workflow-session-bridge.js +177 -0
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -0
- package/dist/src/workflows/service/workflow-session-key.d.ts +3 -0
- package/dist/src/workflows/service/workflow-session-key.js +21 -0
- package/dist/src/workflows/service/workflow-session-key.js.map +1 -0
- package/dist/src/workflows/store/event-store.d.ts +17 -0
- package/dist/src/workflows/store/event-store.js +83 -0
- package/dist/src/workflows/store/event-store.js.map +1 -0
- package/dist/src/workflows/store/paths.d.ts +7 -0
- package/dist/src/workflows/store/paths.js +26 -0
- package/dist/src/workflows/store/paths.js.map +1 -0
- package/dist/src/workflows/store/run-store.d.ts +13 -0
- package/dist/src/workflows/store/run-store.js +69 -0
- package/dist/src/workflows/store/run-store.js.map +1 -0
- package/package.json +5 -5
- package/dist/gateway/static/root/assets/agents-BEAbXpuP.js +0 -222
- package/dist/gateway/static/root/assets/apps-page-Dg8R-Szf.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-yohw9YSu.js +0 -1
- package/dist/gateway/static/root/assets/cron-api-0h_QT8U3.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-BkfKFfFk.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-x4BB7q1X.js +0 -1
- package/dist/gateway/static/root/assets/index-a5gWIdZQ.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-BFZ8GgCv.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-CD7AfB-2.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-BBOjEQW3.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-CcN_gj--.js +0 -2
- package/dist/gateway/static/root/assets/url-Dd8Q7kZZ.js +0 -3
- package/dist/gateway/static/root/assets/voice-api-key-field-O6awz9hi.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './script-runtime.js';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { parseWorkflowScript } from '../../agent/workflow/parser.js';
|
|
2
|
+
export { runWorkflow as runWorkflowScript } from '../../agent/workflow/runtime.js';
|
|
3
|
+
export type { SubagentRunner as WorkflowScriptSubagentRunner, WorkflowRunOptions as WorkflowScriptRunOptions, WorkflowRunResult as WorkflowScriptRunResult, } from '../../agent/workflow/types.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkflowSnapshot } from '../../agent/workflow/types.js';
|
|
2
|
+
import type { WorkflowRunView } from '../domain/index.js';
|
|
3
|
+
/** Map persisted {@link WorkflowRunView} into chat {@link WorkflowSnapshot}. */
|
|
4
|
+
export declare function runViewToSnapshot(view: WorkflowRunView): WorkflowSnapshot;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
//#region src/workflows/service/run-view-to-snapshot.ts
|
|
2
|
+
function agentNumericId(id, index) {
|
|
3
|
+
const parsed = Number.parseInt(id, 10);
|
|
4
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
5
|
+
return index + 1;
|
|
6
|
+
}
|
|
7
|
+
function resolveResultPayload(result) {
|
|
8
|
+
if (result == null) return void 0;
|
|
9
|
+
if (typeof result === "object" && result !== null && "raw" in result) {
|
|
10
|
+
const raw = result.raw;
|
|
11
|
+
return raw !== void 0 ? raw : result;
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
/** Map persisted {@link WorkflowRunView} into chat {@link WorkflowSnapshot}. */
|
|
16
|
+
function runViewToSnapshot(view) {
|
|
17
|
+
const phaseTitleById = new Map(view.phases.map((phase) => [phase.id, phase.title]));
|
|
18
|
+
const runningPhase = view.phases.find((phase) => phase.status === "running");
|
|
19
|
+
const agents = view.agents.map((agent, index) => ({
|
|
20
|
+
id: agentNumericId(agent.id, index),
|
|
21
|
+
label: agent.label,
|
|
22
|
+
phase: agent.phaseId ? phaseTitleById.get(agent.phaseId) : void 0,
|
|
23
|
+
prompt: agent.prompt ?? "",
|
|
24
|
+
status: agent.status,
|
|
25
|
+
resultPreview: agent.resultPreview,
|
|
26
|
+
error: agent.error,
|
|
27
|
+
startedAtMs: agent.startedAtMs,
|
|
28
|
+
durationMs: agent.startedAtMs != null && agent.completedAtMs != null ? agent.completedAtMs - agent.startedAtMs : void 0,
|
|
29
|
+
currentStep: agent.currentStep,
|
|
30
|
+
steps: agent.steps?.map((step) => ({
|
|
31
|
+
id: step.id,
|
|
32
|
+
kind: step.kind,
|
|
33
|
+
toolName: step.kind === "tool" ? step.label : void 0,
|
|
34
|
+
label: step.label,
|
|
35
|
+
detail: step.detail,
|
|
36
|
+
status: step.status,
|
|
37
|
+
startedAtMs: step.startedAtMs,
|
|
38
|
+
durationMs: step.startedAtMs != null && step.completedAtMs != null ? step.completedAtMs - step.startedAtMs : void 0
|
|
39
|
+
}))
|
|
40
|
+
}));
|
|
41
|
+
const { metrics } = view.run;
|
|
42
|
+
return {
|
|
43
|
+
name: view.run.definitionId,
|
|
44
|
+
description: view.run.goal || view.run.title,
|
|
45
|
+
phases: view.phases.map((phase) => phase.title),
|
|
46
|
+
currentPhase: runningPhase?.title,
|
|
47
|
+
logs: view.logs.map((entry) => entry.message),
|
|
48
|
+
agents,
|
|
49
|
+
agentCount: metrics.agentCount,
|
|
50
|
+
runningCount: Math.max(0, metrics.agentCount - metrics.doneAgentCount - metrics.errorAgentCount - metrics.skippedAgentCount),
|
|
51
|
+
doneCount: metrics.doneAgentCount,
|
|
52
|
+
errorCount: metrics.errorAgentCount,
|
|
53
|
+
skippedCount: metrics.skippedAgentCount,
|
|
54
|
+
durationMs: metrics.durationMs,
|
|
55
|
+
result: resolveResultPayload(view.run.result)
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { runViewToSnapshot };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=run-view-to-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-view-to-snapshot.js","names":[],"sources":["../../../../src/workflows/service/run-view-to-snapshot.ts"],"sourcesContent":["import type { WorkflowSnapshot } from '../../agent/workflow/types.js';\nimport type { WorkflowRunView } from '../domain/index.js';\n\nfunction agentNumericId(id: string, index: number): number {\n const parsed = Number.parseInt(id, 10);\n if (Number.isFinite(parsed)) return parsed;\n return index + 1;\n}\n\nfunction resolveResultPayload(result: WorkflowRunView['run']['result']): unknown {\n if (result == null) return undefined;\n if (typeof result === 'object' && result !== null && 'raw' in result) {\n const raw = (result as { raw?: unknown }).raw;\n return raw !== undefined ? raw : result;\n }\n return result;\n}\n\n/** Map persisted {@link WorkflowRunView} into chat {@link WorkflowSnapshot}. */\nexport function runViewToSnapshot(view: WorkflowRunView): WorkflowSnapshot {\n const phaseTitleById = new Map(view.phases.map((phase) => [phase.id, phase.title]));\n const runningPhase = view.phases.find((phase) => phase.status === 'running');\n\n const agents = view.agents.map((agent, index) => ({\n id: agentNumericId(agent.id, index),\n label: agent.label,\n phase: agent.phaseId ? phaseTitleById.get(agent.phaseId) : undefined,\n prompt: agent.prompt ?? '',\n status: agent.status,\n resultPreview: agent.resultPreview,\n error: agent.error,\n startedAtMs: agent.startedAtMs,\n durationMs:\n agent.startedAtMs != null && agent.completedAtMs != null\n ? agent.completedAtMs - agent.startedAtMs\n : undefined,\n currentStep: agent.currentStep,\n steps: agent.steps?.map((step) => ({\n id: step.id,\n kind: step.kind,\n toolName: step.kind === 'tool' ? step.label : undefined,\n label: step.label,\n detail: step.detail,\n status: step.status,\n startedAtMs: step.startedAtMs,\n durationMs:\n step.startedAtMs != null && step.completedAtMs != null\n ? step.completedAtMs - step.startedAtMs\n : undefined,\n })),\n }));\n\n const { metrics } = view.run;\n return {\n name: view.run.definitionId,\n description: view.run.goal || view.run.title,\n phases: view.phases.map((phase) => phase.title),\n currentPhase: runningPhase?.title,\n logs: view.logs.map((entry) => entry.message),\n agents,\n agentCount: metrics.agentCount,\n runningCount: Math.max(\n 0,\n metrics.agentCount - metrics.doneAgentCount - metrics.errorAgentCount - metrics.skippedAgentCount,\n ),\n doneCount: metrics.doneAgentCount,\n errorCount: metrics.errorAgentCount,\n skippedCount: metrics.skippedAgentCount,\n durationMs: metrics.durationMs,\n result: resolveResultPayload(view.run.result),\n };\n}\n"],"mappings":";AAGA,SAAS,eAAe,IAAY,OAAuB;CACzD,MAAM,SAAS,OAAO,SAAS,IAAI,GAAG;AACtC,KAAI,OAAO,SAAS,OAAO,CAAE,QAAO;AACpC,QAAO,QAAQ;;AAGjB,SAAS,qBAAqB,QAAmD;AAC/E,KAAI,UAAU,KAAM,QAAO,KAAA;AAC3B,KAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,SAAS,QAAQ;EACpE,MAAM,MAAO,OAA6B;AAC1C,SAAO,QAAQ,KAAA,IAAY,MAAM;;AAEnC,QAAO;;;AAIT,SAAgB,kBAAkB,MAAyC;CACzE,MAAM,iBAAiB,IAAI,IAAI,KAAK,OAAO,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,MAAM,CAAC,CAAC;CACnF,MAAM,eAAe,KAAK,OAAO,MAAM,UAAU,MAAM,WAAW,UAAU;CAE5E,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO,WAAW;EAChD,IAAI,eAAe,MAAM,IAAI,MAAM;EACnC,OAAO,MAAM;EACb,OAAO,MAAM,UAAU,eAAe,IAAI,MAAM,QAAQ,GAAG,KAAA;EAC3D,QAAQ,MAAM,UAAU;EACxB,QAAQ,MAAM;EACd,eAAe,MAAM;EACrB,OAAO,MAAM;EACb,aAAa,MAAM;EACnB,YACE,MAAM,eAAe,QAAQ,MAAM,iBAAiB,OAChD,MAAM,gBAAgB,MAAM,cAC5B,KAAA;EACN,aAAa,MAAM;EACnB,OAAO,MAAM,OAAO,KAAK,UAAU;GACjC,IAAI,KAAK;GACT,MAAM,KAAK;GACX,UAAU,KAAK,SAAS,SAAS,KAAK,QAAQ,KAAA;GAC9C,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb,aAAa,KAAK;GAClB,YACE,KAAK,eAAe,QAAQ,KAAK,iBAAiB,OAC9C,KAAK,gBAAgB,KAAK,cAC1B,KAAA;GACP,EAAE;EACJ,EAAE;CAEH,MAAM,EAAE,YAAY,KAAK;AACzB,QAAO;EACL,MAAM,KAAK,IAAI;EACf,aAAa,KAAK,IAAI,QAAQ,KAAK,IAAI;EACvC,QAAQ,KAAK,OAAO,KAAK,UAAU,MAAM,MAAM;EAC/C,cAAc,cAAc;EAC5B,MAAM,KAAK,KAAK,KAAK,UAAU,MAAM,QAAQ;EAC7C;EACA,YAAY,QAAQ;EACpB,cAAc,KAAK,IACjB,GACA,QAAQ,aAAa,QAAQ,iBAAiB,QAAQ,kBAAkB,QAAQ,kBACjF;EACD,WAAW,QAAQ;EACnB,YAAY,QAAQ;EACpB,cAAc,QAAQ;EACtB,YAAY,QAAQ;EACpB,QAAQ,qBAAqB,KAAK,IAAI,OAAO;EAC9C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
|
+
import type { BuildChildToolsOptions } from '../../agent/child-agent-factory.js';
|
|
3
|
+
import type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';
|
|
4
|
+
import type { WorkflowDefinition, WorkflowRunDefinitionSnapshot, WorkflowRunInputEnvelope, WorkflowRunMetadata, WorkflowRunSource } from '../domain/index.js';
|
|
5
|
+
import { WorkflowRunStore } from '../store/run-store.js';
|
|
6
|
+
import type { WorkflowSessionBridge } from './workflow-session-bridge.js';
|
|
7
|
+
export type { CancelWorkflowRunResult, CancelWorkflowRunServiceParams, CancelWorkflowRunServiceResult, RetryWorkflowRunServiceParams, StartWorkflowRunServiceParams, StartWorkflowRunServiceResult, WorkflowRunServiceErrorCode, WorkflowRunServiceErrorResult, WorkflowRunServiceResult, } from './workflow-run-service.types.js';
|
|
8
|
+
import type { CancelWorkflowRunResult, CancelWorkflowRunServiceParams, RetryWorkflowRunServiceParams, StartWorkflowRunServiceParams, WorkflowRunServiceResult } from './workflow-run-service.types.js';
|
|
9
|
+
export interface WorkflowRunServiceOptions {
|
|
10
|
+
service: GatewayWorkflowHost;
|
|
11
|
+
sessionBridge: WorkflowSessionBridge;
|
|
12
|
+
buildChildTools: (childOptions: BuildChildToolsOptions) => AgentTool<any, any>[];
|
|
13
|
+
}
|
|
14
|
+
export declare class WorkflowRunService {
|
|
15
|
+
private readonly options;
|
|
16
|
+
private readonly activeRuns;
|
|
17
|
+
constructor(options: WorkflowRunServiceOptions);
|
|
18
|
+
startWorkflowRun(params: StartWorkflowRunServiceParams): Promise<WorkflowRunServiceResult>;
|
|
19
|
+
retryWorkflowRun(params: RetryWorkflowRunServiceParams): Promise<WorkflowRunServiceResult>;
|
|
20
|
+
cancelWorkflowRun(params: CancelWorkflowRunServiceParams): Promise<CancelWorkflowRunResult>;
|
|
21
|
+
createRunStore(agentId: string): WorkflowRunStore;
|
|
22
|
+
private loadDefinition;
|
|
23
|
+
private createWorkflowEngine;
|
|
24
|
+
}
|
|
25
|
+
export declare function buildWorkflowRunInputEnvelope(input: unknown, goal?: string): WorkflowRunInputEnvelope;
|
|
26
|
+
export declare function buildWorkflowRunMetadata(params: {
|
|
27
|
+
definition: WorkflowDefinition;
|
|
28
|
+
agentId: string;
|
|
29
|
+
sessionKey: string;
|
|
30
|
+
source: WorkflowRunSource;
|
|
31
|
+
input: WorkflowRunInputEnvelope;
|
|
32
|
+
retryOfRunId?: string;
|
|
33
|
+
idempotencyKey?: string;
|
|
34
|
+
}): WorkflowRunMetadata;
|
|
35
|
+
export declare function buildWorkflowRunDefinitionSnapshot(definition: WorkflowDefinition): WorkflowRunDefinitionSnapshot;
|
|
36
|
+
export declare function extractWorkflowRunSessionKey(source: WorkflowRunSource): string | null;
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { extractProfileAgentId } from "../../config/agent-profile.js";
|
|
2
|
+
import { init_providers, resolveModel } from "../../providers/index.js";
|
|
3
|
+
import { createWorkflowCatalog } from "../../agent/workflow/catalog.js";
|
|
4
|
+
import { DelegateSubagentRunner } from "../../agent/workflow/subagent-runner.js";
|
|
5
|
+
import { resolveModelRef } from "../../config/agent-typed-models.js";
|
|
6
|
+
import { buildWorkflowDefinition } from "../domain/definition-utils.js";
|
|
7
|
+
import { isTerminalWorkflowRunStatus } from "../domain/run.js";
|
|
8
|
+
import "../domain/index.js";
|
|
9
|
+
import { WorkflowEngine } from "../engine/workflow-engine.js";
|
|
10
|
+
import "../engine/index.js";
|
|
11
|
+
import { WorkflowEventStore } from "../store/event-store.js";
|
|
12
|
+
import { WorkflowRunStore } from "../store/run-store.js";
|
|
13
|
+
import { randomUUID } from "node:crypto";
|
|
14
|
+
//#region src/workflows/service/workflow-run-service.ts
|
|
15
|
+
init_providers();
|
|
16
|
+
var WorkflowRunService = class {
|
|
17
|
+
activeRuns = /* @__PURE__ */ new Map();
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.options = options;
|
|
20
|
+
}
|
|
21
|
+
async startWorkflowRun(params) {
|
|
22
|
+
const definition = this.loadDefinition(params.definitionId);
|
|
23
|
+
if (!definition) return {
|
|
24
|
+
ok: false,
|
|
25
|
+
code: "definition_not_found",
|
|
26
|
+
message: "Workflow definition not found",
|
|
27
|
+
httpStatus: 404
|
|
28
|
+
};
|
|
29
|
+
const runId = randomUUID();
|
|
30
|
+
const goal = params.goal ?? "";
|
|
31
|
+
const { sessionKey } = await this.options.sessionBridge.prepareRunSession({
|
|
32
|
+
runId,
|
|
33
|
+
agentId: params.agentId,
|
|
34
|
+
definitionId: params.definitionId,
|
|
35
|
+
definitionTitle: definition.title,
|
|
36
|
+
goal,
|
|
37
|
+
parentSessionKey: params.parentSessionKey
|
|
38
|
+
});
|
|
39
|
+
const source = normalizeWorkflowRunSourceForSession(params.source, sessionKey, params.parentSessionKey);
|
|
40
|
+
const abortController = new AbortController();
|
|
41
|
+
const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);
|
|
42
|
+
const runStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);
|
|
43
|
+
const engine = this.createWorkflowEngine({
|
|
44
|
+
eventStore,
|
|
45
|
+
runStore,
|
|
46
|
+
sessionKey
|
|
47
|
+
});
|
|
48
|
+
const inputEnvelope = params.inputEnvelope ?? buildWorkflowRunInputEnvelope(params.input, params.goal);
|
|
49
|
+
this.activeRuns.set(runId, abortController);
|
|
50
|
+
engine.startRun(definition, {
|
|
51
|
+
runId,
|
|
52
|
+
input: inputEnvelope.payload,
|
|
53
|
+
goal: inputEnvelope.goal ?? params.goal,
|
|
54
|
+
source,
|
|
55
|
+
metadata: buildWorkflowRunMetadata({
|
|
56
|
+
definition,
|
|
57
|
+
agentId: params.agentId,
|
|
58
|
+
sessionKey,
|
|
59
|
+
source,
|
|
60
|
+
input: inputEnvelope,
|
|
61
|
+
retryOfRunId: params.retryOfRunId,
|
|
62
|
+
idempotencyKey: params.idempotencyKey
|
|
63
|
+
}),
|
|
64
|
+
signal: abortController.signal,
|
|
65
|
+
concurrency: params.concurrency,
|
|
66
|
+
maxSubagents: params.maxSubagents,
|
|
67
|
+
tokenBudget: params.tokenBudget
|
|
68
|
+
}).catch((err) => {
|
|
69
|
+
this.options.service.emit("workflow.run.error", {
|
|
70
|
+
runId,
|
|
71
|
+
error: err instanceof Error ? err.message : String(err)
|
|
72
|
+
});
|
|
73
|
+
}).finally(() => {
|
|
74
|
+
this.activeRuns.delete(runId);
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
ok: true,
|
|
78
|
+
runId,
|
|
79
|
+
sessionKey
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async retryWorkflowRun(params) {
|
|
83
|
+
const existing = await this.createRunStore(params.agentId).readRunView(params.runId);
|
|
84
|
+
if (!existing) return {
|
|
85
|
+
ok: false,
|
|
86
|
+
code: "run_not_found",
|
|
87
|
+
message: "Workflow run not found",
|
|
88
|
+
httpStatus: 404
|
|
89
|
+
};
|
|
90
|
+
const parentSessionKey = existing.run.source.kind === "chat" ? existing.run.source.sessionKey : void 0;
|
|
91
|
+
return this.startWorkflowRun({
|
|
92
|
+
agentId: params.agentId,
|
|
93
|
+
definitionId: existing.run.definitionId,
|
|
94
|
+
input: existing.run.input,
|
|
95
|
+
goal: existing.run.goal,
|
|
96
|
+
source: existing.run.source,
|
|
97
|
+
parentSessionKey,
|
|
98
|
+
retryOfRunId: existing.run.id
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async cancelWorkflowRun(params) {
|
|
102
|
+
const controller = this.activeRuns.get(params.runId);
|
|
103
|
+
if (controller) {
|
|
104
|
+
controller.abort();
|
|
105
|
+
this.activeRuns.delete(params.runId);
|
|
106
|
+
return {
|
|
107
|
+
ok: true,
|
|
108
|
+
cancelled: true
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const runStore = this.createRunStore(params.agentId);
|
|
112
|
+
const view = await runStore.readRunView(params.runId);
|
|
113
|
+
if (!view) return {
|
|
114
|
+
ok: false,
|
|
115
|
+
code: "run_not_found",
|
|
116
|
+
message: "Workflow run not found",
|
|
117
|
+
httpStatus: 404
|
|
118
|
+
};
|
|
119
|
+
if (isTerminalWorkflowRunStatus(view.run.status)) return {
|
|
120
|
+
ok: true,
|
|
121
|
+
cancelled: true,
|
|
122
|
+
alreadyFinished: true
|
|
123
|
+
};
|
|
124
|
+
await new WorkflowEventStore(this.options.service.currentConfig, params.agentId).append({
|
|
125
|
+
runId: params.runId,
|
|
126
|
+
type: "run_cancelled",
|
|
127
|
+
payload: { reason: params.reason ?? "Cancelled by user" }
|
|
128
|
+
});
|
|
129
|
+
const updated = await runStore.rebuildRunView(params.runId);
|
|
130
|
+
if (updated) {
|
|
131
|
+
this.options.service.emit("workflow.run.updated", {
|
|
132
|
+
runId: params.runId,
|
|
133
|
+
view: updated
|
|
134
|
+
});
|
|
135
|
+
this.options.sessionBridge.handleRunViewUpdated(updated);
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
ok: true,
|
|
139
|
+
cancelled: true
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
createRunStore(agentId) {
|
|
143
|
+
const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);
|
|
144
|
+
return new WorkflowRunStore(this.options.service.currentConfig, agentId, eventStore);
|
|
145
|
+
}
|
|
146
|
+
loadDefinition(definitionId) {
|
|
147
|
+
const catalog = createWorkflowCatalog();
|
|
148
|
+
try {
|
|
149
|
+
const loaded = catalog.load(definitionId);
|
|
150
|
+
return buildWorkflowDefinition({
|
|
151
|
+
name: loaded.name,
|
|
152
|
+
source: loaded.source,
|
|
153
|
+
script: loaded.script,
|
|
154
|
+
meta: loaded.meta
|
|
155
|
+
});
|
|
156
|
+
} catch {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
createWorkflowEngine(params) {
|
|
161
|
+
const gatewayService = this.options.service;
|
|
162
|
+
const runner = new DelegateSubagentRunner({
|
|
163
|
+
workspace: gatewayService.currentWorkspacePath,
|
|
164
|
+
bus: gatewayService.messageBusInstance,
|
|
165
|
+
getDefaultModel: () => resolveModel(gatewayService.agentService.getModelForSession(params.sessionKey)),
|
|
166
|
+
getConfig: () => gatewayService.currentConfig,
|
|
167
|
+
buildChildTools: (childOptions) => this.options.buildChildTools(childOptions)
|
|
168
|
+
});
|
|
169
|
+
return new WorkflowEngine({
|
|
170
|
+
cwd: gatewayService.currentWorkspacePath,
|
|
171
|
+
eventStore: params.eventStore,
|
|
172
|
+
runStore: params.runStore,
|
|
173
|
+
runner,
|
|
174
|
+
resolveModelId: (modelId) => {
|
|
175
|
+
const agentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);
|
|
176
|
+
return resolveModel(resolveModelRef(gatewayService.currentConfig, agentId, modelId));
|
|
177
|
+
},
|
|
178
|
+
onEventAppended: (event) => {
|
|
179
|
+
gatewayService.emit("workflow.event.appended", {
|
|
180
|
+
runId: event.runId,
|
|
181
|
+
event
|
|
182
|
+
});
|
|
183
|
+
},
|
|
184
|
+
onRunViewUpdated: (view) => {
|
|
185
|
+
gatewayService.emit("workflow.run.updated", {
|
|
186
|
+
runId: view.run.id,
|
|
187
|
+
view
|
|
188
|
+
});
|
|
189
|
+
this.options.sessionBridge.handleRunViewUpdated(view);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
function normalizeWorkflowRunSourceForSession(source, workflowSessionKey, parentSessionKey) {
|
|
195
|
+
if (parentSessionKey?.trim()) return {
|
|
196
|
+
kind: "chat",
|
|
197
|
+
sessionKey: parentSessionKey.trim()
|
|
198
|
+
};
|
|
199
|
+
if (source.kind === "webui") return {
|
|
200
|
+
...source,
|
|
201
|
+
sessionKey: workflowSessionKey
|
|
202
|
+
};
|
|
203
|
+
if (source.kind === "chat") return source;
|
|
204
|
+
return source;
|
|
205
|
+
}
|
|
206
|
+
function buildWorkflowRunInputEnvelope(input, goal) {
|
|
207
|
+
if (isWorkflowRunInputEnvelope(input)) return input;
|
|
208
|
+
return {
|
|
209
|
+
payload: input ?? {},
|
|
210
|
+
goal
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function buildWorkflowRunMetadata(params) {
|
|
214
|
+
return {
|
|
215
|
+
sessionKey: params.sessionKey,
|
|
216
|
+
triggerSource: params.source.kind,
|
|
217
|
+
agentId: params.agentId,
|
|
218
|
+
retryOfRunId: params.retryOfRunId,
|
|
219
|
+
definition: buildWorkflowRunDefinitionSnapshot(params.definition),
|
|
220
|
+
input: params.input,
|
|
221
|
+
correlation: { idempotencyKey: params.idempotencyKey },
|
|
222
|
+
origin: buildWorkflowRunOrigin(params.source),
|
|
223
|
+
schedule: params.source.kind === "cron" ? {
|
|
224
|
+
scheduleId: params.source.scheduleId,
|
|
225
|
+
fireId: params.source.fireId
|
|
226
|
+
} : void 0
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function buildWorkflowRunDefinitionSnapshot(definition) {
|
|
230
|
+
return {
|
|
231
|
+
id: definition.id,
|
|
232
|
+
name: definition.name,
|
|
233
|
+
title: definition.title,
|
|
234
|
+
version: definition.version,
|
|
235
|
+
source: definition.metadata.source,
|
|
236
|
+
tags: [...definition.metadata.tags],
|
|
237
|
+
phaseCount: definition.phases.length,
|
|
238
|
+
estimatedAgents: definition.metadata.estimatedAgents
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function extractWorkflowRunSessionKey(source) {
|
|
242
|
+
if ("sessionKey" in source && typeof source.sessionKey === "string" && source.sessionKey.trim()) return source.sessionKey.trim();
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
function buildWorkflowRunOrigin(source) {
|
|
246
|
+
switch (source.kind) {
|
|
247
|
+
case "chat": return {
|
|
248
|
+
channel: "chat",
|
|
249
|
+
sessionKey: source.sessionKey,
|
|
250
|
+
messageId: source.messageId
|
|
251
|
+
};
|
|
252
|
+
case "webui": return {
|
|
253
|
+
channel: "webui",
|
|
254
|
+
sessionKey: source.sessionKey
|
|
255
|
+
};
|
|
256
|
+
case "cron": return {
|
|
257
|
+
channel: "cron",
|
|
258
|
+
scheduleId: source.scheduleId,
|
|
259
|
+
fireId: source.fireId
|
|
260
|
+
};
|
|
261
|
+
case "api": return {
|
|
262
|
+
channel: "api",
|
|
263
|
+
requestId: source.requestId
|
|
264
|
+
};
|
|
265
|
+
case "im": return {
|
|
266
|
+
channel: source.channel,
|
|
267
|
+
chatId: source.chatId,
|
|
268
|
+
messageId: source.messageId
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function isWorkflowRunInputEnvelope(input) {
|
|
273
|
+
if (!input || typeof input !== "object" || Array.isArray(input)) return false;
|
|
274
|
+
return "payload" in input || "variables" in input || "context" in input;
|
|
275
|
+
}
|
|
276
|
+
//#endregion
|
|
277
|
+
export { WorkflowRunService, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, extractWorkflowRunSessionKey };
|
|
278
|
+
|
|
279
|
+
//# sourceMappingURL=workflow-run-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-run-service.js","names":["resolveModelById"],"sources":["../../../../src/workflows/service/workflow-run-service.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\n\nimport type { BuildChildToolsOptions } from '../../agent/child-agent-factory.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport { resolveModelRef } from '../../config/agent-typed-models.js';\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { resolveModel as resolveModelById } from '../../providers/index.js';\nimport { createWorkflowCatalog } from '../../agent/workflow/catalog.js';\nimport { DelegateSubagentRunner } from '../../agent/workflow/subagent-runner.js';\nimport type {\n WorkflowDefinition,\n WorkflowRunDefinitionSnapshot,\n WorkflowRunInputEnvelope,\n WorkflowRunMetadata,\n WorkflowRunSource,\n} from '../domain/index.js';\nimport { buildWorkflowDefinition, isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { WorkflowEngine } from '../engine/index.js';\nimport { WorkflowEventStore } from '../store/event-store.js';\nimport { WorkflowRunStore } from '../store/run-store.js';\nimport type { WorkflowSessionBridge } from './workflow-session-bridge.js';\nexport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n CancelWorkflowRunServiceResult,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n StartWorkflowRunServiceResult,\n WorkflowRunServiceErrorCode,\n WorkflowRunServiceErrorResult,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\n\nimport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\n\nexport interface WorkflowRunServiceOptions {\n service: GatewayWorkflowHost;\n sessionBridge: WorkflowSessionBridge;\n buildChildTools: (childOptions: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\nexport class WorkflowRunService {\n private readonly activeRuns = new Map<string, AbortController>();\n\n constructor(private readonly options: WorkflowRunServiceOptions) {}\n\n async startWorkflowRun(params: StartWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const definition = this.loadDefinition(params.definitionId);\n if (!definition) {\n return {\n ok: false,\n code: 'definition_not_found',\n message: 'Workflow definition not found',\n httpStatus: 404,\n };\n }\n\n const runId = randomUUID();\n const goal = params.goal ?? '';\n const { sessionKey } = await this.options.sessionBridge.prepareRunSession({\n runId,\n agentId: params.agentId,\n definitionId: params.definitionId,\n definitionTitle: definition.title,\n goal,\n parentSessionKey: params.parentSessionKey,\n });\n const source = normalizeWorkflowRunSourceForSession(params.source, sessionKey, params.parentSessionKey);\n const abortController = new AbortController();\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n const runStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);\n const engine = this.createWorkflowEngine({\n eventStore,\n runStore,\n sessionKey,\n });\n const inputEnvelope = params.inputEnvelope ?? buildWorkflowRunInputEnvelope(params.input, params.goal);\n\n this.activeRuns.set(runId, abortController);\n void engine.startRun(definition, {\n runId,\n input: inputEnvelope.payload,\n goal: inputEnvelope.goal ?? params.goal,\n source,\n metadata: buildWorkflowRunMetadata({\n definition,\n agentId: params.agentId,\n sessionKey,\n source,\n input: inputEnvelope,\n retryOfRunId: params.retryOfRunId,\n idempotencyKey: params.idempotencyKey,\n }),\n signal: abortController.signal,\n concurrency: params.concurrency,\n maxSubagents: params.maxSubagents,\n tokenBudget: params.tokenBudget,\n }).catch((err) => {\n this.options.service.emit('workflow.run.error', {\n runId,\n error: err instanceof Error ? err.message : String(err),\n });\n }).finally(() => {\n this.activeRuns.delete(runId);\n });\n\n return { ok: true, runId, sessionKey };\n }\n\n async retryWorkflowRun(params: RetryWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const runStore = this.createRunStore(params.agentId);\n const existing = await runStore.readRunView(params.runId);\n if (!existing) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n const parentSessionKey =\n existing.run.source.kind === 'chat' ? existing.run.source.sessionKey : undefined;\n\n return this.startWorkflowRun({\n agentId: params.agentId,\n definitionId: existing.run.definitionId,\n input: existing.run.input,\n goal: existing.run.goal,\n source: existing.run.source,\n parentSessionKey,\n retryOfRunId: existing.run.id,\n });\n }\n\n async cancelWorkflowRun(params: CancelWorkflowRunServiceParams): Promise<CancelWorkflowRunResult> {\n const controller = this.activeRuns.get(params.runId);\n if (controller) {\n controller.abort();\n this.activeRuns.delete(params.runId);\n return { ok: true, cancelled: true };\n }\n\n const runStore = this.createRunStore(params.agentId);\n const view = await runStore.readRunView(params.runId);\n if (!view) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n if (isTerminalWorkflowRunStatus(view.run.status)) {\n return { ok: true, cancelled: true, alreadyFinished: true };\n }\n\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n await eventStore.append({\n runId: params.runId,\n type: 'run_cancelled',\n payload: { reason: params.reason ?? 'Cancelled by user' },\n });\n const updated = await runStore.rebuildRunView(params.runId);\n if (updated) {\n this.options.service.emit('workflow.run.updated', { runId: params.runId, view: updated });\n void this.options.sessionBridge.handleRunViewUpdated(updated);\n }\n return { ok: true, cancelled: true };\n }\n\n createRunStore(agentId: string): WorkflowRunStore {\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);\n return new WorkflowRunStore(this.options.service.currentConfig, agentId, eventStore);\n }\n\n private loadDefinition(definitionId: string): WorkflowDefinition | null {\n const catalog = createWorkflowCatalog();\n try {\n const loaded = catalog.load(definitionId);\n return buildWorkflowDefinition({\n name: loaded.name,\n source: loaded.source,\n script: loaded.script,\n meta: loaded.meta,\n });\n } catch {\n return null;\n }\n }\n\n private createWorkflowEngine(params: {\n eventStore: WorkflowEventStore;\n runStore: WorkflowRunStore;\n sessionKey: string;\n }): WorkflowEngine {\n const gatewayService = this.options.service;\n const runner = new DelegateSubagentRunner({\n workspace: gatewayService.currentWorkspacePath,\n bus: gatewayService.messageBusInstance,\n getDefaultModel: () => resolveModelById(gatewayService.agentService.getModelForSession(params.sessionKey)),\n getConfig: () => gatewayService.currentConfig,\n buildChildTools: (childOptions) => this.options.buildChildTools(childOptions),\n });\n\n return new WorkflowEngine({\n cwd: gatewayService.currentWorkspacePath,\n eventStore: params.eventStore,\n runStore: params.runStore,\n runner,\n resolveModelId: (modelId) => {\n const agentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);\n return resolveModelById(resolveModelRef(gatewayService.currentConfig, agentId, modelId));\n },\n onEventAppended: (event) => {\n gatewayService.emit('workflow.event.appended', { runId: event.runId, event });\n },\n onRunViewUpdated: (view) => {\n gatewayService.emit('workflow.run.updated', { runId: view.run.id, view });\n void this.options.sessionBridge.handleRunViewUpdated(view);\n },\n });\n }\n}\n\nfunction normalizeWorkflowRunSourceForSession(\n source: WorkflowRunSource,\n workflowSessionKey: string,\n parentSessionKey?: string,\n): WorkflowRunSource {\n if (parentSessionKey?.trim()) {\n return { kind: 'chat', sessionKey: parentSessionKey.trim() };\n }\n if (source.kind === 'webui') {\n return { ...source, sessionKey: workflowSessionKey };\n }\n if (source.kind === 'chat') {\n return source;\n }\n return source;\n}\n\nexport function buildWorkflowRunInputEnvelope(input: unknown, goal?: string): WorkflowRunInputEnvelope {\n if (isWorkflowRunInputEnvelope(input)) {\n return input;\n }\n return {\n payload: input ?? {},\n goal,\n };\n}\n\nexport function buildWorkflowRunMetadata(params: {\n definition: WorkflowDefinition;\n agentId: string;\n sessionKey: string;\n source: WorkflowRunSource;\n input: WorkflowRunInputEnvelope;\n retryOfRunId?: string;\n idempotencyKey?: string;\n}): WorkflowRunMetadata {\n return {\n sessionKey: params.sessionKey,\n triggerSource: params.source.kind,\n agentId: params.agentId,\n retryOfRunId: params.retryOfRunId,\n definition: buildWorkflowRunDefinitionSnapshot(params.definition),\n input: params.input,\n correlation: {\n idempotencyKey: params.idempotencyKey,\n },\n origin: buildWorkflowRunOrigin(params.source),\n schedule: params.source.kind === 'cron'\n ? { scheduleId: params.source.scheduleId, fireId: params.source.fireId }\n : undefined,\n };\n}\n\nexport function buildWorkflowRunDefinitionSnapshot(definition: WorkflowDefinition): WorkflowRunDefinitionSnapshot {\n return {\n id: definition.id,\n name: definition.name,\n title: definition.title,\n version: definition.version,\n source: definition.metadata.source,\n tags: [...definition.metadata.tags],\n phaseCount: definition.phases.length,\n estimatedAgents: definition.metadata.estimatedAgents,\n };\n}\n\nexport function extractWorkflowRunSessionKey(source: WorkflowRunSource): string | null {\n if ('sessionKey' in source && typeof source.sessionKey === 'string' && source.sessionKey.trim()) {\n return source.sessionKey.trim();\n }\n return null;\n}\n\nfunction buildWorkflowRunOrigin(source: WorkflowRunSource): WorkflowRunMetadata['origin'] {\n switch (source.kind) {\n case 'chat':\n return { channel: 'chat', sessionKey: source.sessionKey, messageId: source.messageId };\n case 'webui':\n return { channel: 'webui', sessionKey: source.sessionKey };\n case 'cron':\n return { channel: 'cron', scheduleId: source.scheduleId, fireId: source.fireId };\n case 'api':\n return { channel: 'api', requestId: source.requestId };\n case 'im':\n return { channel: source.channel, chatId: source.chatId, messageId: source.messageId };\n }\n}\n\nfunction isWorkflowRunInputEnvelope(input: unknown): input is WorkflowRunInputEnvelope {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return false;\n }\n return 'payload' in input || 'variables' in input || 'context' in input;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { WorkflowRunInputEnvelope, WorkflowRunSource } from '../domain/index.js';
|
|
2
|
+
export interface StartWorkflowRunServiceParams {
|
|
3
|
+
agentId: string;
|
|
4
|
+
definitionId: string;
|
|
5
|
+
parentSessionKey?: string;
|
|
6
|
+
input?: unknown;
|
|
7
|
+
inputEnvelope?: WorkflowRunInputEnvelope;
|
|
8
|
+
goal?: string;
|
|
9
|
+
source: WorkflowRunSource;
|
|
10
|
+
concurrency?: number;
|
|
11
|
+
maxSubagents?: number;
|
|
12
|
+
tokenBudget?: number | null;
|
|
13
|
+
retryOfRunId?: string;
|
|
14
|
+
idempotencyKey?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface StartWorkflowRunServiceResult {
|
|
17
|
+
ok: true;
|
|
18
|
+
runId: string;
|
|
19
|
+
sessionKey: string;
|
|
20
|
+
}
|
|
21
|
+
export type WorkflowRunServiceErrorCode = 'definition_not_found' | 'run_not_found' | 'invalid_state';
|
|
22
|
+
export interface WorkflowRunServiceErrorResult {
|
|
23
|
+
ok: false;
|
|
24
|
+
code: WorkflowRunServiceErrorCode;
|
|
25
|
+
message: string;
|
|
26
|
+
httpStatus: 400 | 404 | 409;
|
|
27
|
+
}
|
|
28
|
+
export type WorkflowRunServiceResult = StartWorkflowRunServiceResult | WorkflowRunServiceErrorResult;
|
|
29
|
+
export interface RetryWorkflowRunServiceParams {
|
|
30
|
+
agentId: string;
|
|
31
|
+
runId: string;
|
|
32
|
+
}
|
|
33
|
+
export interface CancelWorkflowRunServiceParams {
|
|
34
|
+
agentId: string;
|
|
35
|
+
runId: string;
|
|
36
|
+
reason?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface CancelWorkflowRunServiceResult {
|
|
39
|
+
ok: true;
|
|
40
|
+
cancelled: boolean;
|
|
41
|
+
alreadyFinished?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export type CancelWorkflowRunResult = CancelWorkflowRunServiceResult | WorkflowRunServiceErrorResult;
|
|
44
|
+
/** Minimal surface for agent/cron callers (avoids importing the service class). */
|
|
45
|
+
export interface WorkflowRunServiceLike {
|
|
46
|
+
startWorkflowRun(params: StartWorkflowRunServiceParams): Promise<WorkflowRunServiceResult>;
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';
|
|
2
|
+
import type { WorkflowRunView } from '../domain/index.js';
|
|
3
|
+
export declare const WORKFLOW_SESSION_TYPE = "workflow";
|
|
4
|
+
export declare const WORKFLOW_RUN_LINK_CONTEXT_KIND = "workflow-run-link";
|
|
5
|
+
export interface PrepareWorkflowRunSessionParams {
|
|
6
|
+
runId: string;
|
|
7
|
+
agentId: string;
|
|
8
|
+
definitionId: string;
|
|
9
|
+
definitionTitle: string;
|
|
10
|
+
goal: string;
|
|
11
|
+
parentSessionKey?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface PrepareWorkflowRunSessionResult {
|
|
14
|
+
sessionKey: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class WorkflowSessionBridge {
|
|
17
|
+
private readonly gateway;
|
|
18
|
+
private readonly terminalPersistedRunIds;
|
|
19
|
+
constructor(gateway: GatewayWorkflowHost);
|
|
20
|
+
prepareRunSession(params: PrepareWorkflowRunSessionParams): Promise<PrepareWorkflowRunSessionResult>;
|
|
21
|
+
handleRunViewUpdated(view: WorkflowRunView): Promise<void>;
|
|
22
|
+
private persistTerminalTranscript;
|
|
23
|
+
private writeParentRunLink;
|
|
24
|
+
}
|
|
25
|
+
export declare function formatParentRunLinkText(params: {
|
|
26
|
+
definitionId: string;
|
|
27
|
+
goal: string;
|
|
28
|
+
status: WorkflowRunView['run']['status'];
|
|
29
|
+
}): string;
|