@agimon-ai/doompi-workflow 0.0.1-alpha.73 → 0.0.1-alpha.76
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 +4 -2
- package/README.md +8 -5
- package/package.json +19 -18
- package/src/types/webWorkflowTerminal.ts +7 -6
- package/dist/_virtual/_rolldown/runtime.cjs +0 -1
- package/dist/api-contracts.cjs +0 -1
- package/dist/api-contracts.d.cts +0 -2
- package/dist/api-contracts.d.mts +0 -2
- package/dist/api-contracts.mjs +0 -1
- package/dist/extensions/pi.cjs +0 -2
- package/dist/extensions/pi.cjs.map +0 -1
- package/dist/extensions/pi.d.cts +0 -6
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/pi.d.mts +0 -6
- package/dist/extensions/pi.d.mts.map +0 -1
- package/dist/extensions/pi.mjs +0 -2
- package/dist/extensions/pi.mjs.map +0 -1
- package/dist/extensions/server.cjs +0 -2
- package/dist/extensions/server.cjs.map +0 -1
- package/dist/extensions/server.d.cts +0 -5
- package/dist/extensions/server.d.cts.map +0 -1
- package/dist/extensions/server.d.mts +0 -5
- package/dist/extensions/server.d.mts.map +0 -1
- package/dist/extensions/server.mjs +0 -2
- package/dist/extensions/server.mjs.map +0 -1
- package/dist/index.cjs +0 -1
- package/dist/index.d.cts +0 -2
- package/dist/index.d.mts +0 -2
- package/dist/index.mjs +0 -1
- package/dist/src/constants/workflow.cjs +0 -2
- package/dist/src/constants/workflow.cjs.map +0 -1
- package/dist/src/constants/workflow.mjs +0 -2
- package/dist/src/constants/workflow.mjs.map +0 -1
- package/dist/src/controllers/serverRuntime.cjs +0 -2
- package/dist/src/controllers/serverRuntime.cjs.map +0 -1
- package/dist/src/controllers/serverRuntime.mjs +0 -2
- package/dist/src/controllers/serverRuntime.mjs.map +0 -1
- package/dist/src/controllers/workflowCatalogChannel.cjs +0 -2
- package/dist/src/controllers/workflowCatalogChannel.cjs.map +0 -1
- package/dist/src/controllers/workflowCatalogChannel.mjs +0 -2
- package/dist/src/controllers/workflowCatalogChannel.mjs.map +0 -1
- package/dist/src/controllers/workflowHubApi.cjs +0 -2
- package/dist/src/controllers/workflowHubApi.cjs.map +0 -1
- package/dist/src/controllers/workflowHubApi.mjs +0 -2
- package/dist/src/controllers/workflowHubApi.mjs.map +0 -1
- package/dist/src/controllers/workflowsHubChannel.cjs +0 -2
- package/dist/src/controllers/workflowsHubChannel.cjs.map +0 -1
- package/dist/src/controllers/workflowsHubChannel.mjs +0 -2
- package/dist/src/controllers/workflowsHubChannel.mjs.map +0 -1
- package/dist/src/schemas/apiContracts.cjs +0 -2
- package/dist/src/schemas/apiContracts.cjs.map +0 -1
- package/dist/src/schemas/apiContracts.d.cts +0 -53
- package/dist/src/schemas/apiContracts.d.cts.map +0 -1
- package/dist/src/schemas/apiContracts.d.mts +0 -53
- package/dist/src/schemas/apiContracts.d.mts.map +0 -1
- package/dist/src/schemas/apiContracts.mjs +0 -2
- package/dist/src/schemas/apiContracts.mjs.map +0 -1
- package/dist/src/schemas/workflowPi.cjs +0 -2
- package/dist/src/schemas/workflowPi.cjs.map +0 -1
- package/dist/src/schemas/workflowPi.d.cts +0 -1
- package/dist/src/schemas/workflowPi.d.mts +0 -1
- package/dist/src/schemas/workflowPi.mjs +0 -2
- package/dist/src/schemas/workflowPi.mjs.map +0 -1
- package/dist/src/services/backgroundWork/index.cjs +0 -2
- package/dist/src/services/backgroundWork/index.cjs.map +0 -1
- package/dist/src/services/backgroundWork/index.mjs +0 -2
- package/dist/src/services/backgroundWork/index.mjs.map +0 -1
- package/dist/src/services/piToolBridge/index.cjs +0 -11
- package/dist/src/services/piToolBridge/index.cjs.map +0 -1
- package/dist/src/services/piToolBridge/index.mjs +0 -11
- package/dist/src/services/piToolBridge/index.mjs.map +0 -1
- package/dist/src/services/webWorkflowCatalog/index.cjs +0 -2
- package/dist/src/services/webWorkflowCatalog/index.cjs.map +0 -1
- package/dist/src/services/webWorkflowCatalog/index.mjs +0 -2
- package/dist/src/services/webWorkflowCatalog/index.mjs.map +0 -1
- package/dist/src/services/workflowCatalogDeps/index.cjs +0 -2
- package/dist/src/services/workflowCatalogDeps/index.cjs.map +0 -1
- package/dist/src/services/workflowCatalogDeps/index.mjs +0 -2
- package/dist/src/services/workflowCatalogDeps/index.mjs.map +0 -1
- package/dist/src/services/workflowExecution/index.cjs +0 -2
- package/dist/src/services/workflowExecution/index.cjs.map +0 -1
- package/dist/src/services/workflowExecution/index.d.cts +0 -6
- package/dist/src/services/workflowExecution/index.d.mts +0 -6
- package/dist/src/services/workflowExecution/index.mjs +0 -2
- package/dist/src/services/workflowExecution/index.mjs.map +0 -1
- package/dist/src/services/workflowFence/index.cjs +0 -2
- package/dist/src/services/workflowFence/index.cjs.map +0 -1
- package/dist/src/services/workflowFence/index.mjs +0 -2
- package/dist/src/services/workflowFence/index.mjs.map +0 -1
- package/dist/src/services/workflowLaunchCommand/index.cjs +0 -2
- package/dist/src/services/workflowLaunchCommand/index.cjs.map +0 -1
- package/dist/src/services/workflowLaunchCommand/index.d.cts +0 -52
- package/dist/src/services/workflowLaunchCommand/index.d.cts.map +0 -1
- package/dist/src/services/workflowLaunchCommand/index.d.mts +0 -52
- package/dist/src/services/workflowLaunchCommand/index.d.mts.map +0 -1
- package/dist/src/services/workflowLaunchCommand/index.mjs +0 -2
- package/dist/src/services/workflowLaunchCommand/index.mjs.map +0 -1
- package/dist/src/services/workflowLauncher/index.cjs +0 -2
- package/dist/src/services/workflowLauncher/index.cjs.map +0 -1
- package/dist/src/services/workflowLauncher/index.mjs +0 -2
- package/dist/src/services/workflowLauncher/index.mjs.map +0 -1
- package/dist/src/services/workflowNarration/index.cjs +0 -2
- package/dist/src/services/workflowNarration/index.cjs.map +0 -1
- package/dist/src/services/workflowNarration/index.mjs +0 -2
- package/dist/src/services/workflowNarration/index.mjs.map +0 -1
- package/dist/src/services/workflowResource/index.cjs +0 -2
- package/dist/src/services/workflowResource/index.cjs.map +0 -1
- package/dist/src/services/workflowResource/index.mjs +0 -2
- package/dist/src/services/workflowResource/index.mjs.map +0 -1
- package/dist/src/services/workflowRuns/index.cjs +0 -3
- package/dist/src/services/workflowRuns/index.cjs.map +0 -1
- package/dist/src/services/workflowRuns/index.mjs +0 -3
- package/dist/src/services/workflowRuns/index.mjs.map +0 -1
- package/dist/src/services/workflowTerminal/index.cjs +0 -2
- package/dist/src/services/workflowTerminal/index.cjs.map +0 -1
- package/dist/src/services/workflowTerminal/index.mjs +0 -2
- package/dist/src/services/workflowTerminal/index.mjs.map +0 -1
- package/dist/src/services/workflowWatcher/index.cjs +0 -2
- package/dist/src/services/workflowWatcher/index.cjs.map +0 -1
- package/dist/src/services/workflowWatcher/index.mjs +0 -2
- package/dist/src/services/workflowWatcher/index.mjs.map +0 -1
- package/dist/src/tools/workflowTools.cjs +0 -5
- package/dist/src/tools/workflowTools.cjs.map +0 -1
- package/dist/src/tools/workflowTools.mjs +0 -5
- package/dist/src/tools/workflowTools.mjs.map +0 -1
- package/dist/src/tui/leader.cjs +0 -2
- package/dist/src/tui/leader.cjs.map +0 -1
- package/dist/src/tui/leader.mjs +0 -2
- package/dist/src/tui/leader.mjs.map +0 -1
- package/dist/src/tui/workflow/doomOverlay.cjs +0 -2
- package/dist/src/tui/workflow/doomOverlay.cjs.map +0 -1
- package/dist/src/tui/workflow/doomOverlay.mjs +0 -2
- package/dist/src/tui/workflow/doomOverlay.mjs.map +0 -1
- package/dist/src/tui/workflow/overlayText.cjs +0 -2
- package/dist/src/tui/workflow/overlayText.cjs.map +0 -1
- package/dist/src/tui/workflow/overlayText.mjs +0 -2
- package/dist/src/tui/workflow/overlayText.mjs.map +0 -1
- package/dist/src/tui/workflow/rendering.cjs +0 -2
- package/dist/src/tui/workflow/rendering.cjs.map +0 -1
- package/dist/src/tui/workflow/rendering.mjs +0 -2
- package/dist/src/tui/workflow/rendering.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowCatalog.cjs +0 -2
- package/dist/src/tui/workflow/workflowCatalog.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowCatalog.mjs +0 -2
- package/dist/src/tui/workflow/workflowCatalog.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowFinishedMessage.cjs +0 -3
- package/dist/src/tui/workflow/workflowFinishedMessage.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowFinishedMessage.mjs +0 -3
- package/dist/src/tui/workflow/workflowFinishedMessage.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowInspector.cjs +0 -2
- package/dist/src/tui/workflow/workflowInspector.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowInspector.mjs +0 -2
- package/dist/src/tui/workflow/workflowInspector.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowOverlay.cjs +0 -2
- package/dist/src/tui/workflow/workflowOverlay.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowOverlay.mjs +0 -2
- package/dist/src/tui/workflow/workflowOverlay.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowPicker.cjs +0 -2
- package/dist/src/tui/workflow/workflowPicker.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowPicker.mjs +0 -2
- package/dist/src/tui/workflow/workflowPicker.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowProgressOverlay.cjs +0 -2
- package/dist/src/tui/workflow/workflowProgressOverlay.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowProgressOverlay.mjs +0 -2
- package/dist/src/tui/workflow/workflowProgressOverlay.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowPrompt.cjs +0 -2
- package/dist/src/tui/workflow/workflowPrompt.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowPrompt.mjs +0 -2
- package/dist/src/tui/workflow/workflowPrompt.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowRunPanel.cjs +0 -2
- package/dist/src/tui/workflow/workflowRunPanel.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowRunPanel.mjs +0 -2
- package/dist/src/tui/workflow/workflowRunPanel.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowStatusRow.cjs +0 -2
- package/dist/src/tui/workflow/workflowStatusRow.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowStatusRow.mjs +0 -2
- package/dist/src/tui/workflow/workflowStatusRow.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowStepMessage.cjs +0 -2
- package/dist/src/tui/workflow/workflowStepMessage.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowStepMessage.mjs +0 -2
- package/dist/src/tui/workflow/workflowStepMessage.mjs.map +0 -1
- package/dist/src/tui/workflow/workflowToolRender.cjs +0 -7
- package/dist/src/tui/workflow/workflowToolRender.cjs.map +0 -1
- package/dist/src/tui/workflow/workflowToolRender.mjs +0 -7
- package/dist/src/tui/workflow/workflowToolRender.mjs.map +0 -1
- package/dist/src/tui/workflowRuntime.cjs +0 -9
- package/dist/src/tui/workflowRuntime.cjs.map +0 -1
- package/dist/src/tui/workflowRuntime.d.cts +0 -33
- package/dist/src/tui/workflowRuntime.d.cts.map +0 -1
- package/dist/src/tui/workflowRuntime.d.mts +0 -33
- package/dist/src/tui/workflowRuntime.d.mts.map +0 -1
- package/dist/src/tui/workflowRuntime.mjs +0 -9
- package/dist/src/tui/workflowRuntime.mjs.map +0 -1
- package/dist/src/types/webWorkflowTerminal.cjs +0 -2
- package/dist/src/types/webWorkflowTerminal.cjs.map +0 -1
- package/dist/src/types/webWorkflowTerminal.mjs +0 -2
- package/dist/src/types/webWorkflowTerminal.mjs.map +0 -1
- package/dist/src/types/webWorkflows.cjs +0 -2
- package/dist/src/types/webWorkflows.cjs.map +0 -1
- package/dist/src/types/webWorkflows.mjs +0 -2
- package/dist/src/types/webWorkflows.mjs.map +0 -1
- package/src/extensions/web.ts +0 -80
- package/src/web/api/terminalApi.ts +0 -208
- package/src/web/components/ArtifactsPane.tsx +0 -451
- package/src/web/components/LaunchWorkflowDialog.tsx +0 -259
- package/src/web/components/StepTerminalPanel.tsx +0 -243
- package/src/web/components/WorkflowCatalogDrawer.tsx +0 -229
- package/src/web/components/WorkflowToolMessage.tsx +0 -55
- package/src/web/components/WorkflowsActivitySection.tsx +0 -155
- package/src/web/components/WorkflowsPanel.tsx +0 -750
- package/src/web/lib/launchLine.ts +0 -66
- package/src/web/lib/runDuration.ts +0 -15
- package/src/web/lib/workflowActivity.ts +0 -102
- package/src/web/lib/workflowToolRender.ts +0 -585
- package/src/web/stores/catalogStore.ts +0 -123
- package/src/web/stores/workflowsStore.ts +0 -91
- package/src/web/tsconfig.json +0 -22
- /package/{src/web/LICENSE → LICENSE.web} +0 -0
package/LICENSE
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
Portions of this software are licensed as follows:
|
|
2
2
|
|
|
3
|
-
*
|
|
4
|
-
|
|
3
|
+
* The browser half of this package, meaning every ".web" routed file under
|
|
4
|
+
"src/extensions" and the "_components" and "_lib" modules colocated with
|
|
5
|
+
one, is licensed under the DoomPi Web License defined in "LICENSE.web":
|
|
6
|
+
free to use, not to redistribute.
|
|
5
7
|
* All other content is licensed under the MIT license below.
|
|
6
8
|
|
|
7
9
|
MIT License
|
package/README.md
CHANGED
|
@@ -117,17 +117,20 @@ Maintained by [Agimon](https://agimon.ai/about).
|
|
|
117
117
|
|
|
118
118
|
## Web cockpit plugin
|
|
119
119
|
|
|
120
|
-
The `src/
|
|
121
|
-
workflows group opens in a temporary tab,
|
|
122
|
-
compiled into the cockpit bundle by
|
|
120
|
+
The `.web` routed files under `src/extensions/workspaces/sessions/(frontend)` are this package's
|
|
121
|
+
DoomPi web cockpit plugin: the workflows panel the dock's workflows group opens in a temporary tab,
|
|
122
|
+
its store, and its `workflow_runs` session channel, compiled into the cockpit bundle by
|
|
123
|
+
`doompi-web`'s build. Each surface keeps its components in a colocated `_components` folder and its
|
|
124
|
+
stores and helpers in `_lib`.
|
|
123
125
|
The hub-side data source ships behind the `./web-hub` subpath and reads the workflow registry
|
|
124
126
|
(run.json plus progress.ndjson) exactly as the engine writes it. Both halves are declared by the
|
|
125
127
|
`doompiWeb` block in package.json.
|
|
126
128
|
|
|
127
129
|
## License
|
|
128
130
|
|
|
129
|
-
MIT, except the
|
|
130
|
-
`
|
|
131
|
+
MIT, except this package's browser half (the `.web` routed files under `src/extensions` and the
|
|
132
|
+
`_components` and `_lib` modules colocated with one), which is source available under the DoomPi
|
|
133
|
+
Web License (see `LICENSE.web`): free to use, including commercially, but not to redistribute.
|
|
131
134
|
|
|
132
135
|
Workflow's host entries live in `src/extensions/pi.ts`, `server.ts`, and `web.ts`.
|
|
133
136
|
`src/exports` exposes reusable package APIs. Controllers declare server APIs and
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-workflow",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.76",
|
|
4
4
|
"description": "GitHub Actions-style workflow graphs, artifacts, recovery, and asynchronous runs for DoomPi.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -31,11 +31,8 @@
|
|
|
31
31
|
"README.md",
|
|
32
32
|
"src/prompts",
|
|
33
33
|
"skills/workflow-recovery/SKILL.md",
|
|
34
|
-
"src/web",
|
|
35
|
-
"src/extensions/web.ts",
|
|
36
34
|
"src/types/webWorkflows.ts",
|
|
37
|
-
"src/types/webWorkflowTerminal.ts"
|
|
38
|
-
"!src/web/**/*.stories.tsx"
|
|
35
|
+
"src/types/webWorkflowTerminal.ts"
|
|
39
36
|
],
|
|
40
37
|
"type": "module",
|
|
41
38
|
"main": "./dist/index.cjs",
|
|
@@ -57,19 +54,22 @@
|
|
|
57
54
|
"import": "./dist/extensions/server.mjs",
|
|
58
55
|
"require": "./dist/extensions/server.cjs"
|
|
59
56
|
},
|
|
60
|
-
"./
|
|
61
|
-
|
|
57
|
+
"./extensions/web": {
|
|
58
|
+
"import": "./dist/extensions/web.mjs"
|
|
59
|
+
},
|
|
60
|
+
"./skills/workflow-recovery/SKILL.md": "./skills/workflow-recovery/SKILL.md",
|
|
61
|
+
"./package.json": "./package.json"
|
|
62
62
|
},
|
|
63
63
|
"publishConfig": {
|
|
64
64
|
"access": "public"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@agimon-ai/doompi-core": "0.0.1-alpha.
|
|
68
|
-
"@agimon-ai/doompi-minor-mode": "0.0.1-alpha.
|
|
69
|
-
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.
|
|
70
|
-
"@agimon-ai/doompi-ui": "0.0.1-alpha.
|
|
71
|
-
"@agimon-ai/doompi-web-components": "0.0.1-alpha.
|
|
72
|
-
"@agimon-ai/doompi-web-security": "0.0.1-alpha.
|
|
67
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.75",
|
|
68
|
+
"@agimon-ai/doompi-minor-mode": "0.0.1-alpha.75",
|
|
69
|
+
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.72",
|
|
70
|
+
"@agimon-ai/doompi-ui": "0.0.1-alpha.75",
|
|
71
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.33",
|
|
72
|
+
"@agimon-ai/doompi-web-security": "0.0.1-alpha.35",
|
|
73
73
|
"@agimon-ai/workflow-mcp": "0.23.26",
|
|
74
74
|
"@deepseek-ai/cordis": "4.0.2",
|
|
75
75
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
@@ -78,6 +78,7 @@
|
|
|
78
78
|
"zod": "4.6.2"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
+
"@agimon-ai/doompi-build": "0.0.1-alpha.4",
|
|
81
82
|
"@earendil-works/pi-coding-agent": "0.85.1",
|
|
82
83
|
"@earendil-works/pi-tui": "0.85.1",
|
|
83
84
|
"@tanstack/react-store": "0.11.1",
|
|
@@ -108,7 +109,7 @@
|
|
|
108
109
|
"node": ">=22.19.0"
|
|
109
110
|
},
|
|
110
111
|
"doompiServer": {
|
|
111
|
-
"entry": "./
|
|
112
|
+
"entry": "./generated/server.ts",
|
|
112
113
|
"dist": "./dist/extensions/server.mjs",
|
|
113
114
|
"scopes": [
|
|
114
115
|
"global",
|
|
@@ -123,10 +124,10 @@
|
|
|
123
124
|
"doompiWeb": {
|
|
124
125
|
"pluginId": "workflows",
|
|
125
126
|
"channels": [
|
|
126
|
-
"
|
|
127
|
-
"
|
|
127
|
+
"workflow_catalog",
|
|
128
|
+
"workflow_runs"
|
|
128
129
|
],
|
|
129
|
-
"client": "./
|
|
130
|
+
"client": "./dist/extensions/web.mjs",
|
|
130
131
|
"scopes": [
|
|
131
132
|
"session"
|
|
132
133
|
]
|
|
@@ -139,7 +140,7 @@
|
|
|
139
140
|
"scripts": {
|
|
140
141
|
"build": "tsdown",
|
|
141
142
|
"test": "vitest --run",
|
|
142
|
-
"typecheck": "tsc --noEmit && tsc --noEmit -p
|
|
143
|
+
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.web.json",
|
|
143
144
|
"lint": "oxlint . && oxfmt . --check",
|
|
144
145
|
"fixcode": "oxlint . --fix && oxfmt ."
|
|
145
146
|
}
|
|
@@ -6,17 +6,18 @@
|
|
|
6
6
|
* event names live here rather than being spelled twice.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Segment this package's API is mounted under, below /api/plugins/.
|
|
11
|
+
*
|
|
12
|
+
* The same word names `src/extensions/(backend)/api/workflow/`, which is where
|
|
13
|
+
* the build reads the mount for the browser's client, so the two cannot drift.
|
|
14
|
+
* The routes themselves are declared in `apiRoutes.ts`.
|
|
15
|
+
*/
|
|
10
16
|
export const WORKFLOW_API_BASE_PATH = 'workflow';
|
|
11
17
|
|
|
12
18
|
/** The SSE event name the screen stream writes. */
|
|
13
19
|
export const WORKFLOW_SCREEN_EVENT = 'screen';
|
|
14
20
|
|
|
15
|
-
/** Where a run's routes live, below the mount every hub-scoped package API shares. */
|
|
16
|
-
export function workflowRunPath(workspace: string, runKey: string): string {
|
|
17
|
-
return `/api/plugins/${WORKFLOW_API_BASE_PATH}/runs/${encodeURIComponent(workspace)}/${encodeURIComponent(runKey)}`;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
21
|
/** What a surface may do with one run's terminal, and why anything is missing. */
|
|
21
22
|
export interface WorkflowTerminalCapabilitiesView {
|
|
22
23
|
readable: boolean;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));exports.__toESM=s;
|
package/dist/api-contracts.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("./src/schemas/apiContracts.cjs");exports.apiContracts=e.apiContracts,exports.default=e.apiContracts;
|
package/dist/api-contracts.d.cts
DELETED
package/dist/api-contracts.d.mts
DELETED
package/dist/api-contracts.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{apiContracts as e}from"./src/schemas/apiContracts.mjs";export{e as apiContracts,e as default};
|
package/dist/extensions/pi.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../src/constants/workflow.cjs"),t=require("../src/services/workflowFence/index.cjs"),n=require("../src/services/workflowResource/index.cjs"),r=require("../src/tools/workflowTools.cjs"),i=require("../src/tui/leader.cjs"),a=require("../src/tui/workflow/workflowToolRender.cjs"),o=require("../src/tui/workflowRuntime.cjs");let s=require("@agimon-ai/doompi-core/pi-extension"),c=require("@agimon-ai/doompi-core/skills"),l=require("@agimon-ai/doompi-core/ui-hub");const u=(0,s.definePiExtension)(e.PACKAGE_SOURCE,({pi:u,context:d,options:f,signal:p})=>{let m=f?.environment??Object.freeze({...process.env}),h=t.isWorkflowDispatcherProcess(m),g=t.createWorkflowFence(u,p),_=!1,v,y=o.createWorkflowPiRuntime(g.pi,{...f,environment:m,cordis:d,initialMode:h||f?.initialMode,isActive:g.isCurrentInvocation,runCleanup:g.runCleanup,onModeChange(e){_=e,v?.setMode(e),f?.onModeChange?.(e)}}),b=r.createWorkflowTools(y.toolDependencies,e=>({renderCall:(t,n)=>a.renderWorkflowToolCall(e,t,n),renderResult:(t,n,r,i)=>a.renderWorkflowToolResult(e,i.args,t,{...n,isError:i.isError},r)})),x=h?t.dispatcherTools(b,t.resolveDispatcherParentSession(m),m):b;return{services:[...y.services??[],t=>{t.inject([c.DOOM_SKILL_SOURCES_SERVICE],t=>{let r=n.workflowSkillDirectory(),i=(0,c.requireDoomSkillSourcesService)(t).register({source:e.PACKAGE_SOURCE,directories:[r]});return()=>i.dispose()}),h||t.inject([l.DOOM_UI_HUB_SERVICE],e=>{let t=i.registerLeaderContribution((0,l.requireDoomUiHub)(e),_);return v=t,()=>{t.dispose(),v===t&&(v=void 0)}})}],tools:x.map(e=>(0,s.definePiTool)(g.tool({...e,async execute(...t){return await y.waitForReadiness(t[2]),e.execute(...t)}}))),commands:y.commands.map(([e,t])=>g.command(e,t)),shortcuts:y.shortcuts?.map(([e,t])=>g.shortcut(e,t)),events:g.events(y.events??{}),messageRenderers:y.messageRenderers,toolRestrictions:[...y.toolRestrictions??[],...h?[{source:`${e.PACKAGE_SOURCE}/dispatcher`,restrict:t.dispatcherToolRestriction()}]:[]],resources:h?[]:[{source:e.PACKAGE_SOURCE,moduleUrl:require("url").pathToFileURL(__filename).href,skills:[{name:`doompi-author-workflow`,description:`Author DoomPi workflow definitions, job dependencies and host-executed steps.`},{name:`doompi-use-workflow`,description:`Discover, launch, monitor, control and recover DoomPi workflow runs.`}]}],async onStop(){g.beginDisposal(),await g.runCleanup(()=>y.dispose())},async onDispose(){g.beginDisposal();try{await g.runCleanup(()=>y.dispose())}finally{g.finishDisposal()}}}});exports.default=u,exports.workflowExtension=u;
|
|
2
|
-
//# sourceMappingURL=pi.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.cjs","names":["definePiExtension","PACKAGE_SOURCE","isWorkflowDispatcherProcess","createWorkflowFence","createWorkflowPiRuntime","createWorkflowTools","renderWorkflowToolCall","renderWorkflowToolResult","dispatcherTools","resolveDispatcherParentSession","DOOM_SKILL_SOURCES_SERVICE","workflowSkillDirectory","requireDoomSkillSourcesService","DOOM_UI_HUB_SERVICE","registerLeaderContribution","requireDoomUiHub","definePiTool","dispatcherToolRestriction"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension, definePiTool } from '@agimon-ai/doompi-core/pi-extension';\nimport { DOOM_SKILL_SOURCES_SERVICE, requireDoomSkillSourcesService } from '@agimon-ai/doompi-core/skills';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { PACKAGE_SOURCE } from '../constants/workflow';\nimport {\n createWorkflowFence,\n dispatcherTools,\n dispatcherToolRestriction,\n isWorkflowDispatcherProcess,\n resolveDispatcherParentSession,\n} from '../services/workflowFence';\nimport { workflowSkillDirectory } from '../services/workflowResource';\nimport { createWorkflowTools } from '../tools/workflowTools';\nimport { registerLeaderContribution } from '../tui/leader';\nimport { renderWorkflowToolCall, renderWorkflowToolResult } from '../tui/workflow/workflowToolRender';\nimport { createWorkflowPiRuntime, type WorkflowPiExtensionOptions } from '../tui/workflowRuntime';\n\nexport const workflowExtension = definePiExtension<Partial<WorkflowPiExtensionOptions>>(\n PACKAGE_SOURCE,\n ({ pi, context, options, signal }) => {\n const environment = options?.environment ?? Object.freeze({ ...process.env });\n const dispatcher = isWorkflowDispatcherProcess(environment);\n const fence = createWorkflowFence(pi, signal);\n let workflowMode = false;\n let leader: ReturnType<typeof registerLeaderContribution> | undefined;\n const runtime = createWorkflowPiRuntime(fence.pi, {\n ...options,\n environment,\n cordis: context,\n initialMode: dispatcher || options?.initialMode,\n isActive: fence.isCurrentInvocation,\n runCleanup: fence.runCleanup,\n onModeChange(enabled) {\n workflowMode = enabled;\n leader?.setMode(enabled);\n options?.onModeChange?.(enabled);\n },\n });\n const nativeTools = createWorkflowTools(runtime.toolDependencies, (name) => ({\n renderCall: (args, theme) => renderWorkflowToolCall(name, args as Record<string, unknown>, theme),\n renderResult: (result, renderOptions, theme, renderContext) =>\n renderWorkflowToolResult(\n name,\n renderContext.args as Record<string, unknown>,\n result,\n { ...renderOptions, isError: renderContext.isError },\n theme,\n ),\n }));\n const selectedTools = dispatcher\n ? dispatcherTools(nativeTools, resolveDispatcherParentSession(environment), environment)\n : nativeTools;\n return {\n services: [\n ...(runtime.services ?? []),\n (cordis: Context) => {\n cordis.inject([DOOM_SKILL_SOURCES_SERVICE], (skillContext) => {\n const directory = workflowSkillDirectory();\n const contribution = requireDoomSkillSourcesService(skillContext).register({\n source: PACKAGE_SOURCE,\n directories: [directory],\n });\n return () => contribution.dispose();\n });\n if (!dispatcher)\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = registerLeaderContribution(requireDoomUiHub(uiContext), workflowMode);\n leader = contribution;\n return () => {\n contribution.dispose();\n if (leader === contribution) leader = undefined;\n };\n });\n },\n ],\n tools: selectedTools.map((tool) =>\n definePiTool(\n fence.tool({\n ...tool,\n async execute(...args) {\n await runtime.waitForReadiness(args[2]);\n return tool.execute(...args);\n },\n }),\n ),\n ),\n commands: runtime.commands.map(([name, command]) => fence.command(name, command)),\n shortcuts: runtime.shortcuts?.map(([key, shortcut]) => fence.shortcut(key, shortcut)),\n events: fence.events(runtime.events ?? {}),\n messageRenderers: runtime.messageRenderers,\n\n toolRestrictions: [\n ...(runtime.toolRestrictions ?? []),\n ...(dispatcher ? [{ source: `${PACKAGE_SOURCE}/dispatcher`, restrict: dispatcherToolRestriction() }] : []),\n ],\n resources: dispatcher\n ? []\n : [\n {\n source: PACKAGE_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-author-workflow',\n description: 'Author DoomPi workflow definitions, job dependencies and host-executed steps.',\n },\n {\n name: 'doompi-use-workflow',\n description: 'Discover, launch, monitor, control and recover DoomPi workflow runs.',\n },\n ],\n },\n ],\n async onStop() {\n fence.beginDisposal();\n await fence.runCleanup(() => runtime.dispose());\n },\n async onDispose() {\n fence.beginDisposal();\n try {\n await fence.runCleanup(() => runtime.dispose());\n } finally {\n fence.finishDisposal();\n }\n },\n };\n },\n);\nexport default workflowExtension;\n"],"mappings":"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"}
|
package/dist/extensions/pi.d.cts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { WorkflowPiExtensionOptions } from "../src/tui/workflowRuntime.cjs";
|
|
2
|
-
//#region src/extensions/pi.d.ts
|
|
3
|
-
export declare const workflowExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<Partial<WorkflowPiExtensionOptions>>;
|
|
4
|
-
//#endregion
|
|
5
|
-
export { workflowExtension as default };
|
|
6
|
-
//# sourceMappingURL=pi.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.cts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";;qBAmBa,yEAAiB,mBAAA,QAAA"}
|
package/dist/extensions/pi.d.mts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { WorkflowPiExtensionOptions } from "../src/tui/workflowRuntime.mjs";
|
|
2
|
-
//#region src/extensions/pi.d.ts
|
|
3
|
-
export declare const workflowExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<Partial<WorkflowPiExtensionOptions>>;
|
|
4
|
-
//#endregion
|
|
5
|
-
export { workflowExtension as default };
|
|
6
|
-
//# sourceMappingURL=pi.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";;qBAmBa,yEAAiB,mBAAA,QAAA"}
|
package/dist/extensions/pi.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{PACKAGE_SOURCE as e}from"../src/constants/workflow.mjs";import{createWorkflowFence as t,dispatcherToolRestriction as n,dispatcherTools as r,isWorkflowDispatcherProcess as i,resolveDispatcherParentSession as a}from"../src/services/workflowFence/index.mjs";import{workflowSkillDirectory as o}from"../src/services/workflowResource/index.mjs";import{createWorkflowTools as s}from"../src/tools/workflowTools.mjs";import{registerLeaderContribution as c}from"../src/tui/leader.mjs";import{renderWorkflowToolCall as l,renderWorkflowToolResult as u}from"../src/tui/workflow/workflowToolRender.mjs";import{createWorkflowPiRuntime as d}from"../src/tui/workflowRuntime.mjs";import{definePiExtension as f,definePiTool as p}from"@agimon-ai/doompi-core/pi-extension";import{DOOM_SKILL_SOURCES_SERVICE as m,requireDoomSkillSourcesService as h}from"@agimon-ai/doompi-core/skills";import{DOOM_UI_HUB_SERVICE as g,requireDoomUiHub as _}from"@agimon-ai/doompi-core/ui-hub";const v=f(e,({pi:f,context:v,options:y,signal:b})=>{let x=y?.environment??Object.freeze({...process.env}),S=i(x),C=t(f,b),w=!1,T,E=d(C.pi,{...y,environment:x,cordis:v,initialMode:S||y?.initialMode,isActive:C.isCurrentInvocation,runCleanup:C.runCleanup,onModeChange(e){w=e,T?.setMode(e),y?.onModeChange?.(e)}}),D=s(E.toolDependencies,e=>({renderCall:(t,n)=>l(e,t,n),renderResult:(t,n,r,i)=>u(e,i.args,t,{...n,isError:i.isError},r)})),O=S?r(D,a(x),x):D;return{services:[...E.services??[],t=>{t.inject([m],t=>{let n=o(),r=h(t).register({source:e,directories:[n]});return()=>r.dispose()}),S||t.inject([g],e=>{let t=c(_(e),w);return T=t,()=>{t.dispose(),T===t&&(T=void 0)}})}],tools:O.map(e=>p(C.tool({...e,async execute(...t){return await E.waitForReadiness(t[2]),e.execute(...t)}}))),commands:E.commands.map(([e,t])=>C.command(e,t)),shortcuts:E.shortcuts?.map(([e,t])=>C.shortcut(e,t)),events:C.events(E.events??{}),messageRenderers:E.messageRenderers,toolRestrictions:[...E.toolRestrictions??[],...S?[{source:`${e}/dispatcher`,restrict:n()}]:[]],resources:S?[]:[{source:e,moduleUrl:import.meta.url,skills:[{name:`doompi-author-workflow`,description:`Author DoomPi workflow definitions, job dependencies and host-executed steps.`},{name:`doompi-use-workflow`,description:`Discover, launch, monitor, control and recover DoomPi workflow runs.`}]}],async onStop(){C.beginDisposal(),await C.runCleanup(()=>E.dispose())},async onDispose(){C.beginDisposal();try{await C.runCleanup(()=>E.dispose())}finally{C.finishDisposal()}}}});export{v as default,v as workflowExtension};
|
|
2
|
-
//# sourceMappingURL=pi.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension, definePiTool } from '@agimon-ai/doompi-core/pi-extension';\nimport { DOOM_SKILL_SOURCES_SERVICE, requireDoomSkillSourcesService } from '@agimon-ai/doompi-core/skills';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { PACKAGE_SOURCE } from '../constants/workflow';\nimport {\n createWorkflowFence,\n dispatcherTools,\n dispatcherToolRestriction,\n isWorkflowDispatcherProcess,\n resolveDispatcherParentSession,\n} from '../services/workflowFence';\nimport { workflowSkillDirectory } from '../services/workflowResource';\nimport { createWorkflowTools } from '../tools/workflowTools';\nimport { registerLeaderContribution } from '../tui/leader';\nimport { renderWorkflowToolCall, renderWorkflowToolResult } from '../tui/workflow/workflowToolRender';\nimport { createWorkflowPiRuntime, type WorkflowPiExtensionOptions } from '../tui/workflowRuntime';\n\nexport const workflowExtension = definePiExtension<Partial<WorkflowPiExtensionOptions>>(\n PACKAGE_SOURCE,\n ({ pi, context, options, signal }) => {\n const environment = options?.environment ?? Object.freeze({ ...process.env });\n const dispatcher = isWorkflowDispatcherProcess(environment);\n const fence = createWorkflowFence(pi, signal);\n let workflowMode = false;\n let leader: ReturnType<typeof registerLeaderContribution> | undefined;\n const runtime = createWorkflowPiRuntime(fence.pi, {\n ...options,\n environment,\n cordis: context,\n initialMode: dispatcher || options?.initialMode,\n isActive: fence.isCurrentInvocation,\n runCleanup: fence.runCleanup,\n onModeChange(enabled) {\n workflowMode = enabled;\n leader?.setMode(enabled);\n options?.onModeChange?.(enabled);\n },\n });\n const nativeTools = createWorkflowTools(runtime.toolDependencies, (name) => ({\n renderCall: (args, theme) => renderWorkflowToolCall(name, args as Record<string, unknown>, theme),\n renderResult: (result, renderOptions, theme, renderContext) =>\n renderWorkflowToolResult(\n name,\n renderContext.args as Record<string, unknown>,\n result,\n { ...renderOptions, isError: renderContext.isError },\n theme,\n ),\n }));\n const selectedTools = dispatcher\n ? dispatcherTools(nativeTools, resolveDispatcherParentSession(environment), environment)\n : nativeTools;\n return {\n services: [\n ...(runtime.services ?? []),\n (cordis: Context) => {\n cordis.inject([DOOM_SKILL_SOURCES_SERVICE], (skillContext) => {\n const directory = workflowSkillDirectory();\n const contribution = requireDoomSkillSourcesService(skillContext).register({\n source: PACKAGE_SOURCE,\n directories: [directory],\n });\n return () => contribution.dispose();\n });\n if (!dispatcher)\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = registerLeaderContribution(requireDoomUiHub(uiContext), workflowMode);\n leader = contribution;\n return () => {\n contribution.dispose();\n if (leader === contribution) leader = undefined;\n };\n });\n },\n ],\n tools: selectedTools.map((tool) =>\n definePiTool(\n fence.tool({\n ...tool,\n async execute(...args) {\n await runtime.waitForReadiness(args[2]);\n return tool.execute(...args);\n },\n }),\n ),\n ),\n commands: runtime.commands.map(([name, command]) => fence.command(name, command)),\n shortcuts: runtime.shortcuts?.map(([key, shortcut]) => fence.shortcut(key, shortcut)),\n events: fence.events(runtime.events ?? {}),\n messageRenderers: runtime.messageRenderers,\n\n toolRestrictions: [\n ...(runtime.toolRestrictions ?? []),\n ...(dispatcher ? [{ source: `${PACKAGE_SOURCE}/dispatcher`, restrict: dispatcherToolRestriction() }] : []),\n ],\n resources: dispatcher\n ? []\n : [\n {\n source: PACKAGE_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-author-workflow',\n description: 'Author DoomPi workflow definitions, job dependencies and host-executed steps.',\n },\n {\n name: 'doompi-use-workflow',\n description: 'Discover, launch, monitor, control and recover DoomPi workflow runs.',\n },\n ],\n },\n ],\n async onStop() {\n fence.beginDisposal();\n await fence.runCleanup(() => runtime.dispose());\n },\n async onDispose() {\n fence.beginDisposal();\n try {\n await fence.runCleanup(() => runtime.dispose());\n } finally {\n fence.finishDisposal();\n }\n },\n };\n },\n);\nexport default workflowExtension;\n"],"mappings":"g8BAmBA,MAAa,EAAoB,EAC/B,GACC,CAAE,KAAI,UAAS,UAAS,YAAa,CACpC,IAAM,EAAc,GAAS,aAAe,OAAO,OAAO,CAAE,GAAG,QAAQ,GAAI,CAAC,EACtE,EAAa,EAA4B,CAAW,EACpD,EAAQ,EAAoB,EAAI,CAAM,EACxC,EAAe,GACf,EACE,EAAU,EAAwB,EAAM,GAAI,CAChD,GAAG,EACH,cACA,OAAQ,EACR,YAAa,GAAc,GAAS,YACpC,SAAU,EAAM,oBAChB,WAAY,EAAM,WAClB,aAAa,EAAS,CACpB,EAAe,EACf,GAAQ,QAAQ,CAAO,EACvB,GAAS,eAAe,CAAO,CACjC,CACF,CAAC,EACK,EAAc,EAAoB,EAAQ,iBAAmB,IAAU,CAC3E,YAAa,EAAM,IAAU,EAAuB,EAAM,EAAiC,CAAK,EAChG,cAAe,EAAQ,EAAe,EAAO,IAC3C,EACE,EACA,EAAc,KACd,EACA,CAAE,GAAG,EAAe,QAAS,EAAc,OAAQ,EACnD,CACF,CACJ,EAAE,EACI,EAAgB,EAClB,EAAgB,EAAa,EAA+B,CAAW,EAAG,CAAW,EACrF,EACJ,MAAO,CACL,SAAU,CACR,GAAI,EAAQ,UAAY,CAAC,EACxB,GAAoB,CACnB,EAAO,OAAO,CAAC,CAA0B,EAAI,GAAiB,CAC5D,IAAM,EAAY,EAAuB,EACnC,EAAe,EAA+B,CAAY,CAAC,CAAC,SAAS,CACzE,OAAQ,EACR,YAAa,CAAC,CAAS,CACzB,CAAC,EACD,UAAa,EAAa,QAAQ,CACpC,CAAC,EACI,GACH,EAAO,OAAO,CAAC,CAAmB,EAAI,GAAc,CAClD,IAAM,EAAe,EAA2B,EAAiB,CAAS,EAAG,CAAY,EAEzF,MADA,GAAS,MACI,CACX,EAAa,QAAQ,EACjB,IAAW,IAAc,EAAS,IAAA,GACxC,CACF,CAAC,CACL,CACF,EACA,MAAO,EAAc,IAAK,GACxB,EACE,EAAM,KAAK,CACT,GAAG,EACH,MAAM,QAAQ,GAAG,EAAM,CAErB,OADA,MAAM,EAAQ,iBAAiB,EAAK,EAAE,EAC/B,EAAK,QAAQ,GAAG,CAAI,CAC7B,CACF,CAAC,CACH,CACF,EACA,SAAU,EAAQ,SAAS,KAAK,CAAC,EAAM,KAAa,EAAM,QAAQ,EAAM,CAAO,CAAC,EAChF,UAAW,EAAQ,WAAW,KAAK,CAAC,EAAK,KAAc,EAAM,SAAS,EAAK,CAAQ,CAAC,EACpF,OAAQ,EAAM,OAAO,EAAQ,QAAU,CAAC,CAAC,EACzC,iBAAkB,EAAQ,iBAE1B,iBAAkB,CAChB,GAAI,EAAQ,kBAAoB,CAAC,EACjC,GAAI,EAAa,CAAC,CAAE,OAAQ,GAAG,EAAe,aAAc,SAAU,EAA0B,CAAE,CAAC,EAAI,CAAC,CAC1G,EACA,UAAW,EACP,CAAC,EACD,CACE,CACE,OAAQ,EACR,UAAW,YAAY,IACvB,OAAQ,CACN,CACE,KAAM,yBACN,YAAa,+EACf,EACA,CACE,KAAM,sBACN,YAAa,sEACf,CACF,CACF,CACF,EACJ,MAAM,QAAS,CACb,EAAM,cAAc,EACpB,MAAM,EAAM,eAAiB,EAAQ,QAAQ,CAAC,CAChD,EACA,MAAM,WAAY,CAChB,EAAM,cAAc,EACpB,GAAI,CACF,MAAM,EAAM,eAAiB,EAAQ,QAAQ,CAAC,CAChD,QAAU,CACR,EAAM,eAAe,CACvB,CACF,CACF,CACF,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../src/constants/workflow.cjs"),t=require("../src/controllers/serverRuntime.cjs"),n=require("../src/controllers/workflowCatalogChannel.cjs"),r=require("../src/controllers/workflowHubApi.cjs"),i=require("../src/controllers/workflowsHubChannel.cjs"),a=(0,require("@agimon-ai/doompi-core/server-facet").defineServerPlugin)({name:e.PACKAGE_SOURCE,global:{channels:[i.createWorkflowsChannel,n.createWorkflowCatalogChannel],api:[r.api]},workspace:{channels:[i.createWorkflowsChannel,n.createWorkflowCatalogChannel],api:[r.api]},session:({agent:e,host:n})=>({api:[r.api],...e?t.createWorkflowServerRuntime(e,n):{}})});exports.default=a,exports.workflowServerFacet=a;
|
|
2
|
-
//# sourceMappingURL=server.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["defineServerPlugin","PACKAGE_SOURCE","createWorkflowsChannel","createWorkflowCatalogChannel","api","createWorkflowServerRuntime"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { PACKAGE_SOURCE } from '../constants/workflow';\nimport { createWorkflowServerRuntime } from '../controllers/serverRuntime';\nimport { createWorkflowCatalogChannel } from '../controllers/workflowCatalogChannel';\nimport { api } from '../controllers/workflowHubApi';\nimport { createWorkflowsChannel } from '../controllers/workflowsHubChannel';\nexport const workflowServerFacet = defineServerPlugin({\n name: PACKAGE_SOURCE,\n global: { channels: [createWorkflowsChannel, createWorkflowCatalogChannel], api: [api] },\n workspace: { channels: [createWorkflowsChannel, createWorkflowCatalogChannel], api: [api] },\n session: ({ agent, host }) => ({ api: [api], ...(agent ? createWorkflowServerRuntime(agent, host) : {}) }),\n});\nexport default workflowServerFacet;\n"],"mappings":"wWAOa,GAAA,+CAAsBA,CAAAA,CAAAA,mBAAAA,CAAmB,CACpD,KAAMC,EAAAA,eACN,OAAQ,CAAE,SAAU,CAACC,EAAAA,uBAAwBC,EAAAA,4BAA4B,EAAG,IAAK,CAACC,EAAAA,GAAG,CAAE,EACvF,UAAW,CAAE,SAAU,CAACF,EAAAA,uBAAwBC,EAAAA,4BAA4B,EAAG,IAAK,CAACC,EAAAA,GAAG,CAAE,EAC1F,SAAU,CAAE,QAAO,WAAY,CAAE,IAAK,CAACA,EAAAA,GAAG,EAAG,GAAI,EAAQC,EAAAA,4BAA4B,EAAO,CAAI,EAAI,CAAC,CAAG,EAC1G,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.cts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAOa,mEAAmB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAOa,mEAAmB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{PACKAGE_SOURCE as e}from"../src/constants/workflow.mjs";import{createWorkflowServerRuntime as t}from"../src/controllers/serverRuntime.mjs";import{createWorkflowCatalogChannel as n}from"../src/controllers/workflowCatalogChannel.mjs";import{api as r}from"../src/controllers/workflowHubApi.mjs";import{createWorkflowsChannel as i}from"../src/controllers/workflowsHubChannel.mjs";import{defineServerPlugin as a}from"@agimon-ai/doompi-core/server-facet";const o=a({name:e,global:{channels:[i,n],api:[r]},workspace:{channels:[i,n],api:[r]},session:({agent:e,host:n})=>({api:[r],...e?t(e,n):{}})});export{o as default,o as workflowServerFacet};
|
|
2
|
-
//# sourceMappingURL=server.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":[],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { PACKAGE_SOURCE } from '../constants/workflow';\nimport { createWorkflowServerRuntime } from '../controllers/serverRuntime';\nimport { createWorkflowCatalogChannel } from '../controllers/workflowCatalogChannel';\nimport { api } from '../controllers/workflowHubApi';\nimport { createWorkflowsChannel } from '../controllers/workflowsHubChannel';\nexport const workflowServerFacet = defineServerPlugin({\n name: PACKAGE_SOURCE,\n global: { channels: [createWorkflowsChannel, createWorkflowCatalogChannel], api: [api] },\n workspace: { channels: [createWorkflowsChannel, createWorkflowCatalogChannel], api: [api] },\n session: ({ agent, host }) => ({ api: [api], ...(agent ? createWorkflowServerRuntime(agent, host) : {}) }),\n});\nexport default workflowServerFacet;\n"],"mappings":"wcAOA,MAAa,EAAsB,EAAmB,CACpD,KAAM,EACN,OAAQ,CAAE,SAAU,CAAC,EAAwB,CAA4B,EAAG,IAAK,CAAC,CAAG,CAAE,EACvF,UAAW,CAAE,SAAU,CAAC,EAAwB,CAA4B,EAAG,IAAK,CAAC,CAAG,CAAE,EAC1F,SAAU,CAAE,QAAO,WAAY,CAAE,IAAK,CAAC,CAAG,EAAG,GAAI,EAAQ,EAA4B,EAAO,CAAI,EAAI,CAAC,CAAG,EAC1G,CAAC"}
|
package/dist/index.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src/services/workflowLaunchCommand/index.cjs");exports.parseWorkflowLaunchCommand=e.parseWorkflowLaunchCommand,exports.validateWorkflowLaunch=e.validateWorkflowLaunch;
|
package/dist/index.d.cts
DELETED
package/dist/index.d.mts
DELETED
package/dist/index.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{parseWorkflowLaunchCommand as e,validateWorkflowLaunch as t}from"./src/services/workflowLaunchCommand/index.mjs";export{e as parseWorkflowLaunchCommand,t as validateWorkflowLaunch};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=`list_workflows`,t=`launch_workflow`,n=`workflow_run`,r=[e,t,n];exports.LAUNCH_WORKFLOW_TOOL_NAME=t,exports.LEADER_CATALOG_ACTION=`workflow.catalog`,exports.LEADER_DETAIL=`multi-step agent runs`,exports.LEADER_DISABLE_ACTION=`workflow.disable`,exports.LEADER_ENABLE_ACTION=`workflow.enable`,exports.LEADER_LABEL=`workflows`,exports.LEADER_MANAGE_ACTION=`workflow.manage`,exports.LEADER_RECOVER_ACTION=`workflow.recover`,exports.LIST_WORKFLOWS_TOOL_NAME=e,exports.PACKAGE_SOURCE=`@agimon-ai/doompi-workflow`,exports.WORKFLOW_PI_TOOL_NAMES=r,exports.WORKFLOW_RUN_TOOL_NAME=n;
|
|
2
|
-
//# sourceMappingURL=workflow.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.cjs","names":[],"sources":["../../../src/constants/workflow.ts"],"sourcesContent":["export const COMMAND_DESCRIPTION = 'Doom Pi workflow execution and monitoring integration';\nexport const PACKAGE_SOURCE = '@agimon-ai/doompi-workflow';\n\nexport const LEADER_KEY = 'w';\nexport const LEADER_LABEL = 'workflows';\nexport const LEADER_ORDER = 50;\nexport const LEADER_ENABLE_ACTION = 'workflow.enable';\nexport const LEADER_DISABLE_ACTION = 'workflow.disable';\nexport const LEADER_MANAGE_ACTION = 'workflow.manage';\nexport const LEADER_RECOVER_ACTION = 'workflow.recover';\nexport const LEADER_CATALOG_ACTION = 'workflow.catalog';\nexport const LEADER_DETAIL = 'multi-step agent runs';\n\nexport const LIST_WORKFLOWS_TOOL_NAME = 'list_workflows';\nexport const LAUNCH_WORKFLOW_TOOL_NAME = 'launch_workflow';\nexport const WORKFLOW_RUN_TOOL_NAME = 'workflow_run';\nexport const WORKFLOW_PI_TOOL_NAMES = [\n LIST_WORKFLOWS_TOOL_NAME,\n LAUNCH_WORKFLOW_TOOL_NAME,\n WORKFLOW_RUN_TOOL_NAME,\n] as const;\n"],"mappings":"AACA,MAYa,EAA2B,iBAC3B,EAA4B,kBAC5B,EAAyB,eACzB,EAAyB,CACpC,EACA,EACA,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=`@agimon-ai/doompi-workflow`,t=`workflows`,n=`workflow.enable`,r=`workflow.disable`,i=`workflow.manage`,a=`workflow.recover`,o=`workflow.catalog`,s=`multi-step agent runs`,c=`list_workflows`,l=`launch_workflow`,u=`workflow_run`,d=[c,l,u];export{l as LAUNCH_WORKFLOW_TOOL_NAME,o as LEADER_CATALOG_ACTION,s as LEADER_DETAIL,r as LEADER_DISABLE_ACTION,n as LEADER_ENABLE_ACTION,t as LEADER_LABEL,i as LEADER_MANAGE_ACTION,a as LEADER_RECOVER_ACTION,c as LIST_WORKFLOWS_TOOL_NAME,e as PACKAGE_SOURCE,d as WORKFLOW_PI_TOOL_NAMES,u as WORKFLOW_RUN_TOOL_NAME};
|
|
2
|
-
//# sourceMappingURL=workflow.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.mjs","names":[],"sources":["../../../src/constants/workflow.ts"],"sourcesContent":["export const COMMAND_DESCRIPTION = 'Doom Pi workflow execution and monitoring integration';\nexport const PACKAGE_SOURCE = '@agimon-ai/doompi-workflow';\n\nexport const LEADER_KEY = 'w';\nexport const LEADER_LABEL = 'workflows';\nexport const LEADER_ORDER = 50;\nexport const LEADER_ENABLE_ACTION = 'workflow.enable';\nexport const LEADER_DISABLE_ACTION = 'workflow.disable';\nexport const LEADER_MANAGE_ACTION = 'workflow.manage';\nexport const LEADER_RECOVER_ACTION = 'workflow.recover';\nexport const LEADER_CATALOG_ACTION = 'workflow.catalog';\nexport const LEADER_DETAIL = 'multi-step agent runs';\n\nexport const LIST_WORKFLOWS_TOOL_NAME = 'list_workflows';\nexport const LAUNCH_WORKFLOW_TOOL_NAME = 'launch_workflow';\nexport const WORKFLOW_RUN_TOOL_NAME = 'workflow_run';\nexport const WORKFLOW_PI_TOOL_NAMES = [\n LIST_WORKFLOWS_TOOL_NAME,\n LAUNCH_WORKFLOW_TOOL_NAME,\n WORKFLOW_RUN_TOOL_NAME,\n] as const;\n"],"mappings":"AACA,MAAa,EAAiB,6BAGjB,EAAe,YAEf,EAAuB,kBACvB,EAAwB,mBACxB,EAAuB,kBACvB,EAAwB,mBACxB,EAAwB,mBACxB,EAAgB,wBAEhB,EAA2B,iBAC3B,EAA4B,kBAC5B,EAAyB,eACzB,EAAyB,CACpC,EACA,EACA,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../services/workflowLaunchCommand/index.cjs"),t=require("../services/workflowResource/index.cjs"),n=require("../services/webWorkflowCatalog/index.cjs"),r=require("../services/workflowCatalogDeps/index.cjs"),i=require("../services/workflowRuns/index.cjs"),a=require("../services/workflowWatcher/index.cjs"),o=require("../types/webWorkflows.cjs");let s=require("@agimon-ai/workflow-mcp"),c=require("zod"),l=require("@agimon-ai/doompi-minor-mode");const u=`@agimon-ai/doompi-workflow`,d=`workflow`,f=`list_workflows`,p=`launch_workflow`,m=`workflow_run`;function h(e){let t=[];if(typeof e==`object`&&e&&`content`in e&&Array.isArray(e.content))for(let n of e.content){if(typeof n!=`object`||!n||!(`type`in n))continue;let e=n;e.type===`text`&&typeof e.text==`string`?t.push({type:`text`,text:e.text}):e.type===`image`&&typeof e.data==`string`&&typeof e.mimeType==`string`&&t.push({type:`image`,data:e.data,mimeType:e.mimeType})}return t.length===0&&t.push({type:`text`,text:JSON.stringify(e,null,2)}),{content:t,details:e}}function g(g,_){if(_.context.directEvents===void 0)throw Error(`Workflow headless facet requires the session direct event bus.`);let v=_.context.directEvents,y=n.createWorkflowCatalogReader(r.defaultCatalogDeps()),b=async e=>{let t=i.presentWorkflowRuns(a.readWorkflowRuns({environment:e.environment}).filter(t=>i.runBelongsToSession(t,e.sessionId)).map(e=>e.view),Date.now());v.publish(o.WORKFLOW_RUNS_TYPE,e.sessionId,{runs:t});try{v.publish(o.WORKFLOW_CATALOG_TYPE,e.sessionId,{cwd:e.cwd,workflows:n.presentWorkflowCatalog(await y.read(e.cwd))})}catch(t){let n=t instanceof Error?t.message:String(t);v.publish(o.WORKFLOW_CATALOG_TYPE,e.sessionId,{cwd:e.cwd,workflows:[],warning:n})}},x=(0,s.createEmbeddedWorkflowFeature)(),S,C,w=()=>(g.context.selection.state?.[`minor-mode`]??[]).includes(d),T=()=>{let e=w();return{activation:e?`active`:`inactive`,condition:`ready`,...e?{detail:`workflow tools available`}:{},actions:[{id:`activate`,enabled:!e,...e?{disabledReason:`Workflow mode is active.`}:{}},{id:`deactivate`,enabled:e,...e?{}:{disabledReason:`Workflow mode is inactive.`}}]}},E=async e=>{let t=(g.context.selection.state?.[`minor-mode`]??[]).filter(e=>e!==d);await g.changeSelection({axis:`state`,key:`minor-mode`,values:e?[...t,d]:t}),C?.publish()};return C=(0,l.defineMinorMode)({descriptor:{source:u,id:d,label:`Workflow`,description:`Workflow discovery, launch, inspection, control, and recovery tools.`,order:20,actions:[{id:`activate`,label:`Activate`,description:`Enable workflow tools for this session.`,contexts:[`headless`],parameters:[]},{id:`deactivate`,label:`Deactivate`,description:`Disable workflow tools without stopping active runs.`,contexts:[`headless`],parameters:[]}]},state:T,async handleAction(e,t,n,r){if(r.signal.throwIfAborted(),t===`activate`)return await E(!0),{message:`Workflow mode activated.`};if(t===`deactivate`)return await E(!1),{message:`Workflow mode deactivated.`};throw Error(`Unknown workflow mode action: ${t}`)}}).createOwner(void 0),{services:[(0,l.serverMinorModes)([C])],toolRestrictions:[{when:{state:{"minor-mode":d}},allowedTools:[f,p,m]}],hooks:[{event:`tool_execution_end`,handle:async(e,t)=>{await b(t)}},{when:{state:{"minor-mode":d},attribution:{kind:`minor`,mode:d}},event:`session_shutdown`,handle:()=>{S?.dispose(),S=void 0}}],resources:[{when:{state:{"minor-mode":d},attribution:{kind:`minor`,mode:d}},name:`doompi-author-workflow`,kind:`skill`,read:()=>t.readWorkflowSkill(`doompi-author-workflow`)},{when:{state:{"minor-mode":d},attribution:{kind:`minor`,mode:d}},name:`doompi-use-workflow`,kind:`skill`,read:()=>t.readWorkflowSkill(`doompi-use-workflow`)},{when:{state:{"minor-mode":d},attribution:{kind:`minor`,mode:d}},name:`workflow-recovery`,kind:`skill`,read:()=>t.readWorkflowSkill(`workflow-recovery`)}],activities:[{when:{state:{"minor-mode":d},attribution:{kind:`minor`,mode:d}},name:u,async start(e){return S=x.createRunControl({}),await S.start(),await b(e),()=>{S?.dispose(),S=void 0}}}],tools:[{when:{state:{"minor-mode":d},attribution:{kind:`minor`,mode:d}},name:f,label:`List Workflows`,description:`List workflow definitions available in this repository.`,parameters:c.z.toJSONSchema(x.listWorkflowsTool.getInputSchema()),executionMode:`serial`,async execute(e,t,n){return n?.throwIfAborted(),h(await x.listWorkflowsTool.execute(t))}},{when:{state:{"minor-mode":d},attribution:{kind:`minor`,mode:d}},name:p,label:`Launch Workflow`,description:`Start a workflow run and return its recorded launch result.`,parameters:c.z.toJSONSchema(x.runTool.getInputSchema()),executionMode:`serial`,async execute(e,t,n){return n?.throwIfAborted(),h(await x.runTool.execute(t))}},{when:{state:{"minor-mode":d},attribution:{kind:`minor`,mode:d}},name:m,label:`Workflow Run`,description:`Inspect the status of a workflow run or request cooperative control.`,parameters:{type:`object`,properties:{action:{type:`string`,enum:[`status`,`pause`,`resume`,`stop`]},runKey:{type:`string`,minLength:1},workspace:{type:`string`},reason:{type:`string`},expectedRunId:{type:`string`}},required:[`action`,`runKey`],additionalProperties:!1},executionMode:`serial`,async execute(e,t,n){n?.throwIfAborted();let r=t,o=a.readWorkflowRuns({environment:g.context.environment}).filter(e=>i.runBelongsToSession(e,g.context.sessionId)&&e.view.runKey===r.runKey&&(r.workspace===void 0||e.view.workspace===r.workspace));if(o.length!==1)return{...h({error:o.length===0?`Workflow run was not found in this session.`:`Specify the workspace for this run key.`}),isError:!0};let s=o[0].view;return r.action===`status`?h(s):S?typeof r.expectedRunId!=`string`||r.expectedRunId.length===0?h({error:`expectedRunId is required for workflow control.`}):h(r.action===`pause`?await S.pause(r.runKey,r.expectedRunId,r.workspace,r.reason):r.action===`resume`?await S.resume(r.runKey,r.expectedRunId,r.workspace):await S.stop(r.runKey,r.expectedRunId,r.workspace,r.reason)):h({error:`Workflow activity is not active.`})}}],commands:[{when:{state:{"minor-mode":d},attribution:{kind:`minor`,mode:d}},name:`workflow-launch`,description:`Launch a workflow from a slash command.`,async execute(t,n){let r=e.parseWorkflowLaunchCommand(t);if(`error`in r){await n.client.notify({body:r.error,level:`error`});return}let i=h(await x.runTool.execute({workflowPath:r.workflow,...r.runner===void 0?{}:{runner:r.runner},...Object.keys(r.inputs).length===0?{}:{inputs:r.inputs},...r.prompt===void 0?{}:{prompt:r.prompt}})).content.find(e=>e.type===`text`);await n.client.notify({body:i?.type===`text`?i.text:`Workflow launch requested.`,level:`info`})}}],onDispose(){S?.dispose(),S=void 0}}}exports.createWorkflowServerRuntime=g;
|
|
2
|
-
//# sourceMappingURL=serverRuntime.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serverRuntime.cjs","names":["createWorkflowCatalogReader","defaultCatalogDeps","presentWorkflowRuns","readWorkflowRuns","runBelongsToSession","WORKFLOW_RUNS_TYPE","WORKFLOW_CATALOG_TYPE","presentWorkflowCatalog","createEmbeddedWorkflowFeature","defineMinorMode","serverMinorModes","skill","z","parseWorkflowLaunchCommand"],"sources":["../../../src/controllers/serverRuntime.ts"],"sourcesContent":["import {\n type DoomHeadlessExecutionContext,\n type DoomHeadlessContent,\n type DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\nimport { serverMinorModes } from '@agimon-ai/doompi-minor-mode';\nimport { defineMinorMode, type MinorModeOwner, type MinorModeState } from '@agimon-ai/doompi-minor-mode';\nimport { createEmbeddedWorkflowFeature } from '@agimon-ai/workflow-mcp';\nimport { z } from 'zod';\n\nimport { createWorkflowCatalogReader, presentWorkflowCatalog } from '../services/webWorkflowCatalog';\nimport { defaultCatalogDeps } from '../services/workflowCatalogDeps';\nimport { parseWorkflowLaunchCommand } from '../services/workflowLaunchCommand';\nimport { readWorkflowSkill as skill } from '../services/workflowResource';\nimport { presentWorkflowRuns, runBelongsToSession } from '../services/workflowRuns';\nimport { readWorkflowRuns } from '../services/workflowWatcher';\nimport { WORKFLOW_CATALOG_TYPE, WORKFLOW_RUNS_TYPE } from '../types/webWorkflows';\n\nconst SOURCE = '@agimon-ai/doompi-workflow';\nconst WORKFLOW_MODE_ID = 'workflow';\nconst LIST_TOOL = 'list_workflows';\nconst LAUNCH_TOOL = 'launch_workflow';\nconst RUN_TOOL = 'workflow_run';\n\nfunction callResult(value: unknown): DoomHeadlessToolResult {\n const content: DoomHeadlessContent[] = [];\n if (typeof value === 'object' && value !== null && 'content' in value && Array.isArray(value.content)) {\n for (const item of value.content) {\n if (typeof item !== 'object' || item === null || !('type' in item)) continue;\n const record = item as Record<string, unknown>;\n if (record.type === 'text' && typeof record.text === 'string') content.push({ type: 'text', text: record.text });\n else if (record.type === 'image' && typeof record.data === 'string' && typeof record.mimeType === 'string') {\n content.push({ type: 'image', data: record.data, mimeType: record.mimeType });\n }\n }\n }\n if (content.length === 0) content.push({ type: 'text', text: JSON.stringify(value, null, 2) });\n return { content, details: value };\n}\n\nimport { type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { type DoomServerHostService, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/server-facet';\nexport function createWorkflowServerRuntime(\n host: DoomHeadlessHostService,\n serverHost: DoomServerHostService,\n): DoomServerSessionPlugin {\n if (serverHost.context.directEvents === undefined)\n throw new Error('Workflow headless facet requires the session direct event bus.');\n const directEvents = serverHost.context.directEvents;\n const catalogReader = createWorkflowCatalogReader(defaultCatalogDeps());\n const publishLifecycle = async (executionContext: typeof host.context): Promise<void> => {\n const runs = presentWorkflowRuns(\n readWorkflowRuns({ environment: executionContext.environment })\n .filter((run) => runBelongsToSession(run, executionContext.sessionId))\n .map((run) => run.view),\n Date.now(),\n );\n directEvents.publish(WORKFLOW_RUNS_TYPE, executionContext.sessionId, { runs });\n try {\n directEvents.publish(WORKFLOW_CATALOG_TYPE, executionContext.sessionId, {\n cwd: executionContext.cwd,\n workflows: presentWorkflowCatalog(await catalogReader.read(executionContext.cwd)),\n });\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n directEvents.publish(WORKFLOW_CATALOG_TYPE, executionContext.sessionId, {\n cwd: executionContext.cwd,\n workflows: [],\n warning,\n });\n }\n };\n const feature = createEmbeddedWorkflowFeature();\n let control: ReturnType<typeof feature.createRunControl> | undefined;\n let modeOwner: MinorModeOwner | undefined;\n const modeSelected = (): boolean => (host.context.selection.state?.['minor-mode'] ?? []).includes(WORKFLOW_MODE_ID);\n const modeState = (): MinorModeState => {\n const active = modeSelected();\n return {\n activation: active ? 'active' : 'inactive',\n condition: 'ready',\n ...(active ? { detail: 'workflow tools available' } : {}),\n actions: [\n { id: 'activate', enabled: !active, ...(!active ? {} : { disabledReason: 'Workflow mode is active.' }) },\n { id: 'deactivate', enabled: active, ...(active ? {} : { disabledReason: 'Workflow mode is inactive.' }) },\n ],\n };\n };\n const selectMode = async (enabled: boolean): Promise<void> => {\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== WORKFLOW_MODE_ID);\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: enabled ? [...modes, WORKFLOW_MODE_ID] : modes,\n });\n modeOwner?.publish();\n };\n modeOwner = defineMinorMode({\n descriptor: {\n source: SOURCE,\n id: WORKFLOW_MODE_ID,\n label: 'Workflow',\n description: 'Workflow discovery, launch, inspection, control, and recovery tools.',\n order: 20,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Enable workflow tools for this session.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Disable workflow tools without stopping active runs.',\n contexts: ['headless'],\n parameters: [],\n },\n ],\n },\n state: modeState,\n async handleAction(_runtime, actionId, _argumentsValue, execution) {\n execution.signal.throwIfAborted();\n if (actionId === 'activate') {\n await selectMode(true);\n return { message: 'Workflow mode activated.' };\n }\n if (actionId === 'deactivate') {\n await selectMode(false);\n return { message: 'Workflow mode deactivated.' };\n }\n throw new Error(`Unknown workflow mode action: ${actionId}`);\n },\n }).createOwner(undefined);\n return {\n services: [serverMinorModes([modeOwner])],\n toolRestrictions: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID } },\n allowedTools: [LIST_TOOL, LAUNCH_TOOL, RUN_TOOL],\n },\n ],\n hooks: [\n {\n event: 'tool_execution_end',\n handle: async (_event, executionContext) => {\n await publishLifecycle(executionContext);\n },\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n event: 'session_shutdown',\n handle: () => {\n control?.dispose();\n control = undefined;\n },\n },\n ],\n resources: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'doompi-author-workflow',\n kind: 'skill',\n read: () => skill('doompi-author-workflow'),\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'doompi-use-workflow',\n kind: 'skill',\n read: () => skill('doompi-use-workflow'),\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'workflow-recovery',\n kind: 'skill',\n read: () => skill('workflow-recovery'),\n },\n ],\n activities: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: SOURCE,\n async start(executionContext) {\n control = feature.createRunControl({});\n await control.start();\n await publishLifecycle(executionContext);\n return () => {\n control?.dispose();\n control = undefined;\n };\n },\n },\n ],\n tools: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: LIST_TOOL,\n label: 'List Workflows',\n description: 'List workflow definitions available in this repository.',\n parameters: z.toJSONSchema(feature.listWorkflowsTool.getInputSchema()),\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n return callResult(\n await feature.listWorkflowsTool.execute(\n parameters as Parameters<typeof feature.listWorkflowsTool.execute>[0],\n ),\n );\n },\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: LAUNCH_TOOL,\n label: 'Launch Workflow',\n description: 'Start a workflow run and return its recorded launch result.',\n parameters: z.toJSONSchema(feature.runTool.getInputSchema()),\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n return callResult(await feature.runTool.execute(parameters as Parameters<typeof feature.runTool.execute>[0]));\n },\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: RUN_TOOL,\n label: 'Workflow Run',\n description: 'Inspect the status of a workflow run or request cooperative control.',\n parameters: {\n type: 'object',\n properties: {\n action: { type: 'string', enum: ['status', 'pause', 'resume', 'stop'] },\n runKey: { type: 'string', minLength: 1 },\n workspace: { type: 'string' },\n reason: { type: 'string' },\n expectedRunId: { type: 'string' },\n },\n required: ['action', 'runKey'],\n additionalProperties: false,\n },\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n const input = parameters as unknown as {\n action: 'status' | 'pause' | 'resume' | 'stop';\n runKey: string;\n workspace?: string;\n reason?: string;\n expectedRunId?: string;\n };\n const runs = readWorkflowRuns({ environment: host.context.environment }).filter(\n (run) =>\n runBelongsToSession(run, host.context.sessionId) &&\n run.view.runKey === input.runKey &&\n (input.workspace === undefined || run.view.workspace === input.workspace),\n );\n if (runs.length !== 1)\n return {\n ...callResult({\n error:\n runs.length === 0\n ? 'Workflow run was not found in this session.'\n : 'Specify the workspace for this run key.',\n }),\n isError: true,\n };\n const run = runs[0]!.view;\n if (input.action === 'status') return callResult(run);\n if (!control) return callResult({ error: 'Workflow activity is not active.' });\n if (typeof input.expectedRunId !== 'string' || input.expectedRunId.length === 0) {\n return callResult({ error: 'expectedRunId is required for workflow control.' });\n }\n const request =\n input.action === 'pause'\n ? await control.pause(input.runKey, input.expectedRunId, input.workspace, input.reason)\n : input.action === 'resume'\n ? await control.resume(input.runKey, input.expectedRunId, input.workspace)\n : await control.stop(input.runKey, input.expectedRunId, input.workspace, input.reason);\n return callResult(request);\n },\n },\n ],\n commands: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'workflow-launch',\n description: 'Launch a workflow from a slash command.',\n async execute(args: string, execution: DoomHeadlessExecutionContext) {\n const parsed = parseWorkflowLaunchCommand(args);\n if ('error' in parsed) {\n await execution.client.notify({ body: parsed.error, level: 'error' });\n return;\n }\n const result = await feature.runTool.execute({\n workflowPath: parsed.workflow,\n ...(parsed.runner === undefined ? {} : { runner: parsed.runner }),\n ...(Object.keys(parsed.inputs).length === 0 ? {} : { inputs: parsed.inputs }),\n ...(parsed.prompt === undefined ? {} : { prompt: parsed.prompt }),\n });\n const rendered = callResult(result).content.find((entry) => entry.type === 'text');\n await execution.client.notify({\n body: rendered?.type === 'text' ? rendered.text : 'Workflow launch requested.',\n level: 'info',\n });\n },\n },\n ],\n onDispose() {\n control?.dispose();\n control = undefined;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{parseWorkflowLaunchCommand as e}from"../services/workflowLaunchCommand/index.mjs";import{readWorkflowSkill as t}from"../services/workflowResource/index.mjs";import{createWorkflowCatalogReader as n,presentWorkflowCatalog as r}from"../services/webWorkflowCatalog/index.mjs";import{defaultCatalogDeps as i}from"../services/workflowCatalogDeps/index.mjs";import{presentWorkflowRuns as a,runBelongsToSession as o}from"../services/workflowRuns/index.mjs";import{readWorkflowRuns as s}from"../services/workflowWatcher/index.mjs";import{WORKFLOW_CATALOG_TYPE as c,WORKFLOW_RUNS_TYPE as l}from"../types/webWorkflows.mjs";import{createEmbeddedWorkflowFeature as u}from"@agimon-ai/workflow-mcp";import{z as d}from"zod";import{defineMinorMode as f,serverMinorModes as p}from"@agimon-ai/doompi-minor-mode";const m=`@agimon-ai/doompi-workflow`,h=`workflow`,g=`list_workflows`,_=`launch_workflow`,v=`workflow_run`;function y(e){let t=[];if(typeof e==`object`&&e&&`content`in e&&Array.isArray(e.content))for(let n of e.content){if(typeof n!=`object`||!n||!(`type`in n))continue;let e=n;e.type===`text`&&typeof e.text==`string`?t.push({type:`text`,text:e.text}):e.type===`image`&&typeof e.data==`string`&&typeof e.mimeType==`string`&&t.push({type:`image`,data:e.data,mimeType:e.mimeType})}return t.length===0&&t.push({type:`text`,text:JSON.stringify(e,null,2)}),{content:t,details:e}}function b(b,x){if(x.context.directEvents===void 0)throw Error(`Workflow headless facet requires the session direct event bus.`);let S=x.context.directEvents,C=n(i()),w=async e=>{let t=a(s({environment:e.environment}).filter(t=>o(t,e.sessionId)).map(e=>e.view),Date.now());S.publish(l,e.sessionId,{runs:t});try{S.publish(c,e.sessionId,{cwd:e.cwd,workflows:r(await C.read(e.cwd))})}catch(t){let n=t instanceof Error?t.message:String(t);S.publish(c,e.sessionId,{cwd:e.cwd,workflows:[],warning:n})}},T=u(),E,D,O=()=>(b.context.selection.state?.[`minor-mode`]??[]).includes(h),k=()=>{let e=O();return{activation:e?`active`:`inactive`,condition:`ready`,...e?{detail:`workflow tools available`}:{},actions:[{id:`activate`,enabled:!e,...e?{disabledReason:`Workflow mode is active.`}:{}},{id:`deactivate`,enabled:e,...e?{}:{disabledReason:`Workflow mode is inactive.`}}]}},A=async e=>{let t=(b.context.selection.state?.[`minor-mode`]??[]).filter(e=>e!==h);await b.changeSelection({axis:`state`,key:`minor-mode`,values:e?[...t,h]:t}),D?.publish()};return D=f({descriptor:{source:m,id:h,label:`Workflow`,description:`Workflow discovery, launch, inspection, control, and recovery tools.`,order:20,actions:[{id:`activate`,label:`Activate`,description:`Enable workflow tools for this session.`,contexts:[`headless`],parameters:[]},{id:`deactivate`,label:`Deactivate`,description:`Disable workflow tools without stopping active runs.`,contexts:[`headless`],parameters:[]}]},state:k,async handleAction(e,t,n,r){if(r.signal.throwIfAborted(),t===`activate`)return await A(!0),{message:`Workflow mode activated.`};if(t===`deactivate`)return await A(!1),{message:`Workflow mode deactivated.`};throw Error(`Unknown workflow mode action: ${t}`)}}).createOwner(void 0),{services:[p([D])],toolRestrictions:[{when:{state:{"minor-mode":h}},allowedTools:[g,_,v]}],hooks:[{event:`tool_execution_end`,handle:async(e,t)=>{await w(t)}},{when:{state:{"minor-mode":h},attribution:{kind:`minor`,mode:h}},event:`session_shutdown`,handle:()=>{E?.dispose(),E=void 0}}],resources:[{when:{state:{"minor-mode":h},attribution:{kind:`minor`,mode:h}},name:`doompi-author-workflow`,kind:`skill`,read:()=>t(`doompi-author-workflow`)},{when:{state:{"minor-mode":h},attribution:{kind:`minor`,mode:h}},name:`doompi-use-workflow`,kind:`skill`,read:()=>t(`doompi-use-workflow`)},{when:{state:{"minor-mode":h},attribution:{kind:`minor`,mode:h}},name:`workflow-recovery`,kind:`skill`,read:()=>t(`workflow-recovery`)}],activities:[{when:{state:{"minor-mode":h},attribution:{kind:`minor`,mode:h}},name:m,async start(e){return E=T.createRunControl({}),await E.start(),await w(e),()=>{E?.dispose(),E=void 0}}}],tools:[{when:{state:{"minor-mode":h},attribution:{kind:`minor`,mode:h}},name:g,label:`List Workflows`,description:`List workflow definitions available in this repository.`,parameters:d.toJSONSchema(T.listWorkflowsTool.getInputSchema()),executionMode:`serial`,async execute(e,t,n){return n?.throwIfAborted(),y(await T.listWorkflowsTool.execute(t))}},{when:{state:{"minor-mode":h},attribution:{kind:`minor`,mode:h}},name:_,label:`Launch Workflow`,description:`Start a workflow run and return its recorded launch result.`,parameters:d.toJSONSchema(T.runTool.getInputSchema()),executionMode:`serial`,async execute(e,t,n){return n?.throwIfAborted(),y(await T.runTool.execute(t))}},{when:{state:{"minor-mode":h},attribution:{kind:`minor`,mode:h}},name:v,label:`Workflow Run`,description:`Inspect the status of a workflow run or request cooperative control.`,parameters:{type:`object`,properties:{action:{type:`string`,enum:[`status`,`pause`,`resume`,`stop`]},runKey:{type:`string`,minLength:1},workspace:{type:`string`},reason:{type:`string`},expectedRunId:{type:`string`}},required:[`action`,`runKey`],additionalProperties:!1},executionMode:`serial`,async execute(e,t,n){n?.throwIfAborted();let r=t,i=s({environment:b.context.environment}).filter(e=>o(e,b.context.sessionId)&&e.view.runKey===r.runKey&&(r.workspace===void 0||e.view.workspace===r.workspace));if(i.length!==1)return{...y({error:i.length===0?`Workflow run was not found in this session.`:`Specify the workspace for this run key.`}),isError:!0};let a=i[0].view;return r.action===`status`?y(a):E?typeof r.expectedRunId!=`string`||r.expectedRunId.length===0?y({error:`expectedRunId is required for workflow control.`}):y(r.action===`pause`?await E.pause(r.runKey,r.expectedRunId,r.workspace,r.reason):r.action===`resume`?await E.resume(r.runKey,r.expectedRunId,r.workspace):await E.stop(r.runKey,r.expectedRunId,r.workspace,r.reason)):y({error:`Workflow activity is not active.`})}}],commands:[{when:{state:{"minor-mode":h},attribution:{kind:`minor`,mode:h}},name:`workflow-launch`,description:`Launch a workflow from a slash command.`,async execute(t,n){let r=e(t);if(`error`in r){await n.client.notify({body:r.error,level:`error`});return}let i=y(await T.runTool.execute({workflowPath:r.workflow,...r.runner===void 0?{}:{runner:r.runner},...Object.keys(r.inputs).length===0?{}:{inputs:r.inputs},...r.prompt===void 0?{}:{prompt:r.prompt}})).content.find(e=>e.type===`text`);await n.client.notify({body:i?.type===`text`?i.text:`Workflow launch requested.`,level:`info`})}}],onDispose(){E?.dispose(),E=void 0}}}export{b as createWorkflowServerRuntime};
|
|
2
|
-
//# sourceMappingURL=serverRuntime.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serverRuntime.mjs","names":["skill"],"sources":["../../../src/controllers/serverRuntime.ts"],"sourcesContent":["import {\n type DoomHeadlessExecutionContext,\n type DoomHeadlessContent,\n type DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\nimport { serverMinorModes } from '@agimon-ai/doompi-minor-mode';\nimport { defineMinorMode, type MinorModeOwner, type MinorModeState } from '@agimon-ai/doompi-minor-mode';\nimport { createEmbeddedWorkflowFeature } from '@agimon-ai/workflow-mcp';\nimport { z } from 'zod';\n\nimport { createWorkflowCatalogReader, presentWorkflowCatalog } from '../services/webWorkflowCatalog';\nimport { defaultCatalogDeps } from '../services/workflowCatalogDeps';\nimport { parseWorkflowLaunchCommand } from '../services/workflowLaunchCommand';\nimport { readWorkflowSkill as skill } from '../services/workflowResource';\nimport { presentWorkflowRuns, runBelongsToSession } from '../services/workflowRuns';\nimport { readWorkflowRuns } from '../services/workflowWatcher';\nimport { WORKFLOW_CATALOG_TYPE, WORKFLOW_RUNS_TYPE } from '../types/webWorkflows';\n\nconst SOURCE = '@agimon-ai/doompi-workflow';\nconst WORKFLOW_MODE_ID = 'workflow';\nconst LIST_TOOL = 'list_workflows';\nconst LAUNCH_TOOL = 'launch_workflow';\nconst RUN_TOOL = 'workflow_run';\n\nfunction callResult(value: unknown): DoomHeadlessToolResult {\n const content: DoomHeadlessContent[] = [];\n if (typeof value === 'object' && value !== null && 'content' in value && Array.isArray(value.content)) {\n for (const item of value.content) {\n if (typeof item !== 'object' || item === null || !('type' in item)) continue;\n const record = item as Record<string, unknown>;\n if (record.type === 'text' && typeof record.text === 'string') content.push({ type: 'text', text: record.text });\n else if (record.type === 'image' && typeof record.data === 'string' && typeof record.mimeType === 'string') {\n content.push({ type: 'image', data: record.data, mimeType: record.mimeType });\n }\n }\n }\n if (content.length === 0) content.push({ type: 'text', text: JSON.stringify(value, null, 2) });\n return { content, details: value };\n}\n\nimport { type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { type DoomServerHostService, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/server-facet';\nexport function createWorkflowServerRuntime(\n host: DoomHeadlessHostService,\n serverHost: DoomServerHostService,\n): DoomServerSessionPlugin {\n if (serverHost.context.directEvents === undefined)\n throw new Error('Workflow headless facet requires the session direct event bus.');\n const directEvents = serverHost.context.directEvents;\n const catalogReader = createWorkflowCatalogReader(defaultCatalogDeps());\n const publishLifecycle = async (executionContext: typeof host.context): Promise<void> => {\n const runs = presentWorkflowRuns(\n readWorkflowRuns({ environment: executionContext.environment })\n .filter((run) => runBelongsToSession(run, executionContext.sessionId))\n .map((run) => run.view),\n Date.now(),\n );\n directEvents.publish(WORKFLOW_RUNS_TYPE, executionContext.sessionId, { runs });\n try {\n directEvents.publish(WORKFLOW_CATALOG_TYPE, executionContext.sessionId, {\n cwd: executionContext.cwd,\n workflows: presentWorkflowCatalog(await catalogReader.read(executionContext.cwd)),\n });\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n directEvents.publish(WORKFLOW_CATALOG_TYPE, executionContext.sessionId, {\n cwd: executionContext.cwd,\n workflows: [],\n warning,\n });\n }\n };\n const feature = createEmbeddedWorkflowFeature();\n let control: ReturnType<typeof feature.createRunControl> | undefined;\n let modeOwner: MinorModeOwner | undefined;\n const modeSelected = (): boolean => (host.context.selection.state?.['minor-mode'] ?? []).includes(WORKFLOW_MODE_ID);\n const modeState = (): MinorModeState => {\n const active = modeSelected();\n return {\n activation: active ? 'active' : 'inactive',\n condition: 'ready',\n ...(active ? { detail: 'workflow tools available' } : {}),\n actions: [\n { id: 'activate', enabled: !active, ...(!active ? {} : { disabledReason: 'Workflow mode is active.' }) },\n { id: 'deactivate', enabled: active, ...(active ? {} : { disabledReason: 'Workflow mode is inactive.' }) },\n ],\n };\n };\n const selectMode = async (enabled: boolean): Promise<void> => {\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== WORKFLOW_MODE_ID);\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: enabled ? [...modes, WORKFLOW_MODE_ID] : modes,\n });\n modeOwner?.publish();\n };\n modeOwner = defineMinorMode({\n descriptor: {\n source: SOURCE,\n id: WORKFLOW_MODE_ID,\n label: 'Workflow',\n description: 'Workflow discovery, launch, inspection, control, and recovery tools.',\n order: 20,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Enable workflow tools for this session.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Disable workflow tools without stopping active runs.',\n contexts: ['headless'],\n parameters: [],\n },\n ],\n },\n state: modeState,\n async handleAction(_runtime, actionId, _argumentsValue, execution) {\n execution.signal.throwIfAborted();\n if (actionId === 'activate') {\n await selectMode(true);\n return { message: 'Workflow mode activated.' };\n }\n if (actionId === 'deactivate') {\n await selectMode(false);\n return { message: 'Workflow mode deactivated.' };\n }\n throw new Error(`Unknown workflow mode action: ${actionId}`);\n },\n }).createOwner(undefined);\n return {\n services: [serverMinorModes([modeOwner])],\n toolRestrictions: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID } },\n allowedTools: [LIST_TOOL, LAUNCH_TOOL, RUN_TOOL],\n },\n ],\n hooks: [\n {\n event: 'tool_execution_end',\n handle: async (_event, executionContext) => {\n await publishLifecycle(executionContext);\n },\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n event: 'session_shutdown',\n handle: () => {\n control?.dispose();\n control = undefined;\n },\n },\n ],\n resources: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'doompi-author-workflow',\n kind: 'skill',\n read: () => skill('doompi-author-workflow'),\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'doompi-use-workflow',\n kind: 'skill',\n read: () => skill('doompi-use-workflow'),\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'workflow-recovery',\n kind: 'skill',\n read: () => skill('workflow-recovery'),\n },\n ],\n activities: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: SOURCE,\n async start(executionContext) {\n control = feature.createRunControl({});\n await control.start();\n await publishLifecycle(executionContext);\n return () => {\n control?.dispose();\n control = undefined;\n };\n },\n },\n ],\n tools: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: LIST_TOOL,\n label: 'List Workflows',\n description: 'List workflow definitions available in this repository.',\n parameters: z.toJSONSchema(feature.listWorkflowsTool.getInputSchema()),\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n return callResult(\n await feature.listWorkflowsTool.execute(\n parameters as Parameters<typeof feature.listWorkflowsTool.execute>[0],\n ),\n );\n },\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: LAUNCH_TOOL,\n label: 'Launch Workflow',\n description: 'Start a workflow run and return its recorded launch result.',\n parameters: z.toJSONSchema(feature.runTool.getInputSchema()),\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n return callResult(await feature.runTool.execute(parameters as Parameters<typeof feature.runTool.execute>[0]));\n },\n },\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: RUN_TOOL,\n label: 'Workflow Run',\n description: 'Inspect the status of a workflow run or request cooperative control.',\n parameters: {\n type: 'object',\n properties: {\n action: { type: 'string', enum: ['status', 'pause', 'resume', 'stop'] },\n runKey: { type: 'string', minLength: 1 },\n workspace: { type: 'string' },\n reason: { type: 'string' },\n expectedRunId: { type: 'string' },\n },\n required: ['action', 'runKey'],\n additionalProperties: false,\n },\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n signal?.throwIfAborted();\n const input = parameters as unknown as {\n action: 'status' | 'pause' | 'resume' | 'stop';\n runKey: string;\n workspace?: string;\n reason?: string;\n expectedRunId?: string;\n };\n const runs = readWorkflowRuns({ environment: host.context.environment }).filter(\n (run) =>\n runBelongsToSession(run, host.context.sessionId) &&\n run.view.runKey === input.runKey &&\n (input.workspace === undefined || run.view.workspace === input.workspace),\n );\n if (runs.length !== 1)\n return {\n ...callResult({\n error:\n runs.length === 0\n ? 'Workflow run was not found in this session.'\n : 'Specify the workspace for this run key.',\n }),\n isError: true,\n };\n const run = runs[0]!.view;\n if (input.action === 'status') return callResult(run);\n if (!control) return callResult({ error: 'Workflow activity is not active.' });\n if (typeof input.expectedRunId !== 'string' || input.expectedRunId.length === 0) {\n return callResult({ error: 'expectedRunId is required for workflow control.' });\n }\n const request =\n input.action === 'pause'\n ? await control.pause(input.runKey, input.expectedRunId, input.workspace, input.reason)\n : input.action === 'resume'\n ? await control.resume(input.runKey, input.expectedRunId, input.workspace)\n : await control.stop(input.runKey, input.expectedRunId, input.workspace, input.reason);\n return callResult(request);\n },\n },\n ],\n commands: [\n {\n when: { state: { 'minor-mode': WORKFLOW_MODE_ID }, attribution: { kind: 'minor', mode: WORKFLOW_MODE_ID } },\n name: 'workflow-launch',\n description: 'Launch a workflow from a slash command.',\n async execute(args: string, execution: DoomHeadlessExecutionContext) {\n const parsed = parseWorkflowLaunchCommand(args);\n if ('error' in parsed) {\n await execution.client.notify({ body: parsed.error, level: 'error' });\n return;\n }\n const result = await feature.runTool.execute({\n workflowPath: parsed.workflow,\n ...(parsed.runner === undefined ? {} : { runner: parsed.runner }),\n ...(Object.keys(parsed.inputs).length === 0 ? {} : { inputs: parsed.inputs }),\n ...(parsed.prompt === undefined ? {} : { prompt: parsed.prompt }),\n });\n const rendered = callResult(result).content.find((entry) => entry.type === 'text');\n await execution.client.notify({\n body: rendered?.type === 'text' ? rendered.text : 'Workflow launch requested.',\n level: 'info',\n });\n },\n },\n ],\n onDispose() {\n control?.dispose();\n control = undefined;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../services/webWorkflowCatalog/index.cjs"),t=require("../services/workflowCatalogDeps/index.cjs"),n=require("../types/webWorkflows.cjs");function r(r={}){let a=e.createWorkflowCatalogReader(r.deps??t.defaultCatalogDeps());return{frameType:n.WORKFLOW_CATALOG_TYPE,start(t){let r=new Map,o=new Map,s=new Map,c=(e,n)=>{o.set(e.sessionId,n),t.publish(e.sessionId,n)},l=async n=>{let i;try{i={cwd:n.cwd,workflows:e.presentWorkflowCatalog(await a.read(n.cwd))}}catch(e){let r=e instanceof Error?e.message:String(e);i={cwd:n.cwd,workflows:[],warning:r},t.onNotice(`workflow catalog for ${n.cwd} is unavailable (${r})`)}r.get(n.sessionId)===n&&c(n,i)};return{payloadFor(e){return r.has(e.sessionId)?o.get(e.sessionId):void 0},sessionAdded(e){r.set(e.sessionId,e),s.get(e.sessionId)?.();let a=t.directEvents.subscribe(n.WORKFLOW_CATALOG_TYPE,e.sessionId,t=>{i(t)&&c(e,t)},{replayLatest:!0});s.set(e.sessionId,a),l(e)},sessionRemoved(e){s.get(e)?.(),s.delete(e),r.delete(e),o.delete(e)},close(){for(let e of s.values())e();s.clear(),r.clear(),o.clear()}}}}}function i(e){return typeof e==`object`&&!!e&&typeof e.cwd==`string`&&Array.isArray(e.workflows)}exports.createWorkflowCatalogChannel=r;
|
|
2
|
-
//# sourceMappingURL=workflowCatalogChannel.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflowCatalogChannel.cjs","names":["createWorkflowCatalogReader","defaultCatalogDeps","WORKFLOW_CATALOG_TYPE","presentWorkflowCatalog"],"sources":["../../../src/controllers/workflowCatalogChannel.ts"],"sourcesContent":["import type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hub-channel';\n\nimport {\n createWorkflowCatalogReader,\n presentWorkflowCatalog,\n type WorkflowCatalogReaderDeps,\n} from '../services/webWorkflowCatalog';\nimport { defaultCatalogDeps } from '../services/workflowCatalogDeps';\nimport { WORKFLOW_CATALOG_TYPE, type WorkflowCatalogPayload } from '../types/webWorkflows';\n\nexport interface WorkflowCatalogChannelOptions {\n deps?: WorkflowCatalogReaderDeps;\n}\n\n/**\n * The workflow catalog channel. Durable state seeds a session once, then\n * session lifecycle events deliver updates over the direct event bus.\n */\nexport function createWorkflowCatalogChannel(options: WorkflowCatalogChannelOptions = {}): DoomHubChannel {\n const reader = createWorkflowCatalogReader(options.deps ?? defaultCatalogDeps());\n return {\n frameType: WORKFLOW_CATALOG_TYPE,\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, WorkflowCatalogPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: DoomHubSessionScope, payload: WorkflowCatalogPayload): void => {\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n const readInitial = async (scope: DoomHubSessionScope): Promise<void> => {\n let payload: WorkflowCatalogPayload;\n try {\n payload = {\n cwd: scope.cwd,\n workflows: presentWorkflowCatalog(await reader.read(scope.cwd)),\n };\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n payload = { cwd: scope.cwd, workflows: [], warning };\n host.onNotice(`workflow catalog for ${scope.cwd} is unavailable (${warning})`);\n }\n if (scopes.get(scope.sessionId) === scope) publish(scope, payload);\n };\n const source: DoomHubChannelSource = {\n payloadFor(scope) {\n return scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n },\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n subscriptions.get(scope.sessionId)?.();\n const unsubscribe = host.directEvents.subscribe(\n WORKFLOW_CATALOG_TYPE,\n scope.sessionId,\n (value) => {\n if (isWorkflowCatalogPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n void readInitial(scope);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nfunction isWorkflowCatalogPayload(value: unknown): value is WorkflowCatalogPayload {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { cwd?: unknown }).cwd === 'string' &&\n Array.isArray((value as { workflows?: unknown }).workflows)\n );\n}\n"],"mappings":"0JAkBA,SAAgB,EAA6B,EAAyC,CAAC,EAAmB,CACxG,IAAM,EAASA,EAAAA,4BAA4B,EAAQ,MAAQC,EAAAA,mBAAmB,CAAC,EAC/E,MAAO,CACL,UAAWC,EAAAA,sBACX,MAAM,EAAM,CACV,IAAM,EAAS,IAAI,IACb,EAAS,IAAI,IACb,EAAgB,IAAI,IACpB,GAAW,EAA4B,IAA0C,CACrF,EAAO,IAAI,EAAM,UAAW,CAAO,EACnC,EAAK,QAAQ,EAAM,UAAW,CAAO,CACvC,EACM,EAAc,KAAO,IAA8C,CACvE,IAAI,EACJ,GAAI,CACF,EAAU,CACR,IAAK,EAAM,IACX,UAAWC,EAAAA,uBAAuB,MAAM,EAAO,KAAK,EAAM,GAAG,CAAC,CAChE,CACF,OAAS,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EACrE,EAAU,CAAE,IAAK,EAAM,IAAK,UAAW,CAAC,EAAG,SAAQ,EACnD,EAAK,SAAS,wBAAwB,EAAM,IAAI,mBAAmB,EAAQ,EAAE,CAC/E,CACI,EAAO,IAAI,EAAM,SAAS,IAAM,GAAO,EAAQ,EAAO,CAAO,CACnE,EAgCA,MAAO,CA9BL,WAAW,EAAO,CAChB,OAAO,EAAO,IAAI,EAAM,SAAS,EAAI,EAAO,IAAI,EAAM,SAAS,EAAI,IAAA,EACrE,EACA,aAAa,EAAO,CAClB,EAAO,IAAI,EAAM,UAAW,CAAK,EACjC,EAAc,IAAI,EAAM,SAAS,CAAC,GAAG,EACrC,IAAM,EAAc,EAAK,aAAa,UACpCD,EAAAA,sBACA,EAAM,UACL,GAAU,CACL,EAAyB,CAAK,GAAG,EAAQ,EAAO,CAAK,CAC3D,EACA,CAAE,aAAc,EAAK,CACvB,EACA,EAAc,IAAI,EAAM,UAAW,CAAW,EAC9C,EAAiB,CAAK,CACxB,EACA,eAAe,EAAW,CACxB,EAAc,IAAI,CAAS,CAAC,GAAG,EAC/B,EAAc,OAAO,CAAS,EAC9B,EAAO,OAAO,CAAS,EACvB,EAAO,OAAO,CAAS,CACzB,EACA,OAAQ,CACN,IAAK,IAAM,KAAe,EAAc,OAAO,EAAG,EAAY,EAC9D,EAAc,MAAM,EACpB,EAAO,MAAM,EACb,EAAO,MAAM,CACf,CAEU,CACd,CACF,CACF,CAEA,SAAS,EAAyB,EAAiD,CACjF,OACE,OAAO,GAAU,YACjB,GACA,OAAQ,EAA4B,KAAQ,UAC5C,MAAM,QAAS,EAAkC,SAAS,CAE9D"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{createWorkflowCatalogReader as e,presentWorkflowCatalog as t}from"../services/webWorkflowCatalog/index.mjs";import{defaultCatalogDeps as n}from"../services/workflowCatalogDeps/index.mjs";import{WORKFLOW_CATALOG_TYPE as r}from"../types/webWorkflows.mjs";function i(i={}){let o=e(i.deps??n());return{frameType:r,start(e){let n=new Map,i=new Map,s=new Map,c=(t,n)=>{i.set(t.sessionId,n),e.publish(t.sessionId,n)},l=async r=>{let i;try{i={cwd:r.cwd,workflows:t(await o.read(r.cwd))}}catch(t){let n=t instanceof Error?t.message:String(t);i={cwd:r.cwd,workflows:[],warning:n},e.onNotice(`workflow catalog for ${r.cwd} is unavailable (${n})`)}n.get(r.sessionId)===r&&c(r,i)};return{payloadFor(e){return n.has(e.sessionId)?i.get(e.sessionId):void 0},sessionAdded(t){n.set(t.sessionId,t),s.get(t.sessionId)?.();let i=e.directEvents.subscribe(r,t.sessionId,e=>{a(e)&&c(t,e)},{replayLatest:!0});s.set(t.sessionId,i),l(t)},sessionRemoved(e){s.get(e)?.(),s.delete(e),n.delete(e),i.delete(e)},close(){for(let e of s.values())e();s.clear(),n.clear(),i.clear()}}}}}function a(e){return typeof e==`object`&&!!e&&typeof e.cwd==`string`&&Array.isArray(e.workflows)}export{i as createWorkflowCatalogChannel};
|
|
2
|
-
//# sourceMappingURL=workflowCatalogChannel.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflowCatalogChannel.mjs","names":[],"sources":["../../../src/controllers/workflowCatalogChannel.ts"],"sourcesContent":["import type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hub-channel';\n\nimport {\n createWorkflowCatalogReader,\n presentWorkflowCatalog,\n type WorkflowCatalogReaderDeps,\n} from '../services/webWorkflowCatalog';\nimport { defaultCatalogDeps } from '../services/workflowCatalogDeps';\nimport { WORKFLOW_CATALOG_TYPE, type WorkflowCatalogPayload } from '../types/webWorkflows';\n\nexport interface WorkflowCatalogChannelOptions {\n deps?: WorkflowCatalogReaderDeps;\n}\n\n/**\n * The workflow catalog channel. Durable state seeds a session once, then\n * session lifecycle events deliver updates over the direct event bus.\n */\nexport function createWorkflowCatalogChannel(options: WorkflowCatalogChannelOptions = {}): DoomHubChannel {\n const reader = createWorkflowCatalogReader(options.deps ?? defaultCatalogDeps());\n return {\n frameType: WORKFLOW_CATALOG_TYPE,\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, WorkflowCatalogPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: DoomHubSessionScope, payload: WorkflowCatalogPayload): void => {\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n const readInitial = async (scope: DoomHubSessionScope): Promise<void> => {\n let payload: WorkflowCatalogPayload;\n try {\n payload = {\n cwd: scope.cwd,\n workflows: presentWorkflowCatalog(await reader.read(scope.cwd)),\n };\n } catch (error) {\n const warning = error instanceof Error ? error.message : String(error);\n payload = { cwd: scope.cwd, workflows: [], warning };\n host.onNotice(`workflow catalog for ${scope.cwd} is unavailable (${warning})`);\n }\n if (scopes.get(scope.sessionId) === scope) publish(scope, payload);\n };\n const source: DoomHubChannelSource = {\n payloadFor(scope) {\n return scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n },\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n subscriptions.get(scope.sessionId)?.();\n const unsubscribe = host.directEvents.subscribe(\n WORKFLOW_CATALOG_TYPE,\n scope.sessionId,\n (value) => {\n if (isWorkflowCatalogPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n void readInitial(scope);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nfunction isWorkflowCatalogPayload(value: unknown): value is WorkflowCatalogPayload {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { cwd?: unknown }).cwd === 'string' &&\n Array.isArray((value as { workflows?: unknown }).workflows)\n );\n}\n"],"mappings":"oQAkBA,SAAgB,EAA6B,EAAyC,CAAC,EAAmB,CACxG,IAAM,EAAS,EAA4B,EAAQ,MAAQ,EAAmB,CAAC,EAC/E,MAAO,CACL,UAAW,EACX,MAAM,EAAM,CACV,IAAM,EAAS,IAAI,IACb,EAAS,IAAI,IACb,EAAgB,IAAI,IACpB,GAAW,EAA4B,IAA0C,CACrF,EAAO,IAAI,EAAM,UAAW,CAAO,EACnC,EAAK,QAAQ,EAAM,UAAW,CAAO,CACvC,EACM,EAAc,KAAO,IAA8C,CACvE,IAAI,EACJ,GAAI,CACF,EAAU,CACR,IAAK,EAAM,IACX,UAAW,EAAuB,MAAM,EAAO,KAAK,EAAM,GAAG,CAAC,CAChE,CACF,OAAS,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EACrE,EAAU,CAAE,IAAK,EAAM,IAAK,UAAW,CAAC,EAAG,SAAQ,EACnD,EAAK,SAAS,wBAAwB,EAAM,IAAI,mBAAmB,EAAQ,EAAE,CAC/E,CACI,EAAO,IAAI,EAAM,SAAS,IAAM,GAAO,EAAQ,EAAO,CAAO,CACnE,EAgCA,MAAO,CA9BL,WAAW,EAAO,CAChB,OAAO,EAAO,IAAI,EAAM,SAAS,EAAI,EAAO,IAAI,EAAM,SAAS,EAAI,IAAA,EACrE,EACA,aAAa,EAAO,CAClB,EAAO,IAAI,EAAM,UAAW,CAAK,EACjC,EAAc,IAAI,EAAM,SAAS,CAAC,GAAG,EACrC,IAAM,EAAc,EAAK,aAAa,UACpC,EACA,EAAM,UACL,GAAU,CACL,EAAyB,CAAK,GAAG,EAAQ,EAAO,CAAK,CAC3D,EACA,CAAE,aAAc,EAAK,CACvB,EACA,EAAc,IAAI,EAAM,UAAW,CAAW,EAC9C,EAAiB,CAAK,CACxB,EACA,eAAe,EAAW,CACxB,EAAc,IAAI,CAAS,CAAC,GAAG,EAC/B,EAAc,OAAO,CAAS,EAC9B,EAAO,OAAO,CAAS,EACvB,EAAO,OAAO,CAAS,CACzB,EACA,OAAQ,CACN,IAAK,IAAM,KAAe,EAAc,OAAO,EAAG,EAAY,EAC9D,EAAc,MAAM,EACpB,EAAO,MAAM,EACb,EAAO,MAAM,CACf,CAEU,CACd,CACF,CACF,CAEA,SAAS,EAAyB,EAAiD,CACjF,OACE,OAAO,GAAU,YACjB,GACA,OAAQ,EAA4B,KAAQ,UAC5C,MAAM,QAAS,EAAkC,SAAS,CAE9D"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../services/workflowTerminal/index.cjs"),n=require("../types/webWorkflowTerminal.cjs");let r=require("node:fs");r=e.__toESM(r,1);let i=require("node:path");i=e.__toESM(i,1);let a=require("@agimon-ai/workflow-mcp"),o=require("node:crypto"),s=require("node:stream"),c=require("hono"),l=require("hono/streaming");const u=[`running`,`error`,`completed`],d=524288,f=/^[\w.@-]+$/,p={".aac":`audio/aac`,".bmp":`image/bmp`,".css":`text/css`,".csv":`text/csv`,".gif":`image/gif`,".htm":`text/html`,".html":`text/html`,".ico":`image/x-icon`,".jpeg":`image/jpeg`,".jpg":`image/jpeg`,".js":`text/javascript`,".json":`application/json`,".jsx":`text/jsx`,".m4a":`audio/mp4`,".markdown":`text/markdown`,".md":`text/markdown`,".mov":`video/quicktime`,".mp3":`audio/mpeg`,".mp4":`video/mp4`,".oga":`audio/ogg`,".ogg":`audio/ogg`,".ogv":`video/ogg`,".pdf":`application/pdf`,".png":`image/png`,".sh":`text/x-shellscript`,".svg":`image/svg+xml`,".toml":`text/toml`,".ts":`text/typescript`,".tsv":`text/tab-separated-values`,".tsx":`text/tsx`,".txt":`text/plain`,".wav":`audio/wav`,".webm":`video/webm`,".webp":`image/webp`,".xml":`application/xml`,".yaml":`text/yaml`,".yml":`text/yaml`};async function m(e){let t=await e.req.json().catch(()=>void 0);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}function h(e){return e!==``&&e!==`../adapters`&&e!==`..`&&f.test(e)}function g(e,t){return`${e}/${t}`}function _(e={}){let i=e.registry??new a.WorkflowRegistryService,s=e.terminal??new a.WorkflowTerminalService,d=t.createWorkflowTerminalService({terminal:s,now:e.now??(()=>Date.now())}),f=new c.Hono,p=async(e,t)=>{if(h(e)&&h(t))for(let n of u)try{return await i.readRunByKey(e,n,t)}catch{}},_=(e,t)=>({error:`No workflow run '${t}' in workspace '${e}'.`});return f.get(`/runs/:workspace/:runKey/screen/stream`,async e=>{let t=e.req.param(`workspace`),r=e.req.param(`runKey`),i=await p(t,r);if(i===void 0)return e.json(_(t,r),404);let a=g(t,r);return(0,l.streamSSE)(e,async e=>{let o=0,s=!0;for(e.onAbort(()=>{s=!1});s;){let s=await p(t,r)??i,c=d.capabilities(s),l=c.readable?await d.screen(a,s,48):[],u=s.stage!==`running`;u&&(o+=1);let f=u&&o>=4,m={lines:l,capabilities:c,...f?{ended:!0}:{}};if(await e.writeSSE({event:n.WORKFLOW_SCREEN_EVENT,data:JSON.stringify(m)}),f)break;await e.sleep(500)}d.forget(new Set)})}),f.post(`/runs/:workspace/:runKey/control`,async e=>{let t=e.req.param(`workspace`),n=e.req.param(`runKey`),r=await p(t,n);if(r===void 0)return e.json(_(t,n),404);let i=g(t,n),a=await m(e),s=d.capabilities(r);if(a.release===!0)return typeof a.token==`string`&&d.releaseControl(i,a.token),e.json({held:!1});if(!s.writable){let t={held:!1,reason:s.reason};return e.json(t,409)}let c=typeof a.token==`string`&&a.token!==``?a.token:(0,o.randomUUID)();if(!d.takeControl(i,c))return e.json({held:!1,reason:`Another reader holds the keyboard.`},409);let l={held:!0,token:c};return e.json(l)}),f.post(`/runs/:workspace/:runKey/keys`,async e=>{let t=e.req.param(`workspace`),n=e.req.param(`runKey`),r=await p(t,n);if(r===void 0)return e.json(_(t,n),404);let i=await m(e);if(typeof i.token!=`string`||typeof i.data!=`string`)return e.json({error:`A keystroke needs a control token and its data.`},400);try{await d.write(g(t,n),r,i.token,i.data)}catch(t){return e.json({error:t instanceof Error?t.message:String(t)},409)}return e.body(null,204)}),f.post(`/runs/:workspace/:runKey/resize`,async e=>{let t=e.req.param(`workspace`),n=e.req.param(`runKey`),r=await p(t,n);if(r===void 0)return e.json(_(t,n),404);let{token:i,columns:a,rows:o}=await m(e);if(typeof i!=`string`||typeof a!=`number`||typeof o!=`number`)return e.json({error:`A resize needs a control token, columns and rows.`},400);try{let s=await d.resize(g(t,n),r,i,a,o);return e.json({resized:s})}catch(t){return e.json({error:t instanceof Error?t.message:String(t)},409)}}),f.delete(`/runs/:workspace/:runKey`,async e=>{let t=e.req.param(`workspace`),n=e.req.param(`runKey`),a=await p(t,n);if(a===void 0)return e.json(_(t,n),404);if(a.stage===`running`)return e.json({error:`A running workflow must be stopped before it can be deleted.`},409);try{r.default.rmSync(i.runDirectoryFor(a),{recursive:!0,force:!0})}catch(t){return e.json({error:t instanceof Error?t.message:String(t)},409)}return e.json({deleted:!0})}),f.get(`/runs/:workspace/:runKey/artifacts`,async e=>{let t=e.req.param(`workspace`),n=e.req.param(`runKey`),r=await p(t,n);if(r===void 0)return e.json(_(t,n),404);let a=i.runDirectoryFor(r),o={runDir:a,description:r.runDirectory?.description??``,artifacts:S(a,r)};return e.json(o)}),f.get(`/runs/:workspace/:runKey/artifacts/:name{.+}`,async e=>{let t=e.req.param(`workspace`),n=e.req.param(`runKey`),r=await p(t,n);if(r===void 0)return e.json(_(t,n),404);let a=i.runDirectoryFor(r),o=e.req.param(`name`),s=v(a,o);if(s===void 0)return e.json({error:`'${o}' is not inside this run.`},400);if(e.req.query(`raw`)===`1`)return E(s,o,e.req.header(`range`),e.req.query(`download`)===`1`)??e.json({error:`'${o}' has not been written.`},404);let c=T(s,o);return c===void 0?e.json({error:`'${o}' has not been written.`},404):e.json(c)}),f}function v(e,t){let n=i.default.resolve(e,t),r=i.default.resolve(e);if(n===r||n.startsWith(`${r}${i.default.sep}`))return n}function y(e){try{return r.default.statSync(e)}catch{return}}function b(e){return e===void 0?`pending`:e.isDirectory()?`written`:e.size===0?`empty`:`written`}function x(e,t){let n=y(i.default.join(e,t.path));return{...t,state:b(n),...n===void 0?{}:{size:n.size,modifiedAt:n.mtime.toISOString()}}}function S(e,t){let n=(t.runDirectory?.entries??[]).map(t=>x(e,{path:t.path,kind:t.kind,description:t.description,producedBy:t[`produced-by`]??[],declared:!0})),i=new Set(n.map(e=>e.path)),a;try{a=r.default.readdirSync(e,{withFileTypes:!0})}catch{return n}let o=a.filter(e=>!i.has(e.name)).map(t=>x(e,{path:t.name,kind:t.isDirectory()?`directory`:`file`,description:``,producedBy:[],declared:!1})).sort((e,t)=>e.path.localeCompare(t.path));return[...n,...o]}function C(e){return p[i.default.extname(e).toLowerCase()]??`application/octet-stream`}function w(e){return e.startsWith(`text/`)||e===`application/json`||e===`application/xml`}function T(e,t){let n=y(e);if(n===void 0||n.isDirectory())return;let i=C(t),a;if(w(i))try{let t=r.default.openSync(e,`r`);try{let e=Buffer.alloc(Math.min(n.size,d));r.default.readSync(t,e,0,e.length,0),a=e.toString(`utf8`)}finally{r.default.closeSync(t)}}catch{return}return{path:t,size:n.size,modifiedAt:n.mtime.toISOString(),mimeType:i,...a===void 0?{}:{text:a},truncated:a!==void 0&&n.size>d}}function E(e,t,n,a){let o=y(e);if(o===void 0||o.isDirectory())return;let c=C(t),l=0,u=Math.max(0,o.size-1),d=!1,f=n?.match(/^bytes=(\d*)-(\d*)$/);if(f!=null&&o.size>0){let e=f[1]===``?void 0:Number(f[1]),t=f[2]===``?void 0:Number(f[2]);if(e===void 0&&t!==void 0?l=Math.max(0,o.size-t):e!==void 0&&(l=e,u=t===void 0?u:Math.min(t,u)),l>=o.size||l>u)return new Response(null,{status:416,headers:{"content-range":`bytes */${String(o.size)}`}});d=!0}let p=i.default.basename(t).replace(/["\\\r\n]/g,`_`),m=new Headers({"accept-ranges":`bytes`,"content-disposition":`${a||c===`text/html`?`attachment`:`inline`}; filename="${p}"`,"content-length":String(o.size===0?0:u-l+1),"content-type":c,"x-content-type-options":`nosniff`});if(d&&m.set(`content-range`,`bytes ${String(l)}-${String(u)}/${String(o.size)}`),o.size===0)return new Response(null,{status:200,headers:m});let h=s.Readable.toWeb(r.default.createReadStream(e,{start:l,end:u}));return new Response(h,{status:d?206:200,headers:m})}const D={basePath:n.WORKFLOW_API_BASE_PATH,start(e){let t=_();return{fetch:e=>t.fetch(e),close:()=>void 0}}};exports.api=D,exports.createWorkflowHubApi=_;
|
|
2
|
-
//# sourceMappingURL=workflowHubApi.cjs.map
|