@forumone/throughline 1.1.0 → 1.2.0-next-17f8d7c

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 CHANGED
@@ -1,5 +1,15 @@
1
1
  # @forumone/throughline
2
2
 
3
+ ## 1.2.0-next-17f8d7c
4
+
5
+ ### Minor Changes
6
+
7
+ - 17f8d7c: `mcpApiKeyAccess` takes an optional `holder` rule. Given one, an admin can choose who a new MCP key belongs to; nobody can change it afterwards; and a key for someone the rule refuses is not saved, with the rule's reason. Without it, nothing changes: a key belongs to whoever created it.
8
+
9
+ ### Patch Changes
10
+
11
+ - @forumone/throughline-design-system@1.2.0-next-17f8d7c
12
+
3
13
  ## 1.1.0
4
14
 
5
15
  ### Minor Changes
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export type { ThroughlineOptions, ThroughlinePublishingOptions, ThroughlineSuite
3
3
  export { EnvironmentError, assertEnvironment, checkEnvValue } from './env/index.js';
4
4
  export type { EnvValueProblem, EnvironmentCheck } from './env/index.js';
5
5
  export { MCP_API_KEYS_SLUG, McpMetaSchema, auditContext, deniedEnvelope, isMcpApiKeyPrincipal, isSignedIn, mcpApiKeyAccess, signedIn, withMeta, } from './mcp/index.js';
6
- export type { AuditContextFields, McpMeta } from './mcp/index.js';
6
+ export type { AuditContextFields, McpApiKeyAccessOptions, McpMeta } from './mcp/index.js';
7
7
  export type { McpToolCollector, PayloadMcpTool } from './mcp/index.js';
8
8
  export { defaultLogger, createNamedLogger } from './logger/index.js';
9
9
  export { LOCKED_DOCUMENTS_SLUG, hardenCoreCollections } from './access/coreCollections.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,+BAA+B,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC/E,YAAY,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGvE,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,QAAQ,EACR,QAAQ,GACT,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAIjE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEtE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAEpE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAC1F,YAAY,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAE/E,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,SAAS,EACT,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AACzB,YAAY,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAGlE,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,cAAc,EACd,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,+BAA+B,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC/E,YAAY,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGvE,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,QAAQ,EACR,QAAQ,GACT,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAIzF,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEtE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAEpE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAC1F,YAAY,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAE/E,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,SAAS,EACT,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AACzB,YAAY,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAGlE,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,cAAc,EACd,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,4BAA4B,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { Access, CollectionConfig } from 'payload';
1
+ import { type Access, type CollectionConfig } from 'payload';
2
2
  /** The slug `@payloadcms/plugin-mcp` gives its key collection. */
3
3
  export declare const MCP_API_KEYS_SLUG = "payload-mcp-api-keys";
4
4
  /** What Payload puts on `req.user`. */
@@ -43,8 +43,35 @@ export declare const signedIn: Access;
43
43
  * })
44
44
  * ```
45
45
  *
46
- * The plugin's field-level rules on the key's `user` relationship are left as
47
- * shipped: a new key is bound to whoever creates it.
46
+ * Without `holder`, the plugin's field-level rules on the key's `user`
47
+ * relationship are left as shipped: a new key is bound to whoever creates it.
48
+ * See `McpApiKeyAccessOptions.holder` for issuing a key to somebody else.
48
49
  */
49
- export declare function mcpApiKeyAccess(isAdmin: Access): (collection: CollectionConfig) => CollectionConfig;
50
+ export declare function mcpApiKeyAccess(isAdmin: Access, options?: McpApiKeyAccessOptions): (collection: CollectionConfig) => CollectionConfig;
51
+ export interface McpApiKeyAccessOptions {
52
+ /**
53
+ * Who may hold a key: `true`, or the reason they may not. Given, an
54
+ * administrator chooses the person a new key runs as.
55
+ *
56
+ * The plugin binds every new key to whoever creates it and forbids changing
57
+ * that, which is the safe default and the wrong one for a site where keys are
58
+ * admin-only — every key then runs as an administrator, with an
59
+ * administrator's permissions, in an administrator's name in the audit log.
60
+ *
61
+ * With this, the key's `user` may be set on create by whoever passes
62
+ * `isAdmin`, and still never changed afterwards; the creator stays the
63
+ * default. The chosen person is loaded and handed to this rule before the key
64
+ * is saved, so "an editor or above" is the site's to say:
65
+ *
66
+ * ```ts
67
+ * mcpApiKeyAccess(isAdmin, {
68
+ * holder: user => hasEditorRole(user) || 'Only an editor or an admin can hold a key.',
69
+ * })
70
+ * ```
71
+ *
72
+ * The rule is asked on create only. Somebody who loses the role later keeps a
73
+ * key that their own access rules then refuse, tool by tool.
74
+ */
75
+ holder?: (user: Record<string, unknown>) => true | string;
76
+ }
50
77
  //# sourceMappingURL=api-key-access.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-key-access.d.ts","sourceRoot":"","sources":["../../src/mcp/api-key-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAiCvD,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,yBAAyB,CAAA;AAEvD,uCAAuC;AACvC,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7D;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAE1E;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,CAExF;AAED,mDAAmD;AACnD,eAAO,MAAM,QAAQ,EAAE,MAA0C,CAAA;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GACd,CAAC,UAAU,EAAE,gBAAgB,KAAK,gBAAgB,CAcpD"}
1
+ {"version":3,"file":"api-key-access.d.ts","sourceRoot":"","sources":["../../src/mcp/api-key-access.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EAEX,KAAK,gBAAgB,EAGtB,MAAM,SAAS,CAAA;AAiChB,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,yBAAyB,CAAA;AAEvD,uCAAuC;AACvC,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7D;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAE1E;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,CAExF;AAED,mDAAmD;AACnD,eAAO,MAAM,QAAQ,EAAE,MAA0C,CAAA;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,sBAA2B,GACnC,CAAC,UAAU,EAAE,gBAAgB,KAAK,gBAAgB,CAiBpD;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,CAAA;CAC1D"}
@@ -1,3 +1,4 @@
1
+ import { ValidationError, } from 'payload';
1
2
  /*
2
3
  Who may manage MCP keys, and who counts as signed in. Issue #157.
3
4
 
@@ -74,21 +75,92 @@ export const signedIn = ({ req }) => isSignedIn(req.user);
74
75
  * })
75
76
  * ```
76
77
  *
77
- * The plugin's field-level rules on the key's `user` relationship are left as
78
- * shipped: a new key is bound to whoever creates it.
78
+ * Without `holder`, the plugin's field-level rules on the key's `user`
79
+ * relationship are left as shipped: a new key is bound to whoever creates it.
80
+ * See `McpApiKeyAccessOptions.holder` for issuing a key to somebody else.
79
81
  */
80
- export function mcpApiKeyAccess(isAdmin) {
82
+ export function mcpApiKeyAccess(isAdmin, options = {}) {
81
83
  const adminOnly = args => (isMcpApiKeyPrincipal(args.req.user) ? false : isAdmin(args));
82
- return collection => ({
84
+ return collection => {
85
+ const hardened = {
86
+ ...collection,
87
+ access: {
88
+ ...collection.access,
89
+ read: adminOnly,
90
+ create: adminOnly,
91
+ update: adminOnly,
92
+ delete: adminOnly,
93
+ unlock: adminOnly,
94
+ },
95
+ };
96
+ return options.holder ? issuedToAPerson(hardened, adminOnly, options.holder) : hardened;
97
+ };
98
+ }
99
+ /** The plugin's name for the relationship a key runs as. */
100
+ const KEY_USER_FIELD = 'user';
101
+ /*
102
+ Payload strips a field from a create when its `create` access says no, and then
103
+ applies its `defaultValue`. So opening `create` to an administrator is all it
104
+ takes for their choice to stick, and leaving the default in place keeps "a key
105
+ for myself" a single click. `update` stays shut whatever the role: a key that
106
+ could be re-pointed is a key that could be made to act as anybody.
107
+
108
+ Field access is a boolean, where collection access may be a query, so only a
109
+ literal `true` from the site's rule counts.
110
+ */
111
+ function issuedToAPerson(collection, adminOnly, holder) {
112
+ const field = collection.fields.find((each) => 'name' in each && each.name === KEY_USER_FIELD && each.type === 'relationship');
113
+ if (!field || typeof field.relationTo !== 'string') {
114
+ throw new Error(`mcpApiKeyAccess(): "${collection.slug}" has no single-collection "${KEY_USER_FIELD}" relationship, ` +
115
+ 'so there is nobody to issue a key to. Has @payloadcms/plugin-mcp changed its key collection?');
116
+ }
117
+ const adminChooses = async ({ req, data, id }) => (await adminOnly({ req, data, id })) === true;
118
+ return {
83
119
  ...collection,
84
- access: {
85
- ...collection.access,
86
- read: adminOnly,
87
- create: adminOnly,
88
- update: adminOnly,
89
- delete: adminOnly,
90
- unlock: adminOnly,
120
+ fields: collection.fields.map(each => each === field
121
+ ? { ...field, access: { ...field.access, create: adminChooses, update: () => false } }
122
+ : each),
123
+ hooks: {
124
+ ...collection.hooks,
125
+ beforeChange: [
126
+ ...(collection.hooks?.beforeChange ?? []),
127
+ refuseIneligibleHolder(collection.slug, field.relationTo, holder),
128
+ ],
91
129
  },
92
- });
130
+ };
131
+ }
132
+ /*
133
+ A `beforeChange` rather than a `validate` on the field, so the relationship keeps
134
+ Payload's own validation — required, and pointing at a document that exists —
135
+ and this only adds to it. By this point field access has run and the default has
136
+ been applied, so the value is the one that will be saved.
137
+ */
138
+ function refuseIneligibleHolder(collection, users, holder) {
139
+ return async ({ data, operation, req }) => {
140
+ if (operation !== 'create')
141
+ return data;
142
+ const value = data[KEY_USER_FIELD];
143
+ const id = value && typeof value === 'object' ? value.id : value;
144
+ if (typeof id !== 'string' && typeof id !== 'number')
145
+ return data;
146
+ const user = await req.payload.findByID({
147
+ collection: users,
148
+ id,
149
+ depth: 0,
150
+ overrideAccess: true,
151
+ disableErrors: true,
152
+ req,
153
+ });
154
+ // A user that does not exist is the relationship's own validation to report.
155
+ if (!user)
156
+ return data;
157
+ const verdict = holder(user);
158
+ if (verdict === true)
159
+ return data;
160
+ throw new ValidationError({
161
+ collection,
162
+ errors: [{ path: KEY_USER_FIELD, label: 'User', message: verdict }],
163
+ });
164
+ };
93
165
  }
94
166
  //# sourceMappingURL=api-key-access.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-key-access.js","sourceRoot":"","sources":["../../src/mcp/api-key-access.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BE;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAA;AAKvD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA4B;IAC/D,OAAQ,IAAoD,EAAE,UAAU,KAAK,iBAAiB,CAAA;AAChG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,IAA4B;IACrD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;AACrD,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,MAAM,QAAQ,GAAW,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe;IAEf,MAAM,SAAS,GAAW,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAE/F,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;QACpB,GAAG,UAAU;QACb,MAAM,EAAE;YACN,GAAG,UAAU,CAAC,MAAM;YACpB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB;KACF,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"api-key-access.js","sourceRoot":"","sources":["../../src/mcp/api-key-access.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,5 @@ export type { AddToolsOptions, CreateMcpToolCollectorOptions, DeclareToolsOption
9
9
  export { deniedEnvelope } from './envelope.js';
10
10
  export { auditServerFor, mcpServerRefusal } from './audit-server.js';
11
11
  export { MCP_API_KEYS_SLUG, isMcpApiKeyPrincipal, isSignedIn, mcpApiKeyAccess, signedIn, } from './api-key-access.js';
12
+ export type { McpApiKeyAccessOptions } from './api-key-access.js';
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACnD,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACtE,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,uBAAuB,GACxB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EACV,eAAe,EACf,6BAA6B,EAC7B,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,QAAQ,GACT,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACnD,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACtE,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,uBAAuB,GACxB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EACV,eAAe,EACf,6BAA6B,EAC7B,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,QAAQ,GACT,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -178,6 +178,7 @@
178
178
  "ManifestSource": ["@forumone/throughline/components"],
179
179
  "ManualSyncRefusal": ["@forumone/throughline/integrations"],
180
180
  "MatchingConfig": ["@forumone/throughline/components"],
181
+ "McpApiKeyAccessOptions": ["@forumone/throughline"],
181
182
  "McpMeta": ["@forumone/throughline"],
182
183
  "McpMetaSchema": ["@forumone/throughline"],
183
184
  "McpToolCollector": ["@forumone/throughline"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forumone/throughline",
3
- "version": "1.1.0",
3
+ "version": "1.2.0-next-17f8d7c",
4
4
  "description": "Throughline: an editorial platform for Payload CMS. Publishing, approvals, audit, integrations, email and jobs, with every feature reachable over MCP.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -162,7 +162,7 @@
162
162
  "dependencies": {
163
163
  "zod": "^3.23.0",
164
164
  "zod-to-json-schema": "^3.25.2",
165
- "@forumone/throughline-design-system": "1.1.0"
165
+ "@forumone/throughline-design-system": "1.2.0-next-17f8d7c"
166
166
  },
167
167
  "devDependencies": {
168
168
  "@payloadcms/db-sqlite": "^3.83.0",
@@ -184,8 +184,8 @@
184
184
  "resend": "^6.1.4",
185
185
  "typescript": "^5.6.0",
186
186
  "vitest": "^4.1.10",
187
- "@forumone/throughline-reference-ds": "0.3.10",
188
187
  "@forumone/throughline-eslint-config": "0.0.1",
188
+ "@forumone/throughline-reference-ds": "0.3.11-next-17f8d7c",
189
189
  "@forumone/throughline-tsconfig": "0.0.1"
190
190
  },
191
191
  "scripts": {