@anthusai/papyrus 1.10.0 → 1.12.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.
Files changed (79) hide show
  1. package/amplify/data/resource.js +70 -3
  2. package/amplify/data/resource.ts +75 -3
  3. package/amplify/data/schema.js +67 -0
  4. package/amplify/data/schema.ts +72 -0
  5. package/amplify/functions/category-action/handler.ts +190 -20
  6. package/amplify/functions/console-chat-responder/src/main.rs +1 -1
  7. package/amplify/functions/content-actions/handler.py +23 -0
  8. package/amplify/functions/content-actions/requirements.txt +1 -1
  9. package/amplify/functions/content-actions/resource.js +1 -1
  10. package/amplify/functions/content-actions/resource.ts +1 -1
  11. package/amplify/functions/renditions/requirements.txt +1 -1
  12. package/amplify/functions/shared/curation-delegation.ts +67 -0
  13. package/amplify/functions/shared/reference-curation-metadata.ts +20 -0
  14. package/amplify/functions/shared/slack-events.ts +2 -2
  15. package/amplify/publication/renditions-function.js +1 -1
  16. package/amplify/publication/renditions-function.ts +1 -1
  17. package/app/api/local-preview/derive/route.ts +28 -0
  18. package/app/api/local-preview/media/route.ts +25 -0
  19. package/app/globals.css +28 -28
  20. package/app/layout.tsx +8 -5
  21. package/app/newsroom/[section]/[...selection]/page.tsx +0 -1
  22. package/app/newsroom/[section]/page.tsx +0 -1
  23. package/app/newsroom/insights/[threadId]/page.tsx +5 -16
  24. package/app/newsroom/insights/page.tsx +4 -12
  25. package/components/administration-delegations-panel.tsx +204 -0
  26. package/components/board-card-excerpts.tsx +45 -0
  27. package/components/curation-delegation-client.ts +81 -0
  28. package/components/markus-ir-preview.tsx +47 -2
  29. package/components/news-desk-page.tsx +0 -1
  30. package/components/news-desk-taxonomy-client.ts +32 -220
  31. package/components/newsroom-article-editor.tsx +135 -39
  32. package/components/newsroom-assignment-detail.tsx +35 -1
  33. package/components/newsroom-board-view.tsx +29 -7
  34. package/components/newsroom-newsprint-board.css +9 -2
  35. package/components/newsroom-ops-overview.tsx +27 -5
  36. package/components/newsroom-organizer-shell.tsx +25 -7
  37. package/components/newsroom-organizer.css +218 -4
  38. package/components/newsroom-references-view.tsx +56 -21
  39. package/components/priming-proof-page.tsx +17 -8
  40. package/components/prospectus-account-chooser.tsx +98 -0
  41. package/components/reference-cyclotron-status.tsx +5 -5
  42. package/components/reference-cyclotron-suggestion.tsx +143 -0
  43. package/components/reference-live-agreement.tsx +62 -0
  44. package/components/story-reporting-trail-client.ts +91 -0
  45. package/components/story-reporting-trail.tsx +115 -0
  46. package/components/topic-steering-workspace.tsx +203 -674
  47. package/components/ui/sheet.tsx +1 -0
  48. package/components/wiki-concepts-view.tsx +153 -0
  49. package/components/wiki-index-client.ts +51 -0
  50. package/lib/content-actions-client.ts +3 -0
  51. package/lib/content-actions-demo.ts +55 -3
  52. package/lib/content-item-lifecycle.ts +4 -2
  53. package/lib/content-source-context.ts +9 -1
  54. package/lib/curation-delegation-helpers.ts +59 -0
  55. package/lib/cyclotron-suggestions.ts +263 -0
  56. package/lib/front-matter-fields.ts +42 -0
  57. package/lib/graphql-content-repository.ts +42 -7
  58. package/lib/local-preview-seed.ts +174 -3
  59. package/lib/local-preview-tenant.ts +27 -0
  60. package/lib/newsroom-articles.ts +2 -0
  61. package/lib/newsroom-board.ts +4 -0
  62. package/lib/newsroom-forum-routes.ts +2 -43
  63. package/lib/newsroom-index-filters.ts +3 -40
  64. package/lib/newsroom-media-backend.ts +5 -0
  65. package/lib/newsroom-nav.ts +1 -3
  66. package/lib/newsroom-organizer-nav.ts +5 -12
  67. package/lib/newsroom-section-routing.ts +1 -1
  68. package/lib/newsroom-sections.ts +12 -0
  69. package/lib/papyrus-web-locations.ts +3 -24
  70. package/lib/priming-proof-report.ts +1 -0
  71. package/lib/prospectus-tenant.ts +22 -0
  72. package/lib/relevance-decisions.ts +29 -0
  73. package/lib/semantic-graph.ts +5 -5
  74. package/lib/site-brand.ts +9 -0
  75. package/lib/story-reporting-trail.ts +106 -0
  76. package/lib/tenant-keys.ts +32 -0
  77. package/lib/wiki.ts +56 -0
  78. package/package.json +21 -1
  79. package/routes.manifest.json +23 -7
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Everything the reporting process recorded about one story, gathered by the story's lineage id:
3
+ * the draft versions of the copy, the research, reporting and copywriting assignments with their events,
4
+ * the notes and packets in the threads anchored to the story or its assignments, the references it draws on,
5
+ * and attached files. See docs/content-item-lifecycle.md for how these records join.
6
+ */
7
+ export type TrailVersion = {
8
+ id: string;
9
+ versionNumber: number;
10
+ versionState: string | null;
11
+ status: string | null;
12
+ stage: string | null;
13
+ headline: string | null;
14
+ changeReason: string | null;
15
+ versionCreatedBy: string | null;
16
+ versionCreatedAt: string | null;
17
+ updatedAt: string | null;
18
+ };
19
+
20
+ export type TrailAssignmentEvent = {
21
+ id: string;
22
+ eventType: string;
23
+ fromStatus: string | null;
24
+ toStatus: string | null;
25
+ actorLabel: string | null;
26
+ note: string | null;
27
+ createdAt: string;
28
+ };
29
+
30
+ export type TrailAssignment = {
31
+ id: string;
32
+ title: string;
33
+ assignmentTypeKey: string;
34
+ status: string;
35
+ assigneeKey: string | null;
36
+ summary: string | null;
37
+ createdAt: string;
38
+ events: TrailAssignmentEvent[];
39
+ };
40
+
41
+ export type TrailMessage = {
42
+ id: string;
43
+ sequenceNumber?: number | null;
44
+ messageKind: string | null;
45
+ authorLabel: string | null;
46
+ summary: string | null;
47
+ content: string | null;
48
+ createdAt: string;
49
+ };
50
+
51
+ export type TrailThread = {
52
+ id: string;
53
+ title: string | null;
54
+ threadKind: string | null;
55
+ summary: string | null;
56
+ messages: TrailMessage[];
57
+ };
58
+
59
+ export type TrailReference = {
60
+ relationId: string;
61
+ predicate: string;
62
+ referenceId: string;
63
+ referenceLineageId: string | null;
64
+ title: string | null;
65
+ sourceUri: string | null;
66
+ /** consulted: read during reporting; cited: a citation in the article. */
67
+ role: "consulted" | "cited";
68
+ note: string | null;
69
+ citationKey: string | null;
70
+ addedBy: string | null;
71
+ addedAt: string | null;
72
+ };
73
+
74
+ export type TrailAttachment = {
75
+ id: string;
76
+ role: string | null;
77
+ filename: string | null;
78
+ mediaType: string | null;
79
+ byteSize: number | null;
80
+ };
81
+
82
+ export type StoryReportingTrail = {
83
+ versions: TrailVersion[];
84
+ assignments: TrailAssignment[];
85
+ threads: TrailThread[];
86
+ references: TrailReference[];
87
+ attachments: TrailAttachment[];
88
+ };
89
+
90
+ export const EMPTY_STORY_REPORTING_TRAIL: StoryReportingTrail = { versions: [], assignments: [], threads: [], references: [], attachments: [] };
91
+
92
+ export function storyReportingTrailIsEmpty(trail: StoryReportingTrail): boolean {
93
+ return trail.assignments.length === 0 && trail.threads.length === 0 && trail.references.length === 0 && trail.attachments.length === 0 && trail.versions.length <= 1;
94
+ }
95
+
96
+ export type StoryFeedEntry =
97
+ | ({ entryKind: "message"; threadTitle: string | null } & TrailMessage)
98
+ | { entryKind: "reference"; id: string; createdAt: string; reference: TrailReference };
99
+
100
+ /** Every message of the story's threads and every reference found for it in one chronological feed, newest first. */
101
+ export function storyMessageFeed(trail: StoryReportingTrail): StoryFeedEntry[] {
102
+ const messages: StoryFeedEntry[] = trail.threads.flatMap(thread => thread.messages.map(message => ({ ...message, entryKind: "message" as const, threadTitle: thread.title })));
103
+ const references: StoryFeedEntry[] = trail.references.filter(reference => reference.addedAt).map(reference => ({ entryKind: "reference" as const, id: `reference-${reference.relationId}`, createdAt: reference.addedAt as string, reference }));
104
+ const sequenceOf = (entry: StoryFeedEntry) => (entry.entryKind === "message" ? entry.sequenceNumber ?? 0 : 0);
105
+ return [...messages, ...references].sort((left, right) => right.createdAt.localeCompare(left.createdAt) || sequenceOf(right) - sequenceOf(left));
106
+ }
@@ -0,0 +1,32 @@
1
+ export const TENANT_ID_ENVIRONMENT_VARIABLE = "PAPYRUS_TENANT_ID";
2
+ const TENANT_KEY_SEPARATOR = "#";
3
+ const TENANT_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,62}$/;
4
+
5
+ export function validateTenantId(tenantId: string): string {
6
+ if (!TENANT_ID_PATTERN.test(tenantId)) {
7
+ throw new Error(`Tenant id "${tenantId}" must be lowercase letters, digits and hyphens, starting with a letter or digit.`);
8
+ }
9
+ return tenantId;
10
+ }
11
+
12
+ export function tenantIdFromEnvironment(environment: NodeJS.ProcessEnv = process.env): string | undefined {
13
+ const configured = environment[TENANT_ID_ENVIRONMENT_VARIABLE]?.trim();
14
+ return configured ? validateTenantId(configured) : undefined;
15
+ }
16
+
17
+ export function tenantScopedValue(tenantId: string | undefined, value: string): string {
18
+ if (!tenantId) return value;
19
+ const prefix = `${tenantId}${TENANT_KEY_SEPARATOR}`;
20
+ return value.startsWith(prefix) ? value : `${prefix}${value}`;
21
+ }
22
+
23
+ export function rowBelongsToTenant(tenantId: string | undefined, row: { tenantId?: string | null } | null | undefined): boolean {
24
+ if (!tenantId || !row) return true;
25
+ return row.tenantId === tenantId;
26
+ }
27
+
28
+ /** The tenant a Prospectus publishing account maps to: its id as lowercase letters, digits and hyphens. */
29
+ export function tenantIdForProspectusAccount(accountId: string | null | undefined): string | undefined {
30
+ const normalized = (accountId ?? "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 63);
31
+ return normalized ? validateTenantId(normalized) : undefined;
32
+ }
package/lib/wiki.ts ADDED
@@ -0,0 +1,56 @@
1
+ import type { SemanticNodeRecord } from "./category-repository";
2
+
3
+ /** The wiki's front page is an ordinary content item with this slug; its Markus body holds the dynamic components. */
4
+ export const WIKI_INDEX_SLUG = "wiki-index";
5
+ export const WIKI_PAGE_ITEM_TYPE = "wiki_page";
6
+ export const WIKI_CONCEPT_LINK_SCHEME = "concept:";
7
+
8
+ export const DEFAULT_WIKI_INDEX_MARKUS = `# Concept wiki
9
+
10
+ Every page in this wiki is a concept: an entity in the knowledge graph that the newsroom has reported on, researched or cited. Open one to see what it is, what it connects to, and the references behind it.
11
+
12
+ ## Recently edited
13
+
14
+ ::recent-concepts{limit=10}
15
+
16
+ ## Browse all concepts
17
+
18
+ ::concept-list
19
+ `;
20
+
21
+ export function conceptEditedAt(node: SemanticNodeRecord): string {
22
+ return node.updatedAt ?? node.versionCreatedAt ?? node.createdAt ?? "";
23
+ }
24
+
25
+ export function conceptTitle(node: SemanticNodeRecord): string {
26
+ return node.displayName?.trim() || node.nodeKey;
27
+ }
28
+
29
+ export function conceptId(node: SemanticNodeRecord): string {
30
+ return node.lineageId ?? node.id;
31
+ }
32
+
33
+ export function recentlyEditedConcepts(nodes: readonly SemanticNodeRecord[], options: { limit?: number; kind?: string | null } = {}): SemanticNodeRecord[] {
34
+ const { limit = 10, kind = null } = options;
35
+ return nodes
36
+ .filter(node => !kind || node.nodeKind === kind)
37
+ .slice()
38
+ .sort((left, right) => conceptEditedAt(right).localeCompare(conceptEditedAt(left)) || conceptTitle(left).localeCompare(conceptTitle(right)))
39
+ .slice(0, limit);
40
+ }
41
+
42
+ export function conceptsByTitle(nodes: readonly SemanticNodeRecord[], options: { kind?: string | null; limit?: number | null } = {}): SemanticNodeRecord[] {
43
+ const filtered = nodes.filter(node => !options.kind || node.nodeKind === options.kind).slice().sort((left, right) => conceptTitle(left).localeCompare(conceptTitle(right)));
44
+ return options.limit ? filtered.slice(0, options.limit) : filtered;
45
+ }
46
+
47
+ /** Finds the concept a `concept:<key>` wiki link names, by lineage id, node key or title. */
48
+ export function resolveConceptLink(href: string, nodes: readonly SemanticNodeRecord[]): SemanticNodeRecord | null {
49
+ if (!href.startsWith(WIKI_CONCEPT_LINK_SCHEME)) return null;
50
+ const reference = decodeURIComponent(href.slice(WIKI_CONCEPT_LINK_SCHEME.length)).trim().toLowerCase();
51
+ return nodes.find(node => conceptId(node).toLowerCase() === reference || node.nodeKey.toLowerCase() === reference || conceptTitle(node).toLowerCase() === reference) ?? null;
52
+ }
53
+
54
+ export function conceptWikiPath(node: SemanticNodeRecord): string {
55
+ return `/newsroom/concepts/${encodeURIComponent(conceptId(node))}`;
56
+ }
package/package.json CHANGED
@@ -64,6 +64,7 @@
64
64
  "types": "./infra/amplify-app-shell.ts",
65
65
  "default": "./infra/index.js"
66
66
  },
67
+ "./components/administration-delegations-panel": "./components/administration-delegations-panel.tsx",
67
68
  "./components/ai-elements/conversation": "./components/ai-elements/conversation.tsx",
68
69
  "./components/ai-elements/model-selector": "./components/ai-elements/model-selector.tsx",
69
70
  "./components/ai-elements/prompt-input": "./components/ai-elements/prompt-input.tsx",
@@ -75,6 +76,8 @@
75
76
  "./components/archive-shell": "./components/archive-shell.tsx",
76
77
  "./components/article-video": "./components/article-video.tsx",
77
78
  "./components/blog-page-background": "./components/blog-page-background.tsx",
79
+ "./components/board-card-excerpts": "./components/board-card-excerpts.tsx",
80
+ "./components/curation-delegation-client": "./components/curation-delegation-client.ts",
78
81
  "./components/dev-sandbox-editor-sign-in": "./components/dev-sandbox-editor-sign-in.tsx",
79
82
  "./components/markus-ir-preview": "./components/markus-ir-preview.tsx",
80
83
  "./components/news-desk-client-provider": "./components/news-desk-client-provider.tsx",
@@ -100,6 +103,7 @@
100
103
  "./components/presentation-header": "./components/presentation-header.tsx",
101
104
  "./components/presentation-rhythm-hrule": "./components/presentation-rhythm-hrule.tsx",
102
105
  "./components/priming-proof-page": "./components/priming-proof-page.tsx",
106
+ "./components/prospectus-account-chooser": "./components/prospectus-account-chooser.tsx",
103
107
  "./components/publication-cyclotron-panel": "./components/publication-cyclotron-panel.tsx",
104
108
  "./components/reader-auth-control": "./components/reader-auth-control.tsx",
105
109
  "./components/reader-auth-state": "./components/reader-auth-state.ts",
@@ -108,12 +112,16 @@
108
112
  "./components/reference-curation-controls": "./components/reference-curation-controls.tsx",
109
113
  "./components/reference-cyclotron-priming": "./components/reference-cyclotron-priming.tsx",
110
114
  "./components/reference-cyclotron-status": "./components/reference-cyclotron-status.tsx",
115
+ "./components/reference-cyclotron-suggestion": "./components/reference-cyclotron-suggestion.tsx",
116
+ "./components/reference-live-agreement": "./components/reference-live-agreement.tsx",
111
117
  "./components/reference-priming": "./components/reference-priming.tsx",
112
118
  "./components/reference-relevance-review": "./components/reference-relevance-review.tsx",
113
119
  "./components/reference-source-preview": "./components/reference-source-preview.tsx",
114
120
  "./components/settings-page": "./components/settings-page.tsx",
115
121
  "./components/signup-entries-panel": "./components/signup-entries-panel.tsx",
116
122
  "./components/staging-banner": "./components/staging-banner.tsx",
123
+ "./components/story-reporting-trail-client": "./components/story-reporting-trail-client.ts",
124
+ "./components/story-reporting-trail": "./components/story-reporting-trail.tsx",
117
125
  "./components/topic-steering-workspace": "./components/topic-steering-workspace.tsx",
118
126
  "./components/ui/badge": "./components/ui/badge.tsx",
119
127
  "./components/ui/button-group": "./components/ui/button-group.tsx",
@@ -139,6 +147,8 @@
139
147
  "./components/use-paged-content-item-versions": "./components/use-paged-content-item-versions.ts",
140
148
  "./components/use-resolved-papyrus-theme": "./components/use-resolved-papyrus-theme.ts",
141
149
  "./components/use-rhythm-overlay": "./components/use-rhythm-overlay.ts",
150
+ "./components/wiki-concepts-view": "./components/wiki-concepts-view.tsx",
151
+ "./components/wiki-index-client": "./components/wiki-index-client.ts",
142
152
  "./lib/amplify-outputs-guard": "./lib/amplify-outputs-guard.ts",
143
153
  "./lib/amplify-outputs-path": "./lib/amplify-outputs-path.ts",
144
154
  "./lib/amplify-server-runtime": "./lib/amplify-server-runtime.ts",
@@ -166,6 +176,8 @@
166
176
  "./lib/content-source-context": "./lib/content-source-context.ts",
167
177
  "./lib/content-types": "./lib/content-types.ts",
168
178
  "./lib/curation-client": "./lib/curation-client.ts",
179
+ "./lib/curation-delegation-helpers": "./lib/curation-delegation-helpers.ts",
180
+ "./lib/cyclotron-suggestions": "./lib/cyclotron-suggestions.ts",
169
181
  "./lib/define-site": "./lib/define-site.ts",
170
182
  "./lib/demo-amplify-outputs": "./lib/demo-amplify-outputs.ts",
171
183
  "./lib/dev-sandbox-editor-auth": "./lib/dev-sandbox-editor-auth.ts",
@@ -174,6 +186,7 @@
174
186
  "./lib/edition-sections": "./lib/edition-sections.ts",
175
187
  "./lib/empty-edition-layout-plan": "./lib/empty-edition-layout-plan.ts",
176
188
  "./lib/excerpts": "./lib/excerpts.ts",
189
+ "./lib/front-matter-fields": "./lib/front-matter-fields.ts",
177
190
  "./lib/front-mosaic": "./lib/front-mosaic.ts",
178
191
  "./lib/furniture": "./lib/furniture.ts",
179
192
  "./lib/graphql-content-repository": "./lib/graphql-content-repository.ts",
@@ -185,6 +198,7 @@
185
198
  "./lib/layout-types": "./lib/layout-types.ts",
186
199
  "./lib/layout-warnings": "./lib/layout-warnings.ts",
187
200
  "./lib/local-preview-seed": "./lib/local-preview-seed.ts",
201
+ "./lib/local-preview-tenant": "./lib/local-preview-tenant.ts",
188
202
  "./lib/local-preview": "./lib/local-preview.ts",
189
203
  "./lib/markus-body": "./lib/markus-body.ts",
190
204
  "./lib/markus-ir": "./lib/markus-ir.ts",
@@ -227,6 +241,7 @@
227
241
  "./lib/prospectus-session": "./lib/prospectus-session.ts",
228
242
  "./lib/prospectus-sign-in-routes": "./lib/prospectus-sign-in-routes.ts",
229
243
  "./lib/prospectus-site-identity": "./lib/prospectus-site-identity.ts",
244
+ "./lib/prospectus-tenant": "./lib/prospectus-tenant.ts",
230
245
  "./lib/public-placeholder-config": "./lib/public-placeholder-config.ts",
231
246
  "./lib/publication-cyclotron": "./lib/publication-cyclotron.ts",
232
247
  "./lib/publication-items": "./lib/publication-items.ts",
@@ -259,6 +274,8 @@
259
274
  "./lib/staging-gate": "./lib/staging-gate.ts",
260
275
  "./lib/staging-gated-path": "./lib/staging-gated-path.ts",
261
276
  "./lib/staging-preview-object": "./lib/staging-preview-object.ts",
277
+ "./lib/story-reporting-trail": "./lib/story-reporting-trail.ts",
278
+ "./lib/tenant-keys": "./lib/tenant-keys.ts",
262
279
  "./lib/test-editor-override": "./lib/test-editor-override.ts",
263
280
  "./lib/text-columns": "./lib/text-columns.ts",
264
281
  "./lib/themed-image": "./lib/themed-image.ts",
@@ -266,6 +283,7 @@
266
283
  "./lib/video-loading": "./lib/video-loading.ts",
267
284
  "./lib/video-mode": "./lib/video-mode.ts",
268
285
  "./lib/video-script": "./lib/video-script.ts",
286
+ "./lib/wiki": "./lib/wiki.ts",
269
287
  "./renderers/markus/index": "./renderers/markus/index.ts",
270
288
  "./renderers/markus/stubs": "./renderers/markus/stubs.tsx",
271
289
  "./renderers/pretext/article-page": "./renderers/pretext/article-page.tsx",
@@ -288,6 +306,8 @@
288
306
  "./app/api/auth/prospectus/sign-in/route": "./app/api/auth/prospectus/sign-in/route.ts",
289
307
  "./app/api/auth/prospectus/sign-out/route": "./app/api/auth/prospectus/sign-out/route.ts",
290
308
  "./app/api/cyclotron/priming-proof/route": "./app/api/cyclotron/priming-proof/route.ts",
309
+ "./app/api/local-preview/derive/route": "./app/api/local-preview/derive/route.ts",
310
+ "./app/api/local-preview/media/route": "./app/api/local-preview/media/route.ts",
291
311
  "./app/api/media/[...path]/route": "./app/api/media/[...path]/route.ts",
292
312
  "./app/api/revalidate/route": "./app/api/revalidate/route.ts",
293
313
  "./app/archive/page": "./app/archive/page.tsx",
@@ -354,7 +374,7 @@
354
374
  "optional": true
355
375
  }
356
376
  },
357
- "version": "1.10.0",
377
+ "version": "1.12.0",
358
378
  "dependencies": {
359
379
  "@aws-amplify/adapter-nextjs": "^1.7.3",
360
380
  "@aws-crypto/sha256-js": "5.2.0",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.10.0",
2
+ "version": "1.12.0",
3
3
  "routes": [
4
4
  {
5
5
  "file": "app/%5F_preview/[[...path]]/route.ts",
@@ -129,6 +129,26 @@
129
129
  ],
130
130
  "config": {}
131
131
  },
132
+ {
133
+ "file": "app/api/local-preview/derive/route.ts",
134
+ "hasDefault": false,
135
+ "exports": [
136
+ "POST"
137
+ ],
138
+ "config": {
139
+ "dynamic": "\"force-dynamic\""
140
+ }
141
+ },
142
+ {
143
+ "file": "app/api/local-preview/media/route.ts",
144
+ "hasDefault": false,
145
+ "exports": [
146
+ "GET"
147
+ ],
148
+ "config": {
149
+ "dynamic": "\"force-dynamic\""
150
+ }
151
+ },
132
152
  {
133
153
  "file": "app/api/media/[...path]/route.ts",
134
154
  "hasDefault": false,
@@ -230,17 +250,13 @@
230
250
  "file": "app/newsroom/insights/[threadId]/page.tsx",
231
251
  "hasDefault": true,
232
252
  "exports": [],
233
- "config": {
234
- "dynamic": "\"force-dynamic\""
235
- }
253
+ "config": {}
236
254
  },
237
255
  {
238
256
  "file": "app/newsroom/insights/page.tsx",
239
257
  "hasDefault": true,
240
258
  "exports": [],
241
- "config": {
242
- "dynamic": "\"force-dynamic\""
243
- }
259
+ "config": {}
244
260
  },
245
261
  {
246
262
  "file": "app/newsroom/layout.tsx",