@lovelybunch/api 1.0.77-alpha.3 → 1.0.77-alpha.4

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 (127) hide show
  1. package/dist/config/m2m.d.ts +26 -0
  2. package/dist/config/m2m.js +27 -0
  3. package/dist/lib/auth/clerk-m2m-verifier.d.ts +34 -0
  4. package/dist/lib/auth/clerk-m2m-verifier.js +47 -0
  5. package/dist/middleware/auth.js +39 -5
  6. package/dist/server-with-static.js +19 -0
  7. package/dist/server.js +17 -0
  8. package/package.json +4 -4
  9. package/static/assets/{ActivityPage-e7Lcpzqo.js → ActivityPage-NWY9n_Vz.js} +1 -1
  10. package/static/assets/{AgentsContextEditPage-Bu1S7-A4.js → AgentsContextEditPage-CegcDIbc.js} +1 -1
  11. package/static/assets/{AgentsContextPage-DDCut3-f.js → AgentsContextPage-tv1aSHZt.js} +1 -1
  12. package/static/assets/{ApiKeysSettingsPage-BwuKllGv.js → ApiKeysSettingsPage-DBLY6U4j.js} +1 -1
  13. package/static/assets/{AuthSettingsPage-CIxoyr8F.js → AuthSettingsPage-CrQ12eym.js} +1 -1
  14. package/static/assets/{CallbackPage-DmEzJO8t.js → CallbackPage-CG7uYftC.js} +1 -1
  15. package/static/assets/{CoconutCallbackPage-DQfUJPVp.js → CoconutCallbackPage-5SdoMUzX.js} +1 -1
  16. package/static/assets/{CodePage-BPUQfcZm.js → CodePage-BSpmMVCY.js} +1 -1
  17. package/static/assets/{CollapsibleSection-Dqx1qSCh.js → CollapsibleSection-CIsOS9cT.js} +1 -1
  18. package/static/assets/{DashboardPage-CMRqCI-P.js → DashboardPage-H6Do6mdY.js} +1 -1
  19. package/static/assets/{GitPage-DUrDXz-D.js → GitPage-BUjmwsaT.js} +1 -1
  20. package/static/assets/{GitSettingsPage-CcvJJSpr.js → GitSettingsPage-D4pHZQc1.js} +1 -1
  21. package/static/assets/{IdentityPage-BxyDHK13.js → IdentityPage-eGF1AqJq.js} +1 -1
  22. package/static/assets/{ImplementationStepsEditor-Dc6oFW7X.js → ImplementationStepsEditor-B2rhUkN7.js} +1 -1
  23. package/static/assets/{IntegrationsSettingsPage-BQZjUXma.js → IntegrationsSettingsPage-BtuhWJYd.js} +1 -1
  24. package/static/assets/{JobDetailPage-9Il7ekks.js → JobDetailPage-DELop2el.js} +1 -1
  25. package/static/assets/{KnowledgeDetailPage-w7lW0KCX.js → KnowledgeDetailPage-tar2oGxi.js} +1 -1
  26. package/static/assets/{KnowledgeEditPage-8nq-7uVh.js → KnowledgeEditPage-B2Kar8q4.js} +1 -1
  27. package/static/assets/{KnowledgePage-Cz-fTpGq.js → KnowledgePage-DLc2exrV.js} +1 -1
  28. package/static/assets/{LoginPage-DsV3uJmm.js → LoginPage-DOmSsPXw.js} +1 -1
  29. package/static/assets/{MailInboxPage-BROJCyW8.js → MailInboxPage-TygzTth5.js} +1 -1
  30. package/static/assets/{MailProcessingModal-P2Eaxkyd.js → MailProcessingModal-DNrjOWM6.js} +1 -1
  31. package/static/assets/{MailReadPage-LfdU56Fi.js → MailReadPage-kzVyjGT2.js} +1 -1
  32. package/static/assets/{MailSentPage-6mGQAj3E.js → MailSentPage-B_8poTdm.js} +1 -1
  33. package/static/assets/{McpSettingsPage-C69fC3Ad.js → McpSettingsPage-8OZzZoOw.js} +1 -1
  34. package/static/assets/{MemoryEditPage-B7TWaKOi.js → MemoryEditPage-hbJZOd-h.js} +1 -1
  35. package/static/assets/{MemoryPage-C3U1bbRh.js → MemoryPage-mPp-CSud.js} +1 -1
  36. package/static/assets/{NewKnowledgePage-CS_qQB30.js → NewKnowledgePage-EFr9n04L.js} +1 -1
  37. package/static/assets/{NewSkillPage-SxB3XjAy.js → NewSkillPage-CMh7-arC.js} +1 -1
  38. package/static/assets/{NewTaskPage-BwP3me3N.js → NewTaskPage-CQ5OgF1b.js} +1 -1
  39. package/static/assets/{NotFoundPage-VOOxRWyc.js → NotFoundPage-C5dV-iS-.js} +1 -1
  40. package/static/assets/{NotificationsSettingsPage-qX10VwVM.js → NotificationsSettingsPage-dPjU5Q1h.js} +1 -1
  41. package/static/assets/{PromptsSettingsPage-D0YwNTQO.js → PromptsSettingsPage-BvZsTJJa.js} +1 -1
  42. package/static/assets/{ResourceDetailPage-DiikFjON.js → ResourceDetailPage-BOQcC7HN.js} +1 -1
  43. package/static/assets/{ResourcesPage-PNfKhGGp.js → ResourcesPage-D78kDCDA.js} +1 -1
  44. package/static/assets/{RoleEditPage-CMpNk_u6.js → RoleEditPage-B9kTm8KI.js} +1 -1
  45. package/static/assets/{RolePage-Cplft7_d.js → RolePage-B2vEFgJt.js} +1 -1
  46. package/static/assets/{RulesSettingsPage-1w81GxqO.js → RulesSettingsPage-DkpLo1qw.js} +1 -1
  47. package/static/assets/{RunDetailPage-B3ik_bvs.js → RunDetailPage-cKilo4we.js} +1 -1
  48. package/static/assets/{SchedulePage-DFghnNSr.js → SchedulePage-Bs_zBMCY.js} +1 -1
  49. package/static/assets/{SkillDetailPage-D6EhKsku.js → SkillDetailPage-Ltd1vGyY.js} +1 -1
  50. package/static/assets/{SkillEditPage-BpiaQubE.js → SkillEditPage-WvDnQbsn.js} +1 -1
  51. package/static/assets/{SkillsPage-C1niGBYH.js → SkillsPage-2bSn7LSx.js} +1 -1
  52. package/static/assets/{SkillsSettingsPage-BLfVTSlm.js → SkillsSettingsPage-B9JwEAuy.js} +1 -1
  53. package/static/assets/{SourceInput-sY9NPmpb.js → SourceInput-BDIqXfxi.js} +1 -1
  54. package/static/assets/{TagInput-fx5Bxdch.js → TagInput-CL7jQrpP.js} +1 -1
  55. package/static/assets/{TaskDetailPage-Db6Nbd6f.js → TaskDetailPage-CtG04fHi.js} +1 -1
  56. package/static/assets/{TaskEditPage-DOloa9FX.js → TaskEditPage-CzqOFJag.js} +1 -1
  57. package/static/assets/{TasksPage-f5v3GC0k.js → TasksPage-horVpdZI.js} +1 -1
  58. package/static/assets/{TeamEditPage-Bn3JsXqy.js → TeamEditPage-CL6ZR7WT.js} +1 -1
  59. package/static/assets/{TeamPage-Dwzra3-n.js → TeamPage-CZ8AhAtV.js} +1 -1
  60. package/static/assets/{TerminalPage-CgfrEsc9.js → TerminalPage-DdsR4df6.js} +1 -1
  61. package/static/assets/{TerminalSessionPage-B7gCQUK5.js → TerminalSessionPage-BtNLOnes.js} +1 -1
  62. package/static/assets/{UserPreferencesPage-CiLqKJsf.js → UserPreferencesPage-BFuA9TaZ.js} +1 -1
  63. package/static/assets/{UserSettingsPage-DBaS6CHT.js → UserSettingsPage-B4iBDHTu.js} +1 -1
  64. package/static/assets/{UtilitiesPage-57ZLlzkV.js → UtilitiesPage-lIgfa-TS.js} +1 -1
  65. package/static/assets/{alert-DsJ9cGcq.js → alert-BblaPWI4.js} +1 -1
  66. package/static/assets/{arrow-down-DZvXMao-.js → arrow-down-5wVLzm2P.js} +1 -1
  67. package/static/assets/{arrow-left-DRHGi2SW.js → arrow-left-B2qdn6F8.js} +1 -1
  68. package/static/assets/{arrow-up-DM2JrUfI.js → arrow-up-BUq8ttsr.js} +1 -1
  69. package/static/assets/{arrow-up-down-B1vbdxkg.js → arrow-up-down-Wx3HNLji.js} +1 -1
  70. package/static/assets/{badge-Bxf1EyrV.js → badge-CnihwoO_.js} +1 -1
  71. package/static/assets/{browser-modal-C8Tc-uWD.js → browser-modal-BpmwARpG.js} +1 -1
  72. package/static/assets/{card-DsVpjlQD.js → card-ClTppZkC.js} +1 -1
  73. package/static/assets/{chevron-left-0TsDJ16V.js → chevron-left-B6cdF33u.js} +1 -1
  74. package/static/assets/{chevron-up-CNXvBkCN.js → chevron-up-DmV7RyoW.js} +1 -1
  75. package/static/assets/{chevrons-up-BJi_UX1t.js → chevrons-up-CaytjQin.js} +1 -1
  76. package/static/assets/{circle-alert-BkW33Nsy.js → circle-alert-DLogptcc.js} +1 -1
  77. package/static/assets/{circle-check-LOdxtkNO.js → circle-check-WnW2gKuY.js} +1 -1
  78. package/static/assets/{circle-check-big-DiJRbG5s.js → circle-check-big-_7cw_xX7.js} +1 -1
  79. package/static/assets/{circle-play-BwiX0xjD.js → circle-play-DAjst76T.js} +1 -1
  80. package/static/assets/{circle-x-C74Z3CmY.js → circle-x-Cy-GEE0N.js} +1 -1
  81. package/static/assets/{clipboard-B03jh_4C.js → clipboard-BjRIfdtw.js} +1 -1
  82. package/static/assets/{clock-BBA6hrv0.js → clock-BqpT33TV.js} +1 -1
  83. package/static/assets/{code-BIqa_V0g.js → code-BlCNWFR0.js} +1 -1
  84. package/static/assets/{download-CWTsmRM8.js → download-gMGjJye8.js} +1 -1
  85. package/static/assets/{external-link-CvIS_OjZ.js → external-link-B62Uv2FB.js} +1 -1
  86. package/static/assets/{eye-DQ6K9zCD.js → eye-SF5oVtaC.js} +1 -1
  87. package/static/assets/{folder-git-2-D7zmxRhq.js → folder-git-2-DjFQ-1Nl.js} +1 -1
  88. package/static/assets/{globe-CBPRUXdZ.js → globe-CawEz_y2.js} +1 -1
  89. package/static/assets/{index-CrelVTpe.js → index-BLYnta2A.js} +1 -1
  90. package/static/assets/{index-B2DaLcHo.js → index-BOKRJR9W.js} +1 -1
  91. package/static/assets/{index-D9g2SeM2.js → index-BgXpiZXS.js} +1 -1
  92. package/static/assets/{index-xNQoYnQ-.js → index-BhC1oAgs.js} +1 -1
  93. package/static/assets/{index-DUH1UeSE.js → index-BsyUW5MN.js} +1 -1
  94. package/static/assets/{index-BrjTh8y6.js → index-C77IIPc5.js} +1 -1
  95. package/static/assets/{index-DZkYftDX.js → index-CBMKhVK-.js} +1 -1
  96. package/static/assets/{index-KsEHBRky.js → index-CJjOSL3x.js} +6 -6
  97. package/static/assets/{index-CBrt_Y6u.js → index-CVk4I1l9.js} +1 -1
  98. package/static/assets/{index-Bp09GJs-.js → index-CWkvL12t.js} +1 -1
  99. package/static/assets/{index-DwonYchR.js → index-CmhgE-Ve.js} +1 -1
  100. package/static/assets/{index-BbjIsa_U.js → index-CutWk1Pr.js} +1 -1
  101. package/static/assets/{index-C_WFjO-Q.js → index-D6b2LruY.js} +1 -1
  102. package/static/assets/{index-B0FDUSbH.js → index-DRejVr_E.js} +1 -1
  103. package/static/assets/{index-DYA0_E_8.js → index-DhYqfZIE.js} +1 -1
  104. package/static/assets/{index-CcR_8LlL.js → index-DiHN7yBx.js} +1 -1
  105. package/static/assets/{index-B1a08mTf.js → index-FFag0sNb.js} +1 -1
  106. package/static/assets/{index-Z7Jk6xEw.js → index-HbxEbyW3.js} +1 -1
  107. package/static/assets/{index-B8ph_U78.js → index-IG1FNNtX.js} +1 -1
  108. package/static/assets/{info-Cdbs194H.js → info-On5lSg5-.js} +1 -1
  109. package/static/assets/{label-C7u95hG_.js → label-ENwgDlxz.js} +1 -1
  110. package/static/assets/{markdown-editor-B0PDv3V5.js → markdown-editor-ClbNJOVl.js} +3 -3
  111. package/static/assets/{message-square-D5h6xG49.js → message-square-DBowh0DJ.js} +1 -1
  112. package/static/assets/{paperclip-FXIkMaNr.js → paperclip-Fv26pkZS.js} +1 -1
  113. package/static/assets/{pause-B9Zaxj5r.js → pause-C35xce-o.js} +1 -1
  114. package/static/assets/{play-_qXymnTe.js → play-dMLqfItH.js} +1 -1
  115. package/static/assets/{radio-group-CzLMiZME.js → radio-group-BPgf2DjV.js} +1 -1
  116. package/static/assets/{refresh-cw-BqkCBkLp.js → refresh-cw-4aDPS4Ma.js} +1 -1
  117. package/static/assets/{search-CcuUi4yp.js → search-BKZ_bHPJ.js} +1 -1
  118. package/static/assets/{select-Dciu_1Ss.js → select-Cft45rTz.js} +1 -1
  119. package/static/assets/{server-D2vtReXL.js → server-RIrco6rM.js} +1 -1
  120. package/static/assets/{switch-L2iiB8W5.js → switch-N26zinJT.js} +1 -1
  121. package/static/assets/{tabs-D3vdicG-.js → tabs-94xo_fGd.js} +1 -1
  122. package/static/assets/{tag-B0gMRWrw.js → tag-D1KdHBUM.js} +1 -1
  123. package/static/assets/{terminal-preview-DiK9IM0K.js → terminal-preview-BpviO4IZ.js} +1 -1
  124. package/static/assets/{triangle-alert-fyxk-Akq.js → triangle-alert-O41QYHqC.js} +1 -1
  125. package/static/assets/{use-terminal-Cnq9znc5.js → use-terminal-C8IG41zB.js} +1 -1
  126. package/static/assets/{video-B9FAor8z.js → video-Dh8WwEAk.js} +1 -1
  127. package/static/index.html +1 -1
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Control-plane → coconut M2M (machine-to-machine) runtime config.
3
+ *
4
+ * The control plane mints Clerk M2M JWTs carrying a `coconut_id` claim and
5
+ * sends them as `Authorization: Bearer <jwt>` to coconut VMs. The coconut
6
+ * verifies the signature against Clerk's JWKS (same one used for user OAuth
7
+ * login), enforces the standard issuer, and — crucially — asserts that the
8
+ * token's `coconut_id` claim equals THIS coconut's ID. That claim is the
9
+ * isolation guarantee: a token minted for coconut A must be rejected by
10
+ * coconut B.
11
+ *
12
+ * This runtime cache is populated at server startup from `resolveCoconutId()`
13
+ * (which reads env → `.nut/config.json`). If no ID is resolvable, M2M auth
14
+ * stays disabled and the Bearer chain falls through to existing paths. The
15
+ * whole mechanism is purely additive: existing cookie / API-key / OAuth-user
16
+ * flows are unaffected.
17
+ *
18
+ * Kept separate from `OAuthRuntimeConfig` because the verification rules
19
+ * differ (audience vs. custom claim) and conflating them risks security bugs.
20
+ */
21
+ export interface M2MRuntimeConfig {
22
+ enabled: boolean;
23
+ coconutId?: string;
24
+ }
25
+ export declare function setM2MRuntimeConfig(config: M2MRuntimeConfig): void;
26
+ export declare function getM2MRuntimeConfig(): M2MRuntimeConfig;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Control-plane → coconut M2M (machine-to-machine) runtime config.
3
+ *
4
+ * The control plane mints Clerk M2M JWTs carrying a `coconut_id` claim and
5
+ * sends them as `Authorization: Bearer <jwt>` to coconut VMs. The coconut
6
+ * verifies the signature against Clerk's JWKS (same one used for user OAuth
7
+ * login), enforces the standard issuer, and — crucially — asserts that the
8
+ * token's `coconut_id` claim equals THIS coconut's ID. That claim is the
9
+ * isolation guarantee: a token minted for coconut A must be rejected by
10
+ * coconut B.
11
+ *
12
+ * This runtime cache is populated at server startup from `resolveCoconutId()`
13
+ * (which reads env → `.nut/config.json`). If no ID is resolvable, M2M auth
14
+ * stays disabled and the Bearer chain falls through to existing paths. The
15
+ * whole mechanism is purely additive: existing cookie / API-key / OAuth-user
16
+ * flows are unaffected.
17
+ *
18
+ * Kept separate from `OAuthRuntimeConfig` because the verification rules
19
+ * differ (audience vs. custom claim) and conflating them risks security bugs.
20
+ */
21
+ let runtimeConfig = { enabled: false };
22
+ export function setM2MRuntimeConfig(config) {
23
+ runtimeConfig = config;
24
+ }
25
+ export function getM2MRuntimeConfig() {
26
+ return runtimeConfig;
27
+ }
@@ -0,0 +1,34 @@
1
+ import { jwtVerify, type JWTPayload } from 'jose';
2
+ /**
3
+ * Clerk M2M (control-plane → coconut) JWT verification.
4
+ *
5
+ * Differs from `verifyClerkToken` (user OIDC login) in three ways:
6
+ * 1. No audience enforcement — Clerk M2M tokens don't carry the coconut's
7
+ * OAuth client_id as audience; they're minted from the control plane's
8
+ * machine secret with different audience conventions.
9
+ * 2. Requires a custom `coconut_id` claim that must equal THIS coconut's
10
+ * ID. This is the per-tenant isolation guarantee: a token minted for
11
+ * coconut A is signed by the same tenant's keys as coconut B's tokens,
12
+ * so the only thing keeping B from accepting A's token is this claim.
13
+ * 3. Keeps JWKS separate from the OAuth verifier's instance for cleaner
14
+ * test isolation, though both instances point at the same JWKS URL.
15
+ *
16
+ * Returns the verified payload on success, `null` on any failure. The
17
+ * failure reason is logged (same pattern as the OAuth verifier) so 401s
18
+ * are diagnosable in prod without adding debug endpoints.
19
+ */
20
+ type JwksKeyFn = Parameters<typeof jwtVerify>[1];
21
+ export interface M2MVerifyResult {
22
+ payload: JWTPayload & {
23
+ coconut_id: string;
24
+ };
25
+ }
26
+ export declare function verifyCoconutM2MToken(token: string, options: {
27
+ expectedCoconutId: string;
28
+ }): Promise<M2MVerifyResult | null>;
29
+ /**
30
+ * Test-only: inject a custom JWKS key function (e.g. `jose.createLocalJWKSet`
31
+ * backed by a generated keypair) so middleware tests don't hit the network.
32
+ */
33
+ export declare function __setClerkM2MJwksForTests(jwks: JwksKeyFn | null): void;
34
+ export {};
@@ -0,0 +1,47 @@
1
+ import { createRemoteJWKSet, jwtVerify } from 'jose';
2
+ import { CLERK_ISSUER, CLERK_JWKS_URL } from '../../config/oauth.js';
3
+ let jwksInstance = null;
4
+ function getJwks() {
5
+ if (!jwksInstance) {
6
+ jwksInstance = createRemoteJWKSet(new URL(CLERK_JWKS_URL));
7
+ }
8
+ return jwksInstance;
9
+ }
10
+ export async function verifyCoconutM2MToken(token, options) {
11
+ try {
12
+ const jwks = getJwks();
13
+ const verifyOptions = {
14
+ issuer: CLERK_ISSUER,
15
+ };
16
+ const { payload } = await jwtVerify(token, jwks, verifyOptions);
17
+ const claim = payload.coconut_id;
18
+ if (typeof claim !== 'string' || claim.length === 0) {
19
+ console.warn('[clerk-m2m-verifier] Token rejected: missing coconut_id claim');
20
+ return null;
21
+ }
22
+ if (claim !== options.expectedCoconutId) {
23
+ // Log without leaking either ID at full length — prefix-only keeps
24
+ // logs useful for triage without exposing tenant identifiers.
25
+ const prefix = (s) => s.slice(0, 8);
26
+ console.warn(`[clerk-m2m-verifier] Token rejected: coconut_id mismatch ` +
27
+ `(token=${prefix(claim)}… expected=${prefix(options.expectedCoconutId)}…)`);
28
+ return null;
29
+ }
30
+ return { payload: payload };
31
+ }
32
+ catch (err) {
33
+ const e = err;
34
+ const reason = e.code
35
+ ? `${e.code}${e.claim ? ` (claim: ${e.claim})` : ''}`
36
+ : e.message || 'unknown error';
37
+ console.warn(`[clerk-m2m-verifier] Token verification failed: ${reason}`);
38
+ return null;
39
+ }
40
+ }
41
+ /**
42
+ * Test-only: inject a custom JWKS key function (e.g. `jose.createLocalJWKSet`
43
+ * backed by a generated keypair) so middleware tests don't hit the network.
44
+ */
45
+ export function __setClerkM2MJwksForTests(jwks) {
46
+ jwksInstance = jwks;
47
+ }
@@ -2,7 +2,9 @@ import { getCookie } from 'hono/cookie';
2
2
  import { getConnInfo } from '@hono/node-server/conninfo';
3
3
  import { getAuthManager } from '../lib/auth/auth-manager.js';
4
4
  import { getOAuthRuntimeConfig } from '../config/oauth.js';
5
+ import { getM2MRuntimeConfig } from '../config/m2m.js';
5
6
  import { verifyClerkToken } from '../lib/auth/clerk-verifier.js';
7
+ import { verifyCoconutM2MToken } from '../lib/auth/clerk-m2m-verifier.js';
6
8
  const LOOPBACK_ADDRESSES = new Set(['127.0.0.1', '::1', '::ffff:127.0.0.1']);
7
9
  /**
8
10
  * Check if a request is a direct localhost connection (not proxied).
@@ -114,7 +116,11 @@ export async function authMiddleware(c, next) {
114
116
  return c.json({ error: 'Unauthorized', message: 'No authentication token provided' }, 401);
115
117
  }
116
118
  // Verify token: try local HS256 session JWT first (fast, no network),
117
- // then fall back to Clerk JWKS verification when --oauth is enabled.
119
+ // then Clerk JWKS verification for user-OAuth login tokens (audience =
120
+ // this coconut's client_id), then Clerk M2M verification for control-
121
+ // plane tokens (coconut_id claim = this coconut's id). Each check is
122
+ // strictly scoped — a user OIDC token will never satisfy the M2M rule
123
+ // and vice versa — so the chain can't accidentally conflate them.
118
124
  let session = await authManager.verifyToken(token);
119
125
  let authType = 'session';
120
126
  if (!session) {
@@ -142,6 +148,25 @@ export async function authMiddleware(c, next) {
142
148
  }
143
149
  }
144
150
  }
151
+ // M2M control-plane tokens: verified like OIDC tokens but gated on the
152
+ // custom `coconut_id` claim instead of audience. On success we DON'T mint
153
+ // an AuthSession — M2M callers aren't users and shouldn't appear in
154
+ // session-shaped contexts. Instead we set authType='m2m' and let
155
+ // requireAdmin recognize this as a trusted non-session authenticator
156
+ // (same pattern as API keys and direct-localhost).
157
+ if (!session) {
158
+ const m2m = getM2MRuntimeConfig();
159
+ if (m2m.enabled && m2m.coconutId) {
160
+ const result = await verifyCoconutM2MToken(token, {
161
+ expectedCoconutId: m2m.coconutId,
162
+ });
163
+ if (result) {
164
+ c.set('authType', 'm2m');
165
+ c.set('m2mClaims', result.payload);
166
+ return next();
167
+ }
168
+ }
169
+ }
145
170
  if (!session) {
146
171
  return c.json({ error: 'Unauthorized', message: 'Invalid or expired token' }, 401);
147
172
  }
@@ -195,6 +220,12 @@ export function requireAuth(c) {
195
220
  if (authType === 'localhost') {
196
221
  return null;
197
222
  }
223
+ // Control-plane M2M tokens were verified at the middleware layer (signature
224
+ // + coconut_id claim). No session was minted because M2M callers aren't
225
+ // users, but auth is satisfied — same null-return pattern as API keys.
226
+ if (authType === 'm2m') {
227
+ return null;
228
+ }
198
229
  throw new Error('Authentication required');
199
230
  }
200
231
  /**
@@ -207,11 +238,14 @@ export function requireAdmin(c) {
207
238
  if (authEnabled === false) {
208
239
  return null;
209
240
  }
210
- // Trusted non-session authenticators (direct localhost connection, valid API
211
- // key) are authoritative: they've already passed auth at the middleware
212
- // layer, so admin-gated routes accept them without a session.role check.
241
+ // Trusted non-session authenticators (direct localhost connection, valid
242
+ // API key, control-plane M2M token) are authoritative: they've already
243
+ // passed auth at the middleware layer, so admin-gated routes accept them
244
+ // without a session.role check. For M2M specifically, the `coconut_id`
245
+ // claim match is itself proof that the control plane intended this
246
+ // specific coconut — an equivalent gate to admin membership.
213
247
  const authType = c.get('authType');
214
- if (authType === 'localhost' || authType === 'apikey') {
248
+ if (authType === 'localhost' || authType === 'apikey' || authType === 'm2m') {
215
249
  return null;
216
250
  }
217
251
  const session = requireAuth(c);
@@ -13,6 +13,8 @@ import { fileURLToPath } from 'url';
13
13
  import { getLogger } from '@lovelybunch/core/logging';
14
14
  import { getLogsDir } from '@lovelybunch/core';
15
15
  import { oauthRuntimeFromAuthConfig, setOAuthRuntimeConfig } from './config/oauth.js';
16
+ import { setM2MRuntimeConfig } from './config/m2m.js';
17
+ import { resolveCoconutId } from './lib/coconut-context.js';
16
18
  import { getAuthManager } from './lib/auth/auth-manager.js';
17
19
  const __filename = fileURLToPath(import.meta.url);
18
20
  const __dirname = path.dirname(__filename);
@@ -323,6 +325,23 @@ export async function startServer(options = {}) {
323
325
  catch {
324
326
  setOAuthRuntimeConfig({ enabled: false });
325
327
  }
328
+ // Populate the M2M runtime cache from resolveCoconutId() (env → .nut/config.json).
329
+ // Enables control-plane Bearer auth only when this coconut has a resolvable
330
+ // ID; unprovisioned / standalone coconuts get enabled: false and fall through
331
+ // to existing auth paths unchanged.
332
+ try {
333
+ const coconutId = await resolveCoconutId();
334
+ if (coconutId) {
335
+ setM2MRuntimeConfig({ enabled: true, coconutId });
336
+ vlog(`[m2m] Control-plane Bearer auth enabled for coconut ${coconutId}`);
337
+ }
338
+ else {
339
+ setM2MRuntimeConfig({ enabled: false });
340
+ }
341
+ }
342
+ catch {
343
+ setM2MRuntimeConfig({ enabled: false });
344
+ }
326
345
  vlog(`Starting server on ${host}:${port}...`);
327
346
  const server = serve({
328
347
  fetch: app.fetch,
package/dist/server.js CHANGED
@@ -12,6 +12,8 @@ import fs from 'fs';
12
12
  import { getLogger } from '@lovelybunch/core/logging';
13
13
  import { getLogsDir } from '@lovelybunch/core';
14
14
  import { oauthRuntimeFromAuthConfig, setOAuthRuntimeConfig } from './config/oauth.js';
15
+ import { setM2MRuntimeConfig } from './config/m2m.js';
16
+ import { resolveCoconutId } from './lib/coconut-context.js';
15
17
  import { getAuthManager } from './lib/auth/auth-manager.js';
16
18
  const __filename = fileURLToPath(import.meta.url);
17
19
  const __dirname = path.dirname(__filename);
@@ -246,6 +248,21 @@ try {
246
248
  catch {
247
249
  setOAuthRuntimeConfig({ enabled: false });
248
250
  }
251
+ // Populate the M2M runtime cache for control-plane Bearer auth. See
252
+ // server-with-static.ts for the full rationale.
253
+ try {
254
+ const coconutId = await resolveCoconutId();
255
+ if (coconutId) {
256
+ setM2MRuntimeConfig({ enabled: true, coconutId });
257
+ console.log(`[m2m] Control-plane Bearer auth enabled for coconut ${coconutId}`);
258
+ }
259
+ else {
260
+ setM2MRuntimeConfig({ enabled: false });
261
+ }
262
+ }
263
+ catch {
264
+ setM2MRuntimeConfig({ enabled: false });
265
+ }
249
266
  // Start server
250
267
  const port = process.env.PORT ? parseInt(process.env.PORT) : 3001;
251
268
  console.log(`Starting server on port ${port}...`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lovelybunch/api",
3
- "version": "1.0.77-alpha.3",
3
+ "version": "1.0.77-alpha.4",
4
4
  "type": "module",
5
5
  "main": "dist/server-with-static.js",
6
6
  "exports": {
@@ -40,9 +40,9 @@
40
40
  "sharp": "^0.33.5",
41
41
  "ws": "^8.18.0",
42
42
  "zod": "^3.23.0",
43
- "@lovelybunch/core": "1.0.77-alpha.3",
44
- "@lovelybunch/mcp": "1.0.77-alpha.3",
45
- "@lovelybunch/types": "1.0.77-alpha.3"
43
+ "@lovelybunch/core": "1.0.77-alpha.4",
44
+ "@lovelybunch/types": "1.0.77-alpha.4",
45
+ "@lovelybunch/mcp": "1.0.77-alpha.4"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/adm-zip": "^0.5.7",
@@ -1 +1 @@
1
- import{r as a,A as p,j as e,v,bN as y,B as N,n as w,C as b}from"./index-KsEHBRky.js";import{C as c,a as d,b as k,c as C}from"./card-DsVpjlQD.js";import{B as m}from"./badge-Bxf1EyrV.js";import{R as E}from"./refresh-cw-BqkCBkLp.js";const A=5e3;function $(){const[n,o]=a.useState([]),[i,x]=a.useState(!0),[h,u]=a.useState(new Set),l=a.useCallback(async()=>{x(!0);try{const s=await fetch(`${p}/api/v1/events?limit=${A}`);if(!s.ok)throw new Error("Failed to load events");const t=await s.json();o(Array.isArray(t.items)?[...t.items].reverse():[])}catch(s){console.error("Failed to load events:",s),o([])}finally{x(!1)}},[]),g=a.useCallback(s=>{u(t=>{const r=new Set(t);return r.has(s)?r.delete(s):r.add(s),r})},[]);a.useEffect(()=>{l()},[l]);const f=s=>{if(!s)return"Unknown time";try{return new Date(s).toLocaleString()}catch{return s}},j=s=>{switch(s?.toLowerCase()){case"error":return"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200";case"warn":case"warning":return"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200";case"info":return"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200";case"debug":return"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200";default:return"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200"}};return i?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Activity"}),e.jsx("p",{className:"text-muted-foreground",children:"View system activity and events"})]}),e.jsx(c,{children:e.jsx(d,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-center",children:[e.jsx(v,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-2 text-muted-foreground",children:"Loading events..."})]})})})]}):n.length===0?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Activity"}),e.jsx("p",{className:"text-muted-foreground",children:"View system activity and events"})]}),e.jsx(c,{children:e.jsx(d,{className:"pt-6",children:e.jsxs("div",{className:"text-center",children:[e.jsx(y,{className:"mx-auto h-12 w-12 text-muted-foreground"}),e.jsx("h3",{className:"mt-4 text-lg font-semibold",children:"No Events Found"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:"Activity events will appear here as they occur."})]})})})]}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Activity"}),e.jsxs("p",{className:"text-muted-foreground",children:["View system activity and events (",n.length," events)"]})]}),e.jsxs(N,{variant:"outline",size:"sm",onClick:()=>void l(),disabled:i,children:[e.jsx(E,{className:`h-4 w-4 mr-2 ${i?"animate-spin":""}`}),"Refresh"]})]}),e.jsx("div",{className:"space-y-3",children:n.map(s=>{const t=h.has(s.seq);return e.jsxs(c,{className:"transition-colors",children:[e.jsx(k,{className:"py-3 cursor-pointer hover:bg-muted/30",onClick:()=>g(s.seq),children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex items-start gap-2 flex-1 min-w-0",children:[t?e.jsx(w,{className:"h-4 w-4 mt-0.5 text-muted-foreground shrink-0"}):e.jsx(b,{className:"h-4 w-4 mt-0.5 text-muted-foreground shrink-0"}),e.jsxs("div",{className:"space-y-1 flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs(C,{className:"text-sm font-medium",children:["#",s.seq]}),s.kind&&e.jsx(m,{variant:"outline",className:"text-xs",children:s.kind}),s.level&&e.jsx(m,{className:`text-xs ${j(s.level)}`,children:s.level})]}),s.message&&e.jsx("p",{className:`text-sm text-muted-foreground ${t?"":"truncate"}`,children:s.message})]})]}),e.jsx("span",{className:"text-xs text-muted-foreground whitespace-nowrap",children:f(s.ts)})]})}),t&&e.jsx(d,{className:"pt-0 pb-4",children:e.jsx("pre",{className:"text-xs bg-muted p-3 rounded-md overflow-x-auto",children:JSON.stringify(s,null,2)})})]},s.seq)})})]})}export{$ as default};
1
+ import{r as a,A as p,j as e,v,bN as y,B as N,n as w,C as b}from"./index-CJjOSL3x.js";import{C as c,a as d,b as k,c as C}from"./card-ClTppZkC.js";import{B as m}from"./badge-CnihwoO_.js";import{R as E}from"./refresh-cw-4aDPS4Ma.js";const A=5e3;function $(){const[n,o]=a.useState([]),[i,x]=a.useState(!0),[h,u]=a.useState(new Set),l=a.useCallback(async()=>{x(!0);try{const s=await fetch(`${p}/api/v1/events?limit=${A}`);if(!s.ok)throw new Error("Failed to load events");const t=await s.json();o(Array.isArray(t.items)?[...t.items].reverse():[])}catch(s){console.error("Failed to load events:",s),o([])}finally{x(!1)}},[]),g=a.useCallback(s=>{u(t=>{const r=new Set(t);return r.has(s)?r.delete(s):r.add(s),r})},[]);a.useEffect(()=>{l()},[l]);const f=s=>{if(!s)return"Unknown time";try{return new Date(s).toLocaleString()}catch{return s}},j=s=>{switch(s?.toLowerCase()){case"error":return"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200";case"warn":case"warning":return"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200";case"info":return"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200";case"debug":return"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200";default:return"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200"}};return i?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Activity"}),e.jsx("p",{className:"text-muted-foreground",children:"View system activity and events"})]}),e.jsx(c,{children:e.jsx(d,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-center",children:[e.jsx(v,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-2 text-muted-foreground",children:"Loading events..."})]})})})]}):n.length===0?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Activity"}),e.jsx("p",{className:"text-muted-foreground",children:"View system activity and events"})]}),e.jsx(c,{children:e.jsx(d,{className:"pt-6",children:e.jsxs("div",{className:"text-center",children:[e.jsx(y,{className:"mx-auto h-12 w-12 text-muted-foreground"}),e.jsx("h3",{className:"mt-4 text-lg font-semibold",children:"No Events Found"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:"Activity events will appear here as they occur."})]})})})]}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Activity"}),e.jsxs("p",{className:"text-muted-foreground",children:["View system activity and events (",n.length," events)"]})]}),e.jsxs(N,{variant:"outline",size:"sm",onClick:()=>void l(),disabled:i,children:[e.jsx(E,{className:`h-4 w-4 mr-2 ${i?"animate-spin":""}`}),"Refresh"]})]}),e.jsx("div",{className:"space-y-3",children:n.map(s=>{const t=h.has(s.seq);return e.jsxs(c,{className:"transition-colors",children:[e.jsx(k,{className:"py-3 cursor-pointer hover:bg-muted/30",onClick:()=>g(s.seq),children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex items-start gap-2 flex-1 min-w-0",children:[t?e.jsx(w,{className:"h-4 w-4 mt-0.5 text-muted-foreground shrink-0"}):e.jsx(b,{className:"h-4 w-4 mt-0.5 text-muted-foreground shrink-0"}),e.jsxs("div",{className:"space-y-1 flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs(C,{className:"text-sm font-medium",children:["#",s.seq]}),s.kind&&e.jsx(m,{variant:"outline",className:"text-xs",children:s.kind}),s.level&&e.jsx(m,{className:`text-xs ${j(s.level)}`,children:s.level})]}),s.message&&e.jsx("p",{className:`text-sm text-muted-foreground ${t?"":"truncate"}`,children:s.message})]})]}),e.jsx("span",{className:"text-xs text-muted-foreground whitespace-nowrap",children:f(s.ts)})]})}),t&&e.jsx(d,{className:"pt-0 pb-4",children:e.jsx("pre",{className:"text-xs bg-muted p-3 rounded-md overflow-x-auto",children:JSON.stringify(s,null,2)})})]},s.seq)})})]})}export{$ as default};
@@ -1,4 +1,4 @@
1
- import{u as p,a as j,r as n,A as l,j as e,B as h,L as v,a5 as N}from"./index-KsEHBRky.js";import{C as m,a as x,b as C,c as S}from"./card-DsVpjlQD.js";import{M as w}from"./markdown-editor-B0PDv3V5.js";import{A as y}from"./arrow-left-DRHGi2SW.js";import{C as A}from"./circle-check-big-DiJRbG5s.js";import"./index-DZkYftDX.js";function F(){const f=p(),{toast:t}=j(),[a,i]=n.useState(""),[g,r]=n.useState(!0),[o,c]=n.useState(!1);n.useEffect(()=>{fetch(`${l}/api/v1/context/agents`).then(s=>s.json()).then(s=>{s.success&&i(s.document.content.trim()),r(!1)}).catch(s=>{console.error("Failed to load context:",s),t({title:"Error",description:"Failed to load agents definition",variant:"destructive"}),r(!1)})},[t]);const u=async()=>{c(!0);try{const d=await(await fetch(`${l}/api/v1/context/agents`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:a,metadata:{}})})).json();if(d.success)t({title:"Success",description:"Agents definition saved successfully",action:e.jsx(A,{className:"h-4 w-4"})}),f("/context/agents");else throw new Error(d.error||"Failed to save")}catch(s){console.error("Save error:",s),t({title:"Error",description:"Failed to save agents definition",variant:"destructive"})}finally{c(!1)}};return g?e.jsx("div",{className:"space-y-6",children:e.jsx(m,{children:e.jsx(x,{className:"pt-6",children:e.jsx("div",{className:"text-center",children:e.jsx("p",{children:"Loading..."})})})})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-xl sm:text-2xl font-bold tracking-tight",children:"Edit Agents Definition"}),e.jsx("p",{className:"text-muted-foreground text-sm hidden sm:block",children:"Define agents, their capabilities, and configurations"})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx(h,{variant:"ghost",size:"sm",asChild:!0,children:e.jsx(v,{to:"/context/agents",className:"text-muted-foreground hover:text-foreground transition-colors",children:e.jsx(y,{className:"w-4 h-4"})})}),e.jsxs(h,{onClick:u,disabled:o,size:"sm",children:[e.jsx(N,{className:"w-4 h-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:o?"Saving...":"Save"})]})]})]}),e.jsxs(m,{children:[e.jsx(C,{children:e.jsx(S,{children:"Agents Documentation"})}),e.jsx(x,{children:e.jsx(w,{value:a,onChange:s=>i(s||""),placeholder:`Write your agents definition in markdown...
1
+ import{u as p,a as j,r as n,A as l,j as e,B as h,L as v,a5 as N}from"./index-CJjOSL3x.js";import{C as m,a as x,b as C,c as S}from"./card-ClTppZkC.js";import{M as w}from"./markdown-editor-ClbNJOVl.js";import{A as y}from"./arrow-left-B2qdn6F8.js";import{C as A}from"./circle-check-big-_7cw_xX7.js";import"./index-CBMKhVK-.js";function F(){const f=p(),{toast:t}=j(),[a,i]=n.useState(""),[g,r]=n.useState(!0),[o,c]=n.useState(!1);n.useEffect(()=>{fetch(`${l}/api/v1/context/agents`).then(s=>s.json()).then(s=>{s.success&&i(s.document.content.trim()),r(!1)}).catch(s=>{console.error("Failed to load context:",s),t({title:"Error",description:"Failed to load agents definition",variant:"destructive"}),r(!1)})},[t]);const u=async()=>{c(!0);try{const d=await(await fetch(`${l}/api/v1/context/agents`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:a,metadata:{}})})).json();if(d.success)t({title:"Success",description:"Agents definition saved successfully",action:e.jsx(A,{className:"h-4 w-4"})}),f("/context/agents");else throw new Error(d.error||"Failed to save")}catch(s){console.error("Save error:",s),t({title:"Error",description:"Failed to save agents definition",variant:"destructive"})}finally{c(!1)}};return g?e.jsx("div",{className:"space-y-6",children:e.jsx(m,{children:e.jsx(x,{className:"pt-6",children:e.jsx("div",{className:"text-center",children:e.jsx("p",{children:"Loading..."})})})})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-xl sm:text-2xl font-bold tracking-tight",children:"Edit Agents Definition"}),e.jsx("p",{className:"text-muted-foreground text-sm hidden sm:block",children:"Define agents, their capabilities, and configurations"})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx(h,{variant:"ghost",size:"sm",asChild:!0,children:e.jsx(v,{to:"/context/agents",className:"text-muted-foreground hover:text-foreground transition-colors",children:e.jsx(y,{className:"w-4 h-4"})})}),e.jsxs(h,{onClick:u,disabled:o,size:"sm",children:[e.jsx(N,{className:"w-4 h-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:o?"Saving...":"Save"})]})]})]}),e.jsxs(m,{children:[e.jsx(C,{children:e.jsx(S,{children:"Agents Documentation"})}),e.jsx(x,{children:e.jsx(w,{value:a,onChange:s=>i(s||""),placeholder:`Write your agents definition in markdown...
2
2
 
3
3
  ## Agent Definitions
4
4
 
@@ -1 +1 @@
1
- import{a as g,r as t,A as N,j as e,v,az as C,B as a,L as d,a2 as l,M as w,ay as y,au as E}from"./index-KsEHBRky.js";import{C as i,a as c,b}from"./card-DsVpjlQD.js";import{c as A}from"./clipboard-B9ndUJKl.js";function D(){const{toast:r}=g(),[o,m]=t.useState(null),[x,h]=t.useState(!0),[u,n]=t.useState(!1);t.useEffect(()=>{fetch(`${N}/api/v1/context/agents`).then(s=>{if(s.ok)return s.json();throw new Error("Not found")}).then(s=>{s.success?(m(s.document),n(!0)):n(!1)}).catch(()=>{n(!1)}).finally(()=>{h(!1)})},[]);const p=async()=>{const s=".nut/context/agents.md";try{await A(s),r({title:"Copied!",description:`Path ${s} copied to clipboard`})}catch(f){console.error("Failed to copy path:",f),r({title:"Error",description:"Failed to copy path to clipboard",variant:"destructive"})}},j=()=>{const s=new CustomEvent("discuss-in-chat",{detail:{type:"context",id:"agents-md",filename:"agents.md",name:"agents.md",path:".nut/context/agents.md"}});window.dispatchEvent(s)};return x?e.jsx("div",{className:"space-y-6",children:e.jsx(i,{children:e.jsx(c,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-center",children:[e.jsx(v,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-2 text-muted-foreground",children:"Loading agents definition..."})]})})})}):!u||!o?e.jsx("div",{className:"space-y-6",children:e.jsx(i,{children:e.jsx(c,{className:"pt-6",children:e.jsxs("div",{className:"text-center",children:[e.jsx(C,{className:"mx-auto h-12 w-12 text-muted-foreground"}),e.jsx("h3",{className:"mt-4 text-lg font-semibold",children:"No Agents Definition Found"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:"Agents definition will appear here once created."}),e.jsx(a,{className:"mt-4",asChild:!0,children:e.jsxs(d,{to:"/context/agents/edit",children:[e.jsx(l,{className:"h-4 w-4 mr-2"}),"Create Agents Definition"]})})]})})})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Agents"}),e.jsx("p",{className:"text-muted-foreground",children:"Agent definitions and configurations"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(a,{variant:"outline",size:"sm",onClick:j,children:[e.jsx(w,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Discuss"})]}),e.jsxs(a,{variant:"outline",size:"sm",onClick:p,children:[e.jsx(y,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Copy Path"})]}),e.jsx(a,{size:"sm",asChild:!0,children:e.jsxs(d,{to:"/context/agents/edit",children:[e.jsx(l,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Edit"})]})})]})]}),e.jsxs(i,{children:[e.jsx(b,{className:"pb-0"}),e.jsx(c,{children:e.jsx("div",{className:"prose prose-sm max-w-none dark:prose-invert",children:e.jsx(E,{children:o.content||"No content available"})})})]})]})}export{D as default};
1
+ import{a as g,r as t,A as N,j as e,v,az as C,B as a,L as d,a2 as l,M as w,ay as y,au as E}from"./index-CJjOSL3x.js";import{C as i,a as c,b}from"./card-ClTppZkC.js";import{c as A}from"./clipboard-B9ndUJKl.js";function D(){const{toast:r}=g(),[o,m]=t.useState(null),[x,h]=t.useState(!0),[u,n]=t.useState(!1);t.useEffect(()=>{fetch(`${N}/api/v1/context/agents`).then(s=>{if(s.ok)return s.json();throw new Error("Not found")}).then(s=>{s.success?(m(s.document),n(!0)):n(!1)}).catch(()=>{n(!1)}).finally(()=>{h(!1)})},[]);const p=async()=>{const s=".nut/context/agents.md";try{await A(s),r({title:"Copied!",description:`Path ${s} copied to clipboard`})}catch(f){console.error("Failed to copy path:",f),r({title:"Error",description:"Failed to copy path to clipboard",variant:"destructive"})}},j=()=>{const s=new CustomEvent("discuss-in-chat",{detail:{type:"context",id:"agents-md",filename:"agents.md",name:"agents.md",path:".nut/context/agents.md"}});window.dispatchEvent(s)};return x?e.jsx("div",{className:"space-y-6",children:e.jsx(i,{children:e.jsx(c,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-center",children:[e.jsx(v,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-2 text-muted-foreground",children:"Loading agents definition..."})]})})})}):!u||!o?e.jsx("div",{className:"space-y-6",children:e.jsx(i,{children:e.jsx(c,{className:"pt-6",children:e.jsxs("div",{className:"text-center",children:[e.jsx(C,{className:"mx-auto h-12 w-12 text-muted-foreground"}),e.jsx("h3",{className:"mt-4 text-lg font-semibold",children:"No Agents Definition Found"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:"Agents definition will appear here once created."}),e.jsx(a,{className:"mt-4",asChild:!0,children:e.jsxs(d,{to:"/context/agents/edit",children:[e.jsx(l,{className:"h-4 w-4 mr-2"}),"Create Agents Definition"]})})]})})})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Agents"}),e.jsx("p",{className:"text-muted-foreground",children:"Agent definitions and configurations"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(a,{variant:"outline",size:"sm",onClick:j,children:[e.jsx(w,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Discuss"})]}),e.jsxs(a,{variant:"outline",size:"sm",onClick:p,children:[e.jsx(y,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Copy Path"})]}),e.jsx(a,{size:"sm",asChild:!0,children:e.jsxs(d,{to:"/context/agents/edit",children:[e.jsx(l,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Edit"})]})})]})]}),e.jsxs(i,{children:[e.jsx(b,{className:"pb-0"}),e.jsx(c,{children:e.jsx("div",{className:"prose prose-sm max-w-none dark:prose-invert",children:e.jsx(E,{children:o.content||"No content available"})})})]})]})}export{D as default};
@@ -1,2 +1,2 @@
1
- import{t as R,r as t,E as y,j as e,B as a,P as X,bH as Y,Q as J,D as j,b as g,d as v,f,g as A,I as F,a1 as N,ai as Q,w as i}from"./index-KsEHBRky.js";import{C as W,b as G,c as V,d as Z,a as _}from"./card-DsVpjlQD.js";import{L as w}from"./label-C7u95hG_.js";import{B as ee}from"./badge-Bxf1EyrV.js";import{A as I,a as C}from"./alert-DsJ9cGcq.js";import{I as L}from"./info-Cdbs194H.js";import{C as se}from"./circle-alert-BkW33Nsy.js";function oe(){const{authEnabled:n}=R(),[P,k]=t.useState([]),[b,K]=t.useState(!0),[O,l]=t.useState(!1),[M,d]=t.useState(!1),[x,D]=t.useState(""),[h,E]=t.useState("never"),[c,S]=t.useState(null),[m,o]=t.useState(null);t.useEffect(()=>{p()},[]);const p=async()=>{K(!0);try{const s=await y("/api/v1/api-keys");s.success&&k(s.data?.apiKeys||[])}catch(s){console.error("Failed to load API keys:",s),k([])}finally{K(!1)}},U=async()=>{if(!x.trim()){i({title:"Error",description:"Please provide a name for the API key",variant:"destructive"});return}try{const s={name:x,scopes:["*"]};h!=="never"&&(s.expiresIn=h);const r=await y("/api/v1/api-keys",{method:"POST",body:JSON.stringify(s)});r.success&&(S(r.data),l(!1),d(!0),D(""),E("never"),await p(),i({title:"API Key Created",description:"Make sure to copy your API key now. You won't be able to see it again!"}))}catch(s){console.error("Failed to create API key:",s),i({title:"Error",description:"Failed to create API key",variant:"destructive"})}},B=async s=>{try{(await y(`/api/v1/api-keys/${s}`,{method:"DELETE"})).success&&(await p(),o(null),i({title:"API Key Deleted",description:"The API key has been permanently deleted"}))}catch(r){console.error("Failed to delete API key:",r),i({title:"Error",description:"Failed to delete API key",variant:"destructive"})}},H=async s=>{try{await navigator.clipboard.writeText(s),i({title:"Copied",description:"API key copied to clipboard"})}catch{i({title:"Error",description:"Failed to copy to clipboard",variant:"destructive"})}},u=s=>new Date(s).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),$=s=>s?new Date(s)<new Date:!1,q=typeof window<"u"?window.location.origin:"http://localhost:3000",z=c?`curl -H "X-API-Key: ${c.key}" \\
1
+ import{t as R,r as t,E as y,j as e,B as a,P as X,bH as Y,Q as J,D as j,b as g,d as v,f,g as A,I as F,a1 as N,ai as Q,w as i}from"./index-CJjOSL3x.js";import{C as W,b as G,c as V,d as Z,a as _}from"./card-ClTppZkC.js";import{L as w}from"./label-ENwgDlxz.js";import{B as ee}from"./badge-CnihwoO_.js";import{A as I,a as C}from"./alert-BblaPWI4.js";import{I as L}from"./info-On5lSg5-.js";import{C as se}from"./circle-alert-DLogptcc.js";function oe(){const{authEnabled:n}=R(),[P,k]=t.useState([]),[b,K]=t.useState(!0),[O,l]=t.useState(!1),[M,d]=t.useState(!1),[x,D]=t.useState(""),[h,E]=t.useState("never"),[c,S]=t.useState(null),[m,o]=t.useState(null);t.useEffect(()=>{p()},[]);const p=async()=>{K(!0);try{const s=await y("/api/v1/api-keys");s.success&&k(s.data?.apiKeys||[])}catch(s){console.error("Failed to load API keys:",s),k([])}finally{K(!1)}},U=async()=>{if(!x.trim()){i({title:"Error",description:"Please provide a name for the API key",variant:"destructive"});return}try{const s={name:x,scopes:["*"]};h!=="never"&&(s.expiresIn=h);const r=await y("/api/v1/api-keys",{method:"POST",body:JSON.stringify(s)});r.success&&(S(r.data),l(!1),d(!0),D(""),E("never"),await p(),i({title:"API Key Created",description:"Make sure to copy your API key now. You won't be able to see it again!"}))}catch(s){console.error("Failed to create API key:",s),i({title:"Error",description:"Failed to create API key",variant:"destructive"})}},B=async s=>{try{(await y(`/api/v1/api-keys/${s}`,{method:"DELETE"})).success&&(await p(),o(null),i({title:"API Key Deleted",description:"The API key has been permanently deleted"}))}catch(r){console.error("Failed to delete API key:",r),i({title:"Error",description:"Failed to delete API key",variant:"destructive"})}},H=async s=>{try{await navigator.clipboard.writeText(s),i({title:"Copied",description:"API key copied to clipboard"})}catch{i({title:"Error",description:"Failed to copy to clipboard",variant:"destructive"})}},u=s=>new Date(s).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),$=s=>s?new Date(s)<new Date:!1,q=typeof window<"u"?window.location.origin:"http://localhost:3000",z=c?`curl -H "X-API-Key: ${c.key}" \\
2
2
  + ${q}/api/v1/tasks`:"",T=n?null:e.jsxs(I,{children:[e.jsx(L,{className:"h-4 w-4"}),e.jsxs(C,{children:["Authentication is currently disabled. API keys will only be required once you enable authentication in the ",e.jsx("a",{href:"/settings/authentication",className:"underline",children:"Authentication settings"}),"."]})]});return!n&&b?e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-medium",children:"API Keys"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Manage API keys for programmatic access"})]}),T]}):b?e.jsx("div",{className:"space-y-6",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-medium",children:"API Keys"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Loading..."})]})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-medium",children:"API Keys"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Manage API keys for programmatic access to your Coconut instance"})]}),T,n&&e.jsxs(I,{children:[e.jsx(L,{className:"h-4 w-4"}),e.jsxs(C,{children:["API keys provide programmatic access to your Coconut instance. Use them in CI/CD pipelines or automation scripts by including the key in the ",e.jsx("code",{className:"bg-muted px-1 py-0.5 rounded",children:"X-API-Key"})," header."]})]}),e.jsxs(W,{children:[e.jsx(G,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(V,{children:"Active API Keys"}),e.jsx(Z,{children:"API keys you've created for programmatic access"})]}),e.jsxs(a,{onClick:()=>l(!0),disabled:!n,children:[e.jsx(X,{className:"mr-2 h-4 w-4"}),"Create API Key"]})]})}),e.jsx(_,{children:P.length===0?e.jsxs("div",{className:"text-center py-8 text-muted-foreground",children:[e.jsx(Y,{className:"h-12 w-12 mx-auto mb-4 opacity-20"}),e.jsx("p",{children:"No API keys yet"}),e.jsx("p",{className:"text-sm",children:"Create an API key to get started with programmatic access"})]}):e.jsx("div",{className:"space-y-4",children:P.map(s=>e.jsxs("div",{className:"flex items-center justify-between p-4 border rounded-lg",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("p",{className:"font-medium",children:s.name}),$(s.expiresAt)&&e.jsx(ee,{variant:"destructive",children:"Expired"})]}),e.jsx("p",{className:"text-sm text-muted-foreground font-mono",children:s.keyPreview}),e.jsxs("div",{className:"flex items-center gap-4 mt-2 text-xs text-muted-foreground",children:[e.jsxs("span",{children:["Created: ",u(s.createdAt)]}),s.expiresAt&&e.jsxs("span",{children:["Expires: ",u(s.expiresAt)]}),s.lastUsedAt&&e.jsxs("span",{children:["Last used: ",u(s.lastUsedAt)]})]})]}),e.jsx(a,{variant:"ghost",size:"icon",onClick:()=>o(s.id),children:e.jsx(J,{className:"h-4 w-4 text-destructive"})})]},s.id))})})]}),e.jsx(j,{open:O,onOpenChange:l,children:e.jsxs(g,{children:[e.jsxs(v,{children:[e.jsx(f,{children:"Create API Key"}),e.jsx(A,{children:"Create a new API key for programmatic access. The key will only be shown once."})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{htmlFor:"keyName",children:"Name"}),e.jsx(F,{id:"keyName",placeholder:"CI/CD Pipeline",value:x,onChange:s=>D(s.target.value)}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"A descriptive name to identify this API key"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{htmlFor:"keyExpiry",children:"Expiration"}),e.jsxs("select",{id:"keyExpiry",className:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm",value:h,onChange:s=>E(s.target.value),children:[e.jsx("option",{value:"never",children:"Never"}),e.jsx("option",{value:"30d",children:"30 days"}),e.jsx("option",{value:"90d",children:"90 days"}),e.jsx("option",{value:"1y",children:"1 year"})]})]})]}),e.jsxs(N,{children:[e.jsx(a,{variant:"outline",onClick:()=>l(!1),children:"Cancel"}),e.jsx(a,{onClick:U,disabled:!n,children:"Create API Key"})]})]})}),e.jsx(j,{open:M,onOpenChange:d,children:e.jsxs(g,{className:"sm:max-w-[600px]",children:[e.jsxs(v,{children:[e.jsx(f,{children:"API Key Created"}),e.jsx(A,{children:"Make sure to copy your API key now. You won't be able to see it again!"})]}),e.jsxs(I,{variant:"destructive",className:"my-4",children:[e.jsx(se,{className:"h-4 w-4"}),e.jsx(C,{children:"This is the only time you will see this key. Store it securely."})]}),c&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(w,{children:"API Key"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(F,{readOnly:!0,value:c.key,className:"font-mono text-sm"}),e.jsx(a,{variant:"outline",size:"icon",onClick:()=>H(c.key),children:e.jsx(Q,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:[e.jsx("p",{className:"mb-2",children:"Usage example:"}),e.jsx("pre",{className:"bg-muted p-3 rounded-md whitespace-pre-wrap break-words",children:e.jsx("code",{className:"font-mono text-xs",children:z})})]})]}),e.jsx(N,{children:e.jsx(a,{onClick:()=>{d(!1),S(null)},children:"I've Saved My Key"})})]})}),e.jsx(j,{open:!!m,onOpenChange:s=>!s&&o(null),children:e.jsxs(g,{children:[e.jsxs(v,{children:[e.jsx(f,{children:"Delete API Key"}),e.jsx(A,{children:"Are you sure you want to delete this API key? This action cannot be undone and any scripts using this key will stop working."})]}),e.jsxs(N,{children:[e.jsx(a,{variant:"outline",onClick:()=>o(null),children:"Cancel"}),e.jsx(a,{variant:"destructive",onClick:()=>m&&B(m),children:"Delete API Key"})]})]})})]})}export{oe as default};
@@ -1,4 +1,4 @@
1
- import{c as te,t as me,r as n,E as l,j as e,bB as _,i as H,D as q,a0 as z,B as d,b as B,d as Y,f as K,g as Q,I as x,a1 as G,J as ge,N as je,Q as pe,R as ve,U as fe,V as we,W as ye,Y as Ce,_ as Ne,$ as Se,w as r}from"./index-KsEHBRky.js";import{C as m,b as g,c as j,d as p,a as v}from"./card-DsVpjlQD.js";import{L as c}from"./label-C7u95hG_.js";import{S as X,a as Z,b as ee,c as se,d as a}from"./select-Dciu_1Ss.js";import{S as N}from"./switch-L2iiB8W5.js";import{B as F}from"./badge-Bxf1EyrV.js";import{C as be}from"./circle-alert-BkW33Nsy.js";import"./index-DZkYftDX.js";import"./chevron-up-CNXvBkCN.js";/**
1
+ import{c as te,t as me,r as n,E as l,j as e,bB as _,i as H,D as q,a0 as z,B as d,b as B,d as Y,f as K,g as Q,I as x,a1 as G,J as ge,N as je,Q as pe,R as ve,U as fe,V as we,W as ye,Y as Ce,_ as Ne,$ as Se,w as r}from"./index-CJjOSL3x.js";import{C as m,b as g,c as j,d as p,a as v}from"./card-ClTppZkC.js";import{L as c}from"./label-ENwgDlxz.js";import{S as X,a as Z,b as ee,c as se,d as a}from"./select-Cft45rTz.js";import{S as N}from"./switch-N26zinJT.js";import{B as F}from"./badge-CnihwoO_.js";import{C as be}from"./circle-alert-DLogptcc.js";import"./index-CBMKhVK-.js";import"./chevron-up-DmV7RyoW.js";/**
2
2
  * @license lucide-react v0.542.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as m,j as e,v as x,A as f}from"./index-KsEHBRky.js";import{C as w}from"./circle-check-LOdxtkNO.js";import{C as b}from"./circle-x-C74Z3CmY.js";const r="coconut/github-auth-state";function j(s){try{window.opener&&window.opener.postMessage({type:"github-auth",...s},window.location.origin)}catch{}}const y=()=>{const[s,d]=m.useState("pending"),[h,p]=m.useState("Authorizing GitHub…");return m.useEffect(()=>{const a=new URLSearchParams(window.location.search),u=a.get("error"),l=a.get("token"),n=a.get("expires_at")||a.get("expiresAt"),c=a.get("state"),o=t=>{j(t),d(t.success?"success":"error"),p(t.message),setTimeout(()=>{try{window.close()}catch{}},1200)};if(u){localStorage.removeItem(r),o({success:!1,message:decodeURIComponent(u)});return}if(!l||!n||!c){localStorage.removeItem(r),o({success:!1,message:"Missing authorization parameters. Please try again."});return}const g=localStorage.getItem(r);if(!g||g!==c){localStorage.removeItem(r),o({success:!1,message:"Authorization state mismatch. Please start again."});return}(async()=>{try{const t=await fetch(`${f}/api/v1/git/providers/github/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:l,expiresAt:n,state:c})}),i=await t.json();if(!t.ok||!i.success)throw new Error(i?.error?.message||"Failed to store GitHub token");localStorage.removeItem(r),o({success:!0,message:"GitHub connected successfully!",expiresAt:i.data?.expiresAt||n})}catch(t){localStorage.removeItem(r),o({success:!1,message:t?.message||"Failed to store GitHub token. Please try again."})}})()},[]),e.jsx("div",{className:"flex h-screen items-center justify-center bg-background px-6",children:e.jsxs("div",{className:"max-w-sm rounded-lg border bg-card p-6 text-center shadow-sm",children:[e.jsxs("div",{className:"mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted",children:[s==="pending"&&e.jsx(x,{className:"h-6 w-6 animate-spin text-muted-foreground"}),s==="success"&&e.jsx(w,{className:"h-6 w-6 text-green-600"}),s==="error"&&e.jsx(b,{className:"h-6 w-6 text-red-600"})]}),e.jsx("h1",{className:"text-lg font-semibold",children:"GitHub Authorization"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:h}),s!=="pending"&&e.jsx("p",{className:"mt-4 text-xs text-muted-foreground",children:"You can close this window and return to Coconut."})]})})};export{y as default};
1
+ import{r as m,j as e,v as x,A as f}from"./index-CJjOSL3x.js";import{C as w}from"./circle-check-WnW2gKuY.js";import{C as b}from"./circle-x-Cy-GEE0N.js";const r="coconut/github-auth-state";function j(s){try{window.opener&&window.opener.postMessage({type:"github-auth",...s},window.location.origin)}catch{}}const y=()=>{const[s,d]=m.useState("pending"),[h,p]=m.useState("Authorizing GitHub…");return m.useEffect(()=>{const a=new URLSearchParams(window.location.search),u=a.get("error"),l=a.get("token"),n=a.get("expires_at")||a.get("expiresAt"),c=a.get("state"),o=t=>{j(t),d(t.success?"success":"error"),p(t.message),setTimeout(()=>{try{window.close()}catch{}},1200)};if(u){localStorage.removeItem(r),o({success:!1,message:decodeURIComponent(u)});return}if(!l||!n||!c){localStorage.removeItem(r),o({success:!1,message:"Missing authorization parameters. Please try again."});return}const g=localStorage.getItem(r);if(!g||g!==c){localStorage.removeItem(r),o({success:!1,message:"Authorization state mismatch. Please start again."});return}(async()=>{try{const t=await fetch(`${f}/api/v1/git/providers/github/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:l,expiresAt:n,state:c})}),i=await t.json();if(!t.ok||!i.success)throw new Error(i?.error?.message||"Failed to store GitHub token");localStorage.removeItem(r),o({success:!0,message:"GitHub connected successfully!",expiresAt:i.data?.expiresAt||n})}catch(t){localStorage.removeItem(r),o({success:!1,message:t?.message||"Failed to store GitHub token. Please try again."})}})()},[]),e.jsx("div",{className:"flex h-screen items-center justify-center bg-background px-6",children:e.jsxs("div",{className:"max-w-sm rounded-lg border bg-card p-6 text-center shadow-sm",children:[e.jsxs("div",{className:"mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted",children:[s==="pending"&&e.jsx(x,{className:"h-6 w-6 animate-spin text-muted-foreground"}),s==="success"&&e.jsx(w,{className:"h-6 w-6 text-green-600"}),s==="error"&&e.jsx(b,{className:"h-6 w-6 text-red-600"})]}),e.jsx("h1",{className:"text-lg font-semibold",children:"GitHub Authorization"}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:h}),s!=="pending"&&e.jsx("p",{className:"mt-4 text-xs text-muted-foreground",children:"You can close this window and return to Coconut."})]})})};export{y as default};
@@ -1 +1 @@
1
- import{u as E,x as S,t as j,r as i,j as e,v,y as p,z as y,E as C,O as k,w as N}from"./index-KsEHBRky.js";function I(){const c=E(),[a]=S(),{oauth:t,refreshUser:u,isLoading:l}=j(),[w,r]=i.useState("working"),[b,s]=i.useState(null),d=i.useRef(!1);return i.useEffect(()=>{if(d.current||l)return;d.current=!0,(async()=>{const g=a.get("code"),h=a.get("error");if(h){r("error"),s(a.get("error_description")||h);return}if(!g){r("error"),s("Missing authorization code in callback URL");return}if(!t.enabled||!t.clientId||!t.issuer){r("error"),s("OAuth is not enabled on this coconut");return}let o=null;try{o=sessionStorage.getItem(p)}catch{o=null}if(!o){r("error"),s("Missing PKCE verifier - please start sign-in again");return}try{const n=await y({issuer:t.issuer,clientId:t.clientId,code:g,verifier:o});if(!n.id_token)throw new Error('Clerk did not return an id_token (is the "openid" scope registered for this client?)');const m=await C("/api/v1/auth/oauth/exchange",{method:"POST",body:JSON.stringify({idToken:n.id_token})});if(!m.success)throw new Error(m.error||"Server rejected OAuth token");try{sessionStorage.removeItem(p)}catch{}await u();let f="/";try{const x=sessionStorage.getItem(k);x&&(sessionStorage.removeItem(k),f=x)}catch{}N({title:"Welcome back",description:"Signed in with Coconut"}),c(f,{replace:!0})}catch(n){console.error("OAuth callback failed:",n),r("error"),s(n?.message||"OAuth callback failed")}})()},[l,c,t,u,a]),e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gradient-to-br from-background to-muted p-4",children:e.jsx("div",{className:"max-w-sm text-center space-y-4",children:w==="working"?e.jsxs(e.Fragment,{children:[e.jsx(v,{className:"h-8 w-8 animate-spin text-muted-foreground mx-auto"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Finishing sign-in with Coconut..."})]}):e.jsxs(e.Fragment,{children:[e.jsx("h1",{className:"text-lg font-semibold",children:"Sign-in failed"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:b||"Something went wrong completing OAuth sign-in."}),e.jsx("button",{type:"button",className:"text-sm underline",onClick:()=>c("/login",{replace:!0}),children:"Back to login"})]})})})}export{I as default};
1
+ import{u as E,x as S,t as j,r as i,j as e,v,y as p,z as y,E as C,O as k,w as N}from"./index-CJjOSL3x.js";function I(){const c=E(),[a]=S(),{oauth:t,refreshUser:u,isLoading:l}=j(),[w,r]=i.useState("working"),[b,s]=i.useState(null),d=i.useRef(!1);return i.useEffect(()=>{if(d.current||l)return;d.current=!0,(async()=>{const g=a.get("code"),h=a.get("error");if(h){r("error"),s(a.get("error_description")||h);return}if(!g){r("error"),s("Missing authorization code in callback URL");return}if(!t.enabled||!t.clientId||!t.issuer){r("error"),s("OAuth is not enabled on this coconut");return}let o=null;try{o=sessionStorage.getItem(p)}catch{o=null}if(!o){r("error"),s("Missing PKCE verifier - please start sign-in again");return}try{const n=await y({issuer:t.issuer,clientId:t.clientId,code:g,verifier:o});if(!n.id_token)throw new Error('Clerk did not return an id_token (is the "openid" scope registered for this client?)');const m=await C("/api/v1/auth/oauth/exchange",{method:"POST",body:JSON.stringify({idToken:n.id_token})});if(!m.success)throw new Error(m.error||"Server rejected OAuth token");try{sessionStorage.removeItem(p)}catch{}await u();let f="/";try{const x=sessionStorage.getItem(k);x&&(sessionStorage.removeItem(k),f=x)}catch{}N({title:"Welcome back",description:"Signed in with Coconut"}),c(f,{replace:!0})}catch(n){console.error("OAuth callback failed:",n),r("error"),s(n?.message||"OAuth callback failed")}})()},[l,c,t,u,a]),e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gradient-to-br from-background to-muted p-4",children:e.jsx("div",{className:"max-w-sm text-center space-y-4",children:w==="working"?e.jsxs(e.Fragment,{children:[e.jsx(v,{className:"h-8 w-8 animate-spin text-muted-foreground mx-auto"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Finishing sign-in with Coconut..."})]}):e.jsxs(e.Fragment,{children:[e.jsx("h1",{className:"text-lg font-semibold",children:"Sign-in failed"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:b||"Something went wrong completing OAuth sign-in."}),e.jsx("button",{type:"button",className:"text-sm underline",onClick:()=>c("/login",{replace:!0}),children:"Back to login"})]})})})}export{I as default};
@@ -1,2 +1,2 @@
1
- import{u as ce,a as de,r as i,j as e,B as r,T as oe,n as M,X as me,F as xe,a2 as he,D as ue,b as fe,d as pe,f as je,k as ge,a8 as B,a9 as R,aa as H,ab as L,ac as O,ad as G,o as ve,A as T}from"./index-KsEHBRky.js";import{C as g,b as Ne,a as _,c as ye}from"./card-DsVpjlQD.js";import{B as U}from"./badge-Bxf1EyrV.js";import{u as we}from"./use-terminal-Cnq9znc5.js";import{T as Se}from"./terminal-preview-DiK9IM0K.js";import{S as Ce,a as be,b as ke,c as Ae,d as w}from"./select-Dciu_1Ss.js";import{b as De,e as Me,d as Te,c as Ie,a as $e}from"./pipeline-builders-DrEjlsbH.js";import{R as Ee}from"./refresh-cw-BqkCBkLp.js";import{C as Pe,a as ze}from"./chevrons-up-BJi_UX1t.js";import{P as Fe}from"./play-_qXymnTe.js";import{C as Be}from"./code-BIqa_V0g.js";import{C as Re}from"./chevron-up-CNXvBkCN.js";import{S as He}from"./server-D2vtReXL.js";import"./xterm-DTxiCjtJ.js";import"./index-DZkYftDX.js";const Le=c=>c?Array.isArray(c)?c.filter(x=>typeof x=="string").map(x=>x.trim()).filter(Boolean):typeof c=="string"?c.split(",").map(x=>x.trim()).filter(Boolean):[]:[];function ts(){const c=ce(),{sessions:x,loading:b,error:I,refreshSessions:S,createSession:V,destroySession:K}=we(),{toast:v}=de(),[$,W]=i.useState([]),[q,X]=i.useState(!0),[j,k]=i.useState(()=>({})),[A,N]=i.useState(!1),[f,J]=i.useState("claude"),[E,Q]=i.useState(""),[D,P]=i.useState(!1),[h,Y]=i.useState([]),[p,y]=i.useState([]),[Z,ee]=i.useState({}),[u,se]=i.useState([]),[o,C]=i.useState([]),te=s=>{const t=Date.now(),a=new Date(s).getTime(),n=Math.max(0,Math.floor((t-a)/1e3));if(n<60)return`${n}s ago`;const d=Math.floor(n/60);if(d<60)return`${d}m ago`;const l=Math.floor(d/60);return l<24?`${l}h ago`:`${Math.floor(l/24)}d ago`};i.useEffect(()=>{(async()=>{try{const t=await fetch(`${T}/api/v1/tasks`);if(t.ok){const a=await t.json(),n=a.data||a;W(Array.isArray(n)?n:[])}}catch(t){console.error("Error loading tasks:",t)}finally{X(!1)}})()},[]),i.useEffect(()=>{S()},[S]),i.useEffect(()=>{if(!A)return;(async()=>{try{const t=await fetch(`${T}/api/v1/mcp`);if(t.ok){const a=await t.json();a?.success&&Array.isArray(a.servers)&&(Y(a.servers),y(n=>n.filter(d=>a.servers.includes(d))),a.mcpServers&&typeof a.mcpServers=="object"&&ee(a.mcpServers))}}catch(t){console.error("Failed to load MCP servers",t)}try{const t=await fetch(`${T}/api/v1/skills`);if(t.ok){const a=await t.json(),d=(Array.isArray(a?.documents)?a.documents:[]).map(l=>({id:l.id,name:l?.metadata?.name||l.id,mcpServers:Le(l?.metadata?.metadata?.mcpServers)}));se(d),C(l=>l.filter(F=>d.some(le=>le.id===F)))}}catch(t){console.error("Failed to load skills",t)}})()},[A]),i.useEffect(()=>{o.length!==0&&y(s=>{const t=new Set(s),a=h.length>0?new Set(h):void 0;return o.forEach(n=>{const d=u.find(l=>l.id===n);d&&d.mcpServers.forEach(l=>{(!a||a.has(l))&&t.add(l)})}),Array.from(t)})},[o,u,h]);const m=i.useMemo(()=>x.filter(s=>s.taskId?.startsWith("cp-")||s.taskId?.startsWith("ag-")).sort((s,t)=>new Date(t.lastActivity).getTime()-new Date(s.lastActivity).getTime()),[x]);i.useEffect(()=>{k(s=>{const t={...s};return m.forEach(a=>{a.id in t||(t[a.id]=!0)}),t})},[m]);const z=i.useMemo(()=>$.filter(s=>s.status==="draft"||s.status==="ready").sort((s,t)=>new Date(t.metadata.createdAt).getTime()-new Date(s.metadata.createdAt).getTime()).slice(0,3),[$]),ae=()=>{const s=m.every(a=>j[a.id]),t={};m.forEach(a=>{t[a.id]=!s}),k(t)},ie=m.length>0&&m.every(s=>j[s.id]),ne=async s=>{await K(s)?(v({title:"Session closed",description:s}),setTimeout(()=>S(),100)):v({title:"Failed to close session",description:s,variant:"destructive"})},re=async()=>{P(!0);try{const s=`session-${Date.now()}`,t={taskId:s,contextType:"change-task",cliAgent:f,mcpServersMap:Z,selectedMcpServers:p,skills:u,selectedSkillIds:o,automationEnabled:!1,customInstruction:E.trim(),includeDefaultInstructions:!1};let a="";f==="claude"?a=De(t):f==="gemini"?a=Me(t):f==="codex"?a=Te(t):f==="droid"?a=Ie(t):f==="kiro"&&(a=$e(t)),await V(s,a)?(v({title:"Coding session started",description:`Session ${s} created`}),N(!1),c(`/terminal/${s}`)):v({title:"Failed to start session",description:"Could not create terminal session",variant:"destructive"})}catch(s){console.error("Error starting coding session:",s),v({title:"Error",description:"Failed to start coding session",variant:"destructive"})}finally{P(!1)}};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Agents"}),e.jsx("p",{className:"text-muted-foreground hidden sm:block",children:"Manage agents and their active sessions"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(r,{variant:"outline",size:"sm",onClick:()=>S(),disabled:b,children:[e.jsx(Ee,{className:`h-4 w-4 sm:mr-2 ${b?"animate-spin":""}`}),e.jsx("span",{className:"hidden sm:inline",children:"Refresh"})]}),m.length>0&&e.jsx(r,{variant:"outline",size:"sm",onClick:ae,children:ie?e.jsxs(e.Fragment,{children:[e.jsx(Pe,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Hide All"})]}):e.jsxs(e.Fragment,{children:[e.jsx(ze,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Show All"})]})}),e.jsxs(r,{size:"sm",onClick:()=>N(!0),children:[e.jsx(Fe,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Interactive Session"})]})]})]}),I&&e.jsx("div",{className:"p-4 bg-red-50 border border-red-200 rounded-lg",children:e.jsx("div",{className:"text-red-600",children:I})}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:"Sessions"}),b?e.jsx("div",{className:"space-y-2",children:[...Array(2)].map((s,t)=>e.jsx(g,{className:"p-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"h-4 w-4 rounded bg-muted animate-pulse"}),e.jsxs("div",{children:[e.jsx("div",{className:"h-4 w-40 bg-muted rounded animate-pulse mb-2"}),e.jsx("div",{className:"h-3 w-24 bg-muted rounded animate-pulse"})]})]}),e.jsx("div",{className:"h-6 w-20 bg-muted rounded animate-pulse"})]})},t))}):m.length===0?e.jsx(g,{className:"p-8",children:e.jsxs("div",{className:"flex flex-col items-center justify-center text-center space-y-3",children:[e.jsx(Be,{className:"h-12 w-12 text-muted-foreground"}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-lg mb-2",children:"No active sessions"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Get started by launching an"," ",e.jsx("button",{onClick:()=>N(!0),className:"text-primary hover:underline font-medium",children:"Interactive Session"})," ","or working on a"," ",e.jsx("button",{onClick:()=>c("/tasks"),className:"text-primary hover:underline font-medium",children:"New Task"})]})]})]})}):e.jsx("div",{className:"space-y-2",children:m.slice(0,10).map(s=>e.jsxs(g,{className:"p-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(oe,{className:"h-4 w-4 shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"font-medium text-sm",children:s.taskId}),e.jsxs("div",{className:"text-xs text-gray-500",children:["Session ",s.id.split("-").slice(-1)[0].substring(0,8)," • Last activity ",te(s.lastActivity)]})]})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[e.jsx("div",{className:`flex items-center gap-1 ${s.connected?"text-green-600":"text-gray-400"}`,title:s.connected?"Connected":"Disconnected",children:e.jsx("div",{className:`w-2 h-2 rounded-full ${s.connected?"bg-green-500":"bg-gray-400"}`})}),e.jsx(r,{size:"sm",variant:"outline",onClick:()=>{k(t=>({...t,[s.id]:!t[s.id]}))},"aria-label":j[s.id]?"Hide preview":"Show preview",title:j[s.id]?"Hide preview":"Show preview",children:j[s.id]?e.jsx(Re,{className:"h-4 w-4"}):e.jsx(M,{className:"h-4 w-4"})}),e.jsx(r,{size:"sm",variant:"outline",onClick:()=>c(`/terminal/${s.taskId}`),children:"Open"}),e.jsx(r,{size:"icon",variant:"destructive",onClick:()=>ne(s.id),title:"Close session","aria-label":"Close session",children:e.jsx(me,{className:"h-4 w-4"})})]})]}),j[s.id]&&e.jsx("div",{className:"mt-2 w-full p-2 cursor-pointer hover:opacity-80 transition-opacity",onClick:()=>c(`/terminal/${s.taskId}`),title:"Click to open full terminal session",children:e.jsx(Se,{sessionId:s.id,heightPx:160,maxScrollback:200})})]},s.id))})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:"New Tasks"}),q?e.jsx("div",{className:"space-y-3",children:[...Array(3)].map((s,t)=>e.jsx(g,{children:e.jsx(Ne,{className:"py-3",children:e.jsxs("div",{className:"flex justify-between items-start",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"h-4 bg-muted rounded w-2/3 animate-pulse"}),e.jsx("div",{className:"h-3 bg-muted rounded w-1/3 animate-pulse"})]}),e.jsx("div",{className:"h-5 bg-muted rounded w-16 animate-pulse"})]})})},t))}):z.length===0?e.jsx(g,{children:e.jsx(_,{className:"flex items-center justify-center py-6",children:e.jsx("div",{className:"text-center text-sm text-gray-500",children:"No draft or approved tasks found"})})}):e.jsx("div",{className:"space-y-2",children:z.map(s=>e.jsx(g,{className:"hover:shadow-md transition-all cursor-pointer hover:border-primary/50",onClick:()=>c(`/terminal/${s.id}`),children:e.jsx(_,{className:"py-4",children:e.jsx("div",{className:"flex justify-between items-start gap-4",children:e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsx(ye,{className:"text-base leading-tight",children:s.title||s.intent}),e.jsxs("div",{className:"flex gap-1 ml-3 flex-shrink-0",children:[s.priority&&e.jsx(U,{variant:s.priority==="high"||s.priority==="critical"?"destructive":s.priority==="medium"?"secondary":"outline",className:"text-xs",children:s.priority}),e.jsx(U,{variant:"default",className:"text-xs",children:s.status})]})]}),s.content&&e.jsxs("div",{className:"text-sm text-muted-foreground leading-relaxed",children:[s.content.split(`
1
+ import{u as ce,a as de,r as i,j as e,B as r,T as oe,n as M,X as me,F as xe,a2 as he,D as ue,b as fe,d as pe,f as je,k as ge,a8 as B,a9 as R,aa as H,ab as L,ac as O,ad as G,o as ve,A as T}from"./index-CJjOSL3x.js";import{C as g,b as Ne,a as _,c as ye}from"./card-ClTppZkC.js";import{B as U}from"./badge-CnihwoO_.js";import{u as we}from"./use-terminal-C8IG41zB.js";import{T as Se}from"./terminal-preview-BpviO4IZ.js";import{S as Ce,a as be,b as ke,c as Ae,d as w}from"./select-Cft45rTz.js";import{b as De,e as Me,d as Te,c as Ie,a as $e}from"./pipeline-builders-DrEjlsbH.js";import{R as Ee}from"./refresh-cw-4aDPS4Ma.js";import{C as Pe,a as ze}from"./chevrons-up-CaytjQin.js";import{P as Fe}from"./play-dMLqfItH.js";import{C as Be}from"./code-BlCNWFR0.js";import{C as Re}from"./chevron-up-DmV7RyoW.js";import{S as He}from"./server-RIrco6rM.js";import"./xterm-DTxiCjtJ.js";import"./index-CBMKhVK-.js";const Le=c=>c?Array.isArray(c)?c.filter(x=>typeof x=="string").map(x=>x.trim()).filter(Boolean):typeof c=="string"?c.split(",").map(x=>x.trim()).filter(Boolean):[]:[];function ts(){const c=ce(),{sessions:x,loading:b,error:I,refreshSessions:S,createSession:V,destroySession:K}=we(),{toast:v}=de(),[$,W]=i.useState([]),[q,X]=i.useState(!0),[j,k]=i.useState(()=>({})),[A,N]=i.useState(!1),[f,J]=i.useState("claude"),[E,Q]=i.useState(""),[D,P]=i.useState(!1),[h,Y]=i.useState([]),[p,y]=i.useState([]),[Z,ee]=i.useState({}),[u,se]=i.useState([]),[o,C]=i.useState([]),te=s=>{const t=Date.now(),a=new Date(s).getTime(),n=Math.max(0,Math.floor((t-a)/1e3));if(n<60)return`${n}s ago`;const d=Math.floor(n/60);if(d<60)return`${d}m ago`;const l=Math.floor(d/60);return l<24?`${l}h ago`:`${Math.floor(l/24)}d ago`};i.useEffect(()=>{(async()=>{try{const t=await fetch(`${T}/api/v1/tasks`);if(t.ok){const a=await t.json(),n=a.data||a;W(Array.isArray(n)?n:[])}}catch(t){console.error("Error loading tasks:",t)}finally{X(!1)}})()},[]),i.useEffect(()=>{S()},[S]),i.useEffect(()=>{if(!A)return;(async()=>{try{const t=await fetch(`${T}/api/v1/mcp`);if(t.ok){const a=await t.json();a?.success&&Array.isArray(a.servers)&&(Y(a.servers),y(n=>n.filter(d=>a.servers.includes(d))),a.mcpServers&&typeof a.mcpServers=="object"&&ee(a.mcpServers))}}catch(t){console.error("Failed to load MCP servers",t)}try{const t=await fetch(`${T}/api/v1/skills`);if(t.ok){const a=await t.json(),d=(Array.isArray(a?.documents)?a.documents:[]).map(l=>({id:l.id,name:l?.metadata?.name||l.id,mcpServers:Le(l?.metadata?.metadata?.mcpServers)}));se(d),C(l=>l.filter(F=>d.some(le=>le.id===F)))}}catch(t){console.error("Failed to load skills",t)}})()},[A]),i.useEffect(()=>{o.length!==0&&y(s=>{const t=new Set(s),a=h.length>0?new Set(h):void 0;return o.forEach(n=>{const d=u.find(l=>l.id===n);d&&d.mcpServers.forEach(l=>{(!a||a.has(l))&&t.add(l)})}),Array.from(t)})},[o,u,h]);const m=i.useMemo(()=>x.filter(s=>s.taskId?.startsWith("cp-")||s.taskId?.startsWith("ag-")).sort((s,t)=>new Date(t.lastActivity).getTime()-new Date(s.lastActivity).getTime()),[x]);i.useEffect(()=>{k(s=>{const t={...s};return m.forEach(a=>{a.id in t||(t[a.id]=!0)}),t})},[m]);const z=i.useMemo(()=>$.filter(s=>s.status==="draft"||s.status==="ready").sort((s,t)=>new Date(t.metadata.createdAt).getTime()-new Date(s.metadata.createdAt).getTime()).slice(0,3),[$]),ae=()=>{const s=m.every(a=>j[a.id]),t={};m.forEach(a=>{t[a.id]=!s}),k(t)},ie=m.length>0&&m.every(s=>j[s.id]),ne=async s=>{await K(s)?(v({title:"Session closed",description:s}),setTimeout(()=>S(),100)):v({title:"Failed to close session",description:s,variant:"destructive"})},re=async()=>{P(!0);try{const s=`session-${Date.now()}`,t={taskId:s,contextType:"change-task",cliAgent:f,mcpServersMap:Z,selectedMcpServers:p,skills:u,selectedSkillIds:o,automationEnabled:!1,customInstruction:E.trim(),includeDefaultInstructions:!1};let a="";f==="claude"?a=De(t):f==="gemini"?a=Me(t):f==="codex"?a=Te(t):f==="droid"?a=Ie(t):f==="kiro"&&(a=$e(t)),await V(s,a)?(v({title:"Coding session started",description:`Session ${s} created`}),N(!1),c(`/terminal/${s}`)):v({title:"Failed to start session",description:"Could not create terminal session",variant:"destructive"})}catch(s){console.error("Error starting coding session:",s),v({title:"Error",description:"Failed to start coding session",variant:"destructive"})}finally{P(!1)}};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold tracking-tight",children:"Agents"}),e.jsx("p",{className:"text-muted-foreground hidden sm:block",children:"Manage agents and their active sessions"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(r,{variant:"outline",size:"sm",onClick:()=>S(),disabled:b,children:[e.jsx(Ee,{className:`h-4 w-4 sm:mr-2 ${b?"animate-spin":""}`}),e.jsx("span",{className:"hidden sm:inline",children:"Refresh"})]}),m.length>0&&e.jsx(r,{variant:"outline",size:"sm",onClick:ae,children:ie?e.jsxs(e.Fragment,{children:[e.jsx(Pe,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Hide All"})]}):e.jsxs(e.Fragment,{children:[e.jsx(ze,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Show All"})]})}),e.jsxs(r,{size:"sm",onClick:()=>N(!0),children:[e.jsx(Fe,{className:"h-4 w-4 sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Interactive Session"})]})]})]}),I&&e.jsx("div",{className:"p-4 bg-red-50 border border-red-200 rounded-lg",children:e.jsx("div",{className:"text-red-600",children:I})}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:"Sessions"}),b?e.jsx("div",{className:"space-y-2",children:[...Array(2)].map((s,t)=>e.jsx(g,{className:"p-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"h-4 w-4 rounded bg-muted animate-pulse"}),e.jsxs("div",{children:[e.jsx("div",{className:"h-4 w-40 bg-muted rounded animate-pulse mb-2"}),e.jsx("div",{className:"h-3 w-24 bg-muted rounded animate-pulse"})]})]}),e.jsx("div",{className:"h-6 w-20 bg-muted rounded animate-pulse"})]})},t))}):m.length===0?e.jsx(g,{className:"p-8",children:e.jsxs("div",{className:"flex flex-col items-center justify-center text-center space-y-3",children:[e.jsx(Be,{className:"h-12 w-12 text-muted-foreground"}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-lg mb-2",children:"No active sessions"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Get started by launching an"," ",e.jsx("button",{onClick:()=>N(!0),className:"text-primary hover:underline font-medium",children:"Interactive Session"})," ","or working on a"," ",e.jsx("button",{onClick:()=>c("/tasks"),className:"text-primary hover:underline font-medium",children:"New Task"})]})]})]})}):e.jsx("div",{className:"space-y-2",children:m.slice(0,10).map(s=>e.jsxs(g,{className:"p-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(oe,{className:"h-4 w-4 shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"font-medium text-sm",children:s.taskId}),e.jsxs("div",{className:"text-xs text-gray-500",children:["Session ",s.id.split("-").slice(-1)[0].substring(0,8)," • Last activity ",te(s.lastActivity)]})]})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[e.jsx("div",{className:`flex items-center gap-1 ${s.connected?"text-green-600":"text-gray-400"}`,title:s.connected?"Connected":"Disconnected",children:e.jsx("div",{className:`w-2 h-2 rounded-full ${s.connected?"bg-green-500":"bg-gray-400"}`})}),e.jsx(r,{size:"sm",variant:"outline",onClick:()=>{k(t=>({...t,[s.id]:!t[s.id]}))},"aria-label":j[s.id]?"Hide preview":"Show preview",title:j[s.id]?"Hide preview":"Show preview",children:j[s.id]?e.jsx(Re,{className:"h-4 w-4"}):e.jsx(M,{className:"h-4 w-4"})}),e.jsx(r,{size:"sm",variant:"outline",onClick:()=>c(`/terminal/${s.taskId}`),children:"Open"}),e.jsx(r,{size:"icon",variant:"destructive",onClick:()=>ne(s.id),title:"Close session","aria-label":"Close session",children:e.jsx(me,{className:"h-4 w-4"})})]})]}),j[s.id]&&e.jsx("div",{className:"mt-2 w-full p-2 cursor-pointer hover:opacity-80 transition-opacity",onClick:()=>c(`/terminal/${s.taskId}`),title:"Click to open full terminal session",children:e.jsx(Se,{sessionId:s.id,heightPx:160,maxScrollback:200})})]},s.id))})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:"New Tasks"}),q?e.jsx("div",{className:"space-y-3",children:[...Array(3)].map((s,t)=>e.jsx(g,{children:e.jsx(Ne,{className:"py-3",children:e.jsxs("div",{className:"flex justify-between items-start",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"h-4 bg-muted rounded w-2/3 animate-pulse"}),e.jsx("div",{className:"h-3 bg-muted rounded w-1/3 animate-pulse"})]}),e.jsx("div",{className:"h-5 bg-muted rounded w-16 animate-pulse"})]})})},t))}):z.length===0?e.jsx(g,{children:e.jsx(_,{className:"flex items-center justify-center py-6",children:e.jsx("div",{className:"text-center text-sm text-gray-500",children:"No draft or approved tasks found"})})}):e.jsx("div",{className:"space-y-2",children:z.map(s=>e.jsx(g,{className:"hover:shadow-md transition-all cursor-pointer hover:border-primary/50",onClick:()=>c(`/terminal/${s.id}`),children:e.jsx(_,{className:"py-4",children:e.jsx("div",{className:"flex justify-between items-start gap-4",children:e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsx(ye,{className:"text-base leading-tight",children:s.title||s.intent}),e.jsxs("div",{className:"flex gap-1 ml-3 flex-shrink-0",children:[s.priority&&e.jsx(U,{variant:s.priority==="high"||s.priority==="critical"?"destructive":s.priority==="medium"?"secondary":"outline",className:"text-xs",children:s.priority}),e.jsx(U,{variant:"default",className:"text-xs",children:s.status})]})]}),s.content&&e.jsxs("div",{className:"text-sm text-muted-foreground leading-relaxed",children:[s.content.split(`
2
2
  `).slice(0,2).join(" ").substring(0,150),s.content.length>150?"...":""]}),e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsxs("div",{className:"text-xs text-muted-foreground",children:[s.id," • by ",s.author.name," • ",new Date(s.metadata.createdAt).toLocaleDateString()]}),e.jsxs("div",{className:"flex gap-2",onClick:t=>t.stopPropagation(),children:[e.jsxs(r,{variant:"ghost",size:"sm",onClick:()=>c(`/tasks/${s.id}`),className:"h-7 px-2 text-xs",children:[e.jsx(xe,{className:"h-3 w-3 mr-1"})," View"]}),e.jsxs(r,{variant:"ghost",size:"sm",onClick:()=>c(`/tasks/${s.id}/edit`),className:"h-7 px-2 text-xs",children:[e.jsx(he,{className:"h-3 w-3 mr-1"})," Edit"]})]})]})]})})})},s.id))})]}),e.jsx(ue,{open:A,onOpenChange:N,children:e.jsxs(fe,{className:"max-w-lg",children:[e.jsxs(pe,{children:[e.jsx(je,{children:"Start Agent"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Start an interactive session"})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium mb-2 block",children:"Agent"}),e.jsxs(Ce,{value:f,onValueChange:s=>J(s),children:[e.jsx(be,{className:"w-full",children:e.jsx(ke,{placeholder:"Select coding agent"})}),e.jsxs(Ae,{children:[e.jsx(w,{value:"claude",children:"Claude Code"}),e.jsx(w,{value:"gemini",children:"Google Gemini"}),e.jsx(w,{value:"codex",children:"OpenAI Codex"}),e.jsx(w,{value:"droid",children:"Factory Droid"}),e.jsx(w,{value:"kiro",children:"Kiro"})]})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("div",{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(ge,{className:"h-4 w-4"}),"Skills"]}),e.jsxs("div",{className:"text-xs text-gray-500",children:[o.length," of ",u.length," selected"]})]}),e.jsxs(B,{children:[e.jsx(R,{asChild:!0,children:e.jsxs(r,{variant:"outline",className:"w-full justify-between",children:[o.length===0?"Select skills...":o.length===u.length?"All skills selected":`${o.length} skill${o.length!==1?"s":""} selected`,e.jsx(M,{className:"h-4 w-4 opacity-50"})]})}),e.jsxs(H,{className:"w-full min-w-[--radix-dropdown-menu-trigger-width]",children:[e.jsxs(L,{className:"flex items-center justify-between",children:[e.jsx("span",{children:"Available Skills"}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(r,{size:"sm",variant:"ghost",className:"h-5 px-1 text-xs",onClick:s=>{s.preventDefault(),C(u.map(t=>t.id))},children:"All"}),e.jsx(r,{size:"sm",variant:"ghost",className:"h-5 px-1 text-xs",onClick:s=>{s.preventDefault(),C([])},children:"None"})]})]}),e.jsx(O,{}),u.length===0?e.jsx("div",{className:"px-2 py-1.5 text-sm text-gray-500",children:"No skills found"}):u.map(s=>e.jsx(G,{checked:o.includes(s.id),onCheckedChange:t=>{C(a=>t?a.includes(s.id)?a:[...a,s.id]:a.filter(n=>n!==s.id))},children:e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{children:s.name}),s.mcpServers.length>0&&e.jsxs("span",{className:"text-xs text-muted-foreground",children:["MCP servers: ",s.mcpServers.join(", ")]}),s.mcpServers.length===0&&e.jsx("span",{className:"text-xs text-muted-foreground",children:"Inherits available MCP servers"})]})},s.id))]})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("div",{className:"text-sm font-medium flex items-center gap-2",children:[e.jsx(He,{className:"h-4 w-4"}),"MCP Servers"]}),e.jsxs("div",{className:"text-xs text-gray-500",children:[p.length," of ",h.length," selected"]})]}),e.jsxs(B,{children:[e.jsx(R,{asChild:!0,children:e.jsxs(r,{variant:"outline",className:"w-full justify-between",children:[p.length===0?"Select MCP servers...":p.length===h.length?"All servers selected":`${p.length} server${p.length!==1?"s":""} selected`,e.jsx(M,{className:"h-4 w-4 opacity-50"})]})}),e.jsxs(H,{className:"w-full min-w-[--radix-dropdown-menu-trigger-width]",children:[e.jsxs(L,{className:"flex items-center justify-between",children:[e.jsx("span",{children:"Available Servers"}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(r,{size:"sm",variant:"ghost",className:"h-5 px-1 text-xs",onClick:s=>{s.preventDefault(),y(h)},children:"All"}),e.jsx(r,{size:"sm",variant:"ghost",className:"h-5 px-1 text-xs",onClick:s=>{s.preventDefault(),y([])},children:"None"})]})]}),e.jsx(O,{}),h.length===0?e.jsx("div",{className:"px-2 py-1.5 text-sm text-gray-500",children:"No MCP servers found"}):h.map(s=>e.jsx(G,{checked:p.includes(s),onCheckedChange:t=>{y(a=>t?a.includes(s)?a:[...a,s]:a.filter(n=>n!==s))},children:s},s))]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-sm font-medium mb-2 block",children:"Additional Instructions (optional)"}),e.jsx(ve,{value:E,onChange:s=>Q(s.target.value),placeholder:"Add any custom instructions for the coding agent...",rows:4,className:"resize-none"})]}),e.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[e.jsx(r,{variant:"outline",onClick:()=>N(!1),disabled:D,children:"Cancel"}),e.jsx(r,{onClick:re,disabled:D,children:D?"Starting...":"Start Session"})]})]})]})})]})}export{ts as default};
@@ -1 +1 @@
1
- import{r as x,j as e,e as a,n as m}from"./index-KsEHBRky.js";function u({title:n,description:t,icon:r,defaultOpen:o=!1,children:i,className:l}){const[s,d]=x.useState(o);return e.jsxs("div",{className:a("rounded-lg border bg-card text-card-foreground",l),children:[e.jsxs("button",{type:"button",onClick:()=>d(c=>!c),className:"flex w-full items-center justify-between gap-4 px-4 py-3 text-left","aria-expanded":s,children:[e.jsxs("div",{className:"flex items-center gap-3",children:[r,e.jsxs("div",{children:[e.jsx("p",{className:"font-medium leading-tight",children:n}),t&&e.jsx("p",{className:"text-sm text-muted-foreground leading-snug",children:t})]})]}),e.jsx(m,{className:a("h-4 w-4 shrink-0 transition-transform duration-200",s?"rotate-180":"rotate-0")})]}),s&&e.jsx("div",{className:"border-t px-4 py-4",children:i})]})}export{u as C};
1
+ import{r as x,j as e,e as a,n as m}from"./index-CJjOSL3x.js";function u({title:n,description:t,icon:r,defaultOpen:o=!1,children:i,className:l}){const[s,d]=x.useState(o);return e.jsxs("div",{className:a("rounded-lg border bg-card text-card-foreground",l),children:[e.jsxs("button",{type:"button",onClick:()=>d(c=>!c),className:"flex w-full items-center justify-between gap-4 px-4 py-3 text-left","aria-expanded":s,children:[e.jsxs("div",{className:"flex items-center gap-3",children:[r,e.jsxs("div",{children:[e.jsx("p",{className:"font-medium leading-tight",children:n}),t&&e.jsx("p",{className:"text-sm text-muted-foreground leading-snug",children:t})]})]}),e.jsx(m,{className:a("h-4 w-4 shrink-0 transition-transform duration-200",s?"rotate-180":"rotate-0")})]}),s&&e.jsx("div",{className:"border-t px-4 py-4",children:i})]})}export{u as C};
@@ -1,4 +1,4 @@
1
- import{c as b,u as Re,a as Le,r as l,j as e,D as De,b as Ie,d as te,e as f,f as ae,g as ne,S as re,B as d,C as le,I as B,h as G,i as Pe,G as _e,F as qe,k as ue,Z as We,l as ze,m as Fe,T as ce,n as Ve,o as Be,L as v,P as Ee,M as Ke,K as A,p as g,q as $e,A as Ge}from"./index-KsEHBRky.js";import{C as h,a as u,b as R,c as L,d as ie}from"./card-DsVpjlQD.js";import{B as He}from"./badge-Bxf1EyrV.js";import{g as Oe}from"./status-utils-PwF3DXLL.js";import{L as Ye}from"./label-C7u95hG_.js";import{S as oe,a as de,b as me,c as xe,d as E}from"./select-Dciu_1Ss.js";import{u as Qe}from"./use-terminal-Cnq9znc5.js";import{T as Ue}from"./terminal-preview-DiK9IM0K.js";import{C as Ze}from"./circle-check-LOdxtkNO.js";import{C as Je}from"./chevron-left-0TsDJ16V.js";import{S as Xe}from"./search-CcuUi4yp.js";import{G as es}from"./globe-CBPRUXdZ.js";import{C as ss}from"./code-BIqa_V0g.js";import{F as ts}from"./folder-git-2-D7zmxRhq.js";import{E as as}from"./external-link-CvIS_OjZ.js";import{P as ns}from"./play-_qXymnTe.js";import{C as rs}from"./clock-BBA6hrv0.js";import{C as ls}from"./circle-check-big-DiJRbG5s.js";import"./index-DZkYftDX.js";import"./chevron-up-CNXvBkCN.js";import"./xterm-DTxiCjtJ.js";/**
1
+ import{c as b,u as Re,a as Le,r as l,j as e,D as De,b as Ie,d as te,e as f,f as ae,g as ne,S as re,B as d,C as le,I as B,h as G,i as Pe,G as _e,F as qe,k as ue,Z as We,l as ze,m as Fe,T as ce,n as Ve,o as Be,L as v,P as Ee,M as Ke,K as A,p as g,q as $e,A as Ge}from"./index-CJjOSL3x.js";import{C as h,a as u,b as R,c as L,d as ie}from"./card-ClTppZkC.js";import{B as He}from"./badge-CnihwoO_.js";import{g as Oe}from"./status-utils-PwF3DXLL.js";import{L as Ye}from"./label-ENwgDlxz.js";import{S as oe,a as de,b as me,c as xe,d as E}from"./select-Cft45rTz.js";import{u as Qe}from"./use-terminal-C8IG41zB.js";import{T as Ue}from"./terminal-preview-BpviO4IZ.js";import{C as Ze}from"./circle-check-WnW2gKuY.js";import{C as Je}from"./chevron-left-B6cdF33u.js";import{S as Xe}from"./search-BKZ_bHPJ.js";import{G as es}from"./globe-CawEz_y2.js";import{C as ss}from"./code-BlCNWFR0.js";import{F as ts}from"./folder-git-2-DjFQ-1Nl.js";import{E as as}from"./external-link-B62Uv2FB.js";import{P as ns}from"./play-dMLqfItH.js";import{C as rs}from"./clock-BqpT33TV.js";import{C as ls}from"./circle-check-big-_7cw_xX7.js";import"./index-CBMKhVK-.js";import"./chevron-up-DmV7RyoW.js";import"./xterm-DTxiCjtJ.js";/**
2
2
  * @license lucide-react v0.542.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as le,A as l,bK as ws,r as n,a as vs,ag as ys,j as e,L as ee,l as Fe,B as o,G as D,ae as Ns,X as Cs,I as k,n as Me,Q as Be,D as se,b as te,d as ae,f as re,g as ne,bH as ks,a1 as Oe}from"./index-KsEHBRky.js";import{C as ie}from"./card-DsVpjlQD.js";import{L as Re}from"./label-C7u95hG_.js";import{T as Ss,a as Ps,b as Ge,c as We}from"./tabs-D3vdicG-.js";import{C as Ts}from"./circle-check-LOdxtkNO.js";import{C as As}from"./circle-x-C74Z3CmY.js";import{A as Ds}from"./arrow-down-DZvXMao-.js";import{A as Es}from"./arrow-up-DM2JrUfI.js";import{R as ze}from"./refresh-cw-BqkCBkLp.js";import{C as ce}from"./circle-alert-BkW33Nsy.js";import{C as Ue}from"./chevron-up-CNXvBkCN.js";import{F as oe}from"./folder-git-2-D7zmxRhq.js";/**
1
+ import{c as le,A as l,bK as ws,r as n,a as vs,ag as ys,j as e,L as ee,l as Fe,B as o,G as D,ae as Ns,X as Cs,I as k,n as Me,Q as Be,D as se,b as te,d as ae,f as re,g as ne,bH as ks,a1 as Oe}from"./index-CJjOSL3x.js";import{C as ie}from"./card-ClTppZkC.js";import{L as Re}from"./label-ENwgDlxz.js";import{T as Ss,a as Ps,b as Ge,c as We}from"./tabs-94xo_fGd.js";import{C as Ts}from"./circle-check-WnW2gKuY.js";import{C as As}from"./circle-x-Cy-GEE0N.js";import{A as Ds}from"./arrow-down-5wVLzm2P.js";import{A as Es}from"./arrow-up-BUq8ttsr.js";import{R as ze}from"./refresh-cw-4aDPS4Ma.js";import{C as ce}from"./circle-alert-DLogptcc.js";import{C as Ue}from"./chevron-up-DmV7RyoW.js";import{F as oe}from"./folder-git-2-DjFQ-1Nl.js";/**
2
2
  * @license lucide-react v0.542.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as He,r,a as Te,A as u,j as e,bB as he,B as o,Q as Fe,v as De,bH as ze,I as U,D as W,b as B,d as q,f as J,g as K,a1 as Y}from"./index-KsEHBRky.js";import{C as xe,b as pe,c as ge,d as fe,a as be}from"./card-DsVpjlQD.js";import{L as f}from"./label-C7u95hG_.js";import{R as Me,a as je}from"./radio-group-CzLMiZME.js";import{R as A}from"./refresh-cw-BqkCBkLp.js";import{E as ve}from"./external-link-CvIS_OjZ.js";import{C as Oe}from"./circle-check-LOdxtkNO.js";import{C as Ie}from"./circle-x-C74Z3CmY.js";/**
1
+ import{c as He,r,a as Te,A as u,j as e,bB as he,B as o,Q as Fe,v as De,bH as ze,I as U,D as W,b as B,d as q,f as J,g as K,a1 as Y}from"./index-CJjOSL3x.js";import{C as xe,b as pe,c as ge,d as fe,a as be}from"./card-ClTppZkC.js";import{L as f}from"./label-ENwgDlxz.js";import{R as Me,a as je}from"./radio-group-BPgf2DjV.js";import{R as A}from"./refresh-cw-4aDPS4Ma.js";import{E as ve}from"./external-link-B62Uv2FB.js";import{C as Oe}from"./circle-check-WnW2gKuY.js";import{C as Ie}from"./circle-x-Cy-GEE0N.js";/**
2
2
  * @license lucide-react v0.542.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as ge,a as ve,r as u,j as e,v as se,B as x,a5 as fe,a4 as Ne,bz as Te,i as be,Z as Ce,bA as Se,I as c,o as O,ae,P as E,bB as ne,Q as we,A as ie}from"./index-KsEHBRky.js";import{C as y,b as j,c as g,d as v,a as f,e as Ae}from"./card-DsVpjlQD.js";import{L as o}from"./label-C7u95hG_.js";import{B as re}from"./badge-Bxf1EyrV.js";import{S as ke,a as Ie,b as Oe,c as Fe,d as Pe}from"./select-Dciu_1Ss.js";import{A as Ee,a as Me}from"./alert-DsJ9cGcq.js";import{T as De,a as Le,b as C,c as S}from"./tabs-D3vdicG-.js";import{E as Ue}from"./eye-DQ6K9zCD.js";import{C as _e,a as Re}from"./clipboard-B03jh_4C.js";import"./index-DZkYftDX.js";import"./chevron-up-CNXvBkCN.js";/**
1
+ import{c as ge,a as ve,r as u,j as e,v as se,B as x,a5 as fe,a4 as Ne,bz as Te,i as be,Z as Ce,bA as Se,I as c,o as O,ae,P as E,bB as ne,Q as we,A as ie}from"./index-CJjOSL3x.js";import{C as y,b as j,c as g,d as v,a as f,e as Ae}from"./card-ClTppZkC.js";import{L as o}from"./label-ENwgDlxz.js";import{B as re}from"./badge-CnihwoO_.js";import{S as ke,a as Ie,b as Oe,c as Fe,d as Pe}from"./select-Cft45rTz.js";import{A as Ee,a as Me}from"./alert-BblaPWI4.js";import{T as De,a as Le,b as C,c as S}from"./tabs-94xo_fGd.js";import{E as Ue}from"./eye-SF5oVtaC.js";import{C as _e,a as Re}from"./clipboard-BjRIfdtw.js";import"./index-CBMKhVK-.js";import"./chevron-up-DmV7RyoW.js";/**
2
2
  * @license lucide-react v0.542.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as u,j as e,e as p,B as c,Q as x,I as j,P as v}from"./index-KsEHBRky.js";import{L as r}from"./label-C7u95hG_.js";import{S,a as y,b,c as f,d as k}from"./select-Dciu_1Ss.js";/**
1
+ import{c as u,j as e,e as p,B as c,Q as x,I as j,P as v}from"./index-CJjOSL3x.js";import{L as r}from"./label-ENwgDlxz.js";import{S,a as y,b,c as f,d as k}from"./select-Cft45rTz.js";/**
2
2
  * @license lucide-react v0.542.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.