vibebusiness 1.2.39 → 1.2.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.next/standalone/.env +7 -0
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/app-build-manifest.json +68 -60
  4. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  5. package/.next/standalone/.next/build-manifest.json +6 -6
  6. package/.next/standalone/.next/prerender-manifest.json +1 -1
  7. package/.next/standalone/.next/routes-manifest.json +1 -1
  8. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  9. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  12. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/standalone/.next/server/app/api/analyze/route.js +1 -1
  14. package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/checkout/route.js +1 -0
  16. package/.next/standalone/.next/server/app/api/checkout/route.js.nft.json +1 -0
  17. package/.next/standalone/.next/server/app/api/config/detect-repos/route.js +1 -1
  18. package/.next/standalone/.next/server/app/api/config/detect-repos/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/config/route.js +1 -1
  20. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js +1 -1
  22. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/epics/[id]/route.js +1 -1
  24. package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/epics/route.js +1 -1
  26. package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js +1 -1
  28. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/goals/[id]/route.js +1 -1
  30. package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/goals/route.js +1 -1
  32. package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/health/route.js +1 -1
  34. package/.next/standalone/.next/server/app/api/health/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js +1 -1
  36. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/hypotheses/route.js +1 -1
  38. package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js +1 -1
  40. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js +1 -1
  42. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js +1 -1
  44. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js +1 -1
  46. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/api/ideas/route.js +1 -1
  48. package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/api/implementations/route.js +1 -1
  50. package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js +1 -1
  52. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/license/route.js +1 -0
  54. package/.next/standalone/.next/server/app/api/license/route.js.nft.json +1 -0
  55. package/.next/standalone/.next/server/app/api/portal/route.js +1 -0
  56. package/.next/standalone/.next/server/app/api/portal/route.js.nft.json +1 -0
  57. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js +1 -0
  58. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -0
  59. package/.next/standalone/.next/server/app/api/social/[id]/route.js +1 -0
  60. package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -0
  61. package/.next/standalone/.next/server/app/api/social/route.js +1 -0
  62. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -0
  63. package/.next/standalone/.next/server/app/api/webhook/route.js +1 -0
  64. package/.next/standalone/.next/server/app/api/webhook/route.js.nft.json +1 -0
  65. package/.next/standalone/.next/server/app/goals/[id]/page.js +1 -1
  66. package/.next/standalone/.next/server/app/goals/[id]/page.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/goals/page.js +1 -1
  69. package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/hypotheses/[id]/page.js +1 -1
  72. package/.next/standalone/.next/server/app/hypotheses/[id]/page.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
  75. package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/ideas/[id]/page.js +1 -1
  78. package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/landing/page.js +1 -1
  81. package/.next/standalone/.next/server/app/landing/page.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/landing.html +1 -1
  84. package/.next/standalone/.next/server/app/landing.rsc +1 -1
  85. package/.next/standalone/.next/server/app/page.js +1 -1
  86. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/roadmap/[id]/page.js +1 -1
  89. package/.next/standalone/.next/server/app/roadmap/[id]/page.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/roadmap/page.js +1 -1
  92. package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/sessions/page.js +1 -1
  95. package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  98. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/settings.html +1 -1
  101. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  102. package/.next/standalone/.next/server/app/social/page.js +1 -0
  103. package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -0
  104. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -0
  105. package/.next/standalone/.next/server/app/social.html +1 -0
  106. package/.next/standalone/.next/server/app/social.meta +5 -0
  107. package/.next/standalone/.next/server/app/social.rsc +7 -0
  108. package/.next/standalone/.next/server/app-paths-manifest.json +15 -7
  109. package/.next/standalone/.next/server/chunks/{682.js → 1682.js} +1 -1
  110. package/.next/standalone/.next/server/chunks/3644.js +1 -0
  111. package/.next/standalone/.next/server/chunks/4376.js +1 -0
  112. package/.next/standalone/.next/server/chunks/4471.js +2 -0
  113. package/.next/standalone/.next/server/chunks/534.js +1 -0
  114. package/.next/standalone/.next/server/chunks/5972.js +12 -0
  115. package/.next/standalone/.next/server/chunks/7809.js +2 -0
  116. package/.next/standalone/.next/server/chunks/9276.js +2 -0
  117. package/.next/standalone/.next/server/chunks/9777.js +1 -0
  118. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  119. package/.next/standalone/.next/server/pages/404.html +1 -1
  120. package/.next/standalone/.next/server/pages/500.html +1 -1
  121. package/.next/standalone/.next/server/pages/_app.js +1 -1
  122. package/.next/standalone/.next/server/pages/_document.js +1 -1
  123. package/.next/standalone/.next/server/pages/_document.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/pages/_error.js +1 -1
  125. package/.next/standalone/.next/server/pages/_error.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  127. package/.next/standalone/.next/server/webpack-runtime.js +1 -1
  128. package/.next/standalone/data/email-campaigns/welcome-2026-02-20.md +13 -32
  129. package/.next/standalone/data/payments.json +33 -0
  130. package/.next/standalone/data/social.json +13 -0
  131. package/.next/standalone/package.json +5 -1
  132. package/.next/standalone/scripts/skills/social-media.ts +456 -0
  133. package/.next/static/chunks/444-125b7b0fa8cbdb81.js +1 -0
  134. package/.next/static/chunks/746-ea7c3e4e69c14385.js +1 -0
  135. package/.next/static/chunks/app/goals/[id]/{page-91b8382d44e93925.js → page-8dbeab5cc8cf0988.js} +1 -1
  136. package/.next/static/chunks/app/goals/{page-ecaa4a2761757014.js → page-794526d1e1a0856a.js} +1 -1
  137. package/.next/static/chunks/app/hypotheses/[id]/{page-894b08de47a73af9.js → page-65032da79ae146c5.js} +1 -1
  138. package/.next/static/chunks/app/hypotheses/page-8314da4be7c533bd.js +1 -0
  139. package/.next/static/chunks/app/ideas/[id]/page-dc9746061e58eea5.js +1 -0
  140. package/.next/static/chunks/app/layout-eeef7928298d2198.js +1 -0
  141. package/.next/static/chunks/app/page-fb66ff080390f20a.js +1 -0
  142. package/.next/static/chunks/app/roadmap/[id]/{page-3848fd96de497d11.js → page-c8c4baf233e0d480.js} +1 -1
  143. package/.next/static/chunks/app/roadmap/page-b15554a207ed2813.js +1 -0
  144. package/.next/static/chunks/app/sessions/page-42fb8edb15b9da1c.js +1 -0
  145. package/.next/static/chunks/app/settings/page-d2d630a799b6b495.js +1 -0
  146. package/.next/static/chunks/app/social/page-6c61fb0c2546313e.js +1 -0
  147. package/.next/static/chunks/{main-c0637f9544446589.js → main-98052d4291bccc96.js} +1 -1
  148. package/.next/static/css/02298496de89e16e.css +3 -0
  149. package/README.md +18 -0
  150. package/dist/bin/vibebusiness.js +307 -26
  151. package/dist/scripts/analyze.js +1 -0
  152. package/dist/scripts/chat.js +1 -0
  153. package/dist/scripts/generate-idea.js +1 -0
  154. package/dist/scripts/heartbeat.js +7343 -192
  155. package/dist/scripts/implement.js +1 -0
  156. package/dist/scripts/init.js +46 -6
  157. package/dist/scripts/scan.js +1 -0
  158. package/package.json +5 -1
  159. package/templates/commands/email-marketing.md +148 -10
  160. package/.next/standalone/.next/server/chunks/276.js +0 -2
  161. package/.next/standalone/.next/server/chunks/416.js +0 -1
  162. package/.next/standalone/.next/server/chunks/471.js +0 -2
  163. package/.next/standalone/.next/server/chunks/617.js +0 -1
  164. package/.next/standalone/.next/server/chunks/644.js +0 -1
  165. package/.next/standalone/.next/server/chunks/972.js +0 -12
  166. package/.next/static/chunks/444-6c0edb23956d018d.js +0 -1
  167. package/.next/static/chunks/783-3af6dbdb6afb55f4.js +0 -1
  168. package/.next/static/chunks/app/hypotheses/page-2cf90570526c76d3.js +0 -1
  169. package/.next/static/chunks/app/ideas/[id]/page-e0cca1557b59f7e0.js +0 -1
  170. package/.next/static/chunks/app/layout-ae8acf4955ee5472.js +0 -1
  171. package/.next/static/chunks/app/page-6a52a6950963129a.js +0 -1
  172. package/.next/static/chunks/app/roadmap/page-94d002cf0e37260f.js +0 -1
  173. package/.next/static/chunks/app/sessions/page-8085e6da5e28c7e4.js +0 -1
  174. package/.next/static/chunks/app/settings/page-34f70eef4a23eb4c.js +0 -1
  175. package/.next/static/css/501d0ac30341ebbe.css +0 -3
  176. /package/.next/static/{k40DKimnEdAtBs_zywSQ4 → VNI-b7vAR8FWLaaVytLYx}/_buildManifest.js +0 -0
  177. /package/.next/static/{k40DKimnEdAtBs_zywSQ4 → VNI-b7vAR8FWLaaVytLYx}/_ssgManifest.js +0 -0
  178. /package/.next/static/chunks/{117-b74c3899e29d85d7.js → 117-23260fd0b5f0bd9a.js} +0 -0
  179. /package/.next/static/chunks/app/_not-found/{page-2573b25f318b094f.js → page-a7be1c556b396c8e.js} +0 -0
  180. /package/.next/static/chunks/{fd9d1056-2182e078483b259b.js → fd9d1056-8c714984d5b17b60.js} +0 -0
@@ -0,0 +1,13 @@
1
+ {
2
+ "last_updated": "2026-02-20T22:50:48.200Z",
3
+ "platform": "x",
4
+ "username": "@luisgmey",
5
+ "credentials_valid": true,
6
+ "drafts": [],
7
+ "metrics": {
8
+ "followers_count": 334,
9
+ "post_streak_days": 0,
10
+ "total_posts": 0,
11
+ "last_post_date": null
12
+ }
13
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibebusiness",
3
- "version": "1.2.39",
3
+ "version": "1.2.41",
4
4
  "description": "AI-powered autonomous business analyst. Research. Build. Ship. Grow.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "private": false,
@@ -69,5 +69,9 @@
69
69
  "typescript": "^5.4.5",
70
70
  "uuid": "^9.0.1",
71
71
  "vitest": "^4.0.18"
72
+ },
73
+ "dependencies": {
74
+ "stripe": "^20.3.1",
75
+ "twitter-api-v2": "^1.29.0"
72
76
  }
73
77
  }
@@ -0,0 +1,456 @@
1
+ /**
2
+ * Social Media Skill — Twitter/X Build-in-Public for Founders
3
+ *
4
+ * Draft-then-confirm workflow:
5
+ * 1. Heartbeat AI recommends social-draft-* tasks
6
+ * 2. Drafts are saved to data/social.json
7
+ * 3. User reviews and publishes from the /social dashboard
8
+ *
9
+ * Task prefixes handled:
10
+ * social-setup-x → Validate X credentials, save username
11
+ * social-draft-ship → Draft a "just shipped" tweet from latest shipped idea
12
+ * social-draft-update → Draft a product update from positioning data
13
+ * social-draft-milestone → Draft a milestone tweet from a KPI that hit target
14
+ * social-draft-digest → Draft a weekly recap tweet
15
+ * social-publish-{id} → Post draft {id} to Twitter/X
16
+ * social-check-status → Audit: credentials valid? Draft count? Post streak?
17
+ */
18
+
19
+ import * as fs from 'fs';
20
+ import * as path from 'path';
21
+ import { v4 as uuidv4 } from 'uuid';
22
+ import { SOCIAL_FILE, GOALS_FILE } from '../lib/paths';
23
+ import {
24
+ loadCredentials,
25
+ createXClient,
26
+ validateCredentials,
27
+ postTweet,
28
+ } from '../lib/social/x-api';
29
+ import {
30
+ generateShipTweet,
31
+ generateMilestoneTweet,
32
+ generateDigestTweet,
33
+ generateProductUpdateTweet,
34
+ } from '../lib/social/content-generator';
35
+ import type { SocialConfig, SocialDraft, SocialDraftSource, BusinessGoal } from '../../src/lib/types';
36
+
37
+ // ─── State ───────────────────────────────────────────────────────────────────
38
+
39
+ const EMPTY_STATE: SocialConfig = {
40
+ last_updated: new Date().toISOString(),
41
+ platform: 'x',
42
+ username: null,
43
+ credentials_valid: false,
44
+ drafts: [],
45
+ metrics: {
46
+ followers_count: null,
47
+ post_streak_days: 0,
48
+ total_posts: 0,
49
+ last_post_date: null,
50
+ },
51
+ };
52
+
53
+ function loadState(): SocialConfig {
54
+ if (!fs.existsSync(SOCIAL_FILE)) {
55
+ return { ...EMPTY_STATE, metrics: { ...EMPTY_STATE.metrics } };
56
+ }
57
+ try {
58
+ return JSON.parse(fs.readFileSync(SOCIAL_FILE, 'utf-8'));
59
+ } catch {
60
+ return { ...EMPTY_STATE, metrics: { ...EMPTY_STATE.metrics } };
61
+ }
62
+ }
63
+
64
+ function saveState(state: SocialConfig): void {
65
+ state.last_updated = new Date().toISOString();
66
+ const dir = path.dirname(SOCIAL_FILE);
67
+ if (!fs.existsSync(dir)) {
68
+ fs.mkdirSync(dir, { recursive: true });
69
+ }
70
+ fs.writeFileSync(SOCIAL_FILE, JSON.stringify(state, null, 2) + '\n');
71
+ }
72
+
73
+ // ─── Streak Calculation ──────────────────────────────────────────────────────
74
+
75
+ function computeStreak(state: SocialConfig): number {
76
+ const published = state.drafts
77
+ .filter((d) => d.status === 'published' && d.published_at)
78
+ .map((d) => d.published_at!.split('T')[0])
79
+ .sort()
80
+ .reverse();
81
+
82
+ if (published.length === 0) return 0;
83
+
84
+ const uniqueDates = Array.from(new Set(published));
85
+ const today = new Date().toISOString().split('T')[0];
86
+
87
+ // Streak must include today or yesterday
88
+ if (uniqueDates[0] !== today) {
89
+ const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];
90
+ if (uniqueDates[0] !== yesterday) return 0;
91
+ }
92
+
93
+ let streak = 1;
94
+ for (let i = 1; i < uniqueDates.length; i++) {
95
+ const prev = new Date(uniqueDates[i - 1]);
96
+ const curr = new Date(uniqueDates[i]);
97
+ const diffMs = prev.getTime() - curr.getTime();
98
+ const diffDays = Math.round(diffMs / 86400000);
99
+ if (diffDays === 1) {
100
+ streak++;
101
+ } else {
102
+ break;
103
+ }
104
+ }
105
+
106
+ return streak;
107
+ }
108
+
109
+ // ─── Dedup ───────────────────────────────────────────────────────────────────
110
+
111
+ function hasDraftOrPublished(state: SocialConfig, sourceRef: string): boolean {
112
+ return state.drafts.some(
113
+ (d) => d.source_ref === sourceRef && (d.status === 'draft' || d.status === 'published')
114
+ );
115
+ }
116
+
117
+ // ─── Draft Creation Helper ───────────────────────────────────────────────────
118
+
119
+ function createDraft(
120
+ state: SocialConfig,
121
+ text: string,
122
+ source: SocialDraftSource,
123
+ sourceRef: string | null,
124
+ ): SocialDraft {
125
+ const draft: SocialDraft = {
126
+ id: `draft-${uuidv4().slice(0, 8)}`,
127
+ text,
128
+ source,
129
+ source_ref: sourceRef,
130
+ status: 'draft',
131
+ created_at: new Date().toISOString(),
132
+ published_at: null,
133
+ tweet_id: null,
134
+ tweet_url: null,
135
+ };
136
+ state.drafts.push(draft);
137
+ return draft;
138
+ }
139
+
140
+ // ─── Public API ──────────────────────────────────────────────────────────────
141
+
142
+ const SOCIAL_PREFIXES = [
143
+ 'social-setup-x',
144
+ 'social-draft-ship',
145
+ 'social-draft-update',
146
+ 'social-draft-milestone',
147
+ 'social-draft-digest',
148
+ 'social-publish-',
149
+ 'social-check-status',
150
+ ] as const;
151
+
152
+ /**
153
+ * Check if a task ID is a social media task.
154
+ */
155
+ export function isSocialTask(taskId: string): boolean {
156
+ return SOCIAL_PREFIXES.some((prefix) => taskId.startsWith(prefix));
157
+ }
158
+
159
+ /**
160
+ * Execute a social media task.
161
+ */
162
+ export async function executeSocialTask(
163
+ taskId: string,
164
+ description: string,
165
+ _businessContext?: unknown,
166
+ ): Promise<{ success: boolean; output: string }> {
167
+ try {
168
+ if (taskId === 'social-setup-x') {
169
+ return await executeSetupX();
170
+ }
171
+ if (taskId === 'social-draft-ship') {
172
+ return executeDraftShip();
173
+ }
174
+ if (taskId === 'social-draft-update') {
175
+ return executeDraftUpdate();
176
+ }
177
+ if (taskId === 'social-draft-milestone') {
178
+ return executeDraftMilestone();
179
+ }
180
+ if (taskId === 'social-draft-digest') {
181
+ return executeDraftDigest();
182
+ }
183
+ if (taskId.startsWith('social-publish-')) {
184
+ const draftId = taskId.replace('social-publish-', '');
185
+ return await executePublish(draftId);
186
+ }
187
+ if (taskId === 'social-check-status') {
188
+ return await executeCheckStatus();
189
+ }
190
+
191
+ return { success: false, output: `Unknown social task: ${taskId}` };
192
+ } catch (error) {
193
+ const errMsg = error instanceof Error ? error.message : String(error);
194
+ return { success: false, output: `Social task failed: ${errMsg}` };
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Read social media freshness for heartbeat context.
200
+ */
201
+ export function readSocialFreshness(): {
202
+ configured: boolean;
203
+ credentials_valid: boolean;
204
+ username: string | null;
205
+ draft_count: number;
206
+ post_streak_days: number;
207
+ total_posts: number;
208
+ last_post_date: string | null;
209
+ } {
210
+ const state = loadState();
211
+ const pendingDrafts = state.drafts.filter((d) => d.status === 'draft').length;
212
+ const streak = computeStreak(state);
213
+
214
+ return {
215
+ configured: state.credentials_valid,
216
+ credentials_valid: state.credentials_valid,
217
+ username: state.username,
218
+ draft_count: pendingDrafts,
219
+ post_streak_days: streak,
220
+ total_posts: state.metrics.total_posts,
221
+ last_post_date: state.metrics.last_post_date,
222
+ };
223
+ }
224
+
225
+ // ─── Task Implementations ────────────────────────────────────────────────────
226
+
227
+ async function executeSetupX(): Promise<{ success: boolean; output: string }> {
228
+ const credentials = loadCredentials();
229
+ if (!credentials) {
230
+ return {
231
+ success: false,
232
+ output: [
233
+ 'X API credentials not found. Add these to your .env file:',
234
+ ' X_API_KEY=your_consumer_api_key',
235
+ ' X_API_SECRET=your_consumer_api_secret',
236
+ ' X_ACCESS_TOKEN=your_access_token',
237
+ ' X_ACCESS_SECRET=your_access_token_secret',
238
+ '',
239
+ 'Get these at https://developer.x.com/en/portal/dashboard',
240
+ 'Create a project with "Read and Write" permissions.',
241
+ ].join('\n'),
242
+ };
243
+ }
244
+
245
+ const client = createXClient(credentials);
246
+ const userInfo = await validateCredentials(client);
247
+
248
+ const state = loadState();
249
+ state.credentials_valid = userInfo.valid;
250
+ state.username = userInfo.username;
251
+ if (userInfo.followersCount != null) {
252
+ state.metrics.followers_count = userInfo.followersCount;
253
+ }
254
+ saveState(state);
255
+
256
+ if (!userInfo.valid) {
257
+ return {
258
+ success: false,
259
+ output: 'X API credentials are invalid. Check your keys at https://developer.x.com',
260
+ };
261
+ }
262
+
263
+ return {
264
+ success: true,
265
+ output: `Connected to X as ${userInfo.username} (${userInfo.followersCount ?? 0} followers)`,
266
+ };
267
+ }
268
+
269
+ function executeDraftShip(): { success: boolean; output: string } {
270
+ const state = loadState();
271
+ const text = generateShipTweet();
272
+ if (!text) {
273
+ return { success: false, output: 'No shipped ideas found to generate a tweet from.' };
274
+ }
275
+
276
+ // Dedup: check if latest shipped idea already has a draft
277
+ const { ideas } = JSON.parse(fs.readFileSync(
278
+ path.join(path.dirname(SOCIAL_FILE), 'ideas.json'),
279
+ 'utf-8',
280
+ )) as { ideas: Array<{ id: string; stage: string; updated_at: string }> };
281
+
282
+ const latestShipped = ideas
283
+ .filter((i) => i.stage === 'shipped')
284
+ .sort((a, b) => b.updated_at.localeCompare(a.updated_at))[0];
285
+
286
+ if (latestShipped && hasDraftOrPublished(state, latestShipped.id)) {
287
+ return { success: false, output: `Draft already exists for shipped idea ${latestShipped.id}` };
288
+ }
289
+
290
+ const draft = createDraft(state, text, 'ship', latestShipped?.id || null);
291
+ saveState(state);
292
+
293
+ return { success: true, output: `Created ship draft: "${draft.text}" (${draft.id})` };
294
+ }
295
+
296
+ function executeDraftUpdate(): { success: boolean; output: string } {
297
+ const state = loadState();
298
+ const text = generateProductUpdateTweet();
299
+ if (!text) {
300
+ return { success: false, output: 'No positioning data found to generate update tweet.' };
301
+ }
302
+
303
+ const draft = createDraft(state, text, 'update', null);
304
+ saveState(state);
305
+
306
+ return { success: true, output: `Created update draft: "${draft.text}" (${draft.id})` };
307
+ }
308
+
309
+ function executeDraftMilestone(): { success: boolean; output: string } {
310
+ const state = loadState();
311
+ const text = generateMilestoneTweet();
312
+ if (!text) {
313
+ return { success: false, output: 'No KPI milestones found to celebrate.' };
314
+ }
315
+
316
+ const draft = createDraft(state, text, 'milestone', null);
317
+ saveState(state);
318
+
319
+ return { success: true, output: `Created milestone draft: "${draft.text}" (${draft.id})` };
320
+ }
321
+
322
+ function executeDraftDigest(): { success: boolean; output: string } {
323
+ const state = loadState();
324
+ const text = generateDigestTweet();
325
+ if (!text) {
326
+ return { success: false, output: 'No recent activity to summarize in a digest.' };
327
+ }
328
+
329
+ const draft = createDraft(state, text, 'digest', null);
330
+ saveState(state);
331
+
332
+ return { success: true, output: `Created digest draft: "${draft.text}" (${draft.id})` };
333
+ }
334
+
335
+ async function executePublish(draftId: string): Promise<{ success: boolean; output: string }> {
336
+ const state = loadState();
337
+ const draft = state.drafts.find((d) => d.id === draftId);
338
+
339
+ if (!draft) {
340
+ return { success: false, output: `Draft not found: ${draftId}` };
341
+ }
342
+ if (draft.status !== 'draft') {
343
+ return { success: false, output: `Draft ${draftId} is already ${draft.status}` };
344
+ }
345
+
346
+ const credentials = loadCredentials();
347
+ if (!credentials) {
348
+ return { success: false, output: 'X API credentials not configured. Run social-setup-x first.' };
349
+ }
350
+
351
+ const client = createXClient(credentials);
352
+ const result = await postTweet(client, draft.text);
353
+
354
+ // Mark draft as published
355
+ draft.status = 'published';
356
+ draft.published_at = new Date().toISOString();
357
+ draft.tweet_id = result.id;
358
+ draft.tweet_url = result.url;
359
+
360
+ // Update metrics
361
+ state.metrics.total_posts++;
362
+ state.metrics.last_post_date = new Date().toISOString().split('T')[0];
363
+ state.metrics.post_streak_days = computeStreak(state);
364
+
365
+ saveState(state);
366
+
367
+ // Sync KPIs in goals.json
368
+ syncKPIs(state);
369
+
370
+ return {
371
+ success: true,
372
+ output: `Published tweet: ${result.url}`,
373
+ };
374
+ }
375
+
376
+ async function executeCheckStatus(): Promise<{ success: boolean; output: string }> {
377
+ const state = loadState();
378
+ const freshness = readSocialFreshness();
379
+ const lines: string[] = ['Social Media Status:'];
380
+
381
+ if (!freshness.configured) {
382
+ lines.push(' Platform: X (not connected)');
383
+ lines.push(' Run social-setup-x to connect.');
384
+ } else {
385
+ lines.push(` Platform: X`);
386
+ lines.push(` Username: ${freshness.username}`);
387
+ lines.push(` Credentials: ${freshness.credentials_valid ? 'valid' : 'INVALID'}`);
388
+
389
+ // Try to refresh follower count
390
+ const credentials = loadCredentials();
391
+ if (credentials) {
392
+ try {
393
+ const client = createXClient(credentials);
394
+ const userInfo = await validateCredentials(client);
395
+ if (userInfo.valid && userInfo.followersCount != null) {
396
+ state.metrics.followers_count = userInfo.followersCount;
397
+ state.credentials_valid = true;
398
+ saveState(state);
399
+ lines.push(` Followers: ${userInfo.followersCount}`);
400
+ }
401
+ } catch {
402
+ lines.push(` Followers: ${state.metrics.followers_count ?? 'unknown'}`);
403
+ }
404
+ }
405
+ }
406
+
407
+ lines.push(` Pending drafts: ${freshness.draft_count}`);
408
+ lines.push(` Post streak: ${freshness.post_streak_days} day(s)`);
409
+ lines.push(` Total posts: ${freshness.total_posts}`);
410
+ lines.push(` Last post: ${freshness.last_post_date || 'never'}`);
411
+
412
+ return { success: true, output: lines.join('\n') };
413
+ }
414
+
415
+ // ─── KPI Sync ────────────────────────────────────────────────────────────────
416
+
417
+ function syncKPIs(state: SocialConfig): void {
418
+ try {
419
+ if (!fs.existsSync(GOALS_FILE)) return;
420
+ const goalsData = JSON.parse(fs.readFileSync(GOALS_FILE, 'utf-8')) as { goals: BusinessGoal[] };
421
+ let changed = false;
422
+
423
+ for (const goal of goalsData.goals) {
424
+ for (const kpi of goal.kpis) {
425
+ if (kpi.id === 'kpi-daily-posts' && state.metrics.post_streak_days > 0) {
426
+ kpi.current_value = state.metrics.post_streak_days;
427
+ const today = new Date().toISOString().split('T')[0];
428
+ const existingEntry = kpi.history.find((h) => h.date === today);
429
+ if (existingEntry) {
430
+ existingEntry.value = state.metrics.post_streak_days;
431
+ } else {
432
+ kpi.history.push({ date: today, value: state.metrics.post_streak_days });
433
+ }
434
+ changed = true;
435
+ }
436
+ if (kpi.id === 'kpi-twitter-followers' && state.metrics.followers_count != null) {
437
+ kpi.current_value = state.metrics.followers_count;
438
+ const today = new Date().toISOString().split('T')[0];
439
+ const existingEntry = kpi.history.find((h) => h.date === today);
440
+ if (existingEntry) {
441
+ existingEntry.value = state.metrics.followers_count;
442
+ } else {
443
+ kpi.history.push({ date: today, value: state.metrics.followers_count });
444
+ }
445
+ changed = true;
446
+ }
447
+ }
448
+ }
449
+
450
+ if (changed) {
451
+ fs.writeFileSync(GOALS_FILE, JSON.stringify(goalsData, null, 2) + '\n');
452
+ }
453
+ } catch {
454
+ // Non-critical — don't fail the publish
455
+ }
456
+ }
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[444],{2934:function(e,t,n){n.d(t,{Z:function(){return r}});let r=(0,n(9205).Z)("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},7168:function(e,t,n){n.d(t,{Z:function(){return r}});let r=(0,n(9205).Z)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},3085:function(e,t,n){n.d(t,{Z:function(){return r}});let r=(0,n(9205).Z)("TrendingDown",[["polyline",{points:"22 17 13.5 8.5 8.5 13.5 2 7",key:"1r2t7k"}],["polyline",{points:"16 17 22 17 22 11",key:"11uiuu"}]])},525:function(e,t,n){n.d(t,{Z:function(){return r}});let r=(0,n(9205).Z)("TrendingUp",[["polyline",{points:"22 7 13.5 15.5 8.5 10.5 2 17",key:"126l90"}],["polyline",{points:"16 7 22 7 22 13",key:"kwv8wd"}]])},6865:function(e,t,n){n.d(t,{Z:function(){return r}});let r=(0,n(9205).Z)("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]])},1259:function(e,t,n){n.d(t,{default:function(){return f}});var r=n(7437),a=n(7648),i=n(9376),l=n(5466),s=n(2048),o=n(8896),c=n(8220),d=n(2718),u=n(5621),b=n(8728),g=n(2222),h=n(2023),x=n(1994),m=n(257);let p=[{href:"/",label:"Dashboard",icon:(0,r.jsx)(l.Z,{className:"w-5 h-5"})},{href:"/roadmap",label:"Roadmap",icon:(0,r.jsx)(s.Z,{className:"w-5 h-5"})},{href:"/goals",label:"Goals",icon:(0,r.jsx)(o.Z,{className:"w-5 h-5"})},{href:"/hypotheses",label:"Hypotheses",icon:(0,r.jsx)(c.Z,{className:"w-5 h-5"})},{href:"/social",label:"Social",icon:(0,r.jsx)(d.Z,{className:"w-5 h-5"})},{href:"/sessions",label:"Sessions",icon:(0,r.jsx)(u.Z,{className:"w-5 h-5"})},{href:"/settings",label:"Settings",icon:(0,r.jsx)(b.Z,{className:"w-5 h-5"})}];function f(e){let{children:t}=e,n=(0,i.usePathname)();return(0,r.jsxs)("div",{className:"min-h-screen flex",children:[(0,r.jsxs)("aside",{className:"w-64 bg-slate-900 text-white flex flex-col",children:[(0,r.jsx)("div",{className:"p-4 border-b border-slate-700",children:(0,r.jsxs)(a.default,{href:"/",className:"flex items-center gap-2",children:[(0,r.jsx)("div",{className:"w-10 h-10 bg-emerald-500 rounded-lg flex items-center justify-center",children:(0,r.jsx)(g.Z,{className:"w-6 h-6 text-white"})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("h1",{className:"font-bold text-lg leading-tight",children:"Analyst"}),(0,r.jsx)("p",{className:"text-xs text-slate-400",children:m.env.NEXT_PUBLIC_PRODUCT_NAME||"Business"})]})]})}),(0,r.jsx)("nav",{className:"flex-1 p-4",children:(0,r.jsx)("ul",{className:"space-y-1",children:p.map(e=>{let t="/"===e.href?"/"===n:n.startsWith(e.href);return(0,r.jsx)("li",{children:(0,r.jsxs)(a.default,{href:e.href,className:(0,x.Z)("flex items-center gap-3 px-3 py-2 rounded-lg transition-colors",t?"bg-slate-800 text-white":"text-slate-400 hover:text-white hover:bg-slate-800"),children:[e.icon,(0,r.jsx)("span",{children:e.label})]})},e.href)})})}),(0,r.jsx)("div",{className:"p-4 border-t border-slate-700",children:(0,r.jsxs)("div",{className:"flex items-center gap-2 text-xs text-slate-500",children:[(0,r.jsx)(h.Z,{className:"w-4 h-4"}),(0,r.jsx)("span",{children:"Powered by Claude"})]})})]}),(0,r.jsx)("main",{className:"flex-1 overflow-auto",children:t})]})}},104:function(e,t,n){n.d(t,{Z:function(){return l}});var r=n(7437),a=n(1994);let i={on_track:"bg-emerald-500",at_risk:"bg-amber-500",behind:"bg-red-500",achieved:"bg-blue-500"};function l(e){let{current:t,target:n,unit:l,status:s,showLabels:o=!0}=e,c=null!==t?Math.min(t/n*100,100):0,d=e=>null===e?"--":"percent"===l||"%"===l?"".concat(e,"%"):"hours"===l?"".concat(e,"h"):"".concat(e," ").concat(l);return(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"relative h-2 bg-slate-100 rounded-full overflow-hidden",children:[(0,r.jsx)("div",{className:(0,a.Z)("absolute left-0 top-0 h-full rounded-full transition-all duration-500",i[s]),style:{width:"".concat(c,"%")}}),(0,r.jsx)("div",{className:"absolute top-0 w-0.5 h-full bg-slate-400",style:{left:"100%"},title:"Target: ".concat(d(n))})]}),o&&(0,r.jsxs)("div",{className:"flex items-center justify-between mt-1",children:[(0,r.jsxs)("span",{className:"text-xs text-slate-500",children:["Current: ",(0,r.jsx)("span",{className:"font-medium text-slate-700",children:d(t)})]}),(0,r.jsxs)("span",{className:"text-xs text-slate-500",children:["Target: ",(0,r.jsx)("span",{className:"font-medium text-slate-700",children:d(n)})]})]})]})}},281:function(e,t,n){n.d(t,{Z:function(){return i}});var r=n(7437),a=n(2265);function i(e){let{kpi:t,height:n=40,width:i,showTarget:l=!1}=e,{path:s,areaPath:o,minValue:c,maxValue:d,points:u}=(0,a.useMemo)(()=>{let e=t.history;if(0===e.length)return{path:"",areaPath:"",minValue:0,maxValue:0,points:[]};let r=e.map(e=>e.value),a=l&&null!==t.target_value?[...r,t.target_value]:r,s=Math.min(...a),o=Math.max(...a),c=o-s||1,d=s-.1*c,u=o+.1*c-d||1,b=n-4,g=(i||100)/Math.max(e.length-1,1),h=e.map((e,t)=>({x:t*g,y:b-(e.value-d)/u*b+2,value:e.value,date:e.date}));return 1===h.length?{path:"M ".concat(h[0].x," ").concat(h[0].y),areaPath:"",minValue:s,maxValue:o,points:h}:{path:h.map((e,t)=>0===t?"M ".concat(e.x," ").concat(e.y):"L ".concat(e.x," ").concat(e.y)).join(" "),areaPath:["M ".concat(h[0].x," ").concat(b+2),"L ".concat(h[0].x," ").concat(h[0].y),...h.slice(1).map(e=>"L ".concat(e.x," ").concat(e.y)),"L ".concat(h[h.length-1].x," ").concat(b+2),"Z"].join(" "),minValue:s,maxValue:o,points:h}},[t.history,t.target_value,n,i,l]),b=(()=>{if(t.history.length<2)return{stroke:"#94a3b8",fill:"rgba(148, 163, 184, 0.1)"};let e=t.history[0].value,n=t.history[t.history.length-1].value;return("higher_is_better"===t.direction?n>=e:n<=e)?{stroke:"#10b981",fill:"rgba(16, 185, 129, 0.1)"}:{stroke:"#ef4444",fill:"rgba(239, 68, 68, 0.1)"}})();if(0===t.history.length)return(0,r.jsx)("div",{className:"flex items-center justify-center text-xs text-slate-400",style:{height:n,width:i||"100%"},children:"No data"});let g=(()=>{if(!l||null===t.target_value||0===t.history.length)return null;let e=[...t.history.map(e=>e.value),t.target_value],r=Math.min(...e),a=Math.max(...e),i=a-r||1,s=r-.1*i,o=n-4;return o-(t.target_value-s)/(a+.1*i-s||1)*o+2})();return(0,r.jsxs)("svg",{width:i||"100%",height:n,viewBox:"0 0 ".concat(i||100," ").concat(n),preserveAspectRatio:"none",className:"overflow-visible",children:[o&&(0,r.jsx)("path",{d:o,fill:b.fill}),(0,r.jsx)("path",{d:s,fill:"none",stroke:b.stroke,strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"}),l&&null!==g&&(0,r.jsx)("line",{x1:0,y1:g,x2:i||100,y2:g,stroke:"#94a3b8",strokeWidth:1,strokeDasharray:"4 2"}),u.length>0&&(0,r.jsx)("circle",{cx:u[u.length-1].x,cy:u[u.length-1].y,r:3,fill:b.stroke})]})}},6153:function(e,t,n){n.d(t,{G:function(){return s},GK:function(){return N},Gs:function(){return d},Hs:function(){return r},PN:function(){return h},PW:function(){return w},Q_:function(){return x},R$:function(){return j},Vr:function(){return u},Wb:function(){return g},aR:function(){return b},bi:function(){return o},en:function(){return y},i2:function(){return v},kT:function(){return m},l5:function(){return p},lE:function(){return k},lv:function(){return l},pG:function(){return a},rF:function(){return c},tV:function(){return f},tl:function(){return _},xP:function(){return M},yb:function(){return i}});let r={product:"Product",ux_design:"UX/Design",growth:"Growth",performance:"Performance",tech_debt:"Tech Debt",security:"Security",infrastructure:"Infrastructure",content:"Content",analytics:"Analytics",integration:"Integration"},a={product:"bg-blue-100 text-blue-800",ux_design:"bg-purple-100 text-purple-800",growth:"bg-green-100 text-green-800",performance:"bg-orange-100 text-orange-800",tech_debt:"bg-yellow-100 text-yellow-800",security:"bg-red-100 text-red-800",infrastructure:"bg-gray-100 text-gray-800",content:"bg-pink-100 text-pink-800",analytics:"bg-cyan-100 text-cyan-800",integration:"bg-indigo-100 text-indigo-800"},i={inbox:"Inbox",under_review:"Under Review",approved:"Approved",in_progress:"In Progress",testing:"Testing",shipped:"Shipped",deferred:"Deferred",rejected:"Rejected",rolled_back:"Rolled Back"},l={inbox:"bg-amber-500",under_review:"bg-blue-500",approved:"bg-emerald-500",in_progress:"bg-violet-500",testing:"bg-cyan-500",shipped:"bg-green-500",deferred:"bg-gray-500",rejected:"bg-red-500",rolled_back:"bg-orange-500"},s=["inbox","under_review","approved","in_progress","testing","shipped"],o={xs:"XS",s:"S",m:"M",l:"L",xl:"XL"},c={critical:"Critical",high:"High",medium:"Medium",low:"Low"},d={critical:"bg-red-100 text-red-800 border-red-300",high:"bg-orange-100 text-orange-800 border-orange-300",medium:"bg-yellow-100 text-yellow-800 border-yellow-300",low:"bg-gray-100 text-gray-800 border-gray-300"},u={codebase_analysis:"Codebase Analysis",metrics_review:"Metrics Review",market_research:"Market Research",seo_audit:"SEO Audit",manual:"Manual"},b={pending:"bg-slate-100 text-slate-700",validated:"bg-emerald-100 text-emerald-800",needs_investigation:"bg-amber-100 text-amber-800",inconclusive:"bg-slate-100 text-slate-600",invalidated:"bg-red-100 text-red-800"},g={pending:"Pending",validated:"Validated",needs_investigation:"Needs Investigation",inconclusive:"Inconclusive",invalidated:"Invalidated"},h={ship:"Ship",update:"Update",milestone:"Milestone",digest:"Digest",manual:"Manual"},x={ship:"bg-green-100 text-green-800",update:"bg-blue-100 text-blue-800",milestone:"bg-amber-100 text-amber-800",digest:"bg-purple-100 text-purple-800",manual:"bg-slate-100 text-slate-800"},m={acquisition:"Acquisition",activation:"Activation",retention:"Retention",revenue:"Revenue",referral:"Referral"},p={acquisition:"bg-blue-100 text-blue-800",activation:"bg-emerald-100 text-emerald-800",retention:"bg-purple-100 text-purple-800",revenue:"bg-amber-100 text-amber-800",referral:"bg-pink-100 text-pink-800"},f={on_track:"On Track",at_risk:"At Risk",behind:"Behind",achieved:"Achieved"},v={on_track:"bg-emerald-100 text-emerald-800 border-emerald-300",at_risk:"bg-amber-100 text-amber-800 border-amber-300",behind:"bg-red-100 text-red-800 border-red-300",achieved:"bg-blue-100 text-blue-800 border-blue-300"},y={manual:"Manual",rest_api:"REST API",posthog:"PostHog",firestore:"Firestore",stripe:"Stripe",whatsapp:"WhatsApp"},j={stated:"Stated",testing:"Testing",validated:"Validated",invalidated:"Invalidated",deferred:"Deferred"},k={stated:"bg-slate-100 text-slate-800 border-slate-300",testing:"bg-amber-100 text-amber-800 border-amber-300",validated:"bg-emerald-100 text-emerald-800 border-emerald-300",invalidated:"bg-red-100 text-red-800 border-red-300",deferred:"bg-slate-100 text-slate-500 border-slate-200"},w={acquisition:"Acquisition",engagement:"Engagement",conversion:"Conversion",monetization:"Monetization"},_={acquisition:"bg-blue-100 text-blue-800",engagement:"bg-purple-100 text-purple-800",conversion:"bg-amber-100 text-amber-800",monetization:"bg-emerald-100 text-emerald-800"},N={planned:"Planned",active:"Active",completed:"Completed",paused:"Paused"},M={planned:"bg-slate-100 text-slate-700 border-slate-300",active:"bg-blue-100 text-blue-800 border-blue-300",completed:"bg-emerald-100 text-emerald-800 border-emerald-300",paused:"bg-amber-100 text-amber-800 border-amber-300"}}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[746],{9205:function(e,t,r){"use strict";r.d(t,{Z:function(){return s}});var n=r(2265);let o=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),i=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.filter((e,t,r)=>!!e&&r.indexOf(e)===t).join(" ")};var a={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let u=(0,n.forwardRef)((e,t)=>{let{color:r="currentColor",size:o=24,strokeWidth:u=2,absoluteStrokeWidth:s,className:l="",children:c,iconNode:f,...d}=e;return(0,n.createElement)("svg",{ref:t,...a,width:o,height:o,stroke:r,strokeWidth:s?24*Number(u)/Number(o):u,className:i("lucide",l),...d},[...f.map(e=>{let[t,r]=e;return(0,n.createElement)(t,r)}),...Array.isArray(c)?c:[c]])}),s=(e,t)=>{let r=(0,n.forwardRef)((r,a)=>{let{className:s,...l}=r;return(0,n.createElement)(u,{ref:a,iconNode:t,className:i("lucide-".concat(o(e)),s),...l})});return r.displayName="".concat(e),r}},2222:function(e,t,r){"use strict";r.d(t,{Z:function(){return n}});let n=(0,r(9205).Z)("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]])},8220:function(e,t,r){"use strict";r.d(t,{Z:function(){return n}});let n=(0,r(9205).Z)("FlaskConical",[["path",{d:"M10 2v7.527a2 2 0 0 1-.211.896L4.72 20.55a1 1 0 0 0 .9 1.45h12.76a1 1 0 0 0 .9-1.45l-5.069-10.127A2 2 0 0 1 14 9.527V2",key:"pzvekw"}],["path",{d:"M8.5 2h7",key:"csnxdl"}],["path",{d:"M7 16h10",key:"wp8him"}]])},5621:function(e,t,r){"use strict";r.d(t,{Z:function(){return n}});let n=(0,r(9205).Z)("History",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]])},5466:function(e,t,r){"use strict";r.d(t,{Z:function(){return n}});let n=(0,r(9205).Z)("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]])},2048:function(e,t,r){"use strict";r.d(t,{Z:function(){return n}});let n=(0,r(9205).Z)("Map",[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]])},2718:function(e,t,r){"use strict";r.d(t,{Z:function(){return n}});let n=(0,r(9205).Z)("MessageCircle",[["path",{d:"M7.9 20A9 9 0 1 0 4 16.1L2 22Z",key:"vv11sd"}]])},8728:function(e,t,r){"use strict";r.d(t,{Z:function(){return n}});let n=(0,r(9205).Z)("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]])},2023:function(e,t,r){"use strict";r.d(t,{Z:function(){return n}});let n=(0,r(9205).Z)("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]])},8896:function(e,t,r){"use strict";r.d(t,{Z:function(){return n}});let n=(0,r(9205).Z)("Target",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]])},7648:function(e,t,r){"use strict";r.d(t,{default:function(){return o.a}});var n=r(2972),o=r.n(n)},9376:function(e,t,r){"use strict";var n=r(5475);r.o(n,"usePathname")&&r.d(t,{usePathname:function(){return n.usePathname}}),r.o(n,"useRouter")&&r.d(t,{useRouter:function(){return n.useRouter}})},257:function(e,t,r){"use strict";var n,o;e.exports=(null==(n=r.g.process)?void 0:n.env)&&"object"==typeof(null==(o=r.g.process)?void 0:o.env)?r.g.process:r(4227)},5449:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"addLocale",{enumerable:!0,get:function(){return n}}),r(8521);let n=function(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];return e};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},6958:function(e,t,r){"use strict";function n(e,t,r,n){return!1}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getDomainLocale",{enumerable:!0,get:function(){return n}}),r(8521),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},2972:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return R}});let n=r(7043),o=r(7437),i=n._(r(2265)),a=r(5246),u=r(3552),s=r(7497),l=r(3987),c=r(5449),f=r(5523),d=r(1956),p=r(6081),h=r(6958),g=r(1634),m=r(4673),_=new Set;function y(e,t,r,n,o,i){if("undefined"!=typeof window&&(i||(0,u.isLocalURL)(t))){if(!n.bypassPrefetchedCheck){let o=t+"%"+r+"%"+(void 0!==n.locale?n.locale:"locale"in e?e.locale:void 0);if(_.has(o))return;_.add(o)}(async()=>i?e.prefetch(t,o):e.prefetch(t,r,n))().catch(e=>{})}}function E(e){return"string"==typeof e?e:(0,s.formatUrl)(e)}let R=i.default.forwardRef(function(e,t){let r,n;let{href:s,as:_,children:R,prefetch:v=null,passHref:b,replace:P,shallow:S,scroll:A,locale:T,onClick:O,onMouseEnter:x,onTouchStart:N,legacyBehavior:I=!1,...C}=e;r=R,I&&("string"==typeof r||"number"==typeof r)&&(r=(0,o.jsx)("a",{children:r}));let M=i.default.useContext(f.RouterContext),w=i.default.useContext(d.AppRouterContext),j=null!=M?M:w,L=!M,k=!1!==v,D=null===v?m.PrefetchKind.AUTO:m.PrefetchKind.FULL,{href:U,as:F}=i.default.useMemo(()=>{if(!M){let e=E(s);return{href:e,as:_?E(_):e}}let[e,t]=(0,a.resolveHref)(M,s,!0);return{href:e,as:_?(0,a.resolveHref)(M,_):t||e}},[M,s,_]),X=i.default.useRef(U),W=i.default.useRef(F);I&&(n=i.default.Children.only(r));let H=I?n&&"object"==typeof n&&n.ref:t,[G,Z,V]=(0,p.useIntersection)({rootMargin:"200px"}),B=i.default.useCallback(e=>{(W.current!==F||X.current!==U)&&(V(),W.current=F,X.current=U),G(e),H&&("function"==typeof H?H(e):"object"==typeof H&&(H.current=e))},[F,H,U,V,G]);i.default.useEffect(()=>{j&&Z&&k&&y(j,U,F,{locale:T},{kind:D},L)},[F,U,Z,T,k,null==M?void 0:M.locale,j,L,D]);let Y={ref:B,onClick(e){I||"function"!=typeof O||O(e),I&&n.props&&"function"==typeof n.props.onClick&&n.props.onClick(e),j&&!e.defaultPrevented&&function(e,t,r,n,o,a,s,l,c){let{nodeName:f}=e.currentTarget;if("A"===f.toUpperCase()&&(function(e){let t=e.currentTarget.getAttribute("target");return t&&"_self"!==t||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.nativeEvent&&2===e.nativeEvent.which}(e)||!c&&!(0,u.isLocalURL)(r)))return;e.preventDefault();let d=()=>{let e=null==s||s;"beforePopState"in t?t[o?"replace":"push"](r,n,{shallow:a,locale:l,scroll:e}):t[o?"replace":"push"](n||r,{scroll:e})};c?i.default.startTransition(d):d()}(e,j,U,F,P,S,A,T,L)},onMouseEnter(e){I||"function"!=typeof x||x(e),I&&n.props&&"function"==typeof n.props.onMouseEnter&&n.props.onMouseEnter(e),j&&(k||!L)&&y(j,U,F,{locale:T,priority:!0,bypassPrefetchedCheck:!0},{kind:D},L)},onTouchStart:function(e){I||"function"!=typeof N||N(e),I&&n.props&&"function"==typeof n.props.onTouchStart&&n.props.onTouchStart(e),j&&(k||!L)&&y(j,U,F,{locale:T,priority:!0,bypassPrefetchedCheck:!0},{kind:D},L)}};if((0,l.isAbsoluteUrl)(F))Y.href=F;else if(!I||b||"a"===n.type&&!("href"in n.props)){let e=void 0!==T?T:null==M?void 0:M.locale,t=(null==M?void 0:M.isLocaleDomain)&&(0,h.getDomainLocale)(F,e,null==M?void 0:M.locales,null==M?void 0:M.domainLocales);Y.href=t||(0,g.addBasePath)((0,c.addLocale)(F,e,null==M?void 0:M.defaultLocale))}return I?i.default.cloneElement(n,Y):(0,o.jsx)("a",{...C,...Y,children:r})});("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},3515:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(t,{cancelIdleCallback:function(){return n},requestIdleCallback:function(){return r}});let r="undefined"!=typeof self&&self.requestIdleCallback&&self.requestIdleCallback.bind(window)||function(e){let t=Date.now();return self.setTimeout(function(){e({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-t))}})},1)},n="undefined"!=typeof self&&self.cancelIdleCallback&&self.cancelIdleCallback.bind(window)||function(e){return clearTimeout(e)};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},5246:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"resolveHref",{enumerable:!0,get:function(){return f}});let n=r(8637),o=r(7497),i=r(7053),a=r(3987),u=r(8521),s=r(3552),l=r(6279),c=r(7205);function f(e,t,r){let f;let d="string"==typeof t?t:(0,o.formatWithValidation)(t),p=d.match(/^[a-zA-Z]{1,}:\/\//),h=p?d.slice(p[0].length):d;if((h.split("?",1)[0]||"").match(/(\/\/|\\)/)){console.error("Invalid href '"+d+"' passed to next/router in page: '"+e.pathname+"'. Repeated forward-slashes (//) or backslashes \\ are not valid in the href.");let t=(0,a.normalizeRepeatedSlashes)(h);d=(p?p[0]:"")+t}if(!(0,s.isLocalURL)(d))return r?[d]:d;try{f=new URL(d.startsWith("#")?e.asPath:e.pathname,"http://n")}catch(e){f=new URL("/","http://n")}try{let e=new URL(d,f);e.pathname=(0,u.normalizePathTrailingSlash)(e.pathname);let t="";if((0,l.isDynamicRoute)(e.pathname)&&e.searchParams&&r){let r=(0,n.searchParamsToUrlQuery)(e.searchParams),{result:a,params:u}=(0,c.interpolateAs)(e.pathname,e.pathname,r);a&&(t=(0,o.formatWithValidation)({pathname:a,hash:e.hash,query:(0,i.omit)(r,u)}))}let a=e.origin===f.origin?e.href.slice(e.origin.length):e.href;return r?[a,t||a]:a}catch(e){return r?[d]:d}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},6081:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"useIntersection",{enumerable:!0,get:function(){return s}});let n=r(2265),o=r(3515),i="function"==typeof IntersectionObserver,a=new Map,u=[];function s(e){let{rootRef:t,rootMargin:r,disabled:s}=e,l=s||!i,[c,f]=(0,n.useState)(!1),d=(0,n.useRef)(null),p=(0,n.useCallback)(e=>{d.current=e},[]);return(0,n.useEffect)(()=>{if(i){if(l||c)return;let e=d.current;if(e&&e.tagName)return function(e,t,r){let{id:n,observer:o,elements:i}=function(e){let t;let r={root:e.root||null,margin:e.rootMargin||""},n=u.find(e=>e.root===r.root&&e.margin===r.margin);if(n&&(t=a.get(n)))return t;let o=new Map;return t={id:r,observer:new IntersectionObserver(e=>{e.forEach(e=>{let t=o.get(e.target),r=e.isIntersecting||e.intersectionRatio>0;t&&r&&t(r)})},e),elements:o},u.push(r),a.set(r,t),t}(r);return i.set(e,t),o.observe(e),function(){if(i.delete(e),o.unobserve(e),0===i.size){o.disconnect(),a.delete(n);let e=u.findIndex(e=>e.root===n.root&&e.margin===n.margin);e>-1&&u.splice(e,1)}}}(e,e=>e&&f(e),{root:null==t?void 0:t.current,rootMargin:r})}else if(!c){let e=(0,o.requestIdleCallback)(()=>f(!0));return()=>(0,o.cancelIdleCallback)(e)}},[l,r,t,c,d.current]),[p,c,(0,n.useCallback)(()=>{f(!1)},[])]}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},4227:function(e){!function(){var t={229:function(e){var t,r,n,o=e.exports={};function i(){throw Error("setTimeout has not been defined")}function a(){throw Error("clearTimeout has not been defined")}function u(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(r){try{return t.call(null,e,0)}catch(r){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var s=[],l=!1,c=-1;function f(){l&&n&&(l=!1,n.length?s=n.concat(s):c=-1,s.length&&d())}function d(){if(!l){var e=u(f);l=!0;for(var t=s.length;t;){for(n=s,s=[];++c<t;)n&&n[c].run();c=-1,t=s.length}n=null,l=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===a||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function p(e,t){this.fun=e,this.array=t}function h(){}o.nextTick=function(e){var t=Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];s.push(new p(e,t)),1!==s.length||l||u(d)},p.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=h,o.addListener=h,o.once=h,o.off=h,o.removeListener=h,o.removeAllListeners=h,o.emit=h,o.prependListener=h,o.prependOnceListener=h,o.listeners=function(e){return[]},o.binding=function(e){throw Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(e){throw Error("process.chdir is not supported")},o.umask=function(){return 0}}},r={};function n(e){var o=r[e];if(void 0!==o)return o.exports;var i=r[e]={exports:{}},a=!0;try{t[e](i,i.exports,n),a=!1}finally{a&&delete r[e]}return i.exports}n.ab="//";var o=n(229);e.exports=o}()},9259:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(t,{ACTION_SUFFIX:function(){return s},APP_DIR_ALIAS:function(){return O},CACHE_ONE_YEAR:function(){return R},DOT_NEXT_ALIAS:function(){return A},ESLINT_DEFAULT_DIRS:function(){return V},GSP_NO_RETURNED_VALUE:function(){return F},GSSP_COMPONENT_MEMBER_ERROR:function(){return H},GSSP_NO_RETURNED_VALUE:function(){return X},INSTRUMENTATION_HOOK_FILENAME:function(){return P},MIDDLEWARE_FILENAME:function(){return v},MIDDLEWARE_LOCATION_REGEXP:function(){return b},NEXT_BODY_SUFFIX:function(){return f},NEXT_CACHE_IMPLICIT_TAG_ID:function(){return E},NEXT_CACHE_REVALIDATED_TAGS_HEADER:function(){return h},NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER:function(){return g},NEXT_CACHE_SOFT_TAGS_HEADER:function(){return p},NEXT_CACHE_SOFT_TAG_MAX_LENGTH:function(){return y},NEXT_CACHE_TAGS_HEADER:function(){return d},NEXT_CACHE_TAG_MAX_ITEMS:function(){return m},NEXT_CACHE_TAG_MAX_LENGTH:function(){return _},NEXT_DATA_SUFFIX:function(){return l},NEXT_INTERCEPTION_MARKER_PREFIX:function(){return n},NEXT_META_SUFFIX:function(){return c},NEXT_QUERY_PARAM_PREFIX:function(){return r},NON_STANDARD_NODE_ENV:function(){return G},PAGES_DIR_ALIAS:function(){return S},PRERENDER_REVALIDATE_HEADER:function(){return o},PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER:function(){return i},PUBLIC_DIR_MIDDLEWARE_CONFLICT:function(){return w},ROOT_DIR_ALIAS:function(){return T},RSC_ACTION_CLIENT_WRAPPER_ALIAS:function(){return M},RSC_ACTION_ENCRYPTION_ALIAS:function(){return C},RSC_ACTION_PROXY_ALIAS:function(){return I},RSC_ACTION_VALIDATE_ALIAS:function(){return N},RSC_MOD_REF_PROXY_ALIAS:function(){return x},RSC_PREFETCH_SUFFIX:function(){return a},RSC_SUFFIX:function(){return u},SERVER_PROPS_EXPORT_ERROR:function(){return U},SERVER_PROPS_GET_INIT_PROPS_CONFLICT:function(){return L},SERVER_PROPS_SSG_CONFLICT:function(){return k},SERVER_RUNTIME:function(){return B},SSG_FALLBACK_EXPORT_ERROR:function(){return Z},SSG_GET_INITIAL_PROPS_CONFLICT:function(){return j},STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR:function(){return D},UNSTABLE_REVALIDATE_RENAME_ERROR:function(){return W},WEBPACK_LAYERS:function(){return z},WEBPACK_RESOURCE_QUERIES:function(){return K}});let r="nxtP",n="nxtI",o="x-prerender-revalidate",i="x-prerender-revalidate-if-generated",a=".prefetch.rsc",u=".rsc",s=".action",l=".json",c=".meta",f=".body",d="x-next-cache-tags",p="x-next-cache-soft-tags",h="x-next-revalidated-tags",g="x-next-revalidate-tag-token",m=128,_=256,y=1024,E="_N_T_",R=31536e3,v="middleware",b=`(?:src/)?${v}`,P="instrumentation",S="private-next-pages",A="private-dot-next",T="private-next-root-dir",O="private-next-app-dir",x="private-next-rsc-mod-ref-proxy",N="private-next-rsc-action-validate",I="private-next-rsc-server-reference",C="private-next-rsc-action-encryption",M="private-next-rsc-action-client-wrapper",w="You can not have a '_next' folder inside of your public folder. This conflicts with the internal '/_next' route. https://nextjs.org/docs/messages/public-next-folder-conflict",j="You can not use getInitialProps with getStaticProps. To use SSG, please remove your getInitialProps",L="You can not use getInitialProps with getServerSideProps. Please remove getInitialProps.",k="You can not use getStaticProps or getStaticPaths with getServerSideProps. To use SSG, please remove getServerSideProps",D="can not have getInitialProps/getServerSideProps, https://nextjs.org/docs/messages/404-get-initial-props",U="pages with `getServerSideProps` can not be exported. See more info here: https://nextjs.org/docs/messages/gssp-export",F="Your `getStaticProps` function did not return an object. Did you forget to add a `return`?",X="Your `getServerSideProps` function did not return an object. Did you forget to add a `return`?",W="The `unstable_revalidate` property is available for general use.\nPlease use `revalidate` instead.",H="can not be attached to a page's component and must be exported from the page. See more info here: https://nextjs.org/docs/messages/gssp-component-member",G='You are using a non-standard "NODE_ENV" value in your environment. This creates inconsistencies in the project and is strongly advised against. Read more: https://nextjs.org/docs/messages/non-standard-node-env',Z="Pages with `fallback` enabled in `getStaticPaths` can not be exported. See more info here: https://nextjs.org/docs/messages/ssg-fallback-true-export",V=["app","pages","components","lib","src"],B={edge:"edge",experimentalEdge:"experimental-edge",nodejs:"nodejs"},Y={shared:"shared",reactServerComponents:"rsc",serverSideRendering:"ssr",actionBrowser:"action-browser",api:"api",middleware:"middleware",instrument:"instrument",edgeAsset:"edge-asset",appPagesBrowser:"app-pages-browser",appMetadataRoute:"app-metadata-route",appRouteHandler:"app-route-handler"},z={...Y,GROUP:{serverOnly:[Y.reactServerComponents,Y.actionBrowser,Y.appMetadataRoute,Y.appRouteHandler,Y.instrument],clientOnly:[Y.serverSideRendering,Y.appPagesBrowser],nonClientServerTarget:[Y.middleware,Y.api],app:[Y.reactServerComponents,Y.actionBrowser,Y.appMetadataRoute,Y.appRouteHandler,Y.serverSideRendering,Y.appPagesBrowser,Y.shared,Y.instrument]}},K={edgeSSREntry:"__next_edge_ssr_entry__",metadata:"__next_metadata__",metadataRoute:"__next_metadata_route__",metadataImageMeta:"__next_metadata_image_meta__"}},42:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"escapeStringRegexp",{enumerable:!0,get:function(){return o}});let r=/[|\\{}()[\]^$+*?.-]/,n=/[|\\{}()[\]^$+*?.-]/g;function o(e){return r.test(e)?e.replace(n,"\\$&"):e}},5523:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"RouterContext",{enumerable:!0,get:function(){return n}});let n=r(7043)._(r(2265)).default.createContext(null)},7497:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(t,{formatUrl:function(){return i},formatWithValidation:function(){return u},urlObjectKeys:function(){return a}});let n=r(3099)._(r(8637)),o=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,i=e.protocol||"",a=e.pathname||"",u=e.hash||"",s=e.query||"",l=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?l=t+e.host:r&&(l=t+(~r.indexOf(":")?"["+r+"]":r),e.port&&(l+=":"+e.port)),s&&"object"==typeof s&&(s=String(n.urlQueryToSearchParams(s)));let c=e.search||s&&"?"+s||"";return i&&!i.endsWith(":")&&(i+=":"),e.slashes||(!i||o.test(i))&&!1!==l?(l="//"+(l||""),a&&"/"!==a[0]&&(a="/"+a)):l||(l=""),u&&"#"!==u[0]&&(u="#"+u),c&&"?"!==c[0]&&(c="?"+c),""+i+l+(a=a.replace(/[?#]/g,encodeURIComponent))+(c=c.replace("#","%23"))+u}let a=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function u(e){return i(e)}},6279:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(t,{getSortedRoutes:function(){return n.getSortedRoutes},isDynamicRoute:function(){return o.isDynamicRoute}});let n=r(4777),o=r(8104)},7205:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"interpolateAs",{enumerable:!0,get:function(){return i}});let n=r(4199),o=r(9964);function i(e,t,r){let i="",a=(0,o.getRouteRegex)(e),u=a.groups,s=(t!==e?(0,n.getRouteMatcher)(a)(t):"")||r;i=e;let l=Object.keys(u);return l.every(e=>{let t=s[e]||"",{repeat:r,optional:n}=u[e],o="["+(r?"...":"")+e+"]";return n&&(o=(t?"":"/")+"["+o+"]"),r&&!Array.isArray(t)&&(t=[t]),(n||e in s)&&(i=i.replace(o,r?t.map(e=>encodeURIComponent(e)).join("/"):encodeURIComponent(t))||"/")})||(i=""),{params:l,result:i}}},8104:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isDynamicRoute",{enumerable:!0,get:function(){return i}});let n=r(1182),o=/\/\[[^/]+?\](?=\/|$)/;function i(e){return(0,n.isInterceptionRouteAppPath)(e)&&(e=(0,n.extractInterceptionRouteInformation)(e).interceptedRoute),o.test(e)}},3552:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isLocalURL",{enumerable:!0,get:function(){return i}});let n=r(3987),o=r(1283);function i(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,o.hasBasePath)(r.pathname)}catch(e){return!1}}},7053:function(e,t){"use strict";function r(e,t){let r={};return Object.keys(e).forEach(n=>{t.includes(n)||(r[n]=e[n])}),r}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"omit",{enumerable:!0,get:function(){return r}})},8637:function(e,t){"use strict";function r(e){let t={};return e.forEach((e,r)=>{void 0===t[r]?t[r]=e:Array.isArray(t[r])?t[r].push(e):t[r]=[t[r],e]}),t}function n(e){return"string"!=typeof e&&("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function o(e){let t=new URLSearchParams;return Object.entries(e).forEach(e=>{let[r,o]=e;Array.isArray(o)?o.forEach(e=>t.append(r,n(e))):t.set(r,n(o))}),t}function i(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];return r.forEach(t=>{Array.from(t.keys()).forEach(t=>e.delete(t)),t.forEach((t,r)=>e.append(r,t))}),e}Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(t,{assign:function(){return i},searchParamsToUrlQuery:function(){return r},urlQueryToSearchParams:function(){return o}})},4199:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getRouteMatcher",{enumerable:!0,get:function(){return o}});let n=r(3987);function o(e){let{re:t,groups:r}=e;return e=>{let o=t.exec(e);if(!o)return!1;let i=e=>{try{return decodeURIComponent(e)}catch(e){throw new n.DecodeError("failed to decode param")}},a={};return Object.keys(r).forEach(e=>{let t=r[e],n=o[t.pos];void 0!==n&&(a[e]=~n.indexOf("/")?n.split("/").map(e=>i(e)):t.repeat?[i(n)]:i(n))}),a}}},9964:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(t,{getNamedMiddlewareRegex:function(){return p},getNamedRouteRegex:function(){return d},getRouteRegex:function(){return l},parseParameter:function(){return u}});let n=r(9259),o=r(1182),i=r(42),a=r(6674);function u(e){let t=e.startsWith("[")&&e.endsWith("]");t&&(e=e.slice(1,-1));let r=e.startsWith("...");return r&&(e=e.slice(3)),{key:e,repeat:r,optional:t}}function s(e){let t=(0,a.removeTrailingSlash)(e).slice(1).split("/"),r={},n=1;return{parameterizedRoute:t.map(e=>{let t=o.INTERCEPTION_ROUTE_MARKERS.find(t=>e.startsWith(t)),a=e.match(/\[((?:\[.*\])|.+)\]/);if(t&&a){let{key:e,optional:o,repeat:s}=u(a[1]);return r[e]={pos:n++,repeat:s,optional:o},"/"+(0,i.escapeStringRegexp)(t)+"([^/]+?)"}if(!a)return"/"+(0,i.escapeStringRegexp)(e);{let{key:e,repeat:t,optional:o}=u(a[1]);return r[e]={pos:n++,repeat:t,optional:o},t?o?"(?:/(.+?))?":"/(.+?)":"/([^/]+?)"}}).join(""),groups:r}}function l(e){let{parameterizedRoute:t,groups:r}=s(e);return{re:RegExp("^"+t+"(?:/)?$"),groups:r}}function c(e){let{interceptionMarker:t,getSafeRouteKey:r,segment:n,routeKeys:o,keyPrefix:a}=e,{key:s,optional:l,repeat:c}=u(n),f=s.replace(/\W/g,"");a&&(f=""+a+f);let d=!1;(0===f.length||f.length>30)&&(d=!0),isNaN(parseInt(f.slice(0,1)))||(d=!0),d&&(f=r()),a?o[f]=""+a+s:o[f]=s;let p=t?(0,i.escapeStringRegexp)(t):"";return c?l?"(?:/"+p+"(?<"+f+">.+?))?":"/"+p+"(?<"+f+">.+?)":"/"+p+"(?<"+f+">[^/]+?)"}function f(e,t){let r;let u=(0,a.removeTrailingSlash)(e).slice(1).split("/"),s=(r=0,()=>{let e="",t=++r;for(;t>0;)e+=String.fromCharCode(97+(t-1)%26),t=Math.floor((t-1)/26);return e}),l={};return{namedParameterizedRoute:u.map(e=>{let r=o.INTERCEPTION_ROUTE_MARKERS.some(t=>e.startsWith(t)),a=e.match(/\[((?:\[.*\])|.+)\]/);if(r&&a){let[r]=e.split(a[0]);return c({getSafeRouteKey:s,interceptionMarker:r,segment:a[1],routeKeys:l,keyPrefix:t?n.NEXT_INTERCEPTION_MARKER_PREFIX:void 0})}return a?c({getSafeRouteKey:s,segment:a[1],routeKeys:l,keyPrefix:t?n.NEXT_QUERY_PARAM_PREFIX:void 0}):"/"+(0,i.escapeStringRegexp)(e)}).join(""),routeKeys:l}}function d(e,t){let r=f(e,t);return{...l(e),namedRegex:"^"+r.namedParameterizedRoute+"(?:/)?$",routeKeys:r.routeKeys}}function p(e,t){let{parameterizedRoute:r}=s(e),{catchAll:n=!0}=t;if("/"===r)return{namedRegex:"^/"+(n?".*":"")+"$"};let{namedParameterizedRoute:o}=f(e,!1);return{namedRegex:"^"+o+(n?"(?:(/.*)?)":"")+"$"}}},4777:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getSortedRoutes",{enumerable:!0,get:function(){return n}});class r{insert(e){this._insert(e.split("/").filter(Boolean),[],!1)}smoosh(){return this._smoosh()}_smoosh(e){void 0===e&&(e="/");let t=[...this.children.keys()].sort();null!==this.slugName&&t.splice(t.indexOf("[]"),1),null!==this.restSlugName&&t.splice(t.indexOf("[...]"),1),null!==this.optionalRestSlugName&&t.splice(t.indexOf("[[...]]"),1);let r=t.map(t=>this.children.get(t)._smoosh(""+e+t+"/")).reduce((e,t)=>[...e,...t],[]);if(null!==this.slugName&&r.push(...this.children.get("[]")._smoosh(e+"["+this.slugName+"]/")),!this.placeholder){let t="/"===e?"/":e.slice(0,-1);if(null!=this.optionalRestSlugName)throw Error('You cannot define a route with the same specificity as a optional catch-all route ("'+t+'" and "'+t+"[[..."+this.optionalRestSlugName+']]").');r.unshift(t)}return null!==this.restSlugName&&r.push(...this.children.get("[...]")._smoosh(e+"[..."+this.restSlugName+"]/")),null!==this.optionalRestSlugName&&r.push(...this.children.get("[[...]]")._smoosh(e+"[[..."+this.optionalRestSlugName+"]]/")),r}_insert(e,t,n){if(0===e.length){this.placeholder=!1;return}if(n)throw Error("Catch-all must be the last part of the URL.");let o=e[0];if(o.startsWith("[")&&o.endsWith("]")){let r=o.slice(1,-1),a=!1;if(r.startsWith("[")&&r.endsWith("]")&&(r=r.slice(1,-1),a=!0),r.startsWith("...")&&(r=r.substring(3),n=!0),r.startsWith("[")||r.endsWith("]"))throw Error("Segment names may not start or end with extra brackets ('"+r+"').");if(r.startsWith("."))throw Error("Segment names may not start with erroneous periods ('"+r+"').");function i(e,r){if(null!==e&&e!==r)throw Error("You cannot use different slug names for the same dynamic path ('"+e+"' !== '"+r+"').");t.forEach(e=>{if(e===r)throw Error('You cannot have the same slug name "'+r+'" repeat within a single dynamic path');if(e.replace(/\W/g,"")===o.replace(/\W/g,""))throw Error('You cannot have the slug names "'+e+'" and "'+r+'" differ only by non-word symbols within a single dynamic path')}),t.push(r)}if(n){if(a){if(null!=this.restSlugName)throw Error('You cannot use both an required and optional catch-all route at the same level ("[...'+this.restSlugName+']" and "'+e[0]+'" ).');i(this.optionalRestSlugName,r),this.optionalRestSlugName=r,o="[[...]]"}else{if(null!=this.optionalRestSlugName)throw Error('You cannot use both an optional and required catch-all route at the same level ("[[...'+this.optionalRestSlugName+']]" and "'+e[0]+'").');i(this.restSlugName,r),this.restSlugName=r,o="[...]"}}else{if(a)throw Error('Optional route parameters are not yet supported ("'+e[0]+'").');i(this.slugName,r),this.slugName=r,o="[]"}}this.children.has(o)||this.children.set(o,new r),this.children.get(o)._insert(e.slice(1),t,n)}constructor(){this.placeholder=!0,this.children=new Map,this.slugName=null,this.restSlugName=null,this.optionalRestSlugName=null}}function n(e){let t=new r;return e.forEach(e=>t.insert(e)),t.smoosh()}},3987:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(t,{DecodeError:function(){return h},MiddlewareNotFoundError:function(){return y},MissingStaticPage:function(){return _},NormalizeError:function(){return g},PageNotFoundError:function(){return m},SP:function(){return d},ST:function(){return p},WEB_VITALS:function(){return r},execOnce:function(){return n},getDisplayName:function(){return s},getLocationOrigin:function(){return a},getURL:function(){return u},isAbsoluteUrl:function(){return i},isResSent:function(){return l},loadGetInitialProps:function(){return f},normalizeRepeatedSlashes:function(){return c},stringifyError:function(){return E}});let r=["CLS","FCP","FID","INP","LCP","TTFB"];function n(e){let t,r=!1;return function(){for(var n=arguments.length,o=Array(n),i=0;i<n;i++)o[i]=arguments[i];return r||(r=!0,t=e(...o)),t}}let o=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,i=e=>o.test(e);function a(){let{protocol:e,hostname:t,port:r}=window.location;return e+"//"+t+(r?":"+r:"")}function u(){let{href:e}=window.location,t=a();return e.substring(t.length)}function s(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function l(e){return e.finished||e.headersSent}function c(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?"?"+t.slice(1).join("?"):"")}async function f(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await f(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&l(r))return n;if(!n)throw Error('"'+s(e)+'.getInitialProps()" should resolve to an object. But found "'+n+'" instead.');return n}let d="undefined"!=typeof performance,p=d&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class h extends Error{}class g extends Error{}class m extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message="Cannot find module for page: "+e}}class _ extends Error{constructor(e,t){super(),this.message="Failed to load static file for page: "+e+" "+t}}class y extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function E(e){return JSON.stringify({message:e.message,stack:e.stack})}},1994:function(e,t,r){"use strict";t.Z=function(){for(var e,t,r=0,n="",o=arguments.length;r<o;r++)(e=arguments[r])&&(t=function e(t){var r,n,o="";if("string"==typeof t||"number"==typeof t)o+=t;else if("object"==typeof t){if(Array.isArray(t)){var i=t.length;for(r=0;r<i;r++)t[r]&&(n=e(t[r]))&&(o&&(o+=" "),o+=n)}else for(n in t)t[n]&&(o&&(o+=" "),o+=n)}return o}(e))&&(n&&(n+=" "),n+=t);return n}}}]);