@dxos/plugin-magazine 0.0.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/LICENSE +105 -0
- package/PLUGIN.mdl +653 -0
- package/dist/lib/neutral/FeedArticle-PEWCFFSP.mjs +90 -0
- package/dist/lib/neutral/FeedArticle-PEWCFFSP.mjs.map +7 -0
- package/dist/lib/neutral/FeedProperties-EIO7IZOA.mjs +97 -0
- package/dist/lib/neutral/FeedProperties-EIO7IZOA.mjs.map +7 -0
- package/dist/lib/neutral/MagazineArticle-DEUTR23F.mjs +325 -0
- package/dist/lib/neutral/MagazineArticle-DEUTR23F.mjs.map +7 -0
- package/dist/lib/neutral/MagazinePlugin.mjs +62 -0
- package/dist/lib/neutral/MagazinePlugin.mjs.map +7 -0
- package/dist/lib/neutral/MagazinePlugin.workerd.mjs +12 -0
- package/dist/lib/neutral/MagazinePlugin.workerd.mjs.map +7 -0
- package/dist/lib/neutral/PostArticle-RERHXPXC.mjs +230 -0
- package/dist/lib/neutral/PostArticle-RERHXPXC.mjs.map +7 -0
- package/dist/lib/neutral/PostCard-VDGN7BBA.mjs +60 -0
- package/dist/lib/neutral/PostCard-VDGN7BBA.mjs.map +7 -0
- package/dist/lib/neutral/app-graph-builder-JDPRBVHL.mjs +121 -0
- package/dist/lib/neutral/app-graph-builder-JDPRBVHL.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +21 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/neutral/chunk-3K4AQKBZ.mjs +12 -0
- package/dist/lib/neutral/chunk-3K4AQKBZ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-AFPBWBTK.mjs +591 -0
- package/dist/lib/neutral/chunk-AFPBWBTK.mjs.map +7 -0
- package/dist/lib/neutral/chunk-APQRTYT3.mjs +57 -0
- package/dist/lib/neutral/chunk-APQRTYT3.mjs.map +7 -0
- package/dist/lib/neutral/chunk-GU725ZF4.mjs +11 -0
- package/dist/lib/neutral/chunk-GU725ZF4.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-JFPR6OV4.mjs +60 -0
- package/dist/lib/neutral/chunk-JFPR6OV4.mjs.map +7 -0
- package/dist/lib/neutral/chunk-KTYLUOUG.mjs +36 -0
- package/dist/lib/neutral/chunk-KTYLUOUG.mjs.map +7 -0
- package/dist/lib/neutral/chunk-MBPX7RPI.mjs +14 -0
- package/dist/lib/neutral/chunk-MBPX7RPI.mjs.map +7 -0
- package/dist/lib/neutral/chunk-MJ2AY2CK.mjs +8 -0
- package/dist/lib/neutral/chunk-MJ2AY2CK.mjs.map +7 -0
- package/dist/lib/neutral/chunk-OYCDRSWB.mjs +624 -0
- package/dist/lib/neutral/chunk-OYCDRSWB.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SAWKLGJU.mjs +28 -0
- package/dist/lib/neutral/chunk-SAWKLGJU.mjs.map +7 -0
- package/dist/lib/neutral/chunk-XCNCK47N.mjs +15 -0
- package/dist/lib/neutral/chunk-XCNCK47N.mjs.map +7 -0
- package/dist/lib/neutral/clear-magazine-KNY4OWY4.mjs +59 -0
- package/dist/lib/neutral/clear-magazine-KNY4OWY4.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +338 -0
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +17 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/neutral/create-object-SYZMRR4H.mjs +98 -0
- package/dist/lib/neutral/create-object-SYZMRR4H.mjs.map +7 -0
- package/dist/lib/neutral/curate-magazine-MA6OLK2X.mjs +184 -0
- package/dist/lib/neutral/curate-magazine-MA6OLK2X.mjs.map +7 -0
- package/dist/lib/neutral/fetch-article-content-CZO6D3QD.mjs +31 -0
- package/dist/lib/neutral/fetch-article-content-CZO6D3QD.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +18 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/load-post-content-XGL6VFF6.mjs +65 -0
- package/dist/lib/neutral/load-post-content-XGL6VFF6.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +8 -0
- package/dist/lib/neutral/meta.mjs.map +7 -0
- package/dist/lib/neutral/navigation-resolver-IN4OMCDR.mjs +18 -0
- package/dist/lib/neutral/navigation-resolver-IN4OMCDR.mjs.map +7 -0
- package/dist/lib/neutral/operation-handler-JE3743BU.mjs +8 -0
- package/dist/lib/neutral/operation-handler-JE3743BU.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +8 -0
- package/dist/lib/neutral/operations/index.mjs.map +7 -0
- package/dist/lib/neutral/plugin.mjs +16 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/neutral/plugin.workerd.mjs +16 -0
- package/dist/lib/neutral/plugin.workerd.mjs.map +7 -0
- package/dist/lib/neutral/react-surface-TZESAMG2.mjs +60 -0
- package/dist/lib/neutral/react-surface-TZESAMG2.mjs.map +7 -0
- package/dist/lib/neutral/routine-templates-A2XTJOZO.mjs +52 -0
- package/dist/lib/neutral/routine-templates-A2XTJOZO.mjs.map +7 -0
- package/dist/lib/neutral/skill-definition-3KLMUEC5.mjs +8 -0
- package/dist/lib/neutral/skill-definition-3KLMUEC5.mjs.map +7 -0
- package/dist/lib/neutral/skills/index.mjs +46 -0
- package/dist/lib/neutral/skills/index.mjs.map +7 -0
- package/dist/lib/neutral/sync-feed-UZX2XHSQ.mjs +99 -0
- package/dist/lib/neutral/sync-feed-UZX2XHSQ.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +81 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/neutral/types/index.mjs +14 -0
- package/dist/lib/neutral/types/index.mjs.map +7 -0
- package/dist/types/dx.config.d.ts +28 -0
- package/dist/types/dx.config.d.ts.map +1 -0
- package/dist/types/src/MagazinePlugin.d.ts +4 -0
- package/dist/types/src/MagazinePlugin.d.ts.map +1 -0
- package/dist/types/src/MagazinePlugin.test.d.ts +2 -0
- package/dist/types/src/MagazinePlugin.test.d.ts.map +1 -0
- package/dist/types/src/MagazinePlugin.workerd.d.ts +4 -0
- package/dist/types/src/MagazinePlugin.workerd.d.ts.map +1 -0
- package/dist/types/src/atoms/atoms.test.d.ts +2 -0
- package/dist/types/src/atoms/atoms.test.d.ts.map +1 -0
- package/dist/types/src/atoms/index.d.ts +7 -0
- package/dist/types/src/atoms/index.d.ts.map +1 -0
- package/dist/types/src/atoms/magazine-posts.d.ts +16 -0
- package/dist/types/src/atoms/magazine-posts.d.ts.map +1 -0
- package/dist/types/src/atoms/post-content.d.ts +7 -0
- package/dist/types/src/atoms/post-content.d.ts.map +1 -0
- package/dist/types/src/atoms/post-curation.d.ts +16 -0
- package/dist/types/src/atoms/post-curation.d.ts.map +1 -0
- package/dist/types/src/atoms/post-display.d.ts +22 -0
- package/dist/types/src/atoms/post-display.d.ts.map +1 -0
- package/dist/types/src/atoms/post-read.d.ts +14 -0
- package/dist/types/src/atoms/post-read.d.ts.map +1 -0
- package/dist/types/src/atoms/post-tags.d.ts +16 -0
- package/dist/types/src/atoms/post-tags.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts +5 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/create-object.d.ts +5 -0
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +10 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/navigation-resolver.d.ts +5 -0
- package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts +5 -0
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/capabilities/routine-templates.d.ts +5 -0
- package/dist/types/src/capabilities/routine-templates.d.ts.map +1 -0
- package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
- package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
- package/dist/types/src/components/PostContent/PostContent.d.ts +30 -0
- package/dist/types/src/components/PostContent/PostContent.d.ts.map +1 -0
- package/dist/types/src/components/PostContent/PostContent.test.d.ts +2 -0
- package/dist/types/src/components/PostContent/PostContent.test.d.ts.map +1 -0
- package/dist/types/src/components/PostContent/index.d.ts +2 -0
- package/dist/types/src/components/PostContent/index.d.ts.map +1 -0
- package/dist/types/src/components/PostStack/PostStack.d.ts +17 -0
- package/dist/types/src/components/PostStack/PostStack.d.ts.map +1 -0
- package/dist/types/src/components/PostStack/PostStack.stories.d.ts +10 -0
- package/dist/types/src/components/PostStack/PostStack.stories.d.ts.map +1 -0
- package/dist/types/src/components/PostStack/index.d.ts +2 -0
- package/dist/types/src/components/PostStack/index.d.ts.map +1 -0
- package/dist/types/src/components/SubscriptionStack/SubscriptionStack.d.ts +23 -0
- package/dist/types/src/components/SubscriptionStack/SubscriptionStack.d.ts.map +1 -0
- package/dist/types/src/components/SubscriptionStack/SubscriptionStack.stories.d.ts +8 -0
- package/dist/types/src/components/SubscriptionStack/SubscriptionStack.stories.d.ts.map +1 -0
- package/dist/types/src/components/SubscriptionStack/index.d.ts +2 -0
- package/dist/types/src/components/SubscriptionStack/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +4 -0
- package/dist/types/src/components/index.d.ts.map +1 -0
- package/dist/types/src/containers/FeedArticle/FeedArticle.d.ts +6 -0
- package/dist/types/src/containers/FeedArticle/FeedArticle.d.ts.map +1 -0
- package/dist/types/src/containers/FeedArticle/FeedArticle.stories.d.ts +12 -0
- package/dist/types/src/containers/FeedArticle/FeedArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/FeedArticle/FeedToolbar.d.ts +10 -0
- package/dist/types/src/containers/FeedArticle/FeedToolbar.d.ts.map +1 -0
- package/dist/types/src/containers/FeedArticle/index.d.ts +2 -0
- package/dist/types/src/containers/FeedArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/FeedProperties/FeedProperties.d.ts +6 -0
- package/dist/types/src/containers/FeedProperties/FeedProperties.d.ts.map +1 -0
- package/dist/types/src/containers/FeedProperties/index.d.ts +2 -0
- package/dist/types/src/containers/FeedProperties/index.d.ts.map +1 -0
- package/dist/types/src/containers/MagazineArticle/MagazineArticle.d.ts +6 -0
- package/dist/types/src/containers/MagazineArticle/MagazineArticle.d.ts.map +1 -0
- package/dist/types/src/containers/MagazineArticle/MagazineArticle.stories.d.ts +9 -0
- package/dist/types/src/containers/MagazineArticle/MagazineArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/MagazineArticle/MagazineTile.d.ts +11 -0
- package/dist/types/src/containers/MagazineArticle/MagazineTile.d.ts.map +1 -0
- package/dist/types/src/containers/MagazineArticle/index.d.ts +2 -0
- package/dist/types/src/containers/MagazineArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/MagazineArticle/useToolbar.d.ts +18 -0
- package/dist/types/src/containers/MagazineArticle/useToolbar.d.ts.map +1 -0
- package/dist/types/src/containers/PostArticle/PostArticle.d.ts +6 -0
- package/dist/types/src/containers/PostArticle/PostArticle.d.ts.map +1 -0
- package/dist/types/src/containers/PostArticle/PostArticle.stories.d.ts +8 -0
- package/dist/types/src/containers/PostArticle/PostArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/PostArticle/PostToolbar.d.ts +19 -0
- package/dist/types/src/containers/PostArticle/PostToolbar.d.ts.map +1 -0
- package/dist/types/src/containers/PostArticle/index.d.ts +2 -0
- package/dist/types/src/containers/PostArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/PostCard/PostCard.d.ts +11 -0
- package/dist/types/src/containers/PostCard/PostCard.d.ts.map +1 -0
- package/dist/types/src/containers/PostCard/index.d.ts +2 -0
- package/dist/types/src/containers/PostCard/index.d.ts.map +1 -0
- package/dist/types/src/containers/SubscriptionsArticle/SubscriptionsArticle.d.ts +5 -0
- package/dist/types/src/containers/SubscriptionsArticle/SubscriptionsArticle.d.ts.map +1 -0
- package/dist/types/src/containers/SubscriptionsArticle/SubscriptionsArticle.stories.d.ts +8 -0
- package/dist/types/src/containers/SubscriptionsArticle/SubscriptionsArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/SubscriptionsArticle/index.d.ts +2 -0
- package/dist/types/src/containers/SubscriptionsArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +7 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +3 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +33 -0
- package/dist/types/src/meta.d.ts.map +1 -0
- package/dist/types/src/operations/clear-magazine.d.ts +10 -0
- package/dist/types/src/operations/clear-magazine.d.ts.map +1 -0
- package/dist/types/src/operations/curate-magazine.d.ts +25 -0
- package/dist/types/src/operations/curate-magazine.d.ts.map +1 -0
- package/dist/types/src/operations/curate-magazine.skill.test.d.ts +2 -0
- package/dist/types/src/operations/curate-magazine.skill.test.d.ts.map +1 -0
- package/dist/types/src/operations/curate-magazine.test.d.ts +2 -0
- package/dist/types/src/operations/curate-magazine.test.d.ts.map +1 -0
- package/dist/types/src/operations/extraction/article.d.ts +37 -0
- package/dist/types/src/operations/extraction/article.d.ts.map +1 -0
- package/dist/types/src/operations/extraction/article.test.d.ts +2 -0
- package/dist/types/src/operations/extraction/article.test.d.ts.map +1 -0
- package/dist/types/src/operations/extraction/index.d.ts +2 -0
- package/dist/types/src/operations/extraction/index.d.ts.map +1 -0
- package/dist/types/src/operations/fetch-article-content.d.ts +5 -0
- package/dist/types/src/operations/fetch-article-content.d.ts.map +1 -0
- package/dist/types/src/operations/index.d.ts +3 -0
- package/dist/types/src/operations/index.d.ts.map +1 -0
- package/dist/types/src/operations/load-post-content.d.ts +8 -0
- package/dist/types/src/operations/load-post-content.d.ts.map +1 -0
- package/dist/types/src/operations/sources/article.d.ts +24 -0
- package/dist/types/src/operations/sources/article.d.ts.map +1 -0
- package/dist/types/src/operations/sources/cors.d.ts +12 -0
- package/dist/types/src/operations/sources/cors.d.ts.map +1 -0
- package/dist/types/src/operations/sources/feed-fetcher.d.ts +22 -0
- package/dist/types/src/operations/sources/feed-fetcher.d.ts.map +1 -0
- package/dist/types/src/operations/sources/feed-fetcher.test.d.ts +2 -0
- package/dist/types/src/operations/sources/feed-fetcher.test.d.ts.map +1 -0
- package/dist/types/src/operations/sources/http.d.ts +9 -0
- package/dist/types/src/operations/sources/http.d.ts.map +1 -0
- package/dist/types/src/operations/sources/index.d.ts +6 -0
- package/dist/types/src/operations/sources/index.d.ts.map +1 -0
- package/dist/types/src/operations/sources/rss.d.ts +4 -0
- package/dist/types/src/operations/sources/rss.d.ts.map +1 -0
- package/dist/types/src/operations/sources/rss.test.d.ts +2 -0
- package/dist/types/src/operations/sources/rss.test.d.ts.map +1 -0
- package/dist/types/src/operations/sources/standard-site.d.ts +33 -0
- package/dist/types/src/operations/sources/standard-site.d.ts.map +1 -0
- package/dist/types/src/operations/sync-feed.d.ts +5 -0
- package/dist/types/src/operations/sync-feed.d.ts.map +1 -0
- package/dist/types/src/operations/sync-feed.test.d.ts +2 -0
- package/dist/types/src/operations/sync-feed.test.d.ts.map +1 -0
- package/dist/types/src/operations/util.d.ts +25 -0
- package/dist/types/src/operations/util.d.ts.map +1 -0
- package/dist/types/src/operations/util.test.d.ts +2 -0
- package/dist/types/src/operations/util.test.d.ts.map +1 -0
- package/dist/types/src/paths.d.ts +3 -0
- package/dist/types/src/paths.d.ts.map +1 -0
- package/dist/types/src/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/plugin.workerd.d.ts +3 -0
- package/dist/types/src/plugin.workerd.d.ts.map +1 -0
- package/dist/types/src/skills/index.d.ts +2 -0
- package/dist/types/src/skills/index.d.ts.map +1 -0
- package/dist/types/src/skills/magazine-skill.d.ts +4 -0
- package/dist/types/src/skills/magazine-skill.d.ts.map +1 -0
- package/dist/types/src/stories/ArticleExtractor.stories.d.ts +267 -0
- package/dist/types/src/stories/ArticleExtractor.stories.d.ts.map +1 -0
- package/dist/types/src/stories/MagazineCurate.stories.d.ts +32 -0
- package/dist/types/src/stories/MagazineCurate.stories.d.ts.map +1 -0
- package/dist/types/src/stories/theregister-fixture.test.d.ts +2 -0
- package/dist/types/src/stories/theregister-fixture.test.d.ts.map +1 -0
- package/dist/types/src/templates/magazine-curation.d.ts +7 -0
- package/dist/types/src/templates/magazine-curation.d.ts.map +1 -0
- package/dist/types/src/testing/builder.d.ts +28 -0
- package/dist/types/src/testing/builder.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +247 -0
- package/dist/types/src/translations.d.ts.map +1 -0
- package/dist/types/src/types/CreateSubscription.d.ts +29 -0
- package/dist/types/src/types/CreateSubscription.d.ts.map +1 -0
- package/dist/types/src/types/FeedOperation.d.ts +52 -0
- package/dist/types/src/types/FeedOperation.d.ts.map +1 -0
- package/dist/types/src/types/Magazine.d.ts +87 -0
- package/dist/types/src/types/Magazine.d.ts.map +1 -0
- package/dist/types/src/types/Magazine.test.d.ts +2 -0
- package/dist/types/src/types/Magazine.test.d.ts.map +1 -0
- package/dist/types/src/types/Subscription.d.ts +144 -0
- package/dist/types/src/types/Subscription.d.ts.map +1 -0
- package/dist/types/src/types/Subscription.test.d.ts +2 -0
- package/dist/types/src/types/Subscription.test.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +5 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/util/date.d.ts +8 -0
- package/dist/types/src/util/date.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +4 -0
- package/dist/types/src/util/index.d.ts.map +1 -0
- package/dist/types/src/util/post-content.d.ts +14 -0
- package/dist/types/src/util/post-content.d.ts.map +1 -0
- package/dist/types/src/util/text.d.ts +18 -0
- package/dist/types/src/util/text.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/dx.config.ts +48 -0
- package/package.json +164 -0
- package/src/MagazinePlugin.test.ts +36 -0
- package/src/MagazinePlugin.tsx +61 -0
- package/src/MagazinePlugin.workerd.ts +31 -0
- package/src/atoms/atoms.test.ts +323 -0
- package/src/atoms/index.ts +10 -0
- package/src/atoms/magazine-posts.ts +70 -0
- package/src/atoms/post-content.ts +34 -0
- package/src/atoms/post-curation.ts +36 -0
- package/src/atoms/post-display.ts +59 -0
- package/src/atoms/post-read.ts +40 -0
- package/src/atoms/post-tags.ts +66 -0
- package/src/capabilities/app-graph-builder.ts +125 -0
- package/src/capabilities/create-object.ts +127 -0
- package/src/capabilities/index.ts +17 -0
- package/src/capabilities/navigation-resolver.ts +21 -0
- package/src/capabilities/operation-handler.ts +16 -0
- package/src/capabilities/react-surface.tsx +53 -0
- package/src/capabilities/routine-templates.ts +16 -0
- package/src/capabilities/skill-definition.ts +14 -0
- package/src/components/PostContent/PostContent.test.ts +81 -0
- package/src/components/PostContent/PostContent.tsx +111 -0
- package/src/components/PostContent/index.ts +5 -0
- package/src/components/PostStack/PostStack.stories.tsx +39 -0
- package/src/components/PostStack/PostStack.tsx +151 -0
- package/src/components/PostStack/index.ts +5 -0
- package/src/components/SubscriptionStack/SubscriptionStack.stories.tsx +52 -0
- package/src/components/SubscriptionStack/SubscriptionStack.tsx +161 -0
- package/src/components/SubscriptionStack/index.ts +5 -0
- package/src/components/index.ts +7 -0
- package/src/containers/FeedArticle/FeedArticle.stories.tsx +102 -0
- package/src/containers/FeedArticle/FeedArticle.tsx +68 -0
- package/src/containers/FeedArticle/FeedToolbar.tsx +47 -0
- package/src/containers/FeedArticle/index.ts +5 -0
- package/src/containers/FeedProperties/FeedProperties.tsx +107 -0
- package/src/containers/FeedProperties/index.ts +5 -0
- package/src/containers/MagazineArticle/MagazineArticle.stories.tsx +244 -0
- package/src/containers/MagazineArticle/MagazineArticle.tsx +146 -0
- package/src/containers/MagazineArticle/MagazineTile.tsx +88 -0
- package/src/containers/MagazineArticle/index.ts +5 -0
- package/src/containers/MagazineArticle/useToolbar.tsx +145 -0
- package/src/containers/PostArticle/PostArticle.stories.tsx +117 -0
- package/src/containers/PostArticle/PostArticle.tsx +140 -0
- package/src/containers/PostArticle/PostToolbar.tsx +120 -0
- package/src/containers/PostArticle/index.ts +5 -0
- package/src/containers/PostCard/PostCard.tsx +70 -0
- package/src/containers/PostCard/index.ts +5 -0
- package/src/containers/SubscriptionsArticle/SubscriptionsArticle.stories.tsx +80 -0
- package/src/containers/SubscriptionsArticle/SubscriptionsArticle.tsx +99 -0
- package/src/containers/SubscriptionsArticle/index.ts +5 -0
- package/src/containers/index.ts +11 -0
- package/src/index.ts +6 -0
- package/src/meta.ts +9 -0
- package/src/operations/clear-magazine.ts +83 -0
- package/src/operations/curate-magazine.skill.conversations.json +1 -0
- package/src/operations/curate-magazine.skill.test.ts +167 -0
- package/src/operations/curate-magazine.test.ts +91 -0
- package/src/operations/curate-magazine.ts +178 -0
- package/src/operations/extraction/article.test.ts +154 -0
- package/src/operations/extraction/article.ts +270 -0
- package/src/operations/extraction/index.ts +5 -0
- package/src/operations/fetch-article-content.ts +27 -0
- package/src/operations/index.ts +13 -0
- package/src/operations/load-post-content.ts +76 -0
- package/src/operations/sources/article.ts +122 -0
- package/src/operations/sources/cors.ts +19 -0
- package/src/operations/sources/feed-fetcher.test.ts +200 -0
- package/src/operations/sources/feed-fetcher.ts +26 -0
- package/src/operations/sources/http.ts +42 -0
- package/src/operations/sources/index.ts +9 -0
- package/src/operations/sources/rss.test.ts +201 -0
- package/src/operations/sources/rss.ts +138 -0
- package/src/operations/sources/standard-site.ts +381 -0
- package/src/operations/sources/testing/feed.xml +477 -0
- package/src/operations/sync-feed.test.ts +146 -0
- package/src/operations/sync-feed.ts +140 -0
- package/src/operations/util.test.ts +67 -0
- package/src/operations/util.ts +65 -0
- package/src/paths.ts +14 -0
- package/src/plugin.ts +11 -0
- package/src/plugin.workerd.ts +6 -0
- package/src/skills/index.ts +5 -0
- package/src/skills/magazine-skill.ts +45 -0
- package/src/stories/ArticleExtractor.stories.tsx +204 -0
- package/src/stories/MagazineCurate.stories.tsx +217 -0
- package/src/stories/fixtures/theregister-ai.xml +45 -0
- package/src/stories/theregister-fixture.test.ts +35 -0
- package/src/templates/magazine-curation.ts +47 -0
- package/src/testing/builder.ts +77 -0
- package/src/testing/index.ts +5 -0
- package/src/translations.ts +81 -0
- package/src/types/CreateSubscription.ts +61 -0
- package/src/types/FeedOperation.ts +134 -0
- package/src/types/Magazine.test.ts +69 -0
- package/src/types/Magazine.ts +214 -0
- package/src/types/Subscription.test.ts +171 -0
- package/src/types/Subscription.ts +366 -0
- package/src/types/index.ts +8 -0
- package/src/util/date.ts +27 -0
- package/src/util/index.ts +7 -0
- package/src/util/post-content.ts +19 -0
- package/src/util/text.ts +98 -0
- package/src/vite-env.d.ts +10 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Atom } from '@effect-atom/atom-react';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
import { Panel } from '@dxos/react-ui';
|
|
9
|
+
import { Menu, MenuBuilder, useMenuBuilder } from '@dxos/react-ui-menu';
|
|
10
|
+
|
|
11
|
+
import { postReadAtom, postTagsAtom } from '#atoms';
|
|
12
|
+
import { meta } from '#meta';
|
|
13
|
+
import { type Subscription } from '#types';
|
|
14
|
+
|
|
15
|
+
export type PostToolbarProps = {
|
|
16
|
+
post: Subscription.Post;
|
|
17
|
+
/** Whether a content re-fetch is in flight. */
|
|
18
|
+
refreshingAtom: Atom.Atom<boolean>;
|
|
19
|
+
attendableId?: string;
|
|
20
|
+
onSetStarred: (value: boolean) => void;
|
|
21
|
+
onSetArchived: (value: boolean) => void;
|
|
22
|
+
onMarkUnread: () => void;
|
|
23
|
+
onRefresh: () => void;
|
|
24
|
+
onOpenOriginal: () => void;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Reactive post toolbar built from the menu action-graph idiom. The action graph reads the post's
|
|
29
|
+
* star/archive/read slices (and the refreshing flag) via `get` inside the builder, so it subscribes
|
|
30
|
+
* to those atoms and rebuilds whenever this post's state changes. Deps hold only stable references
|
|
31
|
+
* (the post, the refreshing atom, callbacks), never the reactive values.
|
|
32
|
+
*/
|
|
33
|
+
export const PostToolbar = ({
|
|
34
|
+
post,
|
|
35
|
+
refreshingAtom,
|
|
36
|
+
attendableId,
|
|
37
|
+
onSetStarred,
|
|
38
|
+
onSetArchived,
|
|
39
|
+
onMarkUnread,
|
|
40
|
+
onRefresh,
|
|
41
|
+
onOpenOriginal,
|
|
42
|
+
}: PostToolbarProps) => {
|
|
43
|
+
const menuActions = useMenuBuilder(
|
|
44
|
+
(get) => {
|
|
45
|
+
const { starred, archived } = get(postTagsAtom(post));
|
|
46
|
+
const { readAt } = get(postReadAtom(post));
|
|
47
|
+
const read = readAt !== undefined;
|
|
48
|
+
const refreshing = get(refreshingAtom);
|
|
49
|
+
const hasLink = Boolean(post.link);
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
MenuBuilder.make()
|
|
53
|
+
.action(
|
|
54
|
+
'star',
|
|
55
|
+
{
|
|
56
|
+
label: [starred ? 'unstar-post.label' : 'star-post.label', { ns: meta.profile.key }],
|
|
57
|
+
icon: starred ? 'ph--star--fill' : 'ph--star--regular',
|
|
58
|
+
iconOnly: true,
|
|
59
|
+
},
|
|
60
|
+
() => onSetStarred(!starred),
|
|
61
|
+
)
|
|
62
|
+
.action(
|
|
63
|
+
'archive',
|
|
64
|
+
{
|
|
65
|
+
label: [archived ? 'unarchive-post.label' : 'archive-post.label', { ns: meta.profile.key }],
|
|
66
|
+
icon: archived ? 'ph--archive--fill' : 'ph--archive--regular',
|
|
67
|
+
iconOnly: true,
|
|
68
|
+
},
|
|
69
|
+
() => onSetArchived(!archived),
|
|
70
|
+
)
|
|
71
|
+
.action(
|
|
72
|
+
'mark-unread',
|
|
73
|
+
{
|
|
74
|
+
label: ['mark-unread.label', { ns: meta.profile.key }],
|
|
75
|
+
icon: 'ph--envelope--regular',
|
|
76
|
+
iconOnly: true,
|
|
77
|
+
hidden: !read,
|
|
78
|
+
},
|
|
79
|
+
onMarkUnread,
|
|
80
|
+
)
|
|
81
|
+
// `gap` is a flexible spacer that pushes the link actions to the trailing edge.
|
|
82
|
+
.separator('gap')
|
|
83
|
+
.action(
|
|
84
|
+
'refresh',
|
|
85
|
+
{
|
|
86
|
+
label: [refreshing ? 'refresh-content-pending.label' : 'refresh-content.label', { ns: meta.profile.key }],
|
|
87
|
+
icon: 'ph--arrows-clockwise--regular',
|
|
88
|
+
iconClassNames: refreshing ? 'animate-spin' : undefined,
|
|
89
|
+
iconOnly: true,
|
|
90
|
+
disabled: refreshing,
|
|
91
|
+
hidden: !hasLink,
|
|
92
|
+
},
|
|
93
|
+
onRefresh,
|
|
94
|
+
)
|
|
95
|
+
.action(
|
|
96
|
+
'open-original',
|
|
97
|
+
{
|
|
98
|
+
label: ['open-original.label', { ns: meta.profile.key }],
|
|
99
|
+
icon: 'ph--arrow-square-out--regular',
|
|
100
|
+
iconOnly: true,
|
|
101
|
+
hidden: !hasLink,
|
|
102
|
+
},
|
|
103
|
+
onOpenOriginal,
|
|
104
|
+
)
|
|
105
|
+
.build()
|
|
106
|
+
);
|
|
107
|
+
},
|
|
108
|
+
[post, refreshingAtom, onSetStarred, onSetArchived, onMarkUnread, onRefresh, onOpenOriginal],
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
return (
|
|
112
|
+
<Menu.Root {...menuActions} attendableId={attendableId}>
|
|
113
|
+
<Panel.Toolbar asChild>
|
|
114
|
+
<Menu.Toolbar />
|
|
115
|
+
</Panel.Toolbar>
|
|
116
|
+
</Menu.Root>
|
|
117
|
+
);
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
PostToolbar.displayName = 'PostToolbar';
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { useMemo } from 'react';
|
|
6
|
+
|
|
7
|
+
import { type AppSurface } from '@dxos/app-toolkit/ui';
|
|
8
|
+
import { Filter, Obj } from '@dxos/echo';
|
|
9
|
+
import { useObject, useQuery } from '@dxos/react-client/echo';
|
|
10
|
+
import { Card } from '@dxos/react-ui';
|
|
11
|
+
|
|
12
|
+
import { Subscription } from '#types';
|
|
13
|
+
|
|
14
|
+
import { formatDate, getImageUrl, getSnippet } from '../../util';
|
|
15
|
+
|
|
16
|
+
export type PostCardProps = AppSurface.ObjectCardProps<Subscription.Post>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Compact preview of a {@link Subscription.Post}. Rendered into the
|
|
20
|
+
* `AppSurface.CardContent` slot — Card.Root is supplied by the surface host
|
|
21
|
+
* (popovers, sections, related-objects), so the body emits Card.Body only.
|
|
22
|
+
*/
|
|
23
|
+
export const PostCard = ({ subject }: PostCardProps) => {
|
|
24
|
+
const [post] = useObject(subject);
|
|
25
|
+
|
|
26
|
+
// Resolve the source feed's display name when present. `post.feed?.target?.name` only
|
|
27
|
+
// resolves synchronously when the ref is already loaded; querying via useQuery means
|
|
28
|
+
// the meta line lights up as soon as the feed lands in the space.
|
|
29
|
+
const db = Obj.getDatabase(post);
|
|
30
|
+
const allFeeds = useQuery(db, Filter.type(Subscription.Subscription));
|
|
31
|
+
const feedName = useMemo(() => {
|
|
32
|
+
const dxn = post.source?.uri;
|
|
33
|
+
if (!dxn) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
return allFeeds.find((feed) => Obj.getURI(feed) === dxn)?.name;
|
|
37
|
+
}, [post.source, allFeeds]);
|
|
38
|
+
|
|
39
|
+
const published = formatDate(post.published);
|
|
40
|
+
// snippet/imageUrl are derived from the Post's description (no content-feed entry in this surface).
|
|
41
|
+
const imageUrl = getImageUrl(post);
|
|
42
|
+
const snippet = useMemo(() => getSnippet(post) || undefined, [post.description]);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<Card.Body>
|
|
46
|
+
{imageUrl && <Card.Poster alt={post.title ?? ''} image={imageUrl} fit='cover' classNames='rounded-t-xs' />}
|
|
47
|
+
{post.title && (
|
|
48
|
+
<Card.Row>
|
|
49
|
+
<Card.Title classNames='line-clamp-2'>{post.title}</Card.Title>
|
|
50
|
+
</Card.Row>
|
|
51
|
+
)}
|
|
52
|
+
{snippet && (
|
|
53
|
+
<Card.Row>
|
|
54
|
+
<Card.Text variant='description' classNames='line-clamp-3'>
|
|
55
|
+
{snippet}
|
|
56
|
+
</Card.Text>
|
|
57
|
+
</Card.Row>
|
|
58
|
+
)}
|
|
59
|
+
{(feedName || published) && (
|
|
60
|
+
<Card.Row>
|
|
61
|
+
<div className='grid grid-cols-[minmax(0,1fr)_auto] items-center gap-2 text-sm text-description overflow-hidden'>
|
|
62
|
+
<span className='truncate'>{feedName ?? ''}</span>
|
|
63
|
+
<span className='text-end shrink-0'>{published ?? ''}</span>
|
|
64
|
+
</div>
|
|
65
|
+
</Card.Row>
|
|
66
|
+
)}
|
|
67
|
+
{post.link && <Card.Link label={post.link} href={post.link} />}
|
|
68
|
+
</Card.Body>
|
|
69
|
+
);
|
|
70
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import React from 'react';
|
|
8
|
+
|
|
9
|
+
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
10
|
+
import { type Client } from '@dxos/client';
|
|
11
|
+
import { type Space } from '@dxos/client/echo';
|
|
12
|
+
import { Filter } from '@dxos/echo';
|
|
13
|
+
import { ClientPlugin } from '@dxos/plugin-client/testing';
|
|
14
|
+
import { initializeIdentity } from '@dxos/plugin-client/testing';
|
|
15
|
+
import { SpacePlugin } from '@dxos/plugin-space/testing';
|
|
16
|
+
import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
|
|
17
|
+
import { random } from '@dxos/random';
|
|
18
|
+
import { useQuery, useSpaces } from '@dxos/react-client/echo';
|
|
19
|
+
import { Loading, withLayout } from '@dxos/react-ui/testing';
|
|
20
|
+
|
|
21
|
+
import { translations } from '#translations';
|
|
22
|
+
import { Subscription } from '#types';
|
|
23
|
+
|
|
24
|
+
import { MagazinePlugin } from '../../MagazinePlugin';
|
|
25
|
+
import { SubscriptionsArticle } from './SubscriptionsArticle';
|
|
26
|
+
|
|
27
|
+
const DefaultStory = () => {
|
|
28
|
+
const spaces = useSpaces();
|
|
29
|
+
const space = spaces[spaces.length - 1];
|
|
30
|
+
const feeds = useQuery(space?.db, Filter.type(Subscription.Subscription));
|
|
31
|
+
if (!space || feeds.length === 0) {
|
|
32
|
+
return <Loading />;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return <SubscriptionsArticle role='article' space={space} attendableId='story' />;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const meta: Meta<typeof DefaultStory> = {
|
|
39
|
+
title: 'plugins/plugin-magazine/containers/SubscriptionsArticle',
|
|
40
|
+
component: DefaultStory,
|
|
41
|
+
decorators: [
|
|
42
|
+
withLayout({ layout: 'fullscreen' }),
|
|
43
|
+
withPluginManager({
|
|
44
|
+
plugins: [
|
|
45
|
+
...corePlugins(),
|
|
46
|
+
ClientPlugin({
|
|
47
|
+
types: [Subscription.Subscription, Subscription.Post],
|
|
48
|
+
onClientInitialized: ({ client }: { client: Client }) =>
|
|
49
|
+
Effect.gen(function* () {
|
|
50
|
+
yield* initializeIdentity(client);
|
|
51
|
+
const space = (yield* Effect.promise(() => client.spaces.create())) as Space;
|
|
52
|
+
yield* Effect.promise(() => space.waitUntilReady());
|
|
53
|
+
Array.from({ length: 5 }).forEach(() => {
|
|
54
|
+
space.db.add(
|
|
55
|
+
Subscription.makeSubscription({
|
|
56
|
+
name: random.company.name() + ' Blog',
|
|
57
|
+
url: random.internet.url(),
|
|
58
|
+
description: random.lorem.paragraphs(3),
|
|
59
|
+
}),
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
}),
|
|
63
|
+
}),
|
|
64
|
+
SpacePlugin({}),
|
|
65
|
+
StorybookPlugin({}),
|
|
66
|
+
MagazinePlugin(),
|
|
67
|
+
],
|
|
68
|
+
}),
|
|
69
|
+
],
|
|
70
|
+
parameters: {
|
|
71
|
+
layout: 'fullscreen',
|
|
72
|
+
translations,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export default meta;
|
|
77
|
+
|
|
78
|
+
type Story = StoryObj<typeof meta>;
|
|
79
|
+
|
|
80
|
+
export const Default: Story = {};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { useCallback } from 'react';
|
|
6
|
+
|
|
7
|
+
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
8
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
9
|
+
import { type AppSurface, useLayout } from '@dxos/app-toolkit/ui';
|
|
10
|
+
import { Filter, Obj, Ref, Type } from '@dxos/echo';
|
|
11
|
+
import { invariant } from '@dxos/invariant';
|
|
12
|
+
import { SpaceOperation } from '@dxos/plugin-space';
|
|
13
|
+
import { useQuery } from '@dxos/react-client/echo';
|
|
14
|
+
import { Panel, Toolbar, useTranslation } from '@dxos/react-ui';
|
|
15
|
+
import { linkedSegment, useSelection } from '@dxos/react-ui-attention';
|
|
16
|
+
|
|
17
|
+
import { SubscriptionStack, type SubscriptionStackAction } from '#components';
|
|
18
|
+
import { meta } from '#meta';
|
|
19
|
+
import { FeedOperation } from '#types';
|
|
20
|
+
import { Subscription } from '#types';
|
|
21
|
+
|
|
22
|
+
export type SubscriptionsArticleProps = AppSurface.SpaceArticleProps;
|
|
23
|
+
|
|
24
|
+
export const SubscriptionsArticle = ({ role, space, attendableId }: SubscriptionsArticleProps) => {
|
|
25
|
+
const { t } = useTranslation(meta.profile.key);
|
|
26
|
+
const { invokePromise } = useOperationInvoker();
|
|
27
|
+
const layout = useLayout();
|
|
28
|
+
|
|
29
|
+
const feeds = useQuery(space.db, Filter.type(Subscription.Subscription));
|
|
30
|
+
const currentId = useSelection(attendableId, 'single');
|
|
31
|
+
|
|
32
|
+
const handleAction = useCallback(
|
|
33
|
+
(action: SubscriptionStackAction) => {
|
|
34
|
+
switch (action.type) {
|
|
35
|
+
case 'current': {
|
|
36
|
+
invariant(attendableId);
|
|
37
|
+
void invokePromise(LayoutOperation.Select, {
|
|
38
|
+
contextId: attendableId,
|
|
39
|
+
subject: { mode: 'single', id: action.feedId },
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const companion = linkedSegment('feed');
|
|
43
|
+
if (layout.mode === 'simple') {
|
|
44
|
+
void invokePromise(LayoutOperation.UpdateComplementary, {
|
|
45
|
+
subject: companion,
|
|
46
|
+
state: 'expanded',
|
|
47
|
+
});
|
|
48
|
+
} else {
|
|
49
|
+
void invokePromise(LayoutOperation.UpdateCompanion, {
|
|
50
|
+
subject: companion,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
case 'sync': {
|
|
57
|
+
const feedToSync = feeds.find((feed) => feed.id === action.feedId);
|
|
58
|
+
if (feedToSync) {
|
|
59
|
+
void invokePromise(
|
|
60
|
+
FeedOperation.SyncFeed,
|
|
61
|
+
{ feed: Ref.make(feedToSync) },
|
|
62
|
+
{ spaceId: Obj.getDatabase(feedToSync)?.spaceId },
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
case 'delete': {
|
|
69
|
+
const feedToDelete = feeds.find((feed) => feed.id === action.feedId);
|
|
70
|
+
if (feedToDelete) {
|
|
71
|
+
Obj.getDatabase(feedToDelete)?.remove(feedToDelete);
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
[attendableId, layout.mode, feeds, invokePromise],
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
const handleCreate = useCallback(() => {
|
|
81
|
+
void invokePromise(SpaceOperation.OpenCreateObject, {
|
|
82
|
+
target: space.db,
|
|
83
|
+
typename: Type.getTypename(Subscription.Subscription),
|
|
84
|
+
});
|
|
85
|
+
}, [space, invokePromise]);
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<Panel.Root role={role}>
|
|
89
|
+
<Panel.Toolbar asChild>
|
|
90
|
+
<Toolbar.Root>
|
|
91
|
+
<Toolbar.IconButton label={t('add-feed.label')} icon='ph--plus--regular' iconOnly onClick={handleCreate} />
|
|
92
|
+
</Toolbar.Root>
|
|
93
|
+
</Panel.Toolbar>
|
|
94
|
+
<Panel.Content asChild>
|
|
95
|
+
<SubscriptionStack id={attendableId} feeds={feeds} currentId={currentId} onAction={handleAction} />
|
|
96
|
+
</Panel.Content>
|
|
97
|
+
</Panel.Root>
|
|
98
|
+
);
|
|
99
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type ComponentType, lazy } from 'react';
|
|
6
|
+
|
|
7
|
+
export const FeedArticle: ComponentType<any> = lazy(() => import('./FeedArticle'));
|
|
8
|
+
export const FeedProperties: ComponentType<any> = lazy(() => import('./FeedProperties'));
|
|
9
|
+
export const MagazineArticle: ComponentType<any> = lazy(() => import('./MagazineArticle'));
|
|
10
|
+
export const PostArticle: ComponentType<any> = lazy(() => import('./PostArticle'));
|
|
11
|
+
export const PostCard: ComponentType<any> = lazy(() => import('./PostCard'));
|
package/src/index.ts
ADDED
package/src/meta.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Option from 'effect/Option';
|
|
7
|
+
|
|
8
|
+
import { Operation } from '@dxos/compute';
|
|
9
|
+
import { Database, Obj, Ref } from '@dxos/echo';
|
|
10
|
+
import { EID } from '@dxos/keys';
|
|
11
|
+
|
|
12
|
+
import { FeedOperation, Subscription } from '../types';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Clears a Magazine's curated posts, preserving any that are starred. With no `starred` tag in the
|
|
16
|
+
* space nothing can be starred, so the whole list is emptied without resolving any posts; otherwise
|
|
17
|
+
* each post (and its distinct source Subscription) is resolved and the starred ones are kept.
|
|
18
|
+
*/
|
|
19
|
+
const handler: Operation.WithHandler<typeof FeedOperation.ClearMagazine> = FeedOperation.ClearMagazine.pipe(
|
|
20
|
+
Operation.withHandler(
|
|
21
|
+
Effect.fn(function* ({ magazine: magazineRef }) {
|
|
22
|
+
const magazine = yield* Database.load(magazineRef);
|
|
23
|
+
const db = Obj.getDatabase(magazine);
|
|
24
|
+
if (!db || magazine.posts.length === 0) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const starredUri = yield* Effect.promise(() => Subscription.findSystemTagUri(db, 'starred'));
|
|
28
|
+
|
|
29
|
+
const next = yield* Option.fromNullable(starredUri).pipe(
|
|
30
|
+
Option.match({
|
|
31
|
+
onNone: () => Effect.succeed<Ref.Ref<Subscription.Post>[]>([]),
|
|
32
|
+
onSome: (uri) =>
|
|
33
|
+
Effect.gen(function* () {
|
|
34
|
+
// Resolve posts concurrently — `Effect.all` defaults to sequential.
|
|
35
|
+
const loaded = yield* Effect.all(
|
|
36
|
+
magazine.posts.map((ref) => Database.load(ref)),
|
|
37
|
+
{ concurrency: 'unbounded' },
|
|
38
|
+
);
|
|
39
|
+
// A post's starred flag lives on its Subscription's TagIndex; many posts share one
|
|
40
|
+
// Subscription (a feed has many posts), so resolve each distinct source once.
|
|
41
|
+
const sourceById = new Map<string, Ref.Ref<Subscription.Subscription>>();
|
|
42
|
+
for (const post of loaded) {
|
|
43
|
+
if (post.source) {
|
|
44
|
+
sourceById.set(EID.getEntityId(EID.parse(post.source.uri)) ?? post.source.uri, post.source);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const subscriptionEntries = yield* Effect.all(
|
|
48
|
+
[...sourceById].map(([entityId, source]) =>
|
|
49
|
+
Database.load(source).pipe(
|
|
50
|
+
// Resolve the child tag index so `hasTag` can read it synchronously below.
|
|
51
|
+
Effect.tap((subscription) => Database.load(subscription.tags)),
|
|
52
|
+
Effect.map((subscription) => [entityId, subscription] as const),
|
|
53
|
+
),
|
|
54
|
+
),
|
|
55
|
+
{ concurrency: 'unbounded' },
|
|
56
|
+
);
|
|
57
|
+
const subscriptionById = new Map(subscriptionEntries);
|
|
58
|
+
return loaded
|
|
59
|
+
.filter((post) =>
|
|
60
|
+
Subscription.hasTag(
|
|
61
|
+
post.source
|
|
62
|
+
? subscriptionById.get(EID.getEntityId(EID.parse(post.source.uri)) ?? post.source.uri)
|
|
63
|
+
: undefined,
|
|
64
|
+
post.id,
|
|
65
|
+
uri,
|
|
66
|
+
),
|
|
67
|
+
)
|
|
68
|
+
.map((post) => Ref.make(post));
|
|
69
|
+
}),
|
|
70
|
+
}),
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
if (next.length === magazine.posts.length) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
Obj.update(magazine, (magazine) => {
|
|
77
|
+
magazine.posts = next;
|
|
78
|
+
});
|
|
79
|
+
}),
|
|
80
|
+
),
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
export default handler;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"conversations":[{"parameters":{"model":"dxn:com.anthropic.model.claudeOpus48","stream":true,"tools":[{"name":"completeJob","inputSchema":{"type":"object","required":[],"properties":{"success":{"type":"object","required":["posts"],"properties":{"posts":{"type":"array","items":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"A Universally Unique Lexicographically Sortable Identifier","pattern":"^[0-7][0-9A-HJKMNP-TV-Z]{25}$"},"snippet":{"type":"string"},"imageUrl":{"type":"string"}},"additionalProperties":false}}},"additionalProperties":false},"failure":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Short message describing the error."},"description":{"type":"string","description":"Optional longer message describing in detail what went wrong"}},"additionalProperties":false}},"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"You are an agent running in the non-interactive mode.\nThe user is unable to see what you are doing, and cannot answer any questions.\nDo not ask questions.\nComplete the task before you, and at the end call [completeJob] with the output.\nIf you are unable to complete the task, call [completeJob] with the failure reason.\nIf no output is required, call [completeJob] with an empty object: {}\nDo not stop until you call [completeJob].\n\n## Context Objects\n\n<object>\n <dxn>echo://BDJXMULPW5FB55UZ7KP5HLDHVTXUTHE2U/01JGFJJZ00G0WKQSJGMAKCNT8Y</dxn>\n <typename>org.dxos.type.magazine</typename>\n</object>","options":{}},{"role":"user","content":"You curate articles for a Magazine around the Topic described below.\n\nSelect only candidates that clearly match the Topic — quality over quantity.\n\nNever select duplicate articles. Two candidates are duplicates if they share a link or guid, or if\ntheir titles and content describe the same story (e.g. the same article syndicated by different\nfeeds). Keep only one of each — prefer the most complete or authoritative source — and skip the rest.\n\nFor each candidate you select, also produce:\n- A concise 1-2 sentence snippet (plain text, no markdown) capturing why the article is relevant to\n the Topic. If you read the full article, use it to write a richer snippet.\n- The best hero image URL for the article, when one is available.\n\n## Topic\n\nCurate articles about space exploration and astronomy — missions, spacecraft, telescopes, and astrophysics discoveries. Exclude unrelated business, finance, or software-tooling news.\n<input>{\"candidates\":[{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8S\",\"feedName\":\"Tech & Science Daily\",\"title\":\"NASA's Artemis II crew completes lunar flyby rehearsal\",\"description\":\"The four astronauts ran a full simulation of the crewed Moon flyby, practicing re-entry and recovery procedures ahead of next year’s launch.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/artemis-ii\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8T\",\"feedName\":\"Tech & Science Daily\",\"title\":\"James Webb telescope confirms the most distant galaxy yet seen\",\"description\":\"Astronomers used JWST spectroscopy to confirm a galaxy as it appeared 290 million years after the Big Bang, a new record for cosmic distance.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/jwst-galaxy\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8V\",\"feedName\":\"Tech & Science Daily\",\"title\":\"Retail chain beats quarterly earnings estimates\",\"description\":\"Shares rose 6% after the company reported stronger-than-expected holiday sales and raised its full-year profit guidance.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/retail-earnings\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8W\",\"feedName\":\"Tech & Science Daily\",\"title\":\"New JavaScript build tool promises 10x faster bundling\",\"description\":\"The Rust-based bundler aims to replace existing toolchains for large web applications with incremental compilation.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/js-bundler\"}]}</input>","options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_018BJxwZmvRB27odbpJkTAJT","modelId":"claude-opus-4-8","timestamp":"1970-01-01T00:00:00.000Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"Ep4CCmMIDxgCKkDm/fBnYSFnlyUV0jVq9erjrIGCuse0+3DF8kPQF+UBeai8XA2q2J5EBtP986g0KiIhmx/5vFCS1jg+BX1EieIjMg9jbGF1ZGUtb3B1cy00LTg4AEIIdGhpbmtpbmcSDDz59yO2FxmqNndO2RoMLZXt4K66QeYV6eA1IjBtN6fRt+H7MVf9Go+MSLyAzuLWUvYkVfpMpLmh8i8vIZ43Cch/Tiinjo4fOimUzi4qaT0YGuXzqoBxTDuokuelxGKlJRm1Y0HIggKXs1hHMi9FbSNTAtWDK+62jWddmqhy751D5L8g4KJZ6hAhgfmsN23Dhx6VvpHEsRYz7smUDcwloVb4fc60xgBv3SErvNHmNEBgG7ptwi98wxgB"}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"tool-params-start","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","name":"completeJob","providerExecuted":false,"metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"{\"success","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"\":","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" {\"posts\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":":[{\"id\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":":\"01J","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"GFJJZ00G0WKQ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"SJGM","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"AKCNT","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"8S\",\"snippet","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"\":\"NA","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"SA's Artemi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"s II astron","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"au","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ts ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"completed a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" full reh","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"earsal of","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" their crewe","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"d l","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"unar ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"flyb","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"y, practicin","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"g re","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"-entry","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" and recove","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ry a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"head of","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" next ye","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ar","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"'s lau","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"nch — a k","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ey milesto","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ne ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"for h","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"uman","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" deep-spac","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"e explor","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ation.\"},{\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"id","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"\":\"0","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"1JGF","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"JJZ00G","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"0WKQSJGMAKCN","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"T8T\",\"sni","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ppet\":\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"Using J","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"WST spectro","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"scopy, ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"as","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"tronom","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ers","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" confirme","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"d the most ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"di","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"stant galaxy","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" yet obs","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"erve","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"d, se","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"en ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"just 290 mi","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ll","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"io","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"n years a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"fter t","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"he","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" Big Bang —","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" a r","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ecord-sett","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"in","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"g astr","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"oph","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ysic","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"s discov","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"ery","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":" abou","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"t the ea","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"rly ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"univ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","delta":"erse.\"}]}}","metadata":{}},{"type":"tool-params-end","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","metadata":{}},{"type":"finish","reason":"tool-calls","usage":{"inputTokens":2,"outputTokens":307,"totalTokens":309},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":1802},"cache_creation_input_tokens":1802,"cache_read_input_tokens":0,"input_tokens":2,"output_tokens":3,"server_tool_use":null,"service_tier":"standard"}}}}]},{"parameters":{"model":"dxn:com.anthropic.model.claudeOpus48","stream":true,"tools":[{"name":"completeJob","inputSchema":{"type":"object","required":[],"properties":{"success":{"type":"object","required":["posts"],"properties":{"posts":{"type":"array","items":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"A Universally Unique Lexicographically Sortable Identifier","pattern":"^[0-7][0-9A-HJKMNP-TV-Z]{25}$"},"snippet":{"type":"string"},"imageUrl":{"type":"string"}},"additionalProperties":false}}},"additionalProperties":false},"failure":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Short message describing the error."},"description":{"type":"string","description":"Optional longer message describing in detail what went wrong"}},"additionalProperties":false}},"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"You are an agent running in the non-interactive mode.\nThe user is unable to see what you are doing, and cannot answer any questions.\nDo not ask questions.\nComplete the task before you, and at the end call [completeJob] with the output.\nIf you are unable to complete the task, call [completeJob] with the failure reason.\nIf no output is required, call [completeJob] with an empty object: {}\nDo not stop until you call [completeJob].\n\n## Context Objects\n\n<object>\n <dxn>echo://BDJXMULPW5FB55UZ7KP5HLDHVTXUTHE2U/01JGFJJZ00G0WKQSJGMAKCNT8Y</dxn>\n <typename>org.dxos.type.magazine</typename>\n</object>","options":{}},{"role":"user","content":"You curate articles for a Magazine around the Topic described below.\n\nSelect only candidates that clearly match the Topic — quality over quantity.\n\nNever select duplicate articles. Two candidates are duplicates if they share a link or guid, or if\ntheir titles and content describe the same story (e.g. the same article syndicated by different\nfeeds). Keep only one of each — prefer the most complete or authoritative source — and skip the rest.\n\nFor each candidate you select, also produce:\n- A concise 1-2 sentence snippet (plain text, no markdown) capturing why the article is relevant to\n the Topic. If you read the full article, use it to write a richer snippet.\n- The best hero image URL for the article, when one is available.\n\n## Topic\n\nCurate articles about space exploration and astronomy — missions, spacecraft, telescopes, and astrophysics discoveries. Exclude unrelated business, finance, or software-tooling news.\n<input>{\"candidates\":[{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8S\",\"feedName\":\"Tech & Science Daily\",\"title\":\"NASA's Artemis II crew completes lunar flyby rehearsal\",\"description\":\"The four astronauts ran a full simulation of the crewed Moon flyby, practicing re-entry and recovery procedures ahead of next year’s launch.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/artemis-ii\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8T\",\"feedName\":\"Tech & Science Daily\",\"title\":\"James Webb telescope confirms the most distant galaxy yet seen\",\"description\":\"Astronomers used JWST spectroscopy to confirm a galaxy as it appeared 290 million years after the Big Bang, a new record for cosmic distance.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/jwst-galaxy\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8V\",\"feedName\":\"Tech & Science Daily\",\"title\":\"Retail chain beats quarterly earnings estimates\",\"description\":\"Shares rose 6% after the company reported stronger-than-expected holiday sales and raised its full-year profit guidance.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/retail-earnings\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8W\",\"feedName\":\"Tech & Science Daily\",\"title\":\"New JavaScript build tool promises 10x faster bundling\",\"description\":\"The Rust-based bundler aims to replace existing toolchains for large web applications with incremental compilation.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/js-bundler\"}]}</input>","options":{}},{"role":"assistant","content":[{"type":"reasoning","text":"","options":{}},{"type":"tool-call","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","name":"completeJob","params":{"success":{"posts":[{"id":"01JGFJJZ00G0WKQSJGMAKCNT8S","snippet":"NASA's Artemis II astronauts completed a full rehearsal of their crewed lunar flyby, practicing re-entry and recovery ahead of next year's launch — a key milestone for human deep-space exploration."},{"id":"01JGFJJZ00G0WKQSJGMAKCNT8T","snippet":"Using JWST spectroscopy, astronomers confirmed the most distant galaxy yet observed, seen just 290 million years after the Big Bang — a record-setting astrophysics discovery about the early universe."}]}},"providerExecuted":false,"options":{}}],"options":{}},{"role":"tool","content":[{"type":"tool-result","id":"toolu_01K9YeiKJdB6VR2oKNriuew8","name":"completeJob","isFailure":false,"result":{},"providerExecuted":false,"options":{}}],"options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01JDwb8qUNsKJvJ475DnpCou","modelId":"claude-opus-4-8","timestamp":"1970-01-01T00:00:00.000Z","metadata":{}},{"type":"text-start","id":"0","metadata":{}},{"type":"text-delta","id":"0","delta":"I","metadata":{}},{"type":"text-delta","id":"0","delta":" curated the magazine, selecting the two articles that clearly match the space exploration and astronomy topic:\n\n1. **NASA's Artemis II","metadata":{}},{"type":"text-delta","id":"0","delta":" crew lunar flyby rehearsal** — a crewed Moon mission milestone.\n2. **James Webb telescope confirms most distant galaxy** — an astrophysics","metadata":{}},{"type":"text-delta","id":"0","delta":"/telescope discovery.\n\nI excluded the retail earnings article (business/finance) and the JavaScript build tool article (software t","metadata":{}},{"type":"text-delta","id":"0","delta":"ooling), both unrelated to the topic. No duplicates were present.","metadata":{}},{"type":"text-end","id":"0","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":2,"outputTokens":166,"totalTokens":168},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":285},"cache_creation_input_tokens":285,"cache_read_input_tokens":1802,"input_tokens":2,"output_tokens":1,"server_tool_use":null,"service_tier":"standard"}}}}]},{"parameters":{"model":"dxn:com.anthropic.model.claude-opus-4-8.default","stream":true,"tools":[{"name":"completeJob","inputSchema":{"type":"object","required":[],"properties":{"success":{"type":"object","required":["posts"],"properties":{"posts":{"type":"array","items":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"A Universally Unique Lexicographically Sortable Identifier","pattern":"^[0-7][0-9A-HJKMNP-TV-Z]{25}$"},"snippet":{"type":"string"},"imageUrl":{"type":"string"}},"additionalProperties":false}}},"additionalProperties":false},"failure":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Short message describing the error."},"description":{"type":"string","description":"Optional longer message describing in detail what went wrong"}},"additionalProperties":false}},"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"You are an agent running in the non-interactive mode.\nThe user is unable to see what you are doing, and cannot answer any questions.\nDo not ask questions.\nComplete the task before you, and at the end call [completeJob] with the output.\nIf you are unable to complete the task, call [completeJob] with the failure reason.\nIf no output is required, call [completeJob] with an empty object: {}\nDo not stop until you call [completeJob].\n\n## Context Objects\n\n<object>\n <dxn>echo://BDJXMULPW5FB55UZ7KP5HLDHVTXUTHE2U/01JGFJJZ00G0WKQSJGMAKCNT8Y</dxn>\n <typename>org.dxos.type.magazine</typename>\n</object>","options":{}},{"role":"user","content":"You curate articles for a Magazine around the Topic described below.\n\nSelect only candidates that clearly match the Topic — quality over quantity.\n\nNever select duplicate articles. Two candidates are duplicates if they share a link or guid, or if\ntheir titles and content describe the same story (e.g. the same article syndicated by different\nfeeds). Keep only one of each — prefer the most complete or authoritative source — and skip the rest.\n\nFor each candidate you select, also produce:\n- A concise 1-2 sentence snippet (plain text, no markdown) capturing why the article is relevant to\n the Topic. If you read the full article, use it to write a richer snippet.\n- The best hero image URL for the article, when one is available.\n\n## Topic\n\nCurate articles about space exploration and astronomy — missions, spacecraft, telescopes, and astrophysics discoveries. Exclude unrelated business, finance, or software-tooling news.\n<input>{\"candidates\":[{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8S\",\"feedName\":\"Tech & Science Daily\",\"title\":\"NASA's Artemis II crew completes lunar flyby rehearsal\",\"description\":\"The four astronauts ran a full simulation of the crewed Moon flyby, practicing re-entry and recovery procedures ahead of next year’s launch.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/artemis-ii\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8T\",\"feedName\":\"Tech & Science Daily\",\"title\":\"James Webb telescope confirms the most distant galaxy yet seen\",\"description\":\"Astronomers used JWST spectroscopy to confirm a galaxy as it appeared 290 million years after the Big Bang, a new record for cosmic distance.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/jwst-galaxy\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8V\",\"feedName\":\"Tech & Science Daily\",\"title\":\"Retail chain beats quarterly earnings estimates\",\"description\":\"Shares rose 6% after the company reported stronger-than-expected holiday sales and raised its full-year profit guidance.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/retail-earnings\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8W\",\"feedName\":\"Tech & Science Daily\",\"title\":\"New JavaScript build tool promises 10x faster bundling\",\"description\":\"The Rust-based bundler aims to replace existing toolchains for large web applications with incremental compilation.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/js-bundler\"}]}</input>","options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01AoDKaEdrNQBSc8pmh1QJCW","modelId":"claude-opus-4-8","timestamp":"1970-01-01T00:00:00.000Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"EsQCCmMIDxgCKkCLSAgQ6d96to62hjcLm5D+fImzk2XZx6S4F2nFwdYmaR8JoMV3scGhT/ggac0/kcNf4+oUOahFviFW4hJF2NO7Mg9jbGF1ZGUtb3B1cy00LTg4AEIIdGhpbmtpbmcSDAdyGC9OmtOekGN4zRoMWhh5Vn2Kf3kcmtgkIjBr5JndmIsjLYmiRnoQWJkUsQOD9Y+yqcgwOTRPx1oB9Oyr2+1gfMA9wBYzcrIYZo4qjgGpbp/TzU3Q5i6VqE1QKctvDGB7D+cAkGSfeq3KBnKgQpCMJpGNQMEjD+Zuh4C/HLsFReE/w0fX1zMK1EUB9E+v9zIyPNz6lVK7cQM6CE3174CbZ5XNFBGpFCwrqY8EYdp2pxjyrv1f+Dqy31y49qVZi6QsDsogaFHFAot4hBHHSspnpAHqDRVgEQFP01y3GAE="}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"tool-params-start","id":"toolu_019iL51MUHjw3twiR8rGmuCs","name":"completeJob","providerExecuted":false,"metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"{\"success\": ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"{\"posts\":","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"[{\"id\":\"01JG","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"FJJZ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"00G0WK","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"QSJ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"GM","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"AKCNT8S\",\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"snippet\":","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"\"NA","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"SA's Art","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"emis","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":" II ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"crew rehea","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"rsed thei","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"r crewed Moo","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"n ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"flyby, pra","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"ct","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"icing ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"re-entry and","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":" re","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"co","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"very ahea","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"d of n","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"ext ye","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"ar's la","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"unch —","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":" a key mi","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"lestone","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":" in retur","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"ning human","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"s to l","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"un","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"ar space.\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":",\"imageUr","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"l\":\"\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"},{","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"\"id\":\"01JGFJ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"JZ00G0WKQSJ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"GMAKCNT8","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"T\",\"s","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"nippet\":\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"Usin","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"g ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"JWS","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"T spectr","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"oscopy, ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"astro","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"nomers c","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"onfirmed","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":" the most d","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"istant galax","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"y yet ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"obse","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"rved, ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"seen j","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"ust ","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"29","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"0 million","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":" years","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":" afte","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"r the Big","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":" Bang","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":", setting a","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":" ne","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"w c","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"osmic dist","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"ance record.","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"\",\"imageUrl","metadata":{}},{"type":"tool-params-delta","id":"toolu_019iL51MUHjw3twiR8rGmuCs","delta":"\":\"\"}]}}","metadata":{}},{"type":"tool-params-end","id":"toolu_019iL51MUHjw3twiR8rGmuCs","metadata":{}},{"type":"finish","reason":"tool-calls","usage":{"inputTokens":2,"outputTokens":331,"totalTokens":333},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":1802},"cache_creation_input_tokens":1802,"cache_read_input_tokens":0,"input_tokens":2,"output_tokens":6,"server_tool_use":null,"service_tier":"standard"}}}}]},{"parameters":{"model":"dxn:com.anthropic.model.claude-opus-4-8.default","stream":true,"tools":[{"name":"completeJob","inputSchema":{"type":"object","required":[],"properties":{"success":{"type":"object","required":["posts"],"properties":{"posts":{"type":"array","items":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"A Universally Unique Lexicographically Sortable Identifier","pattern":"^[0-7][0-9A-HJKMNP-TV-Z]{25}$"},"snippet":{"type":"string"},"imageUrl":{"type":"string"}},"additionalProperties":false}}},"additionalProperties":false},"failure":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Short message describing the error."},"description":{"type":"string","description":"Optional longer message describing in detail what went wrong"}},"additionalProperties":false}},"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"You are an agent running in the non-interactive mode.\nThe user is unable to see what you are doing, and cannot answer any questions.\nDo not ask questions.\nComplete the task before you, and at the end call [completeJob] with the output.\nIf you are unable to complete the task, call [completeJob] with the failure reason.\nIf no output is required, call [completeJob] with an empty object: {}\nDo not stop until you call [completeJob].\n\n## Context Objects\n\n<object>\n <dxn>echo://BDJXMULPW5FB55UZ7KP5HLDHVTXUTHE2U/01JGFJJZ00G0WKQSJGMAKCNT8Y</dxn>\n <typename>org.dxos.type.magazine</typename>\n</object>","options":{}},{"role":"user","content":"You curate articles for a Magazine around the Topic described below.\n\nSelect only candidates that clearly match the Topic — quality over quantity.\n\nNever select duplicate articles. Two candidates are duplicates if they share a link or guid, or if\ntheir titles and content describe the same story (e.g. the same article syndicated by different\nfeeds). Keep only one of each — prefer the most complete or authoritative source — and skip the rest.\n\nFor each candidate you select, also produce:\n- A concise 1-2 sentence snippet (plain text, no markdown) capturing why the article is relevant to\n the Topic. If you read the full article, use it to write a richer snippet.\n- The best hero image URL for the article, when one is available.\n\n## Topic\n\nCurate articles about space exploration and astronomy — missions, spacecraft, telescopes, and astrophysics discoveries. Exclude unrelated business, finance, or software-tooling news.\n<input>{\"candidates\":[{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8S\",\"feedName\":\"Tech & Science Daily\",\"title\":\"NASA's Artemis II crew completes lunar flyby rehearsal\",\"description\":\"The four astronauts ran a full simulation of the crewed Moon flyby, practicing re-entry and recovery procedures ahead of next year’s launch.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/artemis-ii\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8T\",\"feedName\":\"Tech & Science Daily\",\"title\":\"James Webb telescope confirms the most distant galaxy yet seen\",\"description\":\"Astronomers used JWST spectroscopy to confirm a galaxy as it appeared 290 million years after the Big Bang, a new record for cosmic distance.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/jwst-galaxy\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8V\",\"feedName\":\"Tech & Science Daily\",\"title\":\"Retail chain beats quarterly earnings estimates\",\"description\":\"Shares rose 6% after the company reported stronger-than-expected holiday sales and raised its full-year profit guidance.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/retail-earnings\"},{\"id\":\"01JGFJJZ00G0WKQSJGMAKCNT8W\",\"feedName\":\"Tech & Science Daily\",\"title\":\"New JavaScript build tool promises 10x faster bundling\",\"description\":\"The Rust-based bundler aims to replace existing toolchains for large web applications with incremental compilation.\",\"published\":\"2026-05-01T00:00:00Z\",\"link\":\"https://example.com/js-bundler\"}]}</input>","options":{}},{"role":"assistant","content":[{"type":"reasoning","text":"","options":{}},{"type":"tool-call","id":"toolu_019iL51MUHjw3twiR8rGmuCs","name":"completeJob","params":{"success":{"posts":[{"id":"01JGFJJZ00G0WKQSJGMAKCNT8S","snippet":"NASA's Artemis II crew rehearsed their crewed Moon flyby, practicing re-entry and recovery ahead of next year's launch — a key milestone in returning humans to lunar space.","imageUrl":""},{"id":"01JGFJJZ00G0WKQSJGMAKCNT8T","snippet":"Using JWST spectroscopy, astronomers confirmed the most distant galaxy yet observed, seen just 290 million years after the Big Bang, setting a new cosmic distance record.","imageUrl":""}]}},"providerExecuted":false,"options":{}}],"options":{}},{"role":"tool","content":[{"type":"tool-result","id":"toolu_019iL51MUHjw3twiR8rGmuCs","name":"completeJob","isFailure":false,"result":{},"providerExecuted":false,"options":{}}],"options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01E5uUhLRugSS4T7vP2VJX6v","modelId":"claude-opus-4-8","timestamp":"1970-01-01T00:00:00.000Z","metadata":{}},{"type":"text-start","id":"0","metadata":{}},{"type":"text-delta","id":"0","delta":"I","metadata":{}},{"type":"text-delta","id":"0","delta":" curated the magazine successfully. From the four candidates, I selected the two that clearly match the space exploration and","metadata":{}},{"type":"text-delta","id":"0","delta":" astronomy topic:\n\n1. **NASA's Artemis II crew completes lunar flyby rehearsal** — a space mission story about retur","metadata":{}},{"type":"text-delta","id":"0","delta":"ning humans to lunar space.\n2. **James Webb telescope confirms the most distant galaxy yet seen** — an astrophysics discovery using a telescope.\n\nI excluded the ret","metadata":{}},{"type":"text-delta","id":"0","delta":"ail earnings article (business/finance) and the JavaScript build tool article (software tooling), as both fall outside the topic. No duplicates were present.","metadata":{}},{"type":"text-end","id":"0","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":2,"outputTokens":185,"totalTokens":187},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":288},"cache_creation_input_tokens":288,"cache_read_input_tokens":1802,"input_tokens":2,"output_tokens":1,"server_tool_use":null,"service_tier":"standard"}}}}]}]}
|