@ryanfw/prompt-orchestration-pipeline 1.3.2 → 1.3.4
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/docs/http-api.md +80 -4
- package/package.json +1 -4
- package/src/api/__tests__/index.test.ts +443 -32
- package/src/api/index.ts +108 -127
- package/src/cli/__tests__/analyze-task.test.ts +40 -7
- package/src/cli/__tests__/index.test.ts +337 -17
- package/src/cli/__tests__/types.test.ts +0 -18
- package/src/cli/__tests__/update-pipeline-json.test.ts +19 -9
- package/src/cli/analyze-task.ts +3 -14
- package/src/cli/index.ts +73 -61
- package/src/cli/types.ts +0 -13
- package/src/cli/update-pipeline-json.ts +3 -14
- package/src/config/__tests__/paths.test.ts +46 -1
- package/src/config/__tests__/pipeline-registry.test.ts +767 -0
- package/src/config/__tests__/sse-events.test.ts +470 -0
- package/src/config/__tests__/statuses.test.ts +41 -0
- package/src/config/paths.ts +11 -2
- package/src/config/pipeline-registry.ts +258 -0
- package/src/config/sse-events.ts +122 -0
- package/src/config/statuses.ts +20 -1
- package/src/core/__tests__/agent-step.test.ts +115 -0
- package/src/core/__tests__/config.test.ts +545 -105
- package/src/core/__tests__/core-boot-resolution.test.ts +181 -0
- package/src/core/__tests__/job-concurrency.test.ts +260 -0
- package/src/core/__tests__/job-submission.test.ts +396 -0
- package/src/core/__tests__/job-view.test.ts +1341 -0
- package/src/core/__tests__/json-file.test.ts +111 -0
- package/src/core/__tests__/lifecycle-policy.test.ts +81 -7
- package/src/core/__tests__/logger.test.ts +22 -0
- package/src/core/__tests__/orchestrator-no-deprecated-exports.test.ts +41 -0
- package/src/core/__tests__/orchestrator.test.ts +615 -2
- package/src/core/__tests__/pipeline-runner.test.ts +946 -9
- package/src/core/__tests__/redact.test.ts +153 -0
- package/src/core/__tests__/runner-liveness.test.ts +910 -0
- package/src/core/__tests__/seed-naming.test.ts +57 -0
- package/src/core/__tests__/single-derivation.test.ts +159 -0
- package/src/core/__tests__/task-runner.test.ts +594 -3
- package/src/core/__tests__/task-telemetry.test.ts +241 -0
- package/src/core/__tests__/workspace-root-resolution-guard.test.ts +62 -0
- package/src/core/agent-step.ts +4 -1
- package/src/core/agent-types.ts +5 -4
- package/src/core/config.ts +134 -222
- package/src/core/control.ts +3 -0
- package/src/core/job-concurrency.ts +56 -20
- package/src/core/job-submission.ts +133 -0
- package/src/core/job-view.ts +473 -0
- package/src/core/json-file.ts +45 -0
- package/src/core/lifecycle-policy.ts +23 -8
- package/src/core/logger.ts +0 -29
- package/src/core/orchestrator.ts +200 -74
- package/src/core/pipeline-runner.ts +85 -53
- package/src/core/redact.ts +40 -0
- package/src/core/runner-liveness.ts +280 -0
- package/src/core/seed-naming.ts +9 -0
- package/src/core/status-writer.ts +27 -33
- package/src/core/task-runner.ts +356 -319
- package/src/core/task-telemetry.ts +107 -0
- package/src/harness/__tests__/subprocess.test.ts +112 -1
- package/src/harness/subprocess.ts +55 -16
- package/src/llm/__tests__/index.test.ts +684 -33
- package/src/llm/index.ts +310 -67
- package/src/providers/__tests__/alibaba.test.ts +67 -6
- package/src/providers/__tests__/anthropic.test.ts +35 -14
- package/src/providers/__tests__/base.test.ts +62 -0
- package/src/providers/__tests__/claude-code.test.ts +99 -14
- package/src/providers/__tests__/deepseek.test.ts +16 -6
- package/src/providers/__tests__/gemini.test.ts +47 -25
- package/src/providers/__tests__/moonshot.test.ts +27 -0
- package/src/providers/__tests__/openai.test.ts +262 -74
- package/src/providers/__tests__/opencode.test.ts +77 -0
- package/src/providers/__tests__/request-timeout-contract.test.ts +226 -0
- package/src/providers/__tests__/stream-accumulator.test.ts +52 -0
- package/src/providers/__tests__/types.test.ts +85 -0
- package/src/providers/__tests__/zero-fill-guard.test.ts +62 -0
- package/src/providers/__tests__/zhipu.test.ts +27 -14
- package/src/providers/alibaba.ts +20 -39
- package/src/providers/anthropic.ts +23 -11
- package/src/providers/base.ts +19 -0
- package/src/providers/claude-code.ts +27 -18
- package/src/providers/deepseek.ts +9 -28
- package/src/providers/gemini.ts +20 -58
- package/src/providers/moonshot.ts +15 -11
- package/src/providers/openai.ts +79 -61
- package/src/providers/opencode.ts +16 -33
- package/src/providers/stream-accumulator.ts +27 -21
- package/src/providers/types.ts +29 -4
- package/src/providers/zhipu.ts +15 -44
- package/src/task-analysis/__tests__/analyzer.test.ts +0 -0
- package/src/task-analysis/__tests__/enrichers-schema-deducer.test.ts +34 -2
- package/src/task-analysis/__tests__/no-ast-imports.test.ts +52 -0
- package/src/task-analysis/__tests__/repository.test.ts +65 -0
- package/src/task-analysis/__tests__/types.test.ts +63 -130
- package/src/task-analysis/analyzer.ts +91 -0
- package/src/task-analysis/enrichers/schema-deducer.ts +13 -2
- package/src/task-analysis/index.ts +2 -36
- package/src/task-analysis/repository.ts +45 -0
- package/src/task-analysis/types.ts +42 -58
- package/src/ui/client/__tests__/api.test.ts +143 -1
- package/src/ui/client/__tests__/bootstrap.test.ts +178 -62
- package/src/ui/client/__tests__/job-adapter.test.ts +203 -2
- package/src/ui/client/__tests__/load-state.test.ts +70 -0
- package/src/ui/client/__tests__/types.test.ts +66 -3
- package/src/ui/client/__tests__/useJobDetailWithUpdates.test.ts +390 -77
- package/src/ui/client/__tests__/useJobList.test.ts +198 -23
- package/src/ui/client/__tests__/useJobListWithUpdates.test.ts +218 -7
- package/src/ui/client/adapters/__tests__/job-adapter.test.ts +186 -0
- package/src/ui/client/adapters/job-adapter.ts +41 -16
- package/src/ui/client/api.ts +38 -15
- package/src/ui/client/bootstrap.ts +19 -14
- package/src/ui/client/hooks/useJobDetailWithUpdates.ts +73 -97
- package/src/ui/client/hooks/useJobList.ts +26 -31
- package/src/ui/client/hooks/useJobListWithUpdates.ts +42 -76
- package/src/ui/client/load-state.ts +20 -0
- package/src/ui/client/reducers/__tests__/job-events.test.ts +568 -0
- package/src/ui/client/reducers/job-events.ts +137 -0
- package/src/ui/client/types.ts +16 -20
- package/src/ui/components/DAGGrid.tsx +6 -1
- package/src/ui/components/JobDetail.tsx +12 -4
- package/src/ui/components/JobTable.tsx +41 -13
- package/src/ui/components/StageTimeline.tsx +8 -20
- package/src/ui/components/TaskAnalysisDisplay.tsx +48 -6
- package/src/ui/components/__tests__/DAGGrid.test.tsx +36 -0
- package/src/ui/components/__tests__/JobDetail.test.tsx +112 -0
- package/src/ui/components/__tests__/JobTable.test.tsx +137 -1
- package/src/ui/components/__tests__/StageTimeline.test.tsx +5 -6
- package/src/ui/components/__tests__/TaskAnalysisDisplay.test.tsx +64 -0
- package/src/ui/components/types.ts +35 -15
- package/src/ui/dist/assets/{index--RH3sAt3.js → index-DN3-zvtP.js} +4324 -263
- package/src/ui/dist/assets/index-DN3-zvtP.js.map +1 -0
- package/src/ui/dist/assets/style-CtZBnjlR.css +2 -0
- package/src/ui/dist/index.html +2 -2
- package/src/ui/pages/PipelineDetail.tsx +60 -4
- package/src/ui/pages/PromptPipelineDashboard.tsx +59 -7
- package/src/ui/pages/__tests__/PromptPipelineDashboard.test.tsx +114 -32
- package/src/ui/pages/__tests__/pages.test.tsx +236 -42
- package/src/ui/server/__tests__/concurrency-endpoint.test.ts +54 -0
- package/src/ui/server/__tests__/config-bridge-node.test.ts +34 -1
- package/src/ui/server/__tests__/config-bridge.test.ts +9 -1
- package/src/ui/server/__tests__/embedded-assets.test.ts +66 -0
- package/src/ui/server/__tests__/file-endpoints.test.ts +183 -5
- package/src/ui/server/__tests__/gate-endpoints.test.ts +55 -0
- package/src/ui/server/__tests__/index.test.ts +63 -0
- package/src/ui/server/__tests__/job-control-endpoints.test.ts +512 -2
- package/src/ui/server/__tests__/job-endpoints.test.ts +158 -2
- package/src/ui/server/__tests__/read-static-path-guard.test.ts +94 -0
- package/src/ui/server/__tests__/router-root-isolation.test.ts +204 -0
- package/src/ui/server/__tests__/router-threading.test.ts +148 -0
- package/src/ui/server/__tests__/router.test.ts +104 -0
- package/src/ui/server/__tests__/sse-broadcast.test.ts +44 -0
- package/src/ui/server/__tests__/sse-enhancer.test.ts +70 -0
- package/src/ui/server/config-bridge-node.ts +8 -26
- package/src/ui/server/config-bridge.ts +3 -4
- package/src/ui/server/embedded-assets-imports.d.ts +44 -0
- package/src/ui/server/embedded-assets.ts +13 -2
- package/src/ui/server/endpoints/__tests__/meta-endpoint.test.ts +1 -0
- package/src/ui/server/endpoints/__tests__/pipeline-analysis-endpoint.test.ts +167 -0
- package/src/ui/server/endpoints/__tests__/schema-file-endpoint.test.ts +104 -0
- package/src/ui/server/endpoints/__tests__/task-analysis-endpoint.test.ts +103 -0
- package/src/ui/server/endpoints/__tests__/upload-endpoints.test.ts +162 -96
- package/src/ui/server/endpoints/concurrency-endpoint.ts +2 -1
- package/src/ui/server/endpoints/create-pipeline-endpoint.ts +14 -29
- package/src/ui/server/endpoints/file-endpoints.ts +15 -10
- package/src/ui/server/endpoints/gate-endpoints.ts +2 -6
- package/src/ui/server/endpoints/job-control-endpoints.ts +129 -141
- package/src/ui/server/endpoints/job-endpoints.ts +7 -0
- package/src/ui/server/endpoints/meta-endpoint.ts +1 -1
- package/src/ui/server/endpoints/pipeline-analysis-endpoint.ts +99 -11
- package/src/ui/server/endpoints/schema-file-endpoint.ts +11 -3
- package/src/ui/server/endpoints/task-analysis-endpoint.ts +21 -5
- package/src/ui/server/endpoints/task-save-endpoint.ts +1 -2
- package/src/ui/server/endpoints/upload-endpoints.ts +5 -40
- package/src/ui/server/index.ts +19 -14
- package/src/ui/server/job-reader.ts +14 -2
- package/src/ui/server/router.ts +33 -10
- package/src/ui/server/sse-broadcast.ts +14 -3
- package/src/ui/server/sse-enhancer.ts +12 -2
- package/src/ui/state/__tests__/schema-loader.test.ts +11 -1
- package/src/ui/state/__tests__/snapshot.test.ts +120 -14
- package/src/ui/state/__tests__/types.test.ts +104 -5
- package/src/ui/state/snapshot.ts +2 -2
- package/src/ui/state/transformers/__tests__/list-transformer.test.ts +85 -2
- package/src/ui/state/transformers/__tests__/status-transformer.test.ts +250 -22
- package/src/ui/state/transformers/list-transformer.ts +13 -3
- package/src/ui/state/transformers/status-transformer.ts +36 -170
- package/src/ui/state/types.ts +15 -48
- package/src/utils/__tests__/path-containment.test.ts +160 -0
- package/src/{ui/server/utils → utils}/path-containment.ts +21 -0
- package/src/task-analysis/__tests__/enrichers-analysis-writer.test.ts +0 -86
- package/src/task-analysis/__tests__/enrichers-artifact-resolver.test.ts +0 -124
- package/src/task-analysis/__tests__/extractors-artifacts.test.ts +0 -133
- package/src/task-analysis/__tests__/extractors-llm-calls.test.ts +0 -46
- package/src/task-analysis/__tests__/extractors-stages.test.ts +0 -52
- package/src/task-analysis/__tests__/index.test.ts +0 -143
- package/src/task-analysis/__tests__/parser.test.ts +0 -41
- package/src/task-analysis/__tests__/utils-ast.test.ts +0 -82
- package/src/task-analysis/enrichers/analysis-writer.ts +0 -75
- package/src/task-analysis/enrichers/artifact-resolver.ts +0 -89
- package/src/task-analysis/extractors/artifacts.ts +0 -143
- package/src/task-analysis/extractors/llm-calls.ts +0 -117
- package/src/task-analysis/extractors/stages.ts +0 -45
- package/src/task-analysis/parser.ts +0 -20
- package/src/task-analysis/utils/ast.ts +0 -45
- package/src/ui/dist/assets/index--RH3sAt3.js.map +0 -1
- package/src/ui/dist/assets/style-CSSKuMOe.css +0 -2
- package/src/ui/embedded-assets.js +0 -12
- package/src/ui/server/__tests__/path-containment.test.ts +0 -54
package/docs/http-api.md
CHANGED
|
@@ -12,6 +12,41 @@ This document is the authoritative reference for the Prompt Orchestration Pipeli
|
|
|
12
12
|
- **CORS**: Opt-in via `--cors-origins <comma-separated-origins>` and `--cors-allow-null-origin`. When no origins are configured, no `Access-Control-*` headers are emitted. Cross-origin mutating requests (`POST`, `PUT`, `PATCH`, `DELETE`) to `/api/*` are rejected before dispatch when the origin is not allowed.
|
|
13
13
|
- **Content type**: All JSON responses use `Content-Type: application/json`. SSE streams use `Content-Type: text/event-stream`.
|
|
14
14
|
|
|
15
|
+
## Canonical Job Status
|
|
16
|
+
|
|
17
|
+
Job `status` values returned by `/api/jobs` and `/api/jobs/:id` are drawn
|
|
18
|
+
from the canonical `JobStatus` enum:
|
|
19
|
+
|
|
20
|
+
| Value | Meaning |
|
|
21
|
+
|-------|---------|
|
|
22
|
+
| `pending` | Queued, not yet started |
|
|
23
|
+
| `running` | One or more tasks are executing |
|
|
24
|
+
| `waiting` | Paused on a human gate (approve/reject) |
|
|
25
|
+
| `complete` | All terminal tasks finished successfully (persisted `state: "done"` is mapped to this value on read) |
|
|
26
|
+
| `failed` | A task or gate failed (persisted `state: "failed"` and legacy `status: "error"` both surface as this value) |
|
|
27
|
+
|
|
28
|
+
The canonical vocabulary is the only vocabulary the server emits. The
|
|
29
|
+
reader tolerates legacy spellings (`done`, `error`, `completed`) on
|
|
30
|
+
input, but the wire `status` is always one of the five values above.
|
|
31
|
+
|
|
32
|
+
### Interrupted runners
|
|
33
|
+
|
|
34
|
+
When a pipeline runner process dies before its job reaches a terminal
|
|
35
|
+
state (crash, OOM, `SIGKILL`, or the orchestrator dying alongside it),
|
|
36
|
+
the orchestrator marks the orphaned `running` task and the job `failed`
|
|
37
|
+
durably — on runner exit when the orchestrator observed the child, and
|
|
38
|
+
on the next orchestrator startup via a single boot sweep over
|
|
39
|
+
`current/` for jobs orphaned while the orchestrator was down (including
|
|
40
|
+
detached resume runners from `/restart` and `/tasks/:taskId/start`).
|
|
41
|
+
The persisted states stay the existing `failed`; the distinction from a
|
|
42
|
+
task-logic failure is carried by `tasks[taskId].errorContext.kind =
|
|
43
|
+
"runner-interrupted"` when a running task is attributable, or by root
|
|
44
|
+
`errorContext.kind = "runner-interrupted"` when only the job-level
|
|
45
|
+
status remained `running` (with `code`, `signal`, `source`). Recovery stays
|
|
46
|
+
a client action via `POST /api/jobs/:jobId/restart` or
|
|
47
|
+
`POST /api/jobs/:jobId/tasks/:taskId/start`; the orchestrator does not
|
|
48
|
+
auto-respawn.
|
|
49
|
+
|
|
15
50
|
## Response Envelope
|
|
16
51
|
|
|
17
52
|
Every JSON response uses the shape:
|
|
@@ -168,11 +203,21 @@ Clients should treat a gap longer than the keep-alive interval as a potential di
|
|
|
168
203
|
|
|
169
204
|
| Event | Data Shape | Description |
|
|
170
205
|
|-------|-----------|-------------|
|
|
171
|
-
| `state:change` | `{ jobId,
|
|
172
|
-
| `state:summary` | `{ changeCount }` | Summary of accumulated state changes |
|
|
173
|
-
| `job:created` | `JobSummary` | A new job was detected |
|
|
174
|
-
| `job:updated` | `JobSummary` | An existing job was updated |
|
|
206
|
+
| `state:change` | `{ jobId, path }` | A job's state file changed; the `jobId` is derived from the changed path |
|
|
207
|
+
| `state:summary` | `{ changeCount }` | Summary of accumulated state changes when no per-job change is prioritized |
|
|
208
|
+
| `job:created` | `JobSummary` | A new job was detected (summary granularity; see Caveat below) |
|
|
209
|
+
| `job:updated` | `JobSummary` | An existing job was updated (summary granularity; see Caveat below) |
|
|
210
|
+
| `job:removed` | `{ jobId }` | A job was removed from a watched location |
|
|
175
211
|
| `heartbeat` | `{ ok, timestamp }` | Application-level heartbeat (distinct from the keep-alive comment) |
|
|
212
|
+
| `seed:uploaded` | `{}` | A seed was uploaded; clients should refetch the job list |
|
|
213
|
+
|
|
214
|
+
The keep-alive comment (`: keep-alive`) sent on a fixed interval is **not** an application event;
|
|
215
|
+
clients must not treat it as one. Unknown event types and unknown fields within a known event
|
|
216
|
+
are tolerated by the contract; clients should ignore them. `task:updated`, `status:changed`,
|
|
217
|
+
bare `state`, and `message` are **not** part of the browser-facing contract and are not
|
|
218
|
+
emitted on `/api/events`. `job:created` and `job:updated` carry summary-granularity
|
|
219
|
+
`JobSummary` data; deep per-task detail (costs, files, per-stage state) continues to arrive
|
|
220
|
+
via the existing `state:change` → refetch path.
|
|
176
221
|
|
|
177
222
|
### Job Filtering
|
|
178
223
|
|
|
@@ -230,6 +275,37 @@ Capability negotiation is not built into this protocol. Clients discover compati
|
|
|
230
275
|
- **Adding a new event type** is a **minor** change (given the robustness rule above).
|
|
231
276
|
- **Changing an existing event's payload shape** (removing or renaming a field, changing a field's type) is a **breaking** change.
|
|
232
277
|
|
|
278
|
+
## Breaking Changes
|
|
279
|
+
|
|
280
|
+
The changes below are observable to external HTTP/API consumers. They
|
|
281
|
+
are documented here because the spec does not yet ship a real
|
|
282
|
+
schema/version discriminator (deferred to #32). A dated entry is
|
|
283
|
+
added for every change so consumers can grep for the cutover.
|
|
284
|
+
|
|
285
|
+
### 2026-06-19 — Canonical job status and name-keyed task ids
|
|
286
|
+
|
|
287
|
+
The persisted `JobState` vocabulary (`done`) and the legacy HTTP
|
|
288
|
+
`status` field (`error`) are both mapped to the canonical `JobStatus`
|
|
289
|
+
enum on read. Task ids are now name-keyed on the server and the
|
|
290
|
+
browser; an unnamed array entry falls back to a zero-based
|
|
291
|
+
`task-${index}` (e.g. `task-0`, `task-1`) so server and browser agree.
|
|
292
|
+
|
|
293
|
+
| Surface | Before | After |
|
|
294
|
+
|---------|--------|-------|
|
|
295
|
+
| `GET /api/jobs`, `GET /api/jobs/:id` → `status` | `"error"` | `"failed"` |
|
|
296
|
+
| `GET /api/jobs`, `GET /api/jobs/:id` → `status` | `"done"` | `"complete"` |
|
|
297
|
+
| `PipelineOrchestrator.getStatus(...)` → `state` | `"done"` | `"complete"` |
|
|
298
|
+
| `PipelineOrchestrator.listJobs()` → `state` (per job) | mixed (`done` vs `complete`) | always `"complete"` |
|
|
299
|
+
| `tasks` keys (server and browser) | mixed (`task-0`/`task-1` split) | name-keyed; `task-${index}` only for unnamed array entries |
|
|
300
|
+
|
|
301
|
+
Legacy spellings (`done`, `error`, `completed`) are still **accepted**
|
|
302
|
+
on input by `normalizeJobStatus` / `normalizeJobView` so a mixed
|
|
303
|
+
deploy or stale on-disk file does not mis-render. The server **never
|
|
304
|
+
emits** `done` / `error` as a job status.
|
|
305
|
+
|
|
306
|
+
This is the only external break signal shipped with this change.
|
|
307
|
+
A durable schema/version discriminator is tracked in #32.
|
|
308
|
+
|
|
233
309
|
## Protocol Versioning
|
|
234
310
|
|
|
235
311
|
The `protocolVersion` integer returned by `GET /api/meta` is the protocol's semver indicator:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryanfw/prompt-orchestration-pipeline",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.4",
|
|
4
4
|
"description": "A Prompt-orchestration pipeline (POP) is a framework for building, running, and experimenting with complex chains of LLM tasks.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/ui/server/index.ts",
|
|
@@ -42,9 +42,6 @@
|
|
|
42
42
|
"typecheck": "tsc --noEmit"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@babel/parser": "^7.28.5",
|
|
46
|
-
"@babel/traverse": "^7.28.5",
|
|
47
|
-
"@babel/types": "^7.28.5",
|
|
48
45
|
"@radix-ui/react-progress": "^1.1.7",
|
|
49
46
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
50
47
|
"@radix-ui/react-toast": "^1.2.15",
|