@forumone/throughline-approvals 0.5.0 → 0.6.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 +64 -0
- package/README.md +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +4 -28
- package/dist/plugin.js.map +1 -1
- package/dist/tools/get-approval-status.js +1 -11
- package/dist/tools/get-approval-status.js.map +1 -1
- package/dist/tools/list-pending-approvals.js +1 -11
- package/dist/tools/list-pending-approvals.js.map +1 -1
- package/dist/tools/respond-to-approval.d.ts.map +1 -1
- package/dist/tools/respond-to-approval.js +1 -9
- package/dist/tools/respond-to-approval.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,69 @@
|
|
|
1
1
|
# @forumone/throughline-approvals
|
|
2
2
|
|
|
3
|
+
## 0.6.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-publishing@0.8.0
|
|
50
|
+
- @forumone/throughline-core@0.7.0
|
|
51
|
+
|
|
52
|
+
## 0.5.1
|
|
53
|
+
|
|
54
|
+
### Patch Changes
|
|
55
|
+
|
|
56
|
+
- 9131065: Three helpers that existed once per package now exist once
|
|
57
|
+
- **`unwrapRelationshipId`** had four definitions — three private to `approvals`, one exported from `email` — differing only in a null guard that `typeof value === 'string'` already covers. One deliberate change comes with the move: none of the four handled a _numeric_ id, so on Postgres at `depth: 0` they returned `null` for a relationship that was populated fine. No caller reads at depth 0 today, so this fixes nothing and stops a shared helper being wrong for the first caller that does.
|
|
58
|
+
- **`deniedEnvelope`** had three identical definitions, one per server with an access predicate. The role predicates stay where they are: what counts as an audit reader is not what counts as a forms author, and collapsing those would put one package's policy in another's file.
|
|
59
|
+
- **The MCP handler rebuilt `createNamedLogger` inline**, forty lines from the real one in the same package.
|
|
60
|
+
|
|
61
|
+
Nothing else in the duplication audit survived checking. `createFakePayload` has six definitions and three distinct implementations — a query engine, a two-line map read, and a stateful form store — which share a name and nothing else; merging them means building a fake that does all three jobs. `createFakeInngest` has one definition and three importers. The six MCP endpoint stanzas are real duplication that should be deleted rather than merged, once hosts move to `@payloadcms/plugin-mcp`.
|
|
62
|
+
|
|
63
|
+
- Updated dependencies [9131065]
|
|
64
|
+
- @forumone/throughline-core@0.6.0
|
|
65
|
+
- @forumone/throughline-publishing@0.7.1
|
|
66
|
+
|
|
3
67
|
## 0.5.0
|
|
4
68
|
|
|
5
69
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ Conversational approval workflow server for Throughline. Provides the resolver t
|
|
|
8
8
|
- **Approval resolver** that the publishing server's `approvalStep` calls to check for active granted approvals (auto-attached on the Payload instance via Symbol — no manual wiring needed).
|
|
9
9
|
- **HMAC-signed action tokens** (`generateActionToken` / `verifyActionToken`) for inline-action emails. Single-use enforcement via the per-record `consumedTokens` array prevents replay.
|
|
10
10
|
- **HTTP action endpoint** at `/api/approvals/action` that handles email button clicks: verify token → confirmation page → record decision.
|
|
11
|
-
- **Five MCP tools
|
|
11
|
+
- **Five MCP tools**, 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
|
| Tool | Audit |
|
|
14
14
|
|---|---|
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAA;AAGvE,OAAO,EAAE,KAAK,sBAAsB,EAAmB,MAAM,cAAc,CAAA;AAgB3E,eAAO,MAAM,eAAe,EAAE,UAAU,CAAC,sBAAsB,CAkF5D,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 { createApprovalsCollection } from './collection.js';
|
|
5
5
|
import { attachApprovalResolver, createApprovalResolver } from './resolver.js';
|
|
@@ -7,7 +7,6 @@ import { createActionEndpoint } from './endpoints/action.js';
|
|
|
7
7
|
import { createGetApprovalStatusTool, createListMyRequestsTool, createListPendingApprovalsTool, createRequestApprovalTool, createRespondToApprovalTool, } from './tools/index.js';
|
|
8
8
|
const PLUGIN_ID = '@forumone/throughline-approvals';
|
|
9
9
|
const PLUGIN_VERSION = '0.1.0';
|
|
10
|
-
const MCP_HANDLER_SYMBOL = Symbol.for('@forumone/throughline/approvals-mcp-handler');
|
|
11
10
|
const ACTION_HANDLER_SYMBOL = Symbol.for('@forumone/throughline/approvals-action-handler');
|
|
12
11
|
export const approvalsPlugin = (rawOptions) => (incomingConfig) => {
|
|
13
12
|
if (rawOptions.enabled === false)
|
|
@@ -25,17 +24,6 @@ export const approvalsPlugin = (rawOptions) => (incomingConfig) => {
|
|
|
25
24
|
collections: [...(incomingConfig.collections ?? []), collection],
|
|
26
25
|
endpoints: [
|
|
27
26
|
...(incomingConfig.endpoints ?? []),
|
|
28
|
-
{
|
|
29
|
-
path: `${routePrefix}/mcp`,
|
|
30
|
-
method: 'post',
|
|
31
|
-
handler: async (req) => {
|
|
32
|
-
const handler = req.payload[MCP_HANDLER_SYMBOL];
|
|
33
|
-
if (!handler) {
|
|
34
|
-
return new Response(JSON.stringify({ error: 'Approvals MCP not initialized' }), { status: 503, headers: { 'content-type': 'application/json' } });
|
|
35
|
-
}
|
|
36
|
-
return handler(req);
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
27
|
{
|
|
40
28
|
path: `${routePrefix}/action`,
|
|
41
29
|
method: 'get',
|
|
@@ -72,22 +60,10 @@ export const approvalsPlugin = (rawOptions) => (incomingConfig) => {
|
|
|
72
60
|
createListPendingApprovalsTool({ payload, options }),
|
|
73
61
|
createListMyRequestsTool({ payload, options }),
|
|
74
62
|
];
|
|
75
|
-
// Payload's own MCP plugin,
|
|
76
|
-
//
|
|
77
|
-
//
|
|
63
|
+
// Payload's own MCP plugin, and the only transport these tools have.
|
|
64
|
+
// `onInit` is both the earliest they can exist and still early enough
|
|
65
|
+
// that `mcpPlugin` reads the array populated.
|
|
78
66
|
options.mcpTools?.add(tools, { serverName: 'approvals', logger });
|
|
79
|
-
const handler = createMcpHandler({
|
|
80
|
-
payload,
|
|
81
|
-
serverName: 'approvals',
|
|
82
|
-
tools,
|
|
83
|
-
logger,
|
|
84
|
-
});
|
|
85
|
-
Object.defineProperty(payload, MCP_HANDLER_SYMBOL, {
|
|
86
|
-
value: handler,
|
|
87
|
-
enumerable: false,
|
|
88
|
-
writable: false,
|
|
89
|
-
configurable: false,
|
|
90
|
-
});
|
|
91
67
|
registry.register({
|
|
92
68
|
id: PLUGIN_ID,
|
|
93
69
|
version: PLUGIN_VERSION,
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,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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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { withMeta } from '@forumone/throughline-core';
|
|
2
|
+
import { unwrapRelationshipId, withMeta } from '@forumone/throughline-core';
|
|
3
3
|
import { DEFAULT_APPROVALS_SLUG } from '../collection.js';
|
|
4
4
|
export function createGetApprovalStatusTool(deps) {
|
|
5
5
|
const inputSchema = withMeta({
|
|
@@ -34,14 +34,4 @@ export function createGetApprovalStatusTool(deps) {
|
|
|
34
34
|
},
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
|
-
function unwrapRelationshipId(value) {
|
|
38
|
-
if (value === null || value === undefined)
|
|
39
|
-
return null;
|
|
40
|
-
if (typeof value === 'string')
|
|
41
|
-
return value;
|
|
42
|
-
if (typeof value === 'object' && 'id' in value) {
|
|
43
|
-
return String(value.id);
|
|
44
|
-
}
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
37
|
//# sourceMappingURL=get-approval-status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-approval-status.js","sourceRoot":"","sources":["../../src/tools/get-approval-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"get-approval-status.js","sourceRoot":"","sources":["../../src/tools/get-approval-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAE3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAQzD,MAAM,UAAU,2BAA2B,CAAC,IAA2B;IACrE,MAAM,WAAW,GAAG,QAAQ,CAAC;QAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAA;IAEF,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,sIAAsI;QACxI,WAAW;QACX,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC5C,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,sBAAsB;gBACjE,EAAE,EAAE,KAAK,CAAC,UAAU;aACrB,CAAC,CAAmC,CAAA;YACrC,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAA;YAErD,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;gBAC1B,gBAAgB,EAAE,QAAQ,CAAC,kBAAkB,CAAC;gBAC9C,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC;gBAC9B,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC;gBACpC,aAAa,EAAE,QAAQ,CAAC,eAAe,CAAC;gBACxC,WAAW,EAAE,oBAAoB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;gBAC1D,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC;gBACpC,cAAc,EAAE,QAAQ,CAAC,gBAAgB,CAAC;gBAC1C,SAAS,EAAE,oBAAoB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACtD,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC;gBAChC,aAAa,EAAE,QAAQ,CAAC,eAAe,CAAC;gBACxC,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC;aACjC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { withMeta } from '@forumone/throughline-core';
|
|
2
|
+
import { unwrapRelationshipId, withMeta } from '@forumone/throughline-core';
|
|
3
3
|
import { DEFAULT_APPROVALS_SLUG } from '../collection.js';
|
|
4
4
|
export function createListPendingApprovalsTool(deps) {
|
|
5
5
|
const inputSchema = withMeta({
|
|
@@ -49,14 +49,4 @@ export function createListPendingApprovalsTool(deps) {
|
|
|
49
49
|
},
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
-
function unwrapRelationshipId(value) {
|
|
53
|
-
if (value === null || value === undefined)
|
|
54
|
-
return null;
|
|
55
|
-
if (typeof value === 'string')
|
|
56
|
-
return value;
|
|
57
|
-
if (typeof value === 'object' && 'id' in value) {
|
|
58
|
-
return String(value.id);
|
|
59
|
-
}
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
52
|
//# sourceMappingURL=list-pending-approvals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-pending-approvals.js","sourceRoot":"","sources":["../../src/tools/list-pending-approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"list-pending-approvals.js","sourceRoot":"","sources":["../../src/tools/list-pending-approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAE3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAQzD,MAAM,UAAU,8BAA8B,CAC5C,IAA8B;IAE9B,MAAM,WAAW,GAAG,QAAQ,CAAC;QAC3B,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0BAA0B,CAAC;KACxC,CAAC,CAAA;IAEF,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,wIAAwI;QAC1I,WAAW;QACX,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,IAAI,CAAC,GAAG,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,iDAAiD,EAAE,CAAA;YAClF,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAA;YAClC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;YAEnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBACrC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,sBAAsB;gBACjE,KAAK,EAAE;oBACL,GAAG,EAAE;wBACH,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;wBACjC,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE;qBACvC;iBACF;gBACD,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;gBACxB,IAAI,EAAE,cAAc;aACrB,CAAC,CAAA;YAEF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAsC,CAAA;YAC1D,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC1B,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC7B,gBAAgB,EAAE,GAAG,CAAC,kBAAkB,CAAC;oBACzC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC;oBACzB,WAAW,EAAE,GAAG,CAAC,aAAa,CAAC;oBAC/B,cAAc,EAAE,GAAG,CAAC,gBAAgB,CAAC;oBACrC,WAAW,EAAE,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACrD,WAAW,EAAE,GAAG,CAAC,aAAa,CAAC;oBAC/B,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC;oBAC3B,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC;iBAC9B,CAAC,CAAC;aACJ,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"respond-to-approval.d.ts","sourceRoot":"","sources":["../../src/tools/respond-to-approval.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"respond-to-approval.d.ts","sourceRoot":"","sources":["../../src/tools/respond-to-approval.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAgB,KAAK,WAAW,EAAkC,MAAM,4BAA4B,CAAA;AAE3G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAE9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,sBAAsB,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;IACzD,WAAW,EAAE,WAAW,CAAA;CACzB;AAcD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,CA6F1F"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { auditContext, withMeta } from '@forumone/throughline-core';
|
|
2
|
+
import { auditContext, unwrapRelationshipId, withMeta } from '@forumone/throughline-core';
|
|
3
3
|
import { DEFAULT_APPROVALS_SLUG } from '../collection.js';
|
|
4
4
|
const decisionToStatus = {
|
|
5
5
|
approve: 'granted',
|
|
@@ -93,12 +93,4 @@ export function createRespondToApprovalTool(deps) {
|
|
|
93
93
|
},
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
|
-
function unwrapRelationshipId(value) {
|
|
97
|
-
if (typeof value === 'string')
|
|
98
|
-
return value;
|
|
99
|
-
if (value && typeof value === 'object' && 'id' in value) {
|
|
100
|
-
return String(value.id);
|
|
101
|
-
}
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
96
|
//# sourceMappingURL=respond-to-approval.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"respond-to-approval.js","sourceRoot":"","sources":["../../src/tools/respond-to-approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,
|
|
1
|
+
{"version":3,"file":"respond-to-approval.js","sourceRoot":"","sources":["../../src/tools/respond-to-approval.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forumone/throughline-approvals",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Conversational approval workflow server for Throughline. Provides the approval resolver the publishing server consumes plus MCP tools for requesting and responding to approvals.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"zod": "^3.23.0",
|
|
45
|
-
"@forumone/throughline-core": "0.
|
|
46
|
-
"@forumone/throughline-plugin-contract": "0.
|
|
47
|
-
"@forumone/throughline-publishing": "0.
|
|
45
|
+
"@forumone/throughline-core": "0.7.0",
|
|
46
|
+
"@forumone/throughline-plugin-contract": "0.4.0",
|
|
47
|
+
"@forumone/throughline-publishing": "0.8.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/node": "^20.17.0",
|