Files
sentryagent-idp/portal/app/layout.tsx
SentryAgent.ai Developer d1e6af25aa feat(phase-4): WS2 + WS3 — Developer Portal (Next.js 14) and CLI tool (sentryagent)
WS2: Developer Portal (portal/)
- Standalone Next.js 14 + Tailwind CSS app — independent deployment
- Home page: hero, feature grid, CTA to /get-started
- /pricing: free tier limits table (10 agents, 1k calls/day) + paid tier CTA
- /sdks: all 4 SDKs (Node.js, Python, Go, Java) with install + code examples
- /api-explorer: Swagger UI from NEXT_PUBLIC_API_URL/openapi.json, persistAuthorization
- /get-started: 4-step wizard (setup → register agent → credentials → SDK snippet)
- Shared Nav component with active-link highlighting
- Build: 8/8 static pages, zero TypeScript errors

WS3: CLI Tool (cli/ — npm package: sentryagent)
- configure, register-agent, list-agents, issue-token, rotate-credentials, tail-audit-log
- Auto OAuth2 token fetch + 30s-buffer cache via client_credentials flow
- chalk-formatted table output, confirmation prompts, bounded audit log dedup
- bash + zsh shell completion scripts
- README with installation, all commands, and completion setup
- Build: tsc clean, node dist/index.js --help verified

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 04:29:50 +00:00

32 lines
893 B
TypeScript

import type { Metadata } from 'next';
import type React from 'react';
import './globals.css';
import { Nav } from '@/components/Nav';
export const metadata: Metadata = {
title: 'SentryAgent.ai Developer Portal',
description:
'Identity and access management for AI agents. Register, authenticate, and secure your agents with SentryAgent AgentIdP.',
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body className="min-h-screen bg-slate-50 text-slate-900 antialiased">
<Nav />
<main>{children}</main>
<footer className="border-t border-slate-200 py-8 text-center text-sm text-slate-500">
<p>
&copy; {new Date().getFullYear()} SentryAgent.ai &mdash; All rights
reserved.
</p>
</footer>
</body>
</html>
);
}