alnilam-cli
Version:
Git-native AI career coach that converts multi-year ambitions into weekly execution
73 lines (72 loc) • 6.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActivityFeed = void 0;
const jsx_runtime_1 = require("react/jsx-runtime");
const ink_1 = require("ink");
const ActivityFeed = ({ evidence, summaries, compact = false, maxItems = 10 }) => {
// Get type emoji and color
const getTypeDisplay = (type) => {
switch (type) {
case 'commit':
return { emoji: '💾', color: 'blue', label: 'Commit' };
case 'pr':
return { emoji: '🔀', color: 'green', label: 'PR' };
case 'time':
return { emoji: '⏱️', color: 'yellow', label: 'Time' };
case 'note':
return { emoji: '📝', color: 'gray', label: 'Note' };
case 'summary':
return { emoji: '📊', color: 'purple', label: 'AI Summary' };
default:
return { emoji: '📌', color: 'gray', label: type };
}
};
// Format relative time
const getRelativeTime = (dateString) => {
const date = new Date(dateString);
const now = new Date();
const diffMs = now.getTime() - date.getTime();
const diffMins = Math.floor(diffMs / (1000 * 60));
const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
if (diffMins < 1)
return 'just now';
if (diffMins < 60)
return `${diffMins}m ago`;
if (diffHours < 24)
return `${diffHours}h ago`;
if (diffDays < 7)
return `${diffDays}d ago`;
return date.toLocaleDateString();
};
// Combine and sort activities
const activities = [
...evidence.map(e => ({ ...e, activityType: 'evidence' })),
...summaries.map(s => ({
...s,
activityType: 'summary',
type: 'summary',
message: s.content,
created_at: s.date + 'T00:00:00Z' // Convert date to datetime for sorting
}))
].sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
.slice(0, maxItems);
if (compact) {
// Compact view - just show count by type
const typeCounts = evidence.reduce((acc, e) => {
acc[e.type] = (acc[e.type] || 0) + 1;
return acc;
}, {});
return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [(0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", justifyContent: "space-between", marginBottom: 1, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { color: "blue", bold: true, children: "Recent Activity" }), (0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "gray", children: [evidence.length + summaries.length, " items"] })] }), (0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 2, children: [Object.entries(typeCounts).map(([type, count]) => {
const display = getTypeDisplay(type);
return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 1, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { children: display.emoji }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: display.color, children: count })] }, type));
}), summaries.length > 0 && ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 1, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { children: "\uD83D\uDCCA" }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "purple", children: summaries.length })] }))] })] }));
}
return ((0, jsx_runtime_1.jsx)(ink_1.Box, { flexDirection: "column", children: activities.length === 0 ? ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", height: 3, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { color: "yellow", children: "\uD83C\uDF1F No recent activity" }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "gray", dimColor: true, children: "Start tracking with: alnl evidence add" })] })) : ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [activities.map((activity, index) => {
const display = getTypeDisplay(activity.type);
const isRecent = new Date().getTime() - new Date(activity.created_at).getTime() < 1000 * 60 * 60; // Within 1 hour
return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", marginBottom: 1, children: [(0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", justifyContent: "space-between", children: [(0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 1, alignItems: "center", children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { children: display.emoji }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: display.color, bold: isRecent, children: display.label }), isRecent && (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "green", children: "\u25CF" })] }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "gray", dimColor: true, children: getRelativeTime(activity.created_at) })] }), (0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", marginLeft: 3, children: [(0, jsx_runtime_1.jsxs)(ink_1.Text, { children: [activity.message.substring(0, 60), activity.message.length > 60 ? '...' : ''] }), (0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 2, marginTop: 0, children: [activity.activityType === 'evidence' && activity.metadata && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [activity.metadata.lines_added && ((0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "green", dimColor: true, children: ["+", activity.metadata.lines_added, " lines"] })), activity.metadata.minutes && ((0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "yellow", dimColor: true, children: [activity.metadata.minutes, " min"] })), activity.metadata.complexity && ((0, jsx_runtime_1.jsx)(ink_1.Text, { color: "blue", dimColor: true, children: activity.metadata.complexity }))] })), activity.activityType === 'summary' && ((0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "purple", dimColor: true, children: [activity.evidence_count, " evidence items"] })), activity.goal_id && ((0, jsx_runtime_1.jsx)(ink_1.Text, { color: "gray", dimColor: true, children: "\uD83C\uDFAF linked" }))] })] })] }, `${activity.activityType}-${activity.id || activity.date}-${index}`));
}), (evidence.length + summaries.length) > maxItems && ((0, jsx_runtime_1.jsx)(ink_1.Box, { flexDirection: "row", justifyContent: "center", marginTop: 1, children: (0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "gray", dimColor: true, children: ["... ", (evidence.length + summaries.length) - maxItems, " more activities"] }) }))] })) }));
};
exports.ActivityFeed = ActivityFeed;
exports.default = exports.ActivityFeed;