@forumone/throughline-publishing 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/README.md +8 -5
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +2 -3
- package/dist/options.js.map +1 -1
- package/dist/pipeline/index.d.ts +5 -0
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +47 -29
- package/dist/pipeline/index.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +8 -27
- package/dist/plugin.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,60 @@
|
|
|
1
1
|
# @forumone/throughline-publishing
|
|
2
2
|
|
|
3
|
+
## 0.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 3140ea0: One MCP transport, not seven
|
|
8
|
+
|
|
9
|
+
Every plugin served its own `POST /<prefix>/mcp` on a 146-line JSON-RPC subset of
|
|
10
|
+
the protocol that spoke `tools/list` and `tools/call` and nothing else. Payload
|
|
11
|
+
ships an MCP server built on the official SDK — streamable HTTP, sessions, per-key
|
|
12
|
+
capability checkboxes — and the tools were never the transport. They now reach a
|
|
13
|
+
client through the host's `@payloadcms/plugin-mcp`, on one `/api/mcp`, via the
|
|
14
|
+
collector `createMcpToolCollector` already provided.
|
|
15
|
+
|
|
16
|
+
**Breaking.** Removed from `@forumone/throughline-core`: `createMcpHandler`,
|
|
17
|
+
`McpHandlerOptions`, `createApiKeysCollection`, `ApiKeysCollectionOptions`,
|
|
18
|
+
`DEFAULT_API_KEYS_SLUG`, `createBearerTokenAuthenticator`,
|
|
19
|
+
`BearerTokenAuthenticatorOptions`, `generateApiKey`. Removed from
|
|
20
|
+
`@forumone/throughline-plugin-contract`: `McpAuthenticator`, `McpAuthResult`.
|
|
21
|
+
`sha256Hex` stays exported, from `./utils` rather than `./auth`.
|
|
22
|
+
|
|
23
|
+
`routePrefix` is gone from `auditQueryPlugin`, `componentsPlugin` and
|
|
24
|
+
`integrationsPlugin` — omitted from their options types, so passing one is a
|
|
25
|
+
compile error rather than config that reads as if it does something. `/mcp` was
|
|
26
|
+
the only endpoint any of the three served. `publishingPlugin`, `approvalsPlugin`
|
|
27
|
+
and `formsPlugin` keep theirs; they still serve admin controls, the approval
|
|
28
|
+
action link and the public form post.
|
|
29
|
+
|
|
30
|
+
**A host that passes no `mcpTools` collector now has no MCP surface.** There is no
|
|
31
|
+
per-server endpoint left as a fallback. This is a config change of one line per
|
|
32
|
+
plugin, and `createMcpToolCollector`'s own docs carry the shape.
|
|
33
|
+
|
|
34
|
+
**What this costs, stated plainly.** `requiredScope` is now read by nothing —
|
|
35
|
+
`plugin-mcp` gates on checkboxes generated at config time, which this suite cannot
|
|
36
|
+
fill because every tool is built at `onInit`. So a key that authenticates reaches
|
|
37
|
+
every collected tool, exactly as an all-or-nothing per-server key did. The
|
|
38
|
+
declarations are kept because they are the mapping those checkboxes need; #78
|
|
39
|
+
tracks restoring enforcement, and the type's own doc comment says so.
|
|
40
|
+
|
|
41
|
+
Also drops the key collection from the playground, which leaves that app with no
|
|
42
|
+
MCP surface at all until `mcpPlugin` can be wired there — #79, blocked on moving
|
|
43
|
+
it off `payload@^3.83.0`.
|
|
44
|
+
|
|
45
|
+
### Patch Changes
|
|
46
|
+
|
|
47
|
+
- Updated dependencies [3140ea0]
|
|
48
|
+
- @forumone/throughline-plugin-contract@0.4.0
|
|
49
|
+
- @forumone/throughline-core@0.7.0
|
|
50
|
+
|
|
51
|
+
## 0.7.1
|
|
52
|
+
|
|
53
|
+
### Patch Changes
|
|
54
|
+
|
|
55
|
+
- Updated dependencies [9131065]
|
|
56
|
+
- @forumone/throughline-core@0.6.0
|
|
57
|
+
|
|
3
58
|
## 0.7.0
|
|
4
59
|
|
|
5
60
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ Policy-gated publishing server for Throughline. The trust boundary that decides
|
|
|
8
8
|
- **A trust boundary** — a `beforeChange` hook on every configured collection that rejects direct writes to `_status`. The pipeline is the only sanctioned way to publish.
|
|
9
9
|
- **Admin controls** — Publish and Unpublish buttons that run the pipeline as the logged-in editor. Installed automatically; no host-side code.
|
|
10
10
|
- **A server-side API** — `publishDocument` / `unpublishDocument` / `getPublishStatus` for host code that needs to publish outside the admin.
|
|
11
|
-
- **Five MCP tools**
|
|
11
|
+
- **Five MCP tools** — `publish`, `unpublish`, `schedule_publish`, `get_publish_status`, `rollback` — handed to the host's collector at `onInit` and served by `@payloadcms/plugin-mcp` on one `/api/mcp`. Pass `mcpTools` or they reach nobody.
|
|
12
12
|
|
|
13
13
|
## Installation
|
|
14
14
|
|
|
@@ -71,11 +71,14 @@ With `adminComponents: false` the admin has **no** working publish path until yo
|
|
|
71
71
|
|---|---|---|
|
|
72
72
|
| `POST /api/publishing/publish` | Payload session | `{ collection, id }` |
|
|
73
73
|
| `POST /api/publishing/unpublish` | Payload session | `{ collection, id }` |
|
|
74
|
-
| `POST /api/publishing/mcp` | Bearer API key | JSON-RPC |
|
|
75
74
|
|
|
76
|
-
|
|
75
|
+
Those two, and nothing else. This plugin used to serve `POST /api/publishing/mcp`
|
|
76
|
+
on a JSON-RPC subset written here; it is deleted, along with the five others like
|
|
77
|
+
it.
|
|
77
78
|
|
|
78
|
-
|
|
79
|
+
### Serving these tools through Payload's MCP plugin
|
|
80
|
+
|
|
81
|
+
Payload ships `@payloadcms/plugin-mcp` — the official MCP SDK, streamable HTTP, sessions, and per-key per-tool capability checkboxes an admin can see and change. It is now the only way these tools reach a client:
|
|
79
82
|
|
|
80
83
|
```ts
|
|
81
84
|
import { createMcpToolCollector } from '@forumone/throughline-core'
|
|
@@ -92,7 +95,7 @@ plugins: [
|
|
|
92
95
|
|
|
93
96
|
Every tool here is built at `onInit`, because every one closes over `payload`; `mcpPlugin` takes its tools as a config option. The collector bridges that, and it works because the plugin reads `mcp.tools` inside the handler it builds *per request* — so an array handed over at config time is read populated. Hand over `mcpTools.tools` itself rather than a copy.
|
|
94
97
|
|
|
95
|
-
Omit `mcpTools` and
|
|
98
|
+
Omit `mcpTools` and this plugin's tools are unreachable — there is no per-server endpoint left as a fallback, and nothing errors, because from Payload's side nothing is misconfigured. The admin controls, the trust boundary and `publishDocument` all still work.
|
|
96
99
|
|
|
97
100
|
One thing does not survive the move: `plugin-mcp` resolves a key to its linked user and does not carry the key document forward, so the calling key's *name* is not recoverable. Audit rows record the strategy instead, or a name the host passes as `apiKeyName`.
|
|
98
101
|
|
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAElF,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IACZ,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mGAAmG;IACnG,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,uFAAuF;IACvF,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,0EAA0E;IAC1E,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC1D;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,CACH,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,UAAU,EAAE,kBAAkB,KAC3B,OAAO,CAAC,kBAAkB,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAA;CAC1D;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,iBAAiB,EAAE,CACjB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,uEAAuE;IACvE,WAAW,EAAE,qBAAqB,EAAE,CAAA;IACpC,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC1C;;;;;;;OAOG;IACH,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAA;IACrC,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC5B;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC,GACtF,IAAI,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAA;AAe/C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,uBAAuB,GAAG,uBAAuB,CAezF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,MAAM,GACX,kBAAkB,CAiBpB"}
|
package/dist/options.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { formatZodIssues } from '@forumone/throughline-core';
|
|
1
2
|
import { z } from 'zod';
|
|
2
3
|
const PublishableCollectionSchema = z.object({
|
|
3
4
|
slug: z.string().min(1),
|
|
@@ -26,9 +27,7 @@ export function validateOptions(options) {
|
|
|
26
27
|
for (const collection of options.collections) {
|
|
27
28
|
const result = PublishableCollectionSchema.safeParse(collection);
|
|
28
29
|
if (!result.success) {
|
|
29
|
-
const issues = result.error
|
|
30
|
-
.map((i) => ` - ${i.path.join('.') || '(root)'}: ${i.message}`)
|
|
31
|
-
.join('\n');
|
|
30
|
+
const issues = formatZodIssues(result.error);
|
|
32
31
|
throw new Error(`Invalid collection config:\n${issues}`);
|
|
33
32
|
}
|
|
34
33
|
}
|
package/dist/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAG5D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAqGvB,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,CAAC;SACd,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACxE,QAAQ,EAAE;CACd,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgC;IAC9D,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;IACnF,CAAC;IACD,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,2BAA2B,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAChE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC5C,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAgC,EAChC,IAAY;IAEZ,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,sFAAsF,CAC1G,CAAA;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,QAAQ;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,QAAQ;QAC3C,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM;QACrC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,aAAa;QAC1D,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,oBAAoB;QAC3E,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAA;AACH,CAAC"}
|
package/dist/pipeline/index.d.ts
CHANGED
|
@@ -9,6 +9,11 @@ export declare function runPublishPipeline(context: PipelineContext): Promise<Pi
|
|
|
9
9
|
* Runs every preflight step (everything but `execute`). Used by
|
|
10
10
|
* `get_publish_status` to answer "would this publish succeed?" without
|
|
11
11
|
* mutating anything.
|
|
12
|
+
*
|
|
13
|
+
* Warnings are deliberately dropped, as they always were: this answers a
|
|
14
|
+
* question about whether a publish would be *blocked*, and a warning does not
|
|
15
|
+
* block. Surfacing them here would be a change to what `get_publish_status`
|
|
16
|
+
* means, not a tidy-up.
|
|
12
17
|
*/
|
|
13
18
|
export declare function runPreflightPipeline(context: PipelineContext): Promise<PipelineResult>;
|
|
14
19
|
export type { PipelineContext, PipelineResult, PipelineStep, PipelineStepResult } from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAA;AAoE/E;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAO1F;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAG5F;AAED,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/pipeline/index.js
CHANGED
|
@@ -18,53 +18,71 @@ const ORDERED_STEPS = [
|
|
|
18
18
|
{ name: 'execute', step: executeStep },
|
|
19
19
|
];
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
21
|
+
* Walks a list of steps, stopping at the first that does not pass.
|
|
22
|
+
*
|
|
23
|
+
* The failure envelope — `failedAt` plus whichever of `reason`, `code`,
|
|
24
|
+
* `issues` and `suggestion` the step supplied — was written out twice, once per
|
|
25
|
+
* runner, and a field added to one would have been missed by the other. It is
|
|
26
|
+
* written here once.
|
|
27
|
+
*
|
|
28
|
+
* Warnings are collected but not returned in the envelope: what to do with them
|
|
29
|
+
* differs between the two callers, and that difference is the only reason there
|
|
30
|
+
* are still two.
|
|
31
|
+
*
|
|
32
|
+
* One thing worth knowing before adding a step: a warning cannot currently reach
|
|
33
|
+
* a *failure* envelope. `execute` is the only step that warns, it runs last, and
|
|
34
|
+
* its two failure returns carry none — so `runPublishPipeline` spreading
|
|
35
|
+
* warnings onto a failure is unreachable today. It is kept because the moment a
|
|
36
|
+
* step both warns and fails, or an earlier step learns to warn, dropping them
|
|
37
|
+
* would be silent. That is also why there is no test for it: the pipeline has no
|
|
38
|
+
* way to produce the case.
|
|
24
39
|
*/
|
|
25
|
-
|
|
40
|
+
async function runSteps(context, steps) {
|
|
26
41
|
const warnings = [];
|
|
27
|
-
for (const { name, step } of
|
|
42
|
+
for (const { name, step } of steps) {
|
|
28
43
|
const result = await step(context);
|
|
29
44
|
if (result.warnings)
|
|
30
45
|
warnings.push(...result.warnings);
|
|
31
|
-
if (
|
|
32
|
-
|
|
46
|
+
if (result.pass)
|
|
47
|
+
continue;
|
|
48
|
+
return {
|
|
49
|
+
failure: {
|
|
33
50
|
success: false,
|
|
34
51
|
failedAt: name,
|
|
35
52
|
...(result.reason ? { reason: result.reason } : {}),
|
|
36
53
|
...(result.code ? { code: result.code } : {}),
|
|
37
54
|
...(result.issues ? { issues: result.issues } : {}),
|
|
38
55
|
...(result.suggestion ? { suggestion: result.suggestion } : {}),
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
56
|
+
},
|
|
57
|
+
warnings,
|
|
58
|
+
};
|
|
42
59
|
}
|
|
43
|
-
return {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
60
|
+
return { warnings };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Runs the full publish pipeline. Stops at the first failing step and
|
|
64
|
+
* returns its diagnostic; otherwise records success with the publish
|
|
65
|
+
* timestamp the execute step set.
|
|
66
|
+
*/
|
|
67
|
+
export async function runPublishPipeline(context) {
|
|
68
|
+
const { failure, warnings } = await runSteps(context, ORDERED_STEPS);
|
|
69
|
+
const carried = warnings.length ? { warnings } : {};
|
|
70
|
+
if (failure)
|
|
71
|
+
return { ...failure, ...carried };
|
|
72
|
+
return { success: true, publishedAt: new Date().toISOString(), ...carried };
|
|
48
73
|
}
|
|
49
74
|
/**
|
|
50
75
|
* Runs every preflight step (everything but `execute`). Used by
|
|
51
76
|
* `get_publish_status` to answer "would this publish succeed?" without
|
|
52
77
|
* mutating anything.
|
|
78
|
+
*
|
|
79
|
+
* Warnings are deliberately dropped, as they always were: this answers a
|
|
80
|
+
* question about whether a publish would be *blocked*, and a warning does not
|
|
81
|
+
* block. Surfacing them here would be a change to what `get_publish_status`
|
|
82
|
+
* means, not a tidy-up.
|
|
53
83
|
*/
|
|
54
84
|
export async function runPreflightPipeline(context) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (!result.pass) {
|
|
58
|
-
return {
|
|
59
|
-
success: false,
|
|
60
|
-
failedAt: name,
|
|
61
|
-
...(result.reason ? { reason: result.reason } : {}),
|
|
62
|
-
...(result.code ? { code: result.code } : {}),
|
|
63
|
-
...(result.issues ? { issues: result.issues } : {}),
|
|
64
|
-
...(result.suggestion ? { suggestion: result.suggestion } : {}),
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return { success: true };
|
|
85
|
+
const { failure } = await runSteps(context, PREFLIGHT_STEPS);
|
|
86
|
+
return failure ?? { success: true };
|
|
69
87
|
}
|
|
70
88
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAQhD,MAAM,eAAe,GAAkB;IACrC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE;IAC9C,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAClD,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;IACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE;CACzC,CAAA;AAED,MAAM,aAAa,GAAkB;IACnC,GAAG,eAAe;IAClB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;CACvC,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAQhD,MAAM,eAAe,GAAkB;IACrC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE;IAC9C,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAClD,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;IACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE;CACzC,CAAA;AAED,MAAM,aAAa,GAAkB;IACnC,GAAG,eAAe;IAClB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;CACvC,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,KAAK,UAAU,QAAQ,CACrB,OAAwB,EACxB,KAAoB;IAEpB,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA;QAClC,IAAI,MAAM,CAAC,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;QACtD,IAAI,MAAM,CAAC,IAAI;YAAE,SAAQ;QAEzB,OAAO;YACL,OAAO,EAAE;gBACP,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,IAAI;gBACd,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChE;YACD,QAAQ;SACT,CAAA;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAA;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAwB;IAC/D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnD,IAAI,OAAO;QAAE,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAA;IAE9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,CAAA;AAC7E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAwB;IACjE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;IAC5D,OAAO,OAAO,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACrC,CAAC"}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAA;AAGvE,OAAO,EAAE,KAAK,uBAAuB,EAAmB,MAAM,cAAc,CAAA;AAiB5E,eAAO,MAAM,gBAAgB,EAAE,UAAU,CAAC,uBAAuB,CA+F9D,CAAA"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getPluginRegistry } from '@forumone/throughline-plugin-contract';
|
|
2
|
-
import {
|
|
2
|
+
import { createNamedLogger, defaultLogger, getAuditWriter } from '@forumone/throughline-core';
|
|
3
3
|
import { validateOptions } from './options.js';
|
|
4
4
|
import { createBlockStatusWritesHook } from './hooks/block-status-writes.js';
|
|
5
5
|
import { createRecordDraftWritesHook } from './hooks/draft-writes.js';
|
|
@@ -8,7 +8,6 @@ import { attachPublishingService, createPublishingService } from './service.js';
|
|
|
8
8
|
import { createGetPublishStatusTool, createPublishTool, createRollbackTool, createSchedulePublishTool, createUnpublishTool, } from './tools/index.js';
|
|
9
9
|
const PLUGIN_ID = '@forumone/throughline-publishing';
|
|
10
10
|
const PLUGIN_VERSION = '0.1.0';
|
|
11
|
-
const MCP_HANDLER_SYMBOL = Symbol.for('@forumone/throughline/publishing-mcp-handler');
|
|
12
11
|
const CLIENT_ENTRY = '@forumone/throughline-publishing/client';
|
|
13
12
|
export const publishingPlugin = (rawOptions) => (incomingConfig) => {
|
|
14
13
|
if (rawOptions.enabled === false)
|
|
@@ -51,17 +50,6 @@ export const publishingPlugin = (rawOptions) => (incomingConfig) => {
|
|
|
51
50
|
endpoints: [
|
|
52
51
|
...(incomingConfig.endpoints ?? []),
|
|
53
52
|
...createAdminEndpoints({ routePrefix, publishableSlugs }),
|
|
54
|
-
{
|
|
55
|
-
path: `${routePrefix}/mcp`,
|
|
56
|
-
method: 'post',
|
|
57
|
-
handler: async (req) => {
|
|
58
|
-
const handler = req.payload[MCP_HANDLER_SYMBOL];
|
|
59
|
-
if (!handler) {
|
|
60
|
-
return new Response(JSON.stringify({ error: 'Publishing MCP not initialized' }), { status: 503, headers: { 'content-type': 'application/json' } });
|
|
61
|
-
}
|
|
62
|
-
return handler(req);
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
53
|
],
|
|
66
54
|
onInit: async (payload) => {
|
|
67
55
|
if (incomingConfig.onInit) {
|
|
@@ -82,26 +70,19 @@ export const publishingPlugin = (rawOptions) => (incomingConfig) => {
|
|
|
82
70
|
createRollbackTool({ payload, options, auditWriter }),
|
|
83
71
|
];
|
|
84
72
|
/*
|
|
85
|
-
Payload's own MCP plugin,
|
|
73
|
+
Payload's own MCP plugin, and the only transport these tools have.
|
|
86
74
|
|
|
87
|
-
`onInit` is the first moment
|
|
75
|
+
`onInit` is the first moment they can exist — they close over the
|
|
88
76
|
service, the audit writer and `payload` — and it runs before any request,
|
|
89
77
|
which is when `mcpPlugin` reads the array. That ordering is the whole
|
|
90
78
|
reason a config-time option can be filled at init.
|
|
79
|
+
|
|
80
|
+
A host that registers this plugin without `mcpTools` gets the publish
|
|
81
|
+
pipeline, the admin controls and `publishDocument`, and no MCP surface
|
|
82
|
+
at all. This plugin used to serve its own `/mcp` endpoint as a fallback;
|
|
83
|
+
it no longer does.
|
|
91
84
|
*/
|
|
92
85
|
options.mcpTools?.add(tools, { serverName: 'publishing', logger });
|
|
93
|
-
const handler = createMcpHandler({
|
|
94
|
-
payload,
|
|
95
|
-
serverName: 'publishing',
|
|
96
|
-
tools,
|
|
97
|
-
logger,
|
|
98
|
-
});
|
|
99
|
-
Object.defineProperty(payload, MCP_HANDLER_SYMBOL, {
|
|
100
|
-
value: handler,
|
|
101
|
-
enumerable: false,
|
|
102
|
-
writable: false,
|
|
103
|
-
configurable: false,
|
|
104
|
-
});
|
|
105
86
|
registry.register({
|
|
106
87
|
id: PLUGIN_ID,
|
|
107
88
|
version: PLUGIN_VERSION,
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AACzE,OAAO,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forumone/throughline-publishing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Policy-gated publishing server for Throughline. Wraps Payload's update operation with composition, accessibility, required-field, embargo, and approval gating.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"zod": "^3.23.0",
|
|
62
|
-
"@forumone/throughline-core": "0.
|
|
63
|
-
"@forumone/throughline-plugin-contract": "0.
|
|
62
|
+
"@forumone/throughline-core": "0.7.0",
|
|
63
|
+
"@forumone/throughline-plugin-contract": "0.4.0"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@payloadcms/db-sqlite": "^3.83.0",
|