diff --git a/apps/api/src/api-v1/deployments/create-deployment.ts b/apps/api/src/api-v1/deployments/create-deployment.ts index 0984685f..9d9c292e 100644 --- a/apps/api/src/api-v1/deployments/create-deployment.ts +++ b/apps/api/src/api-v1/deployments/create-deployment.ts @@ -156,6 +156,7 @@ export function registerV1CreateDeployment( let [deployment] = await db .insert(schema.deployments) .values({ + iconUrl: user.image, ...agenticProjectConfig, identifier: deploymentIdentifier, hash, diff --git a/apps/api/src/db/schema/common.ts b/apps/api/src/db/schema/common.ts index 5c431908..5c865a4f 100644 --- a/apps/api/src/db/schema/common.ts +++ b/apps/api/src/db/schema/common.ts @@ -134,6 +134,7 @@ export function timestamp< : PgTimestampBuilderInitial<''> { return timestampImpl({ mode: 'string' as unknown as TMode, + withTimezone: true, ...config }) } diff --git a/apps/e2e/bin/seed-db.ts b/apps/e2e/bin/seed-db.ts index fa6d8c6a..d2055c3e 100644 --- a/apps/e2e/bin/seed-db.ts +++ b/apps/e2e/bin/seed-db.ts @@ -11,8 +11,6 @@ export const client = new AgenticApiClient({ }) async function main() { - // TODO: clear existing tables? and include prompt to double check if so... - { console.log('\n\nCreating "dev" user...\n\n') diff --git a/apps/web/package.json b/apps/web/package.json index 85559b82..df380b31 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -25,6 +25,7 @@ "@agentic/platform-core": "workspace:*", "@agentic/platform-types": "workspace:*", "@agentic/platform-validators": "workspace:*", + "@date-fns/utc": "^2.1.0", "@number-flow/react": "catalog:", "@pmndrs/assets": "catalog:", "@radix-ui/react-dropdown-menu": "catalog:", @@ -44,6 +45,7 @@ "canvas-confetti": "catalog:", "class-variance-authority": "catalog:", "clsx": "catalog:", + "date-fns": "^4.1.0", "hast-util-to-jsx-runtime": "catalog:", "ky": "catalog:", "lucide-react": "catalog:", diff --git a/apps/web/public/agentic-icon-circle-light.svg b/apps/web/public/agentic-icon-circle-light.svg new file mode 100644 index 00000000..7c928ab4 --- /dev/null +++ b/apps/web/public/agentic-icon-circle-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/web/src/app/marketplace/marketplace-index.tsx b/apps/web/src/app/marketplace/marketplace-index.tsx index 7b27aeeb..7285d202 100644 --- a/apps/web/src/app/marketplace/marketplace-index.tsx +++ b/apps/web/src/app/marketplace/marketplace-index.tsx @@ -1,10 +1,10 @@ 'use client' -import Link from 'next/link' import useInfiniteScroll from 'react-infinite-scroll-hook' import { useAgentic } from '@/components/agentic-provider' import { LoadingIndicator } from '@/components/loading-indicator' +import { PublicProject } from '@/components/public-project' import { useInfiniteQuery } from '@/lib/query-client' export function MarketplaceIndex() { @@ -76,25 +76,7 @@ export function MarketplaceIndex() { ) : (
{projects.map((project) => ( - -

{project.name}

- -

- {project.identifier} -

- - {project.lastPublishedDeployment && ( -

- Last published:{' '} - {project.lastPublishedDeployment.version || - project.lastPublishedDeployment.hash} -

- )} - + ))} {hasNextPage && ( diff --git a/apps/web/src/components/public-project.tsx b/apps/web/src/components/public-project.tsx new file mode 100644 index 00000000..a9944ac5 --- /dev/null +++ b/apps/web/src/components/public-project.tsx @@ -0,0 +1,57 @@ +import type { Project } from '@agentic/platform-types' +import { UTCDate } from '@date-fns/utc' +import { formatDistanceToNow } from 'date-fns' +import Link from 'next/link' + +export function PublicProject({ project }: { project: Project }) { + const deployment = project.lastPublishedDeployment! + + return ( + +
+ {project.name} + +
+

+ {project.name} +

+ +

{project.identifier}

+
+
+ +
+ {deployment.description && ( +

{deployment.description}

+ )} + + {project.lastPublishedDeployment && ( +
+
{deployment.version}
+ +
+ Last published{' '} + {formatDistanceToNow(new UTCDate(deployment.createdAt), { + addSuffix: true + })} +
+
+ )} +
+ + ) +} diff --git a/examples/search/agentic.config.ts b/examples/search/agentic.config.ts index fd0ac8e1..c4f37eee 100644 --- a/examples/search/agentic.config.ts +++ b/examples/search/agentic.config.ts @@ -4,6 +4,8 @@ import { defineConfig } from '@agentic/platform' export default defineConfig({ name: 'search', + description: + 'Google Search tool. Useful for finding up-to-date news and information about any topic.', origin: { type: 'mcp', url: process.env.MCP_ORIGIN_URL! @@ -11,6 +13,7 @@ export default defineConfig({ toolConfigs: [ { name: 'search', + // Allow results to be cached publicly for ~1 minute cacheControl: 'public, max-age=60, s-maxage=60 stale-while-revalidate=10' } ] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 810c78a0..ccd65ede 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,69 +6,150 @@ settings: catalogs: default: - '@fisch0920/drizzle-orm': - specifier: ^0.43.7 - version: 0.43.7 - '@fisch0920/drizzle-zod': - specifier: ^0.7.9 - version: 0.7.9 - '@hono/node-server': - specifier: 1.14.4 - version: 1.14.4 - '@hono/zod-openapi': - specifier: ^0.19.8 - version: 0.19.8 - '@paralleldrive/cuid2': - specifier: ^2.2.2 - version: 2.2.2 - '@sentry/node': - specifier: ^9.30.0 - version: 9.30.0 - '@types/semver': - specifier: ^7.7.0 - version: 7.7.0 - bcryptjs: - specifier: ^3.0.2 - version: 3.0.2 - drizzle-kit: - specifier: ^0.31.1 - version: 0.31.1 - drizzle-orm: - specifier: ^0.44.2 - version: 0.44.2 - exit-hook: - specifier: 4.0.0 - version: 4.0.0 - hono: - specifier: 4.8.1 - version: 4.8.1 + '@number-flow/react': + specifier: ^0.5.10 + version: 0.5.10 + '@pmndrs/assets': + specifier: ^1.7.0 + version: 1.7.0 + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.15 + version: 2.1.15 + '@radix-ui/react-label': + specifier: ^2.1.7 + version: 2.1.7 + '@radix-ui/react-slot': + specifier: ^1.2.3 + version: 1.2.3 + '@radix-ui/react-tabs': + specifier: ^1.1.12 + version: 1.1.12 + '@radix-ui/react-tooltip': + specifier: ^1.2.7 + version: 1.2.7 + '@react-three/cannon': + specifier: ^6.6.0 + version: 6.6.0 + '@react-three/drei': + specifier: ^10.2.0 + version: 10.3.0 + '@react-three/fiber': + specifier: ^9.1.2 + version: 9.1.2 + '@react-three/postprocessing': + specifier: ^3.0.4 + version: 3.0.4 + '@react-three/rapier': + specifier: ^2.1.0 + version: 2.1.0 + '@tailwindcss/postcss': + specifier: ^4.1.10 + version: 4.1.10 + '@tailwindcss/typography': + specifier: ^0.5.16 + version: 0.5.16 + '@tanstack/react-form': + specifier: ^1.12.3 + version: 1.12.3 + '@tanstack/react-query': + specifier: ^5.80.10 + version: 5.80.10 + '@tanstack/react-query-devtools': + specifier: ^5.80.10 + version: 5.80.10 + '@types/canvas-confetti': + specifier: ^1.9.0 + version: 1.9.0 + '@types/react': + specifier: ^19.1.8 + version: 19.1.8 + '@types/react-dom': + specifier: ^19.1.6 + version: 19.1.6 + '@types/three': + specifier: ^0.177.0 + version: 0.177.0 + autoprefixer: + specifier: ^10.4.21 + version: 10.4.21 + canvas-confetti: + specifier: ^1.9.3 + version: 1.9.3 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + hast-util-to-jsx-runtime: + specifier: ^2.3.6 + version: 2.3.6 ky: specifier: 1.8.1 version: 1.8.1 - octokit: - specifier: ^5.0.3 - version: 5.0.3 - p-all: - specifier: ^5.0.0 - version: 5.0.0 - postgres: - specifier: ^3.4.7 - version: 3.4.7 - restore-cursor: - specifier: ^5.1.0 - version: 5.1.0 - semver: - specifier: ^7.7.2 - version: 7.7.2 + lucide-react: + specifier: ^0.518.0 + version: 0.518.0 + motion: + specifier: ^12.18.1 + version: 12.18.1 + next: + specifier: ^15.3.4 + version: 15.3.4 + next-themes: + specifier: ^0.4.6 + version: 0.4.6 + postcss: + specifier: ^8.5.6 + version: 8.5.6 + posthog-js: + specifier: ^1.255.0 + version: 1.255.0 + react: + specifier: ^19.1.0 + version: 19.1.0 + react-dom: + specifier: ^19.1.0 + version: 19.1.0 + react-infinite-scroll-hook: + specifier: ^6.0.1 + version: 6.0.1 + react-lottie-player: + specifier: ^2.1.0 + version: 2.1.0 + react-use: + specifier: ^17.6.0 + version: 17.6.0 + server-only: + specifier: ^0.0.1 + version: 0.0.1 + shiki: + specifier: ^3.7.0 + version: 3.7.0 + sonner: + specifier: ^2.0.5 + version: 2.0.5 stripe: specifier: ^18.2.1 version: 18.2.1 + suspend-react: + specifier: ^0.1.3 + version: 0.1.3 + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 + tailwindcss: + specifier: ^4.1.10 + version: 4.1.10 + three: + specifier: ^0.177.0 + version: 0.177.0 + tw-animate-css: + specifier: ^1.3.4 + version: 1.3.4 type-fest: specifier: ^4.41.0 version: 4.41.0 - zod-validation-error: - specifier: ^3.5.2 - version: 3.5.2 importers: @@ -347,6 +428,9 @@ importers: '@agentic/platform-validators': specifier: workspace:* version: link:../../packages/validators + '@date-fns/utc': + specifier: ^2.1.0 + version: 2.1.0 '@number-flow/react': specifier: 'catalog:' version: 0.5.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -404,6 +488,9 @@ importers: clsx: specifier: 'catalog:' version: 2.1.1 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 hast-util-to-jsx-runtime: specifier: 'catalog:' version: 2.3.6 @@ -1037,6 +1124,9 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@date-fns/utc@2.1.0': + resolution: {integrity: sha512-176grgAgU2U303rD2/vcOmNg0kGPbhzckuH1TEP2al7n0AQipZIy9P15usd2TKQCG1g+E1jX/ZVQSzs4sUDwgA==} + '@dimforge/rapier3d-compat@0.12.0': resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} @@ -4148,6 +4238,9 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + debounce-fn@6.0.0: resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} engines: {node: '>=18'} @@ -7849,6 +7942,8 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@date-fns/utc@2.1.0': {} + '@dimforge/rapier3d-compat@0.12.0': {} '@dimforge/rapier3d-compat@0.15.0': {} @@ -10735,6 +10830,8 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + date-fns@4.1.0: {} + debounce-fn@6.0.0: dependencies: mimic-function: 5.0.1 @@ -11053,7 +11150,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.25.5): dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) esbuild: 0.25.5 transitivePeerDependencies: - supports-color @@ -12575,7 +12672,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -13385,7 +13482,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@10.0.0) module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c8ca89fd..ba25b5a6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,16 +3,13 @@ packages: - apps/* - examples/* - packages/fixtures/valid/* -ignoredBuiltDependencies: - - '@fisch0920/config' -onlyBuiltDependencies: - - '@sentry/cli' + catalog: '@agentic/core': ^7.6.7 '@agentic/serper': ^7.6.7 '@ai-sdk/openai': ^1.3.22 '@apideck/better-ajv-errors': ^0.3.6 - '@clack/prompts': ^0.11.0 + '@clack/prompts': 0.11.0 '@cloudflare/workers-types': ^4.20250620.0 '@commander-js/extra-typings': ^14.0.0 '@dotenvx/dotenvx': ^1.45.1 @@ -148,3 +145,9 @@ catalog: zod: ^3.25.67 zod-to-json-schema: ^3.24.5 zod-validation-error: ^3.5.2 + +ignoredBuiltDependencies: + - '@fisch0920/config' + +onlyBuiltDependencies: + - '@sentry/cli' diff --git a/readme.md b/readme.md index 7df7c121..68eba18f 100644 --- a/readme.md +++ b/readme.md @@ -109,6 +109,7 @@ - RateLimit-Policy: "burst";q=100;w=60,"daily";q=1000;w=86400 - https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/ - make json `$schema` public for `agentic.config.json` +- handle hosting of deployment and user images ## Connect