constellai 0.3.2 → 0.3.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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +2 -2
- package/.next/server/app/(app)/activity/page.js +2 -2
- package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
- package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/agents/[handle]/page.js +2 -2
- package/.next/server/app/(app)/agents/[handle]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/agents/[handle]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/code/page.js +2 -2
- package/.next/server/app/(app)/code/page.js.nft.json +1 -1
- package/.next/server/app/(app)/code/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/config/page.js +2 -2
- package/.next/server/app/(app)/config/page.js.nft.json +1 -1
- package/.next/server/app/(app)/config/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/costs/page.js +2 -2
- package/.next/server/app/(app)/costs/page.js.nft.json +1 -1
- package/.next/server/app/(app)/costs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/cron/page.js +2 -2
- package/.next/server/app/(app)/cron/page.js.nft.json +1 -1
- package/.next/server/app/(app)/cron/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/dashboard/page.js +2 -2
- package/.next/server/app/(app)/dashboard/page.js.nft.json +1 -1
- package/.next/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/design/page.js +13 -13
- package/.next/server/app/(app)/design/page.js.nft.json +1 -1
- package/.next/server/app/(app)/design/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/docs/[id]/page.js +2 -2
- package/.next/server/app/(app)/docs/[id]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/docs/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/docs/page.js +2 -2
- package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
- package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/github/page.js +1 -1
- package/.next/server/app/(app)/github/page.js.nft.json +1 -1
- package/.next/server/app/(app)/github/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/goals/page.js +2 -2
- package/.next/server/app/(app)/goals/page.js.nft.json +1 -1
- package/.next/server/app/(app)/goals/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/inbox/page.js +2 -2
- package/.next/server/app/(app)/inbox/page.js.nft.json +1 -1
- package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/knowledge/page.js +3 -3
- package/.next/server/app/(app)/knowledge/page.js.nft.json +1 -1
- package/.next/server/app/(app)/knowledge/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/models/page.js +2 -2
- package/.next/server/app/(app)/models/page.js.nft.json +1 -1
- package/.next/server/app/(app)/models/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/notifications/page.js +2 -2
- package/.next/server/app/(app)/notifications/page.js.nft.json +1 -1
- package/.next/server/app/(app)/notifications/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/org/page.js +4 -4
- package/.next/server/app/(app)/org/page.js.nft.json +1 -1
- package/.next/server/app/(app)/org/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/organizations/page.js +2 -2
- package/.next/server/app/(app)/organizations/page.js.nft.json +1 -1
- package/.next/server/app/(app)/organizations/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/page.js +3 -3
- package/.next/server/app/(app)/page.js.nft.json +1 -1
- package/.next/server/app/(app)/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/planner/page.js +2 -2
- package/.next/server/app/(app)/planner/page.js.nft.json +1 -1
- package/.next/server/app/(app)/planner/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/plugins/page.js +2 -2
- package/.next/server/app/(app)/plugins/page.js.nft.json +1 -1
- package/.next/server/app/(app)/plugins/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/pm/page.js +2 -2
- package/.next/server/app/(app)/pm/page.js.nft.json +1 -1
- package/.next/server/app/(app)/pm/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/prepare-deploy/page.js +2 -2
- package/.next/server/app/(app)/prepare-deploy/page.js.nft.json +1 -1
- package/.next/server/app/(app)/prepare-deploy/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/profile/page.js +2 -2
- package/.next/server/app/(app)/profile/page.js.nft.json +1 -1
- package/.next/server/app/(app)/profile/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/pulse/page.js +2 -2
- package/.next/server/app/(app)/pulse/page.js.nft.json +1 -1
- package/.next/server/app/(app)/pulse/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/reports/[id]/page.js +2 -2
- package/.next/server/app/(app)/reports/[id]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/reports/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/reports/page.js +3 -3
- package/.next/server/app/(app)/reports/page.js.nft.json +1 -1
- package/.next/server/app/(app)/reports/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/routines/page.js +2 -2
- package/.next/server/app/(app)/routines/page.js.nft.json +1 -1
- package/.next/server/app/(app)/routines/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/search/page.js +2 -2
- package/.next/server/app/(app)/search/page.js.nft.json +1 -1
- package/.next/server/app/(app)/search/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/security/page.js +2 -2
- package/.next/server/app/(app)/security/page.js.nft.json +1 -1
- package/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/skills/page.js +2 -2
- package/.next/server/app/(app)/skills/page.js.nft.json +1 -1
- package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/tasks/page.js +2 -2
- package/.next/server/app/(app)/tasks/page.js.nft.json +1 -1
- package/.next/server/app/(app)/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/test-dev/page.js +2 -2
- package/.next/server/app/(app)/test-dev/page.js.nft.json +1 -1
- package/.next/server/app/(app)/test-dev/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/update/page.js +3 -3
- package/.next/server/app/(app)/update/page.js.nft.json +1 -1
- package/.next/server/app/(app)/update/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(auth)/login/page.js +2 -2
- package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(auth)/onboarding/page.js +1 -1
- package/.next/server/app/(auth)/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cron/tick/route.js +2 -2
- package/.next/server/app/api/sync/file/route.js +1 -1
- package/.next/server/app/api/telegram/poll/route.js +3 -3
- package/.next/server/app/api/v1/[[...path]]/route.js +1 -1
- package/.next/server/chunks/1249.js +5 -5
- package/.next/server/chunks/259.js +1 -1
- package/.next/server/chunks/2867.js +1 -1
- package/.next/server/chunks/2960.js +1 -1
- package/.next/server/chunks/319.js +1 -0
- package/.next/server/chunks/3234.js +1 -1
- package/.next/server/chunks/4828.js +1 -0
- package/.next/server/chunks/4979.js +2 -2
- package/.next/server/chunks/5697.js +1 -0
- package/.next/server/chunks/6151.js +12 -0
- package/.next/server/chunks/6431.js +1 -1
- package/.next/server/chunks/6798.js +21 -0
- package/.next/server/chunks/{3078.js → 6903.js} +15 -15
- package/.next/server/chunks/7589.js +1 -1
- package/.next/server/chunks/7989.js +1 -1
- package/.next/server/chunks/8486.js +4 -0
- package/.next/server/chunks/8561.js +1 -1
- package/.next/server/chunks/8823.js +1 -1
- package/.next/server/chunks/9783.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/4353-12629098ed83e468.js +1 -0
- package/.next/static/chunks/4398-e798770ae782576f.js +1 -0
- package/.next/static/chunks/4428-09f7d473d9e33d59.js +1 -0
- package/.next/static/chunks/7457-c37382c6f4e115f8.js +4 -0
- package/.next/static/chunks/{7509.8d3cbebb5fbe6247.js → 7509.721cd47a931c5518.js} +1 -1
- package/.next/static/chunks/{8370-4a29b1affcb7dc68.js → 8370-6da6aa10d687b8ae.js} +2 -2
- package/.next/static/chunks/9690-00ad96a74abac075.js +1 -0
- package/.next/static/chunks/app/(app)/activity/{page-02fbf7cf46282feb.js → page-09bc1c776962737c.js} +1 -1
- package/.next/static/chunks/app/(app)/agents/[handle]/page-b11e5f8f25fb2f88.js +1 -0
- package/.next/static/chunks/app/(app)/code/{page-8f8ae22136752631.js → page-ff6925db6e10e3cc.js} +1 -1
- package/.next/static/chunks/app/(app)/config/page-4df2facd9c81adb5.js +1 -0
- package/.next/static/chunks/app/(app)/costs/{page-aadb60fb329974f3.js → page-c0a07c0283731a8c.js} +1 -1
- package/.next/static/chunks/app/(app)/cron/{page-0219c7a0530ad628.js → page-662e6e1a25b14025.js} +1 -1
- package/.next/static/chunks/app/(app)/dashboard/page-e6f62eaecc0f9926.js +1 -0
- package/.next/static/chunks/app/(app)/design/{page-f889489d70e0e839.js → page-d457cdfa525acb85.js} +3 -3
- package/.next/static/chunks/app/(app)/docs/[id]/{page-f2e1f3d72634fb4b.js → page-4a1be0c9bd6ca402.js} +1 -1
- package/.next/static/chunks/app/(app)/docs/page-e6db758a14f57ec8.js +1 -0
- package/.next/static/chunks/app/(app)/github/{page-0e47c2c1c9c927e4.js → page-57bb812627d083a1.js} +1 -1
- package/.next/static/chunks/app/(app)/goals/page-81e1af515f78e13b.js +1 -0
- package/.next/static/chunks/app/(app)/inbox/page-0baef1b01009c832.js +12 -0
- package/.next/static/chunks/app/(app)/knowledge/page-eb1317bf385e31ed.js +1 -0
- package/.next/static/chunks/app/(app)/layout-dcd4f30b53cb140f.js +1 -0
- package/.next/static/chunks/app/(app)/models/page-d73965ae6ca317e8.js +1 -0
- package/.next/static/chunks/app/(app)/notifications/page-b3ff14483cb6694e.js +12 -0
- package/.next/static/chunks/app/(app)/org/{page-30bb71b216cc152e.js → page-3075b218dbc681ce.js} +2 -2
- package/.next/static/chunks/app/(app)/organizations/page-a6d35dbb21a61b7c.js +1 -0
- package/.next/static/chunks/app/(app)/page-c9e4fc0616a0083e.js +1 -0
- package/.next/static/chunks/app/(app)/planner/{page-5177b5fd72d529f4.js → page-809dd3edda4ada93.js} +1 -1
- package/.next/static/chunks/app/(app)/plugins/page-7e2aad1b702b5c88.js +1 -0
- package/.next/static/chunks/app/(app)/pm/page-709f9ac68ac98693.js +1 -0
- package/.next/static/chunks/app/(app)/prepare-deploy/page-f9609626153c2483.js +1 -0
- package/.next/static/chunks/app/(app)/profile/page-6d22c7bd0adb7a52.js +1 -0
- package/.next/static/chunks/app/(app)/pulse/{page-a0895a89c74c1d4c.js → page-f529917828ff4884.js} +1 -1
- package/.next/static/chunks/app/(app)/reports/[id]/{page-0219c7a0530ad628.js → page-662e6e1a25b14025.js} +1 -1
- package/.next/static/chunks/app/(app)/reports/page-5248735b18767054.js +1 -0
- package/.next/static/chunks/app/(app)/routines/{page-eaba9756a33d98a6.js → page-cf4e597389865ae8.js} +1 -1
- package/.next/static/chunks/app/(app)/search/{page-d975712d07eed70d.js → page-4d1e07c4c43a7489.js} +1 -1
- package/.next/static/chunks/app/(app)/security/{page-4b126307f9963c2a.js → page-db7b8840d9cc6b72.js} +1 -1
- package/.next/static/chunks/app/(app)/skills/page-a98da9e415efc310.js +1 -0
- package/.next/static/chunks/app/(app)/tasks/page-ab33402626a50c88.js +1 -0
- package/.next/static/chunks/app/(app)/test-dev/page-34612a4b47ec9aa2.js +1 -0
- package/.next/static/chunks/app/(app)/update/page-99d63495bfdd56a9.js +1 -0
- package/.next/static/chunks/app/(auth)/login/{page-3df648bab2319a0b.js → page-c7b372a5053512f0.js} +1 -1
- package/.next/static/chunks/app/(auth)/onboarding/{page-ee09eb3fd38f3365.js → page-450bfc87fb942f9b.js} +1 -1
- package/.next/static/chunks/{main-2e2f6e1d0f3b78b1.js → main-722e16032e7764d1.js} +1 -1
- package/.next/static/chunks/webpack-222e3894b78c67db.js +1 -0
- package/.next/trace-build +1 -1
- package/CHANGELOG.md +32 -0
- package/README.md +1 -1
- package/README.pt-BR.md +1 -1
- package/bin/constella-update.mjs +44 -0
- package/docs/UPDATE.md +51 -6
- package/package.json +1 -1
- package/scripts/vps-install.sh +22 -0
- package/scripts/vps-update.sh +22 -0
- package/.next/server/chunks/104.js +0 -1
- package/.next/server/chunks/1082.js +0 -1
- package/.next/server/chunks/2359.js +0 -1
- package/.next/server/chunks/7970.js +0 -21
- package/.next/server/chunks/8071.js +0 -4
- package/.next/server/chunks/8102.js +0 -12
- package/.next/static/chunks/1068-50497be19315ccfb.js +0 -1
- package/.next/static/chunks/4991-0306ad0e6cd8cb8a.js +0 -1
- package/.next/static/chunks/6061-f3ad54a48323cba0.js +0 -1
- package/.next/static/chunks/6121-37930472292e5a6c.js +0 -4
- package/.next/static/chunks/9690-53d5222618cbeddb.js +0 -1
- package/.next/static/chunks/app/(app)/agents/[handle]/page-e3eda42a3f20e3e5.js +0 -1
- package/.next/static/chunks/app/(app)/config/page-84216e49b0b08248.js +0 -1
- package/.next/static/chunks/app/(app)/dashboard/page-1e7ecb2bdefcdc19.js +0 -1
- package/.next/static/chunks/app/(app)/docs/page-ab10f655b932f175.js +0 -1
- package/.next/static/chunks/app/(app)/goals/page-9a68e61bbc392281.js +0 -1
- package/.next/static/chunks/app/(app)/inbox/page-6ee42cdd99664d11.js +0 -12
- package/.next/static/chunks/app/(app)/knowledge/page-c02936180f61550f.js +0 -1
- package/.next/static/chunks/app/(app)/layout-7d2d377b224620c8.js +0 -1
- package/.next/static/chunks/app/(app)/models/page-8635495017d696c1.js +0 -1
- package/.next/static/chunks/app/(app)/notifications/page-72f15bd4b6289bf1.js +0 -12
- package/.next/static/chunks/app/(app)/organizations/page-50c64b60a6850870.js +0 -1
- package/.next/static/chunks/app/(app)/page-638517264806ba7e.js +0 -1
- package/.next/static/chunks/app/(app)/plugins/page-66921b5b398f2c05.js +0 -1
- package/.next/static/chunks/app/(app)/pm/page-a1f93d19d3c28627.js +0 -1
- package/.next/static/chunks/app/(app)/prepare-deploy/page-de7dc9413e3dbf82.js +0 -1
- package/.next/static/chunks/app/(app)/profile/page-e73d191fce633cd7.js +0 -1
- package/.next/static/chunks/app/(app)/reports/page-fd0b0d0fa742819e.js +0 -1
- package/.next/static/chunks/app/(app)/skills/page-f1fc99f1d15e26a4.js +0 -1
- package/.next/static/chunks/app/(app)/tasks/page-a4b78a8d76fd9432.js +0 -1
- package/.next/static/chunks/app/(app)/test-dev/page-55cef74633b3cf4c.js +0 -1
- package/.next/static/chunks/app/(app)/update/page-92764fc98b253709.js +0 -1
- package/.next/static/chunks/webpack-94c9726ec79ee4b4.js +0 -1
- /package/.next/static/{N4KMSOY3i-qyXrbfm97sO → mOVW9EdxrQ1xPT7vDdRdK}/_buildManifest.js +0 -0
- /package/.next/static/{N4KMSOY3i-qyXrbfm97sO → mOVW9EdxrQ1xPT7vDdRdK}/_ssgManifest.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,38 @@ may still introduce breaking changes while the platform stabilises.
|
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
+
## [0.3.4] — 2026-06-26 — "A VPS updates itself"
|
|
16
|
+
|
|
17
|
+
The **Update now** button finally does the whole thing on a server — no shell, no copy-paste.
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- **One-click updates on a VPS.** Pressing **Update now** in the Update module now installs the new release and
|
|
21
|
+
restarts the service **by itself**. It updates the global package, lets **systemd** cycle the unit onto the new
|
|
22
|
+
code, and the page **reloads itself** once the server answers again — it waits out the ~3s restart instead of
|
|
23
|
+
landing on a dead connection. Before, a VPS could only print the manual command for you to run.
|
|
24
|
+
- **Scoped passwordless self-update.** `vps-install.sh` (and `vps-update.sh`) now drop a tightly-scoped
|
|
25
|
+
`/etc/sudoers.d/constella` that grants the service user **NOPASSWD for exactly two commands** —
|
|
26
|
+
`npm install -g constellai[@version]` and `systemctl restart constella` — and nothing else. It's validated with
|
|
27
|
+
`visudo` before it's installed, so a malformed rule can never lock you out of sudo.
|
|
28
|
+
|
|
29
|
+
### Note
|
|
30
|
+
- **Bootstrap.** Hosts installed before 0.3.4 don't have the sudoers drop-in yet, so the **first** update still
|
|
31
|
+
uses the shell — run the VPS one-liner once
|
|
32
|
+
(`curl -fsSL …/scripts/vps-update.sh | bash`). That run writes the drop-in; **every update after is one-click**
|
|
33
|
+
from the button.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## [0.3.3] — 2026-06-26 — "Avatar photos show everywhere"
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
- **Avatar photos show in the home chat + @-mention list** — the home page passed the operator without its
|
|
41
|
+
`image`, so an uploaded operator photo never appeared there (always the "OP" initials), and the @-mention list
|
|
42
|
+
also dropped the agent image. Both now thread the saved avatar (the chat dock + sidebar already did). Avatars
|
|
43
|
+
are small data URLs in the DB.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
15
47
|
## [0.3.2] — 2026-06-26 — "Install & onboarding fixes"
|
|
16
48
|
|
|
17
49
|
A point release fixing first-run on Windows and on a VPS.
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
<p align="center">
|
|
7
7
|
<a href="#-quickstart"><img alt="npx constella" src="https://img.shields.io/badge/npx-constellai-7c3aed?style=for-the-badge&logo=npm&logoColor=white"></a>
|
|
8
|
-
<img alt="version" src="https://img.shields.io/badge/version-0.3.
|
|
8
|
+
<img alt="version" src="https://img.shields.io/badge/version-0.3.4-22d3ee?style=for-the-badge">
|
|
9
9
|
<img alt="node" src="https://img.shields.io/badge/node-%E2%89%A520-3fb950?style=for-the-badge&logo=node.js&logoColor=white">
|
|
10
10
|
<img alt="license" src="https://img.shields.io/badge/license-MIT-a78bfa?style=for-the-badge">
|
|
11
11
|
<img alt="agent CLIs" src="https://img.shields.io/badge/agent%20CLIs-claude%20%C2%B7%20codex%20%C2%B7%20%2B8-e879f9?style=for-the-badge">
|
package/README.pt-BR.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
<p align="center">
|
|
7
7
|
<a href="#-início-rápido"><img alt="npx constella" src="https://img.shields.io/badge/npx-constellai-7c3aed?style=for-the-badge&logo=npm&logoColor=white"></a>
|
|
8
|
-
<img alt="version" src="https://img.shields.io/badge/version-0.3.
|
|
8
|
+
<img alt="version" src="https://img.shields.io/badge/version-0.3.4-22d3ee?style=for-the-badge">
|
|
9
9
|
<img alt="node" src="https://img.shields.io/badge/node-%E2%89%A520-3fb950?style=for-the-badge&logo=node.js&logoColor=white">
|
|
10
10
|
<img alt="license" src="https://img.shields.io/badge/license-MIT-a78bfa?style=for-the-badge">
|
|
11
11
|
<img alt="agent CLIs" src="https://img.shields.io/badge/CLIs%20de%20agente-claude%20%C2%B7%20codex%20%C2%B7%20%2B8-e879f9?style=for-the-badge">
|
package/bin/constella-update.mjs
CHANGED
|
@@ -109,6 +109,50 @@ function relaunch() {
|
|
|
109
109
|
try { spawn("constella", ["--" + MODE], { detached: true, stdio: "ignore", shell: true, windowsHide: true, env: { ...process.env, CONSTELLA_HOME: HOME } }).unref(); } catch { /* user can start it by hand */ }
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
+
// ── VPS path ─────────────────────────────────────────────────────────────────────────────────────────────
|
|
113
|
+
// A VPS runs under systemd as a non-root service user, so it CANNOT touch the root-owned global package or
|
|
114
|
+
// `systemctl` on its own. The installer (vps-install.sh) drops a tightly-scoped /etc/sudoers.d/constella that
|
|
115
|
+
// grants NOPASSWD for EXACTLY two commands: `npm install -g constellai[@*]` and `systemctl restart constella`.
|
|
116
|
+
// So here we update via `sudo -n` and then let systemd cycle the unit (it stops this whole cgroup — us
|
|
117
|
+
// included — and starts fresh on the new code). No kill-by-pid, no relaunch: systemd owns the process.
|
|
118
|
+
const SERVICE = process.env.CONSTELLA_SERVICE || "constella";
|
|
119
|
+
|
|
120
|
+
function vpsInstall(target) {
|
|
121
|
+
const opt = { stdio: QUIET ? "ignore" : "inherit", windowsHide: true, cwd: SAFE_CWD };
|
|
122
|
+
for (let i = 0; i < 4; i++) {
|
|
123
|
+
log(`• sudo npm install -g ${target} (attempt ${i + 1}/4)…`);
|
|
124
|
+
// Prefer passwordless sudo (root-owned global prefix). Fall back to plain npm in case the prefix is
|
|
125
|
+
// already user-writable (a user-level npm prefix) — then no sudo is needed at all.
|
|
126
|
+
let r = spawnSync("sudo", ["-n", "npm", "install", "-g", target], opt);
|
|
127
|
+
if (r.status === 0) return true;
|
|
128
|
+
r = spawnSync("npm", ["install", "-g", target], { ...opt, shell: true });
|
|
129
|
+
if (r.status === 0) return true;
|
|
130
|
+
sleep(3000);
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function restartUnit() {
|
|
136
|
+
log(`• Restarting the ${SERVICE} systemd service…`);
|
|
137
|
+
// Self-restart: systemd SIGTERMs this cgroup (incl. this updater) then starts the unit fresh on the new
|
|
138
|
+
// code. The result file is already "done", so the reconnecting UI sees success. If sudo/systemctl isn't
|
|
139
|
+
// available (a non-systemd container), this no-ops and the host keeps running the old code until a manual
|
|
140
|
+
// restart — `Restart=always` does NOT help here because we didn't crash.
|
|
141
|
+
try { spawnSync("sudo", ["-n", "systemctl", "restart", SERVICE], { stdio: QUIET ? "ignore" : "inherit" }); } catch { /* manual restart needed */ }
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (MODE === "vps") {
|
|
145
|
+
result({ status: "running" });
|
|
146
|
+
if (QUIET) sleep(1200); // let the UI receive the response + start polling
|
|
147
|
+
const v = arg("--version") || "latest";
|
|
148
|
+
const target = `${PKG}@${/^\d+\.\d+\.\d+/.test(v) ? v : "latest"}`; // only a real semver or @latest (sudoers-scoped)
|
|
149
|
+
const okv = vpsInstall(target);
|
|
150
|
+
result({ status: okv ? "done" : "error" });
|
|
151
|
+
log(okv ? "✓ Installed — restarting the service." : "✖ Update failed — run by hand: sudo npm i -g constellai@latest && sudo systemctl restart constella");
|
|
152
|
+
if (okv) restartUnit();
|
|
153
|
+
process.exit(okv ? 0 : 1);
|
|
154
|
+
}
|
|
155
|
+
|
|
112
156
|
result({ status: "running" });
|
|
113
157
|
if (QUIET) sleep(1200); // let the UI receive the response + start polling
|
|
114
158
|
|
package/docs/UPDATE.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
7
|
-
**Current stable release: `v0.3.
|
|
7
|
+
**Current stable release: `v0.3.4`** — a VPS now updates itself in one click. See what changed in the
|
|
8
8
|
[Changelog](../CHANGELOG.md) (the Update module also shows it inline as “What's new”).
|
|
9
9
|
|
|
10
10
|
> This is the page the **Update** module's “docs” button opens. It tells you, in plain terms, how to move Constella
|
|
@@ -18,6 +18,40 @@ it didn't earn: the updater writes the real result and the screen reflects it tr
|
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
|
+
## 🆕 What's new — release history
|
|
22
|
+
|
|
23
|
+
Latest first. The in-app **Update** module shows the changelog inline as “What's new”; this is the same history, kept
|
|
24
|
+
here so the “docs” button always shows what each release added. Full detail: [Changelog](../CHANGELOG.md).
|
|
25
|
+
|
|
26
|
+
### v0.3.4 — a VPS updates itself
|
|
27
|
+
- **One-click updates on a VPS.** **Update now** installs the new release and restarts the service **by itself** —
|
|
28
|
+
it updates the global package, lets **systemd** cycle the unit onto the new code, and the page **reloads itself**
|
|
29
|
+
once the server is back (it waits out the restart instead of dropping a dead connection). Before, a VPS could
|
|
30
|
+
only print the manual command.
|
|
31
|
+
- **Scoped passwordless self-update.** The installer drops a tightly-scoped `/etc/sudoers.d/constella` that lets
|
|
32
|
+
the service user run **exactly two** commands without a password — `npm install -g constellai[@version]` and
|
|
33
|
+
`systemctl restart constella` — validated with `visudo` first. _Bootstrap:_ hosts installed before 0.3.4 run the
|
|
34
|
+
VPS one-liner **once** to gain the drop-in; every update after that is one-click.
|
|
35
|
+
|
|
36
|
+
### v0.3.3 — avatar photos show everywhere
|
|
37
|
+
- Operator/agent avatar photos now appear in the **home chat** and the **@-mention list** (they already showed in
|
|
38
|
+
the chat dock + sidebar).
|
|
39
|
+
|
|
40
|
+
### v0.3.2 — install & onboarding fixes
|
|
41
|
+
- `npx constellai` works on **Windows** (the package ships a matching `constellai` bin).
|
|
42
|
+
- Onboarding no longer freezes at “Setting up… 100%” — it hard-navigates to the Planner (all modes).
|
|
43
|
+
- **VPS:** the systemd service gets a real `PATH`, so it detects + runs your CLIs (Claude Code / Codex / …).
|
|
44
|
+
- Avatar photos show in the home chat + @-mention list (the operator/agent image is threaded everywhere now).
|
|
45
|
+
|
|
46
|
+
### v0.3.0 — first clean public release
|
|
47
|
+
- **Design module** — Grace prototypes the UI on a faithful, **text-only** canvas; the approved design **becomes the
|
|
48
|
+
real served frontend** (engineers extend it, never rebuild). **Live app + Inspect**: render the real running dev
|
|
49
|
+
server (any stack) and click an element to ask Grace to change it. Visual-fidelity gate + Telegram control.
|
|
50
|
+
- **Context donut** — per-conversation, per-agent token + `$` cost in the chat header.
|
|
51
|
+
- **Resilience** — agent runs retry transient failures (429 / quota / 5xx); the Design→execution handoff is idempotent + resumable.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
21
55
|
## ✦ Update from the app (recommended)
|
|
22
56
|
|
|
23
57
|
Open the **Update** module (the rocket icon, or `/update`):
|
|
@@ -57,23 +91,34 @@ constella update
|
|
|
57
91
|
|
|
58
92
|
## 🌌 How it updates, per environment
|
|
59
93
|
|
|
60
|
-
The first match wins.
|
|
61
|
-
command, because running it from the web server would be environment-specific.
|
|
94
|
+
The first match wins. A **global npm install** and a **VPS** both update themselves from the button; dev / npx /
|
|
95
|
+
portable hand you the precise command, because running it from the web server would be environment-specific.
|
|
62
96
|
|
|
63
97
|
| Environment | Auto-updates? | What to run |
|
|
64
98
|
| --- | --- | --- |
|
|
65
99
|
| **Global npm install** | ✅ in the background | `npm install -g constellai@latest` (Constella runs this for you) → then restart |
|
|
100
|
+
| **VPS (native service)** | ✅ from the button¹ | nothing — it installs + `systemctl restart`s + reloads itself |
|
|
66
101
|
| **Dev (from source)** | ❌ | `git pull && pnpm install && pnpm build` |
|
|
67
102
|
| **npx** | ❌ | `npx constellai@latest` |
|
|
68
|
-
| **VPS (native service)** | ❌ | `bash scripts/vps-update.sh` (or the curl one-liner below) |
|
|
69
103
|
| **Portable (USB)** | ❌ | `npm install -g constellai@latest` (after a free-space + backup check) |
|
|
70
104
|
|
|
105
|
+
> ¹ One-click VPS updates need the passwordless self-update drop-in (`/etc/sudoers.d/constella`) that the installer
|
|
106
|
+
> writes from **v0.3.4** on. A host installed earlier runs the VPS one-liner **once** (below) to gain it — after
|
|
107
|
+
> that, **Update now** does everything on its own.
|
|
108
|
+
|
|
71
109
|
---
|
|
72
110
|
|
|
73
111
|
## 🛰️ VPS update
|
|
74
112
|
|
|
75
|
-
|
|
76
|
-
|
|
113
|
+
**From v0.3.4 the button does it for you.** On a VPS, **Update now** installs the new release, lets systemd restart
|
|
114
|
+
the unit, and reloads the page once the server is back — no shell needed. It works because the installer grants the
|
|
115
|
+
service user passwordless rights to **exactly** `npm install -g constellai` and `systemctl restart constella`
|
|
116
|
+
(`/etc/sudoers.d/constella`, validated with `visudo`). A host first installed **before** v0.3.4 doesn't have that
|
|
117
|
+
drop-in yet, so run the one-liner below **once** — that update writes the drop-in, and every update after is
|
|
118
|
+
one-click from the button.
|
|
119
|
+
|
|
120
|
+
To update from a shell instead (or to do that first bootstrap run), use **one** of these on the VPS host. Data in
|
|
121
|
+
`~/.constella` is preserved, and the database migrations run automatically on the next boot.
|
|
77
122
|
|
|
78
123
|
```bash
|
|
79
124
|
# Native install — pull the updater straight from GitHub (no repo checkout needed):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "constellai",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "Constella — run autonomous AI agent-companies locally: real claude/codex agents, Goals → Specs → Issues → Plans, local models, GitHub & Telegram, all from one cosmic control plane.",
|
|
5
5
|
"//name": "Published as `constellai` (the unscoped `constella` was taken). Ships BOTH a `constellai` and a `constella` bin (same launcher): `npx constellai` needs a bin matching the package name to run on Windows, and a global install also gives the short `constella` command.",
|
|
6
6
|
"license": "MIT",
|
package/scripts/vps-install.sh
CHANGED
|
@@ -82,6 +82,28 @@ EOF
|
|
|
82
82
|
$SUDO systemctl daemon-reload
|
|
83
83
|
$SUDO systemctl enable --now constella
|
|
84
84
|
|
|
85
|
+
# 4b) Passwordless self-update. The service runs as a NON-root user, so it can't touch the root-owned global
|
|
86
|
+
# package or `systemctl` by itself — the in-app "Update now" button would stall waiting for a password.
|
|
87
|
+
# Drop a TIGHTLY-SCOPED /etc/sudoers.d/constella granting NOPASSWD for EXACTLY two commands: install the
|
|
88
|
+
# package and restart the unit. Nothing else. Validated with `visudo -c` before it's installed (a malformed
|
|
89
|
+
# sudoers file would lock out sudo), and skipped gracefully if validation fails.
|
|
90
|
+
say "• Enabling passwordless self-update (sudoers.d/constella)…"
|
|
91
|
+
NPM_PATH="$(command -v npm || echo /usr/bin/npm)"
|
|
92
|
+
SYSTEMCTL_PATH="$(command -v systemctl || echo /usr/bin/systemctl)"
|
|
93
|
+
SUDOERS_TMP="$(mktemp)"
|
|
94
|
+
cat > "$SUDOERS_TMP" <<EOF
|
|
95
|
+
# Constella self-update — managed by scripts/vps-install.sh. Lets ${RUN_USER} update Constella and restart
|
|
96
|
+
# its service without a password (the in-app Update button + scripts/vps-update.sh). Scoped to two commands.
|
|
97
|
+
${RUN_USER} ALL=(root) NOPASSWD: ${NPM_PATH} install -g constellai, ${NPM_PATH} install -g constellai@*, ${SYSTEMCTL_PATH} restart constella, ${SYSTEMCTL_PATH} restart constella.service
|
|
98
|
+
EOF
|
|
99
|
+
if visudo -cf "$SUDOERS_TMP" >/dev/null 2>&1; then
|
|
100
|
+
$SUDO install -m 0440 -o root -g root "$SUDOERS_TMP" /etc/sudoers.d/constella
|
|
101
|
+
say " ✓ One-click updates enabled — the Update module can install + restart on its own."
|
|
102
|
+
else
|
|
103
|
+
say " • Skipped (sudoers validation failed) — in-app VPS updates will fall back to the shell command."
|
|
104
|
+
fi
|
|
105
|
+
rm -f "$SUDOERS_TMP"
|
|
106
|
+
|
|
85
107
|
# 5) Reach URL = the host's tailnet IP.
|
|
86
108
|
sleep 2
|
|
87
109
|
IP="$(tailscale ip -4 2>/dev/null | head -1 || true)"
|
package/scripts/vps-update.sh
CHANGED
|
@@ -12,9 +12,31 @@ SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
|
|
|
12
12
|
say() { printf '%s\n' "$*"; }
|
|
13
13
|
VERSION="${1:-latest}"
|
|
14
14
|
|
|
15
|
+
# The user the service runs as (owns ~/.constella). Under sudo, the real operator.
|
|
16
|
+
RUN_USER="${SUDO_USER:-$(id -un)}"
|
|
17
|
+
|
|
15
18
|
say "• Installing ${PKG}@${VERSION}…"
|
|
16
19
|
$SUDO npm install -g "${PKG}@${VERSION}"
|
|
17
20
|
|
|
21
|
+
# Ensure the passwordless self-update drop-in exists (so the in-app "Update now" button can install + restart
|
|
22
|
+
# on its own from here on). Idempotent: re-writes the same scoped file each run. See vps-install.sh for the
|
|
23
|
+
# rationale; validated with visudo before install so a bad file can never lock out sudo.
|
|
24
|
+
if [ ! -f /etc/sudoers.d/constella ]; then
|
|
25
|
+
NPM_PATH="$(command -v npm || echo /usr/bin/npm)"
|
|
26
|
+
SYSTEMCTL_PATH="$(command -v systemctl || echo /usr/bin/systemctl)"
|
|
27
|
+
SUDOERS_TMP="$(mktemp)"
|
|
28
|
+
cat > "$SUDOERS_TMP" <<EOF
|
|
29
|
+
# Constella self-update — managed by scripts/vps-update.sh. Lets ${RUN_USER} update Constella and restart its
|
|
30
|
+
# service without a password (the in-app Update button). Scoped to two commands.
|
|
31
|
+
${RUN_USER} ALL=(root) NOPASSWD: ${NPM_PATH} install -g constellai, ${NPM_PATH} install -g constellai@*, ${SYSTEMCTL_PATH} restart constella, ${SYSTEMCTL_PATH} restart constella.service
|
|
32
|
+
EOF
|
|
33
|
+
if visudo -cf "$SUDOERS_TMP" >/dev/null 2>&1; then
|
|
34
|
+
$SUDO install -m 0440 -o root -g root "$SUDOERS_TMP" /etc/sudoers.d/constella
|
|
35
|
+
say "• Enabled passwordless one-click updates (sudoers.d/constella)."
|
|
36
|
+
fi
|
|
37
|
+
rm -f "$SUDOERS_TMP"
|
|
38
|
+
fi
|
|
39
|
+
|
|
18
40
|
if systemctl list-unit-files 2>/dev/null | grep -q '^constella\.service'; then
|
|
19
41
|
say "• Restarting the constella service…"
|
|
20
42
|
$SUDO systemctl restart constella
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=104,exports.ids=[104,7336],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},4795:(a,b,c)=>{c.d(b,{j:()=>e});var d=c(2910);let e=(0,d.createServerReference)("003f7bfd00bce6e4642889640da92a0031cf3f1506",d.callServer,void 0,d.findSourceMapURL,"devServerStatusAction")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},18612:(a,b,c)=>{c.d(b,{r$:()=>h,EX:()=>p,CS:()=>function a(b,c=""){let d=[];for(let e of l(b,c))if(e.isDir){if(m.has(e.name))continue;d.push(...a(b,e.path))}else d.push(e.path);return d},HZ:()=>j,Ci:()=>l,sL:()=>n,dx:()=>o});var d=c(73024),e=c(76760),f=c(48161),g=c(28430);function h(){return process.env.CONSTELLA_HOME?(0,g.Y)(process.env.CONSTELLA_HOME):(0,e.join)((0,f.homedir)(),".constella")}let i=new Set;function j(a){if(!/^[A-Za-z0-9_-]{6,64}$/.test(a))throw Error("Invalid orgId");let b=(0,e.join)(h(),"organizations",a,"workspace");if(!i.has(a)){i.add(a);try{let c=(0,e.join)(h(),"organizations",a,"constella"),f=!(0,d.existsSync)(b)||0===(0,d.readdirSync)(b).length;if((0,d.existsSync)(c)&&f)try{(0,d.renameSync)(c,b)}catch{(0,d.mkdirSync)(b,{recursive:!0}),0===(0,d.readdirSync)(b).length&&(0,d.cpSync)(c,b,{recursive:!0})}}catch{}}return b}function k(a,b){let c=(0,e.normalize)((0,e.join)(a,b));if(c!==a&&!c.startsWith(a+e.sep))throw Error("Path escapes workspace: "+b);if((0,d.existsSync)(a)){let f;try{f=d.realpathSync.native(a)}catch{f=a}let g=function(a){let b=a;for(;;){if((0,d.existsSync)(b))try{return d.realpathSync.native(b)}catch{return b}let a=(0,e.dirname)(b);if(a===b)return b;b=a}}(c);if(g!==f&&!g.startsWith(f+e.sep))throw Error("Path escapes workspace (symlink): "+b)}return c}function l(a,b=""){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readdirSync)(c).map(a=>{let f=(0,e.join)(c,a),g=(b?b+"/":"")+a;return{name:a,path:g,isDir:(0,d.statSync)(f).isDirectory()}}).sort((a,b)=>a.isDir===b.isDir?a.name.localeCompare(b.name):a.isDir?-1:1):[]}let m=new Set(["node_modules",".git",".next",".turbo","dist","build","out","coverage",".cache","archives",".testdev",".pnpm-store",".vercel","vendor"]);function n(a,b){let c=k(j(a),b);return(0,d.existsSync)(c)?(0,d.readFileSync)(c,"utf8"):null}function o(a,b,c){let f=k(j(a),b);(0,d.mkdirSync)((0,e.dirname)(f),{recursive:!0}),(0,d.writeFileSync)(f,c,"utf8")}function p(a,b){let c=k(j(a),b);(0,d.existsSync)(c)&&(0,d.rmSync)(c,{recursive:!0,force:!0})}},33379:(a,b,c)=>{c.r(b),c.d(b,{"0028f961902c9e2476af137bbeb472cd7073047824":()=>d.Kd,"007022a76790c9702b4391280231b2e171ccb37259":()=>d.cT,"405c3175ae584fd80327c8ee43d0a247dd50e3c25b":()=>d.j0,"40834c7dee509b9fe3747f69a43078710b318bcdf5":()=>d.OD});var d=c(14565)},47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>l});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0);async function j(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function l(a=!1){let b,c,m=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),n=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let o=await j(`https://registry.npmjs.org/${g}/latest`),p=o?.version??null,q=!!p&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))break}return!1}(p,m),r=null;if(q&&p){let a=await k("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");r=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,p):null}let s={current:m,latest:p,updateAvailable:q,type:p?(b=i(p),c=i(m),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]?"patch":null):null,command:n,changelog:r};return h={at:Date.now(),info:s},s}},51221:(a,b,c)=>{c.d(b,{ViewChrome:()=>h});var d=c(4374),e=c(43526),f=c(48442),g=c(31819);function h({title:a,sub:b,right:c,icon:i,flush:j,children:k}){let l=(0,g.k)(),m=f.e.find(b=>b.title===a),n=i??m?.icon,o=m?l(`mod.${m.id}`):a;return(0,d.jsxs)("div",{className:"app-view",children:[(0,d.jsxs)("div",{className:"view-head",children:[n&&(0,d.jsx)("div",{className:"vh-icon",children:(0,d.jsx)(e.I,{name:n,size:18})}),(0,d.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,d.jsx)("div",{className:"view-title",children:o}),b&&(0,d.jsx)("div",{className:"view-sub",children:b})]}),c]}),(0,d.jsx)("div",{className:"view-body",style:j?{padding:0,overflow:"hidden"}:void 0,children:k})]})}},52932:(a,b,c)=>{c.d(b,{pM:()=>z,lP:()=>y,Kg:()=>x,eU:()=>B,PG:()=>A});var d=c(6866),e=c(53993),f=c(30043),g=c(64567),h=c(30170);function i(){return(0,h.n)()?"dev":"vps"===(0,g.T)()?"vps":"portable"===(0,g.T)()?"portable":/[\\/]_npx[\\/]/.test((0,f.v)())?"npx":"global"}var j=c(47336),k=c(73024),l=c(76760),m=c(48161),n=c(31421),o=c(57086);let p=()=>new Date().toISOString().replace(/[:.]/g,"-"),q=()=>(0,l.join)((0,o.r$)(),"backups","last-update.json");async function r(){let a=await (0,j.checkForUpdate)(!0),b=i(),c=a.command;if(!a.updateAvailable)return{ok:!0,context:b,command:c,message:"Already up to date."};let d=function(){try{let a=(0,o.r$)(),b=(0,l.join)(a,"backups",p());for(let c of((0,k.mkdirSync)(b,{recursive:!0}),[".env","constella.db","constella.db-wal","constella.db-shm"])){let d=(0,l.join)(a,c);if((0,k.existsSync)(d))try{(0,k.copyFileSync)(d,(0,l.join)(b,c))}catch{}}return b}catch{return null}}()??void 0;return"dev"===b?{ok:!1,context:b,command:c,backupDir:d,message:"Running from source — update with: git pull && pnpm install && pnpm build"}:"npx"===b?{ok:!1,context:b,command:c,backupDir:d,message:"npx runs an ephemeral copy — re-run: npx constellai@latest"}:"vps"===b?{ok:!1,context:b,command:"bash scripts/vps-update.sh",backupDir:d,needsRestart:!0,message:"On a VPS, update from a shell: `bash scripts/vps-update.sh` (or `npm install -g constellai@latest && sudo systemctl restart constella`). Your data in ~/.constella — DB, secrets, workspaces — is preserved; migrations run on the next boot."}:function(a,b,c,d){try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let e=process.env.CONSTELLA_RUN_MODE||"start",f=process.env.CONSTELLA_LAUNCHER_PID||(process.ppid?String(process.ppid):"0"),g=(0,o.r$)(),h=process.env.PORT||"3000",i=process.env.CONSTELLA_PKG_ROOT||process.cwd(),j=(0,l.join)(i,"bin","constella-update.mjs"),r=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[j,"--quiet","--pid",f,"--mode",e,"--home",g,"--port",h,...r],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:b,command:c,backupDir:d,message:`Updating to ${a.latest} and restarting — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:b,command:c,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}(a,b,c,d)}var s=c(97603),t=c(65705),u=c(1890),v=c(10245);async function w(){let a=await t.db.select({lastPulse:u.agent.lastPulse}).from(u.agent).where((0,s.eq)(u.agent.status,"working")),b=Date.now()-v.fQ;return a.some(a=>null!=a.lastPulse&&new Date(a.lastPulse).getTime()>=b)}async function x(a=!1){return(0,j.checkForUpdate)(a)}async function y(a=!1){let[b,c]=await Promise.all([(0,j.checkForUpdate)(a),w()]);return{info:b,busy:c}}async function z(){return i()}async function A(){return(await (0,e.nP)(),await w())?{ok:!1,started:!1,blocked:!0,context:"",command:"",message:"An agent is working — pause it before updating."}:r()}async function B(){try{return JSON.parse((0,k.readFileSync)(q(),"utf8"))}catch{return{status:"idle"}}}(0,c(74252).D)([x,y,z,A,B]),(0,d.A)(x,"400cec94da616f674817927789cb26482bba22cfbd",null),(0,d.A)(y,"401b5fdc3d8fb095679094c177536777e53f9c06fd",null),(0,d.A)(z,"00a3d5009503b1be561d7520e2b68ce0587a6740c0",null),(0,d.A)(A,"004385fd0fd07982e82eeb3fc0a146319a0c4cddcf",null),(0,d.A)(B,"009be10f119924c7536924e7aa423be2a59d4a0f40",null)},56662:(a,b,c)=>{c.d(b,{R:()=>e});var d=c(2910);let e=(0,d.createServerReference)("001e793b6b9e17dd4f29b7fd68cfaf7432f33ca45b",d.callServer,void 0,d.findSourceMapURL,"startDevServerAction")},60686:(a,b,c)=>{c.d(b,{Fy:()=>m,KD:()=>q,Rr:()=>l,TH:()=>s,Xu:()=>r,j0:()=>n,nx:()=>o,zC:()=>p});var d=c(6866),e=c(31371),f=c(53993),g=c(63562),h=c(81204),i=c(70221),j=c(77558),k=c(24701);async function l(){let{org:a,workspace:b}=await (0,f.nP)(),c=await (0,g.ZF)(b.id,a.id);return(0,e.revalidatePath)("/test-dev"),c}async function m(){let{workspace:a}=await (0,f.nP)(),b=await (0,g.n9)(a.id);return(0,e.revalidatePath)("/test-dev"),b}async function n(){let{workspace:a}=await (0,f.nP)();return(0,g.CS)(a.id)}async function o(){let{org:a,workspace:b}=await (0,f.nP)(),c=(0,g.CS)(b.id);if("running"!==c.status&&"starting"!==c.status&&(c=await (0,g.ZF)(b.id,a.id)),!c.url||"running"!==c.status&&"starting"!==c.status)return{ok:!1,error:"The dev server isn't running — start the app first."};let d=await (0,h.nK)(b.id,c.url);return d?{ok:!0,url:d.url}:{ok:!1,error:"Could not start the inspect proxy."}}async function p(){let{workspace:a}=await (0,f.nP)();return(0,h.hA)(a.id),{ok:!0}}async function q(a){if(await (0,f.nP)(),!/^https?:\/\/(127\.0\.0\.1|localhost)(:\d+)?/i.test(a))return{frameable:!0};try{let b=await fetch(a,{redirect:"manual",signal:AbortSignal.timeout(3e3)}),c=(b.headers.get("x-frame-options")||"").toLowerCase(),d=(b.headers.get("content-security-policy")||"").toLowerCase(),e=/frame-ancestors\s+([^;]+)/.exec(d)?.[1]??"",f=c.includes("deny")||c.includes("sameorigin"),g=!!e&&!/(\*|localhost|127\.0\.0\.1)/.test(e);return{frameable:!(f||g)}}catch{return{frameable:!0}}}async function r(a){let{org:b,workspace:c}=await (0,f.nP)(),d=a?.issueId?await (0,i.B)(c.id,a.issueId):void 0,g=await (0,i.z)(c.id,b.id,{goalId:a?.goalId,issueId:a?.issueId,routes:d,by:"operator"});return(0,e.revalidatePath)("/test-dev"),g}async function s(a,b){let{workspace:c}=await (0,f.nP)();return await (0,j.vE)(c.id,{kind:"validation",refType:"validation",refId:a,title:`Validate ${a}`,detail:b.slice(0,500)}),await (0,k.I)(c.id,{kind:"review",text:`Validation requested — ${a}`,detail:b.slice(0,300)}),(0,e.revalidatePath)("/inbox"),{ok:!0}}(0,c(74252).D)([l,m,n,o,p,q,r,s]),(0,d.A)(l,"001e793b6b9e17dd4f29b7fd68cfaf7432f33ca45b",null),(0,d.A)(m,"001fccc7214a81eee4a828374a1cfd7cc92e5109fb",null),(0,d.A)(n,"003f7bfd00bce6e4642889640da92a0031cf3f1506",null),(0,d.A)(o,"00c38194c9d1cef9ff1d75790c8f782badbc37b52a",null),(0,d.A)(p,"006e8b51bd97c68f55b9872060b05677c64a7c9f97",null),(0,d.A)(q,"405a2f4d5897167f5bd29ff4e7282eb422acfea757",null),(0,d.A)(r,"40d7c1696464f382355736732058cace6827a29770",null),(0,d.A)(s,"60df05f65ffaefc9f562b1958a9e2824fad101221e",null)},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},67949:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(79676),e=c(75785);async function f(){return(0,e.e)((await (0,d.cookies)()).get("cn-lang")?.value)}async function g(){let a=await f();return(b,c)=>(0,e.t)(a,b,c)}},78564:(a,b,c)=>{c.d(b,{K:()=>e});var d=c(2910);let e=(0,d.createServerReference)("405a2f4d5897167f5bd29ff4e7282eb422acfea757",d.callServer,void 0,d.findSourceMapURL,"previewFrameableAction")}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=1082,exports.ids=[1082],exports.modules={25543:(a,b,c)=>{c.d(b,{IssueApprove:()=>g,PlanGate:()=>f,PlanGateLive:()=>e,Run247Button:()=>h});var d=c(62060);let e=(0,d.registerClientReference)(function(){throw Error("Attempted to call PlanGateLive() from the server but PlanGateLive is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","PlanGateLive");(0,d.registerClientReference)(function(){throw Error("Attempted to call GeneratePlanButton() from the server but GeneratePlanButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","GeneratePlanButton");let f=(0,d.registerClientReference)(function(){throw Error("Attempted to call PlanGate() from the server but PlanGate is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","PlanGate");(0,d.registerClientReference)(function(){throw Error("Attempted to call SpecApprove() from the server but SpecApprove is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","SpecApprove");let g=(0,d.registerClientReference)(function(){throw Error("Attempted to call IssueApprove() from the server but IssueApprove is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","IssueApprove"),h=(0,d.registerClientReference)(function(){throw Error("Attempted to call Run247Button() from the server but Run247Button is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\plan-gate.tsx","Run247Button")},30527:(a,b,c)=>{c.d(b,{P:()=>e});var d=c(2910);let e=(0,d.createServerReference)("003febf4e7267ca98f9eb9b6dc436d9a4e2b65e7ca",d.callServer,void 0,d.findSourceMapURL,"approvePlan")},33379:(a,b,c)=>{c.r(b),c.d(b,{"0028f961902c9e2476af137bbeb472cd7073047824":()=>d.Kd,"007022a76790c9702b4391280231b2e171ccb37259":()=>d.cT,"405c3175ae584fd80327c8ee43d0a247dd50e3c25b":()=>d.j0,"40834c7dee509b9fe3747f69a43078710b318bcdf5":()=>d.OD});var d=c(14565)},73134:(a,b,c)=>{c.d(b,{AgentRunLive:()=>j});var d=c(4374),e=c(74679),f=c(47104),g=c(43526);c(14631);var h=c(31819);let i=["read","create","edit","run","search","thinking","done","error"];function j({channel:a,resume:b=!1,sinceSeq:c=0,onFinish:k}){let l=(0,h.k)();(0,f.useRouter)();let[m,n]=(0,e.useState)(b),[o,p]=(0,e.useState)([]),[q,r]=(0,e.useState)(0);if((0,e.useRef)(b?c:0),(0,e.useRef)(!1),(0,e.useRef)(0),!m&&0===o.length)return null;let s=function(a){let b=[];for(let c of a)if("text"===c.kind){let a=(c.detail||"").replace(/\s+/g," ").trim();if(!a)continue;let d=b[b.length-1];d&&"text"===d.kind?d.content=(d.content+" "+a).slice(-600):b.push({id:c.id,kind:"text",content:a})}else if("thinking"===c.kind){let a=(c.detail||c.target||"").replace(/\s+/g," ").trim();a&&b.push({id:c.id,kind:"thinking",content:a})}else b.push({id:c.id,kind:c.kind,content:function(a){if(!a)return"";let b=a.split(/[\\/]/);return b.length>1?b.slice(-2).join("/"):a}(c.target)||c.detail||""});return b}(o),t=s.slice(-5),u=s.length-t.length,v=o.some(a=>"done"===a.kind||"error"===a.kind),w=o.some(a=>"error"===a.kind),x=String(Math.floor(q/60)).padStart(2,"0"),y=String(q%60).padStart(2,"0");return(0,d.jsxs)("div",{className:"card live-stream",style:{marginBottom:16,borderColor:w?"var(--sx-keyword)":"var(--accent)"},children:[(0,d.jsxs)("div",{className:"set-desc",style:{marginBottom:8,display:"flex",alignItems:"center",gap:7},children:[m&&!v?(0,d.jsx)("span",{className:"dotpulse"}):(0,d.jsx)(g.I,{name:w?"close":"check",size:13,style:{color:w?"var(--sx-keyword)":"var(--sx-string)"}}),m&&!v?l("agent.run.working"):w?l("agent.run.failed"):l("agent.run.finished"),s.length>0&&(0,d.jsxs)("span",{style:{color:"var(--text-faint)"},children:["\xb7 ",l(1===s.length?"agent.run.steps.one":"agent.run.steps.other",{n:s.length})]}),(0,d.jsxs)("span",{className:"live-elapsed",style:{marginLeft:"auto"},children:[x,":",y]})]}),0===t.length?(0,d.jsxs)("div",{className:"muted",style:{fontSize:12,display:"flex",alignItems:"center",gap:7},children:[(0,d.jsx)("span",{className:"sync-spin",children:(0,d.jsx)(g.I,{name:"refresh",size:12})})," ",l("agent.run.reading")]}):(0,d.jsxs)(d.Fragment,{children:[u>0&&(0,d.jsx)("div",{className:"live-more",children:l(1===u?"agent.run.earlier.one":"agent.run.earlier.other",{n:u})}),(0,d.jsx)("div",{className:"live-stream-lines",children:t.map(a=>(0,d.jsxs)("div",{className:"live-line "+a.kind,children:["text"!==a.kind&&(0,d.jsx)("span",{className:"ll-k",children:i.includes(a.kind)?l(`agent.verb.${a.kind}`):a.kind}),(0,d.jsxs)("span",{className:"ll-c",children:[a.content,!v&&a===t[t.length-1]&&"text"===a.kind&&(0,d.jsx)("span",{className:"ll-caret"})]})]},a.id))})]})]})}},73838:(a,b,c)=>{c.d(b,{IssueApprove:()=>x,PlanGate:()=>v,PlanGateLive:()=>u,Run247Button:()=>y,p:()=>w});var d=c(4374),e=c(74679),f=c(47104),g=c(43526),h=c(31819),i=c(73134),j=c(2910);let k=(0,j.createServerReference)("40a5db20e92cac0094f3ce6250a17ec8d42fc4d887",j.callServer,void 0,j.findSourceMapURL,"generatePlan"),l=(0,j.createServerReference)("005cb5bb28bc19f2d5ed503834ad00dc741d78a51d",j.callServer,void 0,j.findSourceMapURL,"requestPlanChanges");var m=c(30527),n=c(97696),o=c(90362),p=c(80047),q=c(99756);let r=(0,j.createServerReference)("4096425e44cce93bbec45707a6319457d2f7f2d3cb",j.callServer,void 0,j.findSourceMapURL,"setAuto247"),s=(0,j.createServerReference)("0042e68aad222037eb8d73ca8b3ce5329de2cd3485",j.callServer,void 0,j.findSourceMapURL,"skipDesignGate");function t(a,b){window.dispatchEvent(new CustomEvent("constella:open-dm",{detail:{handle:a,text:b}}))}function u({planning:a,planSince:b,designRecommended:c=!1,designPending:j=!1}){let l=(0,h.k)(),[m,n]=(0,e.useTransition)(),o=(0,f.useRouter)(),[p,q]=(0,e.useState)(!1),[r,t]=(0,e.useState)(""),v=a||p;function w(){t(""),q(!0),window.dispatchEvent(new CustomEvent("constella:agent-run",{detail:{channel:"planner"}})),n(async()=>{try{let a=await k();(!a?.ok||!1===a.started)&&(q(!1),a?.error&&t(a.error)),o.refresh()}catch{q(!1),t(l("planner.gate.staleTab"))}})}return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i.AgentRunLive,{channel:"planner",resume:a,sinceSeq:a?b-1:0,onFinish:()=>q(!1)}),v?(0,d.jsxs)("div",{className:"plan-gate",children:[(0,d.jsx)("div",{className:"plan-gate-bar","aria-hidden":!0}),(0,d.jsx)("div",{className:"pg-ic",children:(0,d.jsx)(g.I,{name:"bot",size:20})}),(0,d.jsxs)("div",{className:"pg-main",children:[(0,d.jsx)("div",{className:"pg-t",children:l("planner.gate.drafting.t")}),(0,d.jsx)("div",{className:"pg-d",children:l("planner.gate.drafting.d")})]})]}):c||j?(0,d.jsxs)("div",{className:"plan-gate",style:{borderColor:"rgba(99,102,241,.45)"},children:[(0,d.jsx)("div",{className:"plan-gate-bar","aria-hidden":!0,style:{background:"#6366f1"}}),(0,d.jsx)("div",{className:"pg-ic",style:{background:"rgba(99,102,241,.16)",color:"#6366f1"},children:(0,d.jsx)(g.I,{name:"skill",size:20})}),(0,d.jsxs)("div",{className:"pg-main",children:[(0,d.jsx)("div",{className:"pg-t",children:j?"Design step pending":"Recommended: prototype the design first"}),(0,d.jsx)("div",{className:"pg-d",children:j?"Ada is holding the plan on the design step. Open the Design module, build & approve the prototype with Grace, then Send to execution — Ada turns the approved design into specs & issues (zero drift).":"This is a frontend product. Prototype & approve the UI in the Design module before generating the plan — Grace turns the brief into a real visual reference, so the specs are precise and you avoid rework."}),r&&(0,d.jsx)("div",{className:"pg-d",style:{color:"var(--sx-keyword)",marginTop:6},children:r})]}),(0,d.jsxs)("div",{className:"pg-actions",children:[(0,d.jsxs)("button",{className:"btn-accent",onClick:()=>o.push("/design"),children:[(0,d.jsx)(g.I,{name:"skill",size:14})," Open Design"]}),(0,d.jsxs)("button",{className:"btn-ghost",disabled:m,onClick:function(){n(async()=>{try{await s()}catch{}}),w()},style:{fontSize:12},children:[(0,d.jsx)(g.I,{name:m?"refresh":"bot",size:13,className:m?"sync-spin":""})," ",m?l("planner.gate.analyzing"):"Skip design & plan anyway"]})]})]}):(0,d.jsxs)("div",{className:"plan-gate",children:[(0,d.jsx)("div",{className:"plan-gate-bar","aria-hidden":!0}),(0,d.jsx)("div",{className:"pg-ic",children:(0,d.jsx)(g.I,{name:"bot",size:20})}),(0,d.jsxs)("div",{className:"pg-main",children:[(0,d.jsx)("div",{className:"pg-t",children:l("planner.gate.noPlan.t")}),(0,d.jsx)("div",{className:"pg-d",children:l("planner.gate.noPlan.d")}),r&&(0,d.jsx)("div",{className:"pg-d",style:{color:"var(--sx-keyword)",marginTop:6},children:r})]}),(0,d.jsxs)("div",{className:"pg-actions",children:[(0,d.jsxs)("div",{className:"plan-hint",children:[(0,d.jsx)("div",{className:"plan-hint-t",children:l("planner.gate.hint.t")}),(0,d.jsx)("div",{className:"plan-hint-d",children:l("planner.gate.hint.d")})]}),(0,d.jsxs)("button",{className:"btn-accent",disabled:m,onClick:w,children:[(0,d.jsx)(g.I,{name:m?"refresh":"bot",size:14,className:m?"sync-spin":""})," ",m?l("planner.gate.analyzing"):l("planner.gate.generate")]})]})]})]})}function v({specs:a,total:b}){let c=(0,h.k)(),[f,i]=(0,e.useTransition)();return(0,d.jsxs)("div",{className:"plan-gate",children:[(0,d.jsx)("div",{className:"pg-ic",children:(0,d.jsx)(g.I,{name:"bot",size:20})}),(0,d.jsxs)("div",{className:"pg-main",children:[(0,d.jsx)("div",{className:"pg-t",children:c("planner.gate.ready.t")}),(0,d.jsx)("div",{className:"pg-d",children:c("planner.gate.ready.d",{specs:a,total:b})})]}),(0,d.jsxs)("div",{className:"pg-actions",children:[(0,d.jsxs)("button",{className:"btn-ghost",disabled:f,onClick:()=>i(async()=>{await l(),t("ada",c("planner.gate.rejectPlanDm"))}),children:[(0,d.jsx)(g.I,{name:"refresh",size:13})," ",c("planner.gate.requestChanges")]}),(0,d.jsxs)("button",{className:"btn-accent",disabled:f,onClick:()=>i(()=>(0,m.P)()),children:[(0,d.jsx)(g.I,{name:"check",size:14})," ",c("planner.gate.approvePlan")]})]})]})}function w({specId:a,specKey:b,approved:c}){let f=(0,h.k)(),[i,j]=(0,e.useTransition)();return c?(0,d.jsxs)("span",{className:"pill",style:{background:"var(--sx-string)22",color:"var(--sx-string)"},children:[(0,d.jsx)(g.I,{name:"check",size:11})," ",f("planner.approved")]}):(0,d.jsxs)("span",{style:{display:"inline-flex",gap:6},children:[(0,d.jsxs)("button",{className:"sc2-btn",disabled:i,onClick:()=>j(()=>(0,n.B)(a)),children:[(0,d.jsx)(g.I,{name:"check",size:11})," ",f("planner.approve")]}),(0,d.jsxs)("button",{className:"sc2-btn danger",disabled:i,onClick:()=>j(async()=>{t((await (0,o.J)(a)).handle,f("planner.rejectItemDm",{key:b}))}),children:[(0,d.jsx)(g.I,{name:"refresh",size:11})," ",f("planner.reject")]})]})}function x({issueId:a,issueKey:b,approved:c}){let f=(0,h.k)(),[i,j]=(0,e.useTransition)();return c?(0,d.jsxs)("span",{className:"pill",style:{background:"var(--sx-string)22",color:"var(--sx-string)"},children:[(0,d.jsx)(g.I,{name:"check",size:11})," ",f("planner.approved")]}):(0,d.jsxs)("span",{style:{display:"inline-flex",gap:6},children:[(0,d.jsxs)("button",{className:"sc2-btn",disabled:i,onClick:()=>j(()=>(0,p.t)(a)),children:[(0,d.jsx)(g.I,{name:"check",size:11})," ",f("planner.approve")]}),(0,d.jsxs)("button",{className:"sc2-btn danger",disabled:i,onClick:()=>j(async()=>{t((await (0,q.d)(a)).handle,f("planner.rejectItemDm",{key:b}))}),children:[(0,d.jsx)(g.I,{name:"refresh",size:11})," ",f("planner.reject")]})]})}function y({auto:a,approved:b,state:c}){let f=(0,h.k)(),[i,j]=(0,e.useTransition)(),k=f(i?a?"planner.run247.pausing":"planner.run247.starting":"waiting-approval"===c?"planner.run247.approveToRun":"all-done"===c?"planner.run247.allDone":a?"planner.run247.pause":"planner.run247.run"),l="blocked"===c?f("planner.run247.blockedTip"):void 0,m="off"===c&&!i;return(0,d.jsxs)("button",{className:"btn-"+(a?"ghost":"accent")+(m?" run-attn":""),disabled:!b||"all-done"===c||i,title:l,onClick:()=>j(()=>r(!a)),children:[(0,d.jsx)(g.I,{name:i?"refresh":"waiting-approval"===c?"bot":"all-done"===c?"check":a?"close":"play",size:14,className:i?"sync-spin":""})," ",k,("running"===c||m)&&(0,d.jsx)("span",{className:"dotpulse",style:{marginLeft:6}})]})}},80047:(a,b,c)=>{c.d(b,{t:()=>e});var d=c(2910);let e=(0,d.createServerReference)("40aa8d10fe1fc7b3d00fb58cf6686d7e66a57a82de",d.callServer,void 0,d.findSourceMapURL,"approveIssue")},90362:(a,b,c)=>{c.d(b,{J:()=>e});var d=c(2910);let e=(0,d.createServerReference)("409c5ecd26ccaec10a2e66bce9e702bf46d8cc21e0",d.callServer,void 0,d.findSourceMapURL,"rejectSpec")},97696:(a,b,c)=>{c.d(b,{B:()=>e});var d=c(2910);let e=(0,d.createServerReference)("40278c98b65eb6a42ba19ed36299f6ada32c9eea34",d.callServer,void 0,d.findSourceMapURL,"approveSpec")},99756:(a,b,c)=>{c.d(b,{d:()=>e});var d=c(2910);let e=(0,d.createServerReference)("4067ca80a5da742c05fbb50e0a730ae4a24a79b000",d.callServer,void 0,d.findSourceMapURL,"rejectIssue")}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=2359,exports.ids=[2359,7336],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},9842:(a,b,c)=>{c.d(b,{IZ:()=>k,Ix:()=>j,ZF:()=>m,h6:()=>n,w1:()=>l});var d=c(1782),e=c(76760),f=c(80280),g=c(25533),h=c(18612),i=c(54033);function j(a,b){if(!b)return null;let c=(0,h.HZ)(a),d=((0,e.isAbsolute)(b)?(0,e.relative)(c,b):b).replace(/\\/g,"/");return!d||d.startsWith("..")||d.startsWith(".git/")||d.startsWith(".claude/")||d.startsWith("archives/")?null:d}async function k(a,b,c){let e=(0,d.Uo)((0,d.eq)(g.fileLock.workspaceId,a),(0,d.eq)(g.fileLock.path,b)),[h]=await f.db.select().from(g.fileLock).where(e);if(h){let a=!!c.taskId&&h.taskId===c.taskId,b=!h.taskId&&!!c.agentId&&h.agentId===c.agentId;return a||b?(await f.db.update(g.fileLock).set({heartbeatAt:new Date}).where(e),{ok:!0}):{ok:!1,heldBy:{handle:h.agentHandle,taskId:h.taskId}}}try{return await f.db.insert(g.fileLock).values({workspaceId:a,path:b,taskId:c.taskId||"",agentId:c.agentId||"",agentHandle:c.handle||"",acquiredAt:new Date,heartbeatAt:new Date}),{ok:!0}}catch{let[a]=await f.db.select().from(g.fileLock).where(e);if(a&&(a.taskId===c.taskId||a.agentId===c.agentId))return{ok:!0};return{ok:!1,heldBy:a?{handle:a.agentHandle,taskId:a.taskId}:void 0}}}async function l(a,b){if(b)try{let c=await f.db.select({path:g.fileLock.path}).from(g.fileLock).where((0,d.Uo)((0,d.eq)(g.fileLock.workspaceId,a),(0,d.eq)(g.fileLock.taskId,b)));for(let e of(await f.db.delete(g.fileLock).where((0,d.Uo)((0,d.eq)(g.fileLock.workspaceId,a),(0,d.eq)(g.fileLock.taskId,b))),c))await (0,i.W_)(a,"task",`lock:${e.path}`)}catch{}}async function m(a=3e5){try{await f.db.delete(g.fileLock).where((0,d.lt)(g.fileLock.heartbeatAt,new Date(Date.now()-a)))}catch{}}async function n(a){try{return await f.db.select({path:g.fileLock.path,agentHandle:g.fileLock.agentHandle,taskId:g.fileLock.taskId}).from(g.fileLock).where((0,d.eq)(g.fileLock.workspaceId,a))}catch{return[]}}},18727:(a,b,c)=>{c.d(b,{O:()=>e});var d=c(2910);let e=(0,d.createServerReference)("00989a2c152ceb87b200f52f9d56d6a1006b3ae418",d.callServer,void 0,d.findSourceMapURL,"curateKbAction")},47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>l});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0);async function j(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function l(a=!1){let b,c,m=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),n=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let o=await j(`https://registry.npmjs.org/${g}/latest`),p=o?.version??null,q=!!p&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))break}return!1}(p,m),r=null;if(q&&p){let a=await k("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");r=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,p):null}let s={current:m,latest:p,updateAvailable:q,type:p?(b=i(p),c=i(m),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]?"patch":null):null,command:n,changelog:r};return h={at:Date.now(),info:s},s}},51221:(a,b,c)=>{c.d(b,{ViewChrome:()=>h});var d=c(4374),e=c(43526),f=c(48442),g=c(31819);function h({title:a,sub:b,right:c,icon:i,flush:j,children:k}){let l=(0,g.k)(),m=f.e.find(b=>b.title===a),n=i??m?.icon,o=m?l(`mod.${m.id}`):a;return(0,d.jsxs)("div",{className:"app-view",children:[(0,d.jsxs)("div",{className:"view-head",children:[n&&(0,d.jsx)("div",{className:"vh-icon",children:(0,d.jsx)(e.I,{name:n,size:18})}),(0,d.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,d.jsx)("div",{className:"view-title",children:o}),b&&(0,d.jsx)("div",{className:"view-sub",children:b})]}),c]}),(0,d.jsx)("div",{className:"view-body",style:j?{padding:0,overflow:"hidden"}:void 0,children:k})]})}},52932:(a,b,c)=>{c.d(b,{pM:()=>z,lP:()=>y,Kg:()=>x,eU:()=>B,PG:()=>A});var d=c(6866),e=c(53993),f=c(30043),g=c(64567),h=c(30170);function i(){return(0,h.n)()?"dev":"vps"===(0,g.T)()?"vps":"portable"===(0,g.T)()?"portable":/[\\/]_npx[\\/]/.test((0,f.v)())?"npx":"global"}var j=c(47336),k=c(73024),l=c(76760),m=c(48161),n=c(31421),o=c(57086);let p=()=>new Date().toISOString().replace(/[:.]/g,"-"),q=()=>(0,l.join)((0,o.r$)(),"backups","last-update.json");async function r(){let a=await (0,j.checkForUpdate)(!0),b=i(),c=a.command;if(!a.updateAvailable)return{ok:!0,context:b,command:c,message:"Already up to date."};let d=function(){try{let a=(0,o.r$)(),b=(0,l.join)(a,"backups",p());for(let c of((0,k.mkdirSync)(b,{recursive:!0}),[".env","constella.db","constella.db-wal","constella.db-shm"])){let d=(0,l.join)(a,c);if((0,k.existsSync)(d))try{(0,k.copyFileSync)(d,(0,l.join)(b,c))}catch{}}return b}catch{return null}}()??void 0;return"dev"===b?{ok:!1,context:b,command:c,backupDir:d,message:"Running from source — update with: git pull && pnpm install && pnpm build"}:"npx"===b?{ok:!1,context:b,command:c,backupDir:d,message:"npx runs an ephemeral copy — re-run: npx constellai@latest"}:"vps"===b?{ok:!1,context:b,command:"bash scripts/vps-update.sh",backupDir:d,needsRestart:!0,message:"On a VPS, update from a shell: `bash scripts/vps-update.sh` (or `npm install -g constellai@latest && sudo systemctl restart constella`). Your data in ~/.constella — DB, secrets, workspaces — is preserved; migrations run on the next boot."}:function(a,b,c,d){try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let e=process.env.CONSTELLA_RUN_MODE||"start",f=process.env.CONSTELLA_LAUNCHER_PID||(process.ppid?String(process.ppid):"0"),g=(0,o.r$)(),h=process.env.PORT||"3000",i=process.env.CONSTELLA_PKG_ROOT||process.cwd(),j=(0,l.join)(i,"bin","constella-update.mjs"),r=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[j,"--quiet","--pid",f,"--mode",e,"--home",g,"--port",h,...r],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:b,command:c,backupDir:d,message:`Updating to ${a.latest} and restarting — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:b,command:c,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}(a,b,c,d)}var s=c(97603),t=c(65705),u=c(1890),v=c(10245);async function w(){let a=await t.db.select({lastPulse:u.agent.lastPulse}).from(u.agent).where((0,s.eq)(u.agent.status,"working")),b=Date.now()-v.fQ;return a.some(a=>null!=a.lastPulse&&new Date(a.lastPulse).getTime()>=b)}async function x(a=!1){return(0,j.checkForUpdate)(a)}async function y(a=!1){let[b,c]=await Promise.all([(0,j.checkForUpdate)(a),w()]);return{info:b,busy:c}}async function z(){return i()}async function A(){return(await (0,e.nP)(),await w())?{ok:!1,started:!1,blocked:!0,context:"",command:"",message:"An agent is working — pause it before updating."}:r()}async function B(){try{return JSON.parse((0,k.readFileSync)(q(),"utf8"))}catch{return{status:"idle"}}}(0,c(74252).D)([x,y,z,A,B]),(0,d.A)(x,"400cec94da616f674817927789cb26482bba22cfbd",null),(0,d.A)(y,"401b5fdc3d8fb095679094c177536777e53f9c06fd",null),(0,d.A)(z,"00a3d5009503b1be561d7520e2b68ce0587a6740c0",null),(0,d.A)(A,"004385fd0fd07982e82eeb3fc0a146319a0c4cddcf",null),(0,d.A)(B,"009be10f119924c7536924e7aa423be2a59d4a0f40",null)},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},67949:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(79676),e=c(75785);async function f(){return(0,e.e)((await (0,d.cookies)()).get("cn-lang")?.value)}async function g(){let a=await f();return(b,c)=>(0,e.t)(a,b,c)}},76594:(a,b,c)=>{c.r(b),c.d(b,{"003d1836382188603c5b40a8fd0c7735cec69e7922":()=>i.V,"004385fd0fd07982e82eeb3fc0a146319a0c4cddcf":()=>n.PG,"004ec7f252351e38a9c4baf338040eebc632b425d2":()=>j.f,"0051a52502b49e09ad171c2a611bc2418ed1c1a9dc":()=>e.PE,"005a226f73ea851bb80ec4f9fdf3aedb50fb7fbcd1":()=>e.y_,"00703229b811528142c40576d5c57f3467b87b9b61":()=>d.bt,"008945e940738840c2c3f8cf09a767e9dff2d1d34b":()=>k.dj,"00989a2c152ceb87b200f52f9d56d6a1006b3ae418":()=>j.O,"009be10f119924c7536924e7aa423be2a59d4a0f40":()=>n.eU,"00a3d5009503b1be561d7520e2b68ce0587a6740c0":()=>n.pM,"00bb81b2ee7b45ce9f2c558b5098b2acbe223d936e":()=>k.eg,"00cdd261029ea6d12df690e0b43e69818dbfeca142":()=>h.x7,"00ce8a19facd18b6c85993ebd6da347d63d0579dfa":()=>k.io,"00d423e1c54f47493dd9e26787f081501532d5754f":()=>d.xU,"00df7e6e08eaa29f35def8db35d7aefb6c9acb9ce2":()=>e.KO,"00e68579200e3df5cde1803035a93f8406aa41e3b0":()=>h.Mp,"00ee824db0a18ba9e4b113a979c27e43db14785003":()=>e.GK,"4004cb652b9955d22ac032162768b4e0579a46079b":()=>e.ey,"400cec94da616f674817927789cb26482bba22cfbd":()=>n.Kg,"4010339d35fee3f9209079d6bec35c010e1bbd23f5":()=>m.y,"4012df9fe60cdc771539fe5ed6ee353f894150d310":()=>g.L,"40180769811ee904607ab5b31116043b8c5f8be1a1":()=>i.E_,"401b5fdc3d8fb095679094c177536777e53f9c06fd":()=>n.lP,"4021ca58f6081eea2ecbd22b042f8eb7cb116a2fc3":()=>i.zS,"40242806df9ad69eb1c87ff62b4b2b34b3abad98dd":()=>e.jc,"40249f352fbd111bf83a85129254e9e18ef8ea9d64":()=>l.TX,"404005f581c185523c57ba4de7b6e623b00422d422":()=>l.IL,"4049b65fc61de5f15ea027c832048d695017a2cadc":()=>d.GW,"404aa55a36511316cdf338b098de663d429f9e7c1f":()=>k.De,"4055d44350781ccf3333fcaf2f5cb371866c797769":()=>i.F,"406201c1d173ad16581e88feb7fdf42ebbc95ef841":()=>d.VL,"407c52c4d4449ab61d90dcfa9cbf1ddd27160f6838":()=>e.RG,"4087e6e58cd4d57932fba61705c67f27c76e9dbebb":()=>d.Wu,"40972d5b822e66513389d5179af32bb5f9ab77ca88":()=>g.p,"409743adf88b2fc6a237494fd51038d3a4527b0203":()=>h.lR,"4098f6bc6c8bcf5e0704daf3a5a7bab7ffa82a196c":()=>d.H7,"40a6b782c452b9d7da8220c5630efb6277ba4077a1":()=>h.sE,"40a7dc12aa0d1b7b04c68ad7e482ba71fd189a44a7":()=>i.VJ,"40b05730806e4d6ca81c8b097bbe58fc8b2a6a9c19":()=>e.lJ,"40b85e5a61026f49480c36b5f71ce876512194b848":()=>e.S,"40dd7a9ba904e27f9eeac05cd7a750583e8de84545":()=>d.rd,"40e311db584b685c4692979c63d0c6e43ebfbb3776":()=>e.r7,"40eca98781164e186e8b92598018c0247eee2533ed":()=>l.q4,"40faf10ed1dd931e743694b6ab07acfffa9f1c5fff":()=>d.gg,"600d82e3d7031f663a63e6110ba9f565e1925bac77":()=>d.Fu,"602541726f950df2e46bd648c470b35caff4290401":()=>l.Jp,"60301fe28cb811b08550b91045a0558179995780c0":()=>d.ME,"6043588d0686a7654ec852ff74b41a1990afb8ad5b":()=>l.bk,"60581df9364a1b92ebc0d853d7c78efa696792047f":()=>d.rm,"605cdb117d7636ebc2c1655a5624f369a8c5530ef3":()=>l.bV,"605ee4201fe65199f85db7180e840b038e2e8ffd10":()=>d.n4,"60641a6b24e31ba5d7c698743071a038d3366fc586":()=>e.AA,"6089bcc5361f39d22c01d6f92038ab1a71d519835f":()=>f.k,"60b6a569caae9899b156707b836ab2851f5218fa91":()=>e.q$,"60c1724f6f00fd2d33760b52f4dde31de692d1b203":()=>f.I,"60e6371f54999c9587eca32148839e4ce8eef9abc3":()=>e.LZ,"60e9b223d15847a611ea2b6fdf59614eceb4151ee9":()=>d.jw,"700e7dc42f9902ba897ac4e36d45bfd5032bd56211":()=>d._z,"706d88c745d18277356678742d9b6b2b19c4f6e86d":()=>e.M8});var d=c(97140),e=c(15487),f=c(79505),g=c(51605),h=c(46363),i=c(46282),j=c(387),k=c(13604),l=c(7482),m=c(58169),n=c(52932)}};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=7970,exports.ids=[7970],exports.modules={19881:(a,b,c)=>{c.d(b,{W:()=>h});var d=c(4374),e=c(74679);let f={anthropic:"anthropic",claude_code:"claude",openai:"openai",codex_cli:"openai",google:"google",google_gemini:"gemini",gemini_cli:"gemini",vertex_ai:"vertexai",mistral:"mistral",deepseek:"deepseek",cohere:"cohere",perplexity:"perplexity",xai_grok:"grok",groq:"groq",ai21:"ai21",nvidia_nim:"nvidia",huggingface:"huggingface",replicate:"replicate",azure_openai:"azure",aws_bedrock:"bedrock",cloudflare:"cloudflare",dashscope:"qwen",zhipu:"zhipu",moonshot:"moonshot",minimax:"minimax",together:"together",openrouter:"openrouter",fireworks:"fireworks",cerebras:"cerebras",ollama:"ollama",ollama_cli:"ollama",lmstudio:"lmstudio",vllm:"vllm",localai:"localai",elevenlabs:"elevenlabs",stability:"stability",jina:"jina",voyage:"voyage"},g={anthropic:["#d97757","An"],openai:["#10a37f","AI"],google_gemini:["#4285f4","G"],google:["#4285f4","G"],mistral:["#fa520f","Mi"],xai_grok:["#1a1a1a","X"],deepseek:["#4d6bfe","DS"],cohere:["#39594d","Co"],ai21:["#e8488a","A2"],perplexity:["#20808d","Px"],groq:["#f55036","Gq"],nvidia_nim:["#76b900","NV"],together:["#0f6fff","To"],fireworks:["#5019c5","Fw"],cerebras:["#f25733","Cb"],huggingface:["#ff9d00","HF"],replicate:["#1a1a1a","Rp"],openrouter:["#6566f1","OR"],litellm:["#00b8a3","LL"],portkey:["#3b5bdb","Pk"],azure_openai:["#0078d4","Az"],aws_bedrock:["#ff9900","Br"],vertex_ai:["#4285f4","Vx"],cloudflare:["#f38020","Cf"],dashscope:["#ff6a00","Qw"],zhipu:["#3859ff","GL"],moonshot:["#16162a","Ki"],minimax:["#e1342c","MM"],ollama:["#0c0c0c","Ol"],llamacpp:["#7a4ddb","Lc"],lmstudio:["#4a5cff","LM"],vllm:["#1668dc","vL"],localai:["#2e7d32","La"],gpt4all:["#5b6cff","G4"],jan:["#1a1a1a","Jn"],claude_code:["#d97757","CC"],codex_cli:["#10a37f","Cx"],gemini_cli:["#4285f4","Gc"],aider:["#14b8a6","Ad"],ollama_cli:["#0c0c0c","Oc"],openclaw:["#e8590c","OC"],hermes_cli:["#6d28d9","Hm"],opencode:["#1a1a1a","Oc"],copilot_cli:["#1f2328","Co"],cursor_cli:["#1a1a1a","Cu"],cline_cli:["#2563eb","Cl"],kilo_code:["#7c3aed","Ki"],voyage:["#5b21b6","Vo"],jina:["#ec4899","Ji"],stability:["#a855f7","St"],elevenlabs:["#1a1a1a","El"]};function h({id:a,size:b=34,radius:c}){let i,j=g[a],k=j?j[0]:"#5b6378",l=j?j[1]:(a||"?").slice(0,2).replace(/[^a-z0-9]/gi,"").toUpperCase(),m=(i=f[a])?`https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg/icons/${i}.svg`:null,[n,o]=(0,e.useState)(!1),p=null!=c?c:Math.round(.28*b),q=m&&!n,r=Math.round(.66*b);return(0,d.jsx)("span",{className:"prov-glyph",style:{width:b,height:b,flex:"0 0 "+b+"px",borderRadius:p,background:q?"#fff":"linear-gradient(150deg, "+k+", color-mix(in srgb, "+k+" 70%, #000))",color:"#fff",display:"grid",placeItems:"center",overflow:"hidden",fontSize:Math.round(.4*b),fontWeight:800,letterSpacing:"-.5px",boxShadow:q?"inset 0 0 0 1px rgba(0,0,0,.08)":"inset 0 1px 0 rgba(255,255,255,.18)"},children:q?(0,d.jsx)("img",{src:m,alt:"",width:r,height:r,loading:"lazy",onError:()=>o(!0),style:{width:r,height:r,objectFit:"contain",display:"block"}}):l})}},27829:(a,b,c)=>{c.d(b,{Y:()=>j});var d=c(4374),e=c(74679),f=c(71898),g=c(31819);let h={cli_claude_code:[{value:"opus",label:"Claude Opus \xb7 most capable"},{value:"sonnet",label:"Claude Sonnet \xb7 balanced"},{value:"haiku",label:"Claude Haiku \xb7 fast"}],cli_codex:[{value:"gpt-5-codex",label:"GPT-5 Codex"},{value:"o4-mini",label:"o4-mini"}],cli_gemini:[{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro"},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash"}],cli_openclaw:[{value:"(default)",label:"Configured default"},{value:"openai/gpt-5.4",label:"OpenAI \xb7 GPT-5.4"},{value:"anthropic/claude-sonnet-4",label:"Anthropic \xb7 Claude Sonnet 4"}],cli_hermes:[{value:"(default)",label:"Configured default"},{value:"anthropic/claude-sonnet-4.6",label:"Anthropic \xb7 Claude Sonnet 4.6"},{value:"openai/gpt-5.5",label:"OpenAI \xb7 GPT-5.5"}],cli_aider:[{value:"(default)",label:"Configured default"},{value:"anthropic/claude-sonnet-4-6",label:"Anthropic \xb7 Claude Sonnet 4.6"},{value:"openai/gpt-5.2",label:"OpenAI \xb7 GPT-5.2"},{value:"deepseek/deepseek-chat",label:"DeepSeek \xb7 Chat"}],cli_opencode:[{value:"(default)",label:"Configured default"},{value:"anthropic/claude-sonnet-4-6",label:"Anthropic \xb7 Claude Sonnet 4.6"},{value:"openai/gpt-5.2",label:"OpenAI \xb7 GPT-5.2"}],cli_copilot:[{value:"(default)",label:"Configured default"},{value:"claude-sonnet-4.5",label:"Claude Sonnet 4.5"},{value:"gpt-5",label:"GPT-5"}],cli_cursor:[{value:"(default)",label:"Configured default"},{value:"claude-4.5-sonnet",label:"Claude Sonnet 4.5"},{value:"gpt-5",label:"GPT-5"}],cli_cline:[{value:"(default)",label:"Configured default"}],cli_kilo:[{value:"(default)",label:"Configured default"}]};var i=c(69503);function j({adapter:a,value:b,onChange:c,providers:k}){let l=(0,g.k)(),m=function(a){let b=h[a]??null;if(!b)return null;let c=(0,i.L2)(a);return c?b.map(a=>{let b=c.find(b=>b.id===a.value);return b?{value:a.value,label:`${b.label} ${b.version}${b.note?" \xb7 "+b.note:""}`}:a}):b}(a),n=a.startsWith("local_"),[o,p]=(0,e.useState)(null),[q,r]=(0,e.useState)("");k.find(b=>b.adapter===a);let s=n?[{value:b||"local",label:l("modelpicker.localGguf")}]:null,t=m??s??o??(b?[{value:b,label:b}]:[]),u=b&&!t.some(a=>a.value===b)?[{value:b,label:b},...t]:t;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.m,{mono:!0,value:b,options:u,placeholder:l("modelpicker.placeholder"),onChange:c}),q&&(0,d.jsx)("div",{className:"form-hint",style:{marginTop:4},children:q})]})}c(92837),c(44153)},36172:(a,b,c)=>{c.d(b,{j:()=>e});var d=c(2910);let e=(0,d.createServerReference)("4023914c635fa47959e59550bc8bd4ebb3ff58154d",d.callServer,void 0,d.findSourceMapURL,"pullModel")},37343:(a,b,c)=>{c.d(b,{k:()=>e});var d=c(2910);let e=(0,d.createServerReference)("60f7a9badac0e78da08a792858f4ccc8f6f37a02ef",d.callServer,void 0,d.findSourceMapURL,"saveAgentModel")},44153:(a,b,c)=>{c.d(b,{E:()=>e});var d=c(2910);let e=(0,d.createServerReference)("40ad8cc407db284a4237d2a2f3eb012ddf1050500b",d.callServer,void 0,d.findSourceMapURL,"listProviderModels")},65300:(a,b,c)=>{function d(a,b,c){let d=a.match(/^---\n([\s\S]*?)\n---/);if(!d)return a;let e=d[1].split("\n"),f=!1,g=e.map(a=>a.startsWith(b+":")?(f=!0,`${b}: ${c}`):a);return f||g.push(`${b}: ${c}`),a.replace(/^---\n[\s\S]*?\n---/,`---
|
|
2
|
-
${g.join("\n")}
|
|
3
|
-
---`)}function e(a,b,c){let d=RegExp(`(\\*\\*${b}:\\*\\*\\s*).*`);return d.test(a)?a.replace(d,`$1${c}`):a}function f(a,b,c){let d=RegExp(`(^|\\n)##\\s+${b}\\s*\\n[\\s\\S]*?(?=\\n##\\s|$)`);return d.test(a)?a.replace(d,`$1## ${b}
|
|
4
|
-
${c}`):a.replace(/\s*$/,"")+`
|
|
5
|
-
|
|
6
|
-
## ${b}
|
|
7
|
-
${c}
|
|
8
|
-
`}c.d(b,{a$:()=>e,c4:()=>f,tT:()=>d})},69503:(a,b,c)=>{c.d(b,{L2:()=>e,Ov:()=>f});let d={cli_claude_code:[{id:"opus",label:"Claude Opus",version:"4.8",note:"most capable"},{id:"sonnet",label:"Claude Sonnet",version:"4.6",note:"balanced"},{id:"haiku",label:"Claude Haiku",version:"4.5",note:"fast"}],cli_codex:[{id:"gpt-5-codex",label:"GPT-5 Codex",version:"5"},{id:"o4-mini",label:"o4-mini",version:"o4"}],cli_gemini:[{id:"gemini-2.5-pro",label:"Gemini Pro",version:"2.5"},{id:"gemini-2.5-flash",label:"Gemini Flash",version:"2.5"}],cli_openclaw:[{id:"(default)",label:"OpenClaw",version:"default",note:"configured provider"},{id:"openai/gpt-5.4",label:"GPT",version:"5.4"},{id:"anthropic/claude-sonnet-4",label:"Claude Sonnet",version:"4"}],cli_hermes:[{id:"(default)",label:"Hermes",version:"default",note:"configured provider"},{id:"anthropic/claude-sonnet-4.6",label:"Claude Sonnet",version:"4.6"},{id:"openai/gpt-5.5",label:"GPT",version:"5.5"}],cli_aider:[{id:"(default)",label:"Aider",version:"default",note:"configured provider"},{id:"anthropic/claude-sonnet-4-6",label:"Claude Sonnet",version:"4.6"},{id:"openai/gpt-5.2",label:"GPT",version:"5.2"},{id:"deepseek/deepseek-chat",label:"DeepSeek Chat",version:""}],cli_opencode:[{id:"(default)",label:"OpenCode",version:"default",note:"configured provider"},{id:"anthropic/claude-sonnet-4-6",label:"Claude Sonnet",version:"4.6"},{id:"openai/gpt-5.2",label:"GPT",version:"5.2"}],cli_copilot:[{id:"(default)",label:"Copilot",version:"default",note:"configured provider"},{id:"claude-sonnet-4.5",label:"Claude Sonnet",version:"4.5"},{id:"gpt-5",label:"GPT",version:"5"}],cli_cursor:[{id:"(default)",label:"Cursor",version:"default",note:"configured provider"},{id:"claude-4.5-sonnet",label:"Claude Sonnet",version:"4.5"},{id:"gpt-5",label:"GPT",version:"5"}],cli_cline:[{id:"(default)",label:"Cline",version:"default",note:"configured provider"}],cli_kilo:[{id:"(default)",label:"Kilo Code",version:"default",note:"configured provider"}]};function e(a){return d[a]??null}function f(a){if(!a)return{label:"",version:""};let b=a.match(/(\d+(?:[.\-]\d+){0,2})(?!.*\d)/),c=b?b[1].replace(/-/g,"."):"";return{label:(b?a.slice(0,b.index).replace(/[-_.\s]+$/,""):a).split(/[-_.\s]+/).filter(Boolean).map(a=>/^(gpt|llm|api|ai)$/i.test(a)?a.toUpperCase():a.charAt(0).toUpperCase()+a.slice(1)).join(" ")||a,version:c}}},71898:(a,b,c)=>{c.d(b,{m:()=>i});var d=c(4374),e=c(74679),f=c(43526),g=c(19881),h=c(31819);function i({value:a,options:b,onChange:c,placeholder:j,mono:k,glyph:l,disabled:m,searchable:n}){let o=(0,h.k)(),[p,q]=(0,e.useState)(!1),[r,s]=(0,e.useState)(""),t=(0,e.useRef)(null),u=(0,e.useRef)(null),v=(0,e.useMemo)(()=>(b||[]).map(a=>"string"==typeof a?{value:a,label:a}:a),[b]),w=v.find(b=>b.value===a),x=(n??v.length>8)&&!m,y=r.trim().toLowerCase(),z=x&&y?v.filter(a=>(a.label+" "+a.value+" "+(a.sub||"")).toLowerCase().includes(y)):v;return(0,d.jsxs)("div",{className:"dd"+(p?" open":"")+(m?" disabled":""),ref:t,children:[(0,d.jsxs)("button",{type:"button",className:"dd-btn"+(k?" mono":""),onClick:()=>!m&&q(a=>!a),children:[l&&w&&(0,d.jsx)(g.W,{id:w.glyphId||w.value,size:20}),(0,d.jsx)("span",{className:"dd-val",children:w?w.label:(0,d.jsx)("span",{className:"dd-ph",children:j||o("common.selectEllipsis")})}),(0,d.jsx)(f.I,{name:"chevronDown",size:14})]}),p&&(0,d.jsxs)("div",{className:"dd-menu scroll",children:[x&&(0,d.jsxs)("div",{style:{position:"sticky",top:0,zIndex:1,display:"flex",alignItems:"center",gap:6,padding:"6px 8px",margin:"-4px -4px 4px",background:"var(--bg-elev, var(--bg-active))",borderBottom:"1px solid var(--border)"},children:[(0,d.jsx)(f.I,{name:"search",size:13}),(0,d.jsx)("input",{ref:u,value:r,placeholder:o("common.searchEllipsis"),onChange:a=>s(a.target.value),onKeyDown:a=>{"Enter"===a.key&&z[0]?(c(z[0].value),q(!1)):"Escape"===a.key&&r&&(a.stopPropagation(),s(""))},className:k?"mono":void 0,style:{flex:1,minWidth:0,background:"transparent",border:"none",outline:"none",color:"var(--text)",fontSize:12.5,fontFamily:k?"var(--mono-font)":"inherit"}}),r&&(0,d.jsx)("button",{type:"button",title:o("common.clear"),onClick:()=>{s(""),u.current?.focus()},style:{background:"none",border:"none",color:"var(--text-dim)",cursor:"pointer",display:"flex",padding:0},children:(0,d.jsx)(f.I,{name:"close",size:12})})]}),0===v.length&&(0,d.jsx)("div",{className:"dd-empty",children:o("common.noOptions")}),v.length>0&&0===z.length&&(0,d.jsx)("div",{className:"dd-empty",children:o("dropdown.noMatch",{q:r})}),z.map(b=>(0,d.jsxs)("button",{type:"button",className:"dd-opt"+(b.value===a?" on":""),onClick:()=>{c(b.value),q(!1)},children:[l&&(0,d.jsx)(g.W,{id:b.glyphId||b.value,size:22}),(0,d.jsxs)("span",{className:"dd-opt-main",children:[(0,d.jsx)("span",{className:"dd-opt-label"+(k?" mono":""),children:b.label}),b.sub&&(0,d.jsx)("span",{className:"dd-opt-sub",children:b.sub})]}),b.tag&&(0,d.jsx)("span",{className:"dd-opt-tag",children:b.tag}),b.value===a&&(0,d.jsx)(f.I,{name:"check",size:13})]},b.value))]})]})}},86036:(a,b,c)=>{c.d(b,{bv:()=>t,eH:()=>q,iw:()=>o,jM:()=>n,kq:()=>p,yS:()=>s,z6:()=>r});var d=c(6866),e=c(97603),f=c(31371),g=c(65705),h=c(1890),i=c(53993),j=c(57086),k=c(83963),l=c(65300),m=c(35745);async function n(a,b){let{workspace:c}=await (0,i.nP)();if(a===b)return;let d=Object.fromEntries((await g.db.select().from(h.agent).where((0,e.eq)(h.agent.workspaceId,c.id))).map(a=>[a.id,a])),j=b,k=new Set;for(;j;){if(j===a)return;if(k.has(j))break;k.add(j),j=d[j]?.reportsTo??null}await g.db.update(h.agent).set({reportsTo:b}).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,c.id))),(0,f.revalidatePath)("/org")}async function o(a,b){let{workspace:c}=await (0,i.nP)();if(a===b)return;let d=Object.fromEntries((await g.db.select().from(h.agent).where((0,e.eq)(h.agent.workspaceId,c.id))).map(a=>[a.handle,a])),j=d[a];if(!j||null!==b&&!d[b])return;let k=b,l=new Set;for(;k;){if(k===a)return;if(l.has(k))break;l.add(k),k=d[k]?.reportsTo??null}await g.db.update(h.agent).set({reportsTo:b}).where((0,e.Uo)((0,e.eq)(h.agent.id,j.id),(0,e.eq)(h.agent.workspaceId,c.id))),(0,f.revalidatePath)("/org")}async function p(a,b){let{org:c,workspace:d}=await (0,i.nP)(),[n]=await g.db.select().from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,d.id)));if(!n)return;await g.db.update(h.agent).set({...void 0!==b.adapter?{adapter:b.adapter}:{},...void 0!==b.model?{model:b.model}:{},...void 0!==b.temperature?{temperature:b.temperature}:{},...void 0!==b.dailyCapUsd?{dailyCapUsd:b.dailyCapUsd}:{},...void 0!==b.tierFloor?{tierFloor:b.tierFloor}:{}}).where((0,e.eq)(h.agent.id,a));let o=`.claude/agents/${n.handle}/Agent.md`,p=(0,j.sL)(c.id,o);p&&(void 0!==b.adapter&&(p=(0,l.tT)(p,"provider",b.adapter)),void 0!==b.model&&(p=(0,l.tT)(p,"model",b.model)),void 0!==b.temperature&&(p=(0,l.tT)(p,"temperature",b.temperature),p=(0,l.c4)(p,"Behavior",(0,m.T)(b.temperature))),void 0!==b.dailyCapUsd&&(p=(0,l.tT)(p,"dailyCapUsd",b.dailyCapUsd)),void 0!==b.tierFloor&&(p=(0,l.tT)(p,"tierFloor",b.tierFloor)),await (0,k.g)(c.id,o,p)),(0,f.revalidatePath)("/agents/[handle]","page")}async function q(a,b){let{org:c,workspace:d}=await (0,i.nP)(),[k]=await g.db.select().from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,d.id)));if(k){if(k.image&&k.image.startsWith("uploads/")&&k.image!==b)try{(0,j.EX)(c.id,k.image.split("/").slice(0,2).join("/"))}catch{}await g.db.update(h.agent).set({image:b??null}).where((0,e.eq)(h.agent.id,a)),(0,f.revalidatePath)("/agents/[handle]","page"),(0,f.revalidatePath)("/","layout")}}async function r(a,b){let{org:c,workspace:d}=await (0,i.nP)(),[m]=await g.db.select().from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,d.id)));if(!m)return;await g.db.update(h.agent).set({persona:b}).where((0,e.eq)(h.agent.id,a));let n=`.claude/agents/${m.handle}/Agent.md`,o=(0,j.sL)(c.id,n);o?(o=(0,l.a$)(o,"Identity",b.identity),o=(0,l.a$)(o,"Ritual",b.ritual),o=(0,l.c4)(o,"System prompt",b.systemPrompt)):o=`---
|
|
9
|
-
handle: ${m.handle}
|
|
10
|
-
name: ${m.name}
|
|
11
|
-
role: ${m.role}
|
|
12
|
-
---
|
|
13
|
-
# ${m.name} — ${m.role}
|
|
14
|
-
|
|
15
|
-
**Identity:** ${b.identity}
|
|
16
|
-
|
|
17
|
-
**Ritual:** ${b.ritual}
|
|
18
|
-
|
|
19
|
-
## System prompt
|
|
20
|
-
${b.systemPrompt}
|
|
21
|
-
`,await (0,k.g)(c.id,n,o),(0,f.revalidatePath)("/agents/[handle]","page")}async function s(a,b,c){let{workspace:d}=await (0,i.nP)();await g.db.update(h.agent).set({orgX:Math.round(b),orgY:Math.round(c)}).where((0,e.Uo)((0,e.eq)(h.agent.handle,a),(0,e.eq)(h.agent.workspaceId,d.id)))}async function t(a,b){let{workspace:c}=await (0,i.nP)(),[d]=await g.db.select().from(h.agent).where((0,e.Uo)((0,e.eq)(h.agent.id,a),(0,e.eq)(h.agent.workspaceId,c.id)));d&&(await g.db.update(h.agent).set({rag:b}).where((0,e.eq)(h.agent.id,a)),(0,f.revalidatePath)("/agents/[handle]","page"))}(0,c(74252).D)([n,o,p,q,r,s,t]),(0,d.A)(n,"607693138d28d8f43569c42d33b1e396036f9caee1",null),(0,d.A)(o,"60b5e8b749b8c079b6f0232b55d48f5ad0e9f26bd0",null),(0,d.A)(p,"60f7a9badac0e78da08a792858f4ccc8f6f37a02ef",null),(0,d.A)(q,"60182615880c9d485a408140c0a1796aa25913b0c7",null),(0,d.A)(r,"6075563bd7c53667d7c6bc25a3c8ae003c74b8de89",null),(0,d.A)(s,"70f5473699d6879da7e70820c873eebbda885204de",null),(0,d.A)(t,"6008d8c78dff76e554930b597d23dddf9673f6a7b6",null)},92837:(a,b,c)=>{c.d(b,{A:()=>e});var d=c(2910);let e=(0,d.createServerReference)("406836dff841ba34c3bd419e038c83fef59ce53ba8",d.callServer,void 0,d.findSourceMapURL,"listCatalogModels")},96214:(a,b,c)=>{c.d(b,{aO:()=>H,AO:()=>M,EC:()=>O,uR:()=>L,Po:()=>J,iw:()=>P,xf:()=>Q,x1:()=>I,WU:()=>N});var d=c(6866),e=c(77598),f=c(97603),g=c(31371),h=c(65705),i=c(1890),j=c(53993),k=c(38926),l=c(29803),m=c(70149);async function n(a,b,c=12e3){let d=new AbortController,e=setTimeout(()=>d.abort(),c);try{let c,e=await fetch(a,{headers:b,signal:d.signal}),f=await e.text();try{c=JSON.parse(f)}catch{c=void 0}return{ok:e.ok,status:e.status,json:c,error:e.ok?void 0:f.slice(0,200)||e.statusText}}catch(a){return{ok:!1,status:0,error:a instanceof Error?a.message:String(a)}}finally{clearTimeout(e)}}function o(a){return a&&"object"==typeof a?Array.isArray(a.data)?a.data.length:Array.isArray(a.models)?a.models.length:0:0}async function p(a,b){let c=a.defaultAdapter;if(c.startsWith("cli_")){let a=(0,m.hW)(c);return await (0,m.$g)(a)?{ok:!0,count:(m.w5[c]??m.w5.cli_claude_code).length}:{ok:!1,count:0,error:`${a} CLI not found on PATH`}}if("local_ollama"===c||"ollama"===a.id||"ollama_openai"===a.id){let b=a.baseUrl||"http://127.0.0.1:11434",c=await n(b.replace(/\/$/,"")+"/api/tags",{});return c.ok?{ok:!0,count:o(c.json)}:{ok:!1,count:0,error:c.error||"Ollama not reachable at "+b}}if("local_runtime"===a.category){let c=a.baseUrl||"http://127.0.0.1:8080",d=await n(c.replace(/\/$/,"")+"/v1/models",b?{Authorization:"Bearer "+b}:{});return d.ok?{ok:!0,count:o(d.json)}:{ok:!1,count:0,error:d.error||"local runtime not reachable"}}if(!b)return{ok:!1,count:0,error:"no API key in vault — connect with a key first"};if("http_anthropic"===c||"anthropic"===a.id){let a=await n("https://api.anthropic.com/v1/models",{"x-api-key":b,"anthropic-version":"2023-06-01"});return a.ok?{ok:!0,count:o(a.json)}:{ok:!1,count:0,error:a.error||"auth failed ("+a.status+")"}}let d=(a.baseUrl||"https://api.openai.com/v1").replace(/\/$/,""),e=d.endsWith("/models")?d:d+(d.includes("/v1")?"/models":"/v1/models"),f=await n(e,{Authorization:"Bearer "+b});return f.ok?{ok:!0,count:o(f.json)}:{ok:!1,count:0,error:f.error||"auth failed ("+f.status+")"}}var q=c(73024),r=c(76760),s=c(57086);let t={anthropic:"anthropic",openai:"openai",google_gemini:"google",xai_grok:"xai",deepseek:"deepseek",cohere:"cohere",groq:"groq",nvidia_nim:"nvidia",together:"togetherai",fireworks:"fireworks-ai",cerebras:"cerebras",perplexity:"perplexity",openrouter:"openrouter",mistral:"mistral",moonshot:"moonshotai",dashscope:"alibaba",zhipu:"zhipuai",azure_openai:"azure",aws_bedrock:"amazon-bedrock",vertex_ai:"google-vertex",claude_code:"anthropic",gemini_cli:"google"};function u(a){return t[a]?t[a]:a.replace(/_(grok|gemini|nim|cli|openai|api|server|rt)$/g,"").replace(/_/g,"-")}let v={anthropic:["sonnet-4","sonnet","opus-4","opus"],openai:["gpt-5.2","gpt-5.1","gpt-5","gpt-4.1","o4"],google:["gemini-3-pro","gemini-3","gemini-2.5-pro","pro"],xai:["grok-4","grok-3","grok"],groq:["llama-4","llama-3.3","llama-3.1"],deepseek:["deepseek-chat","deepseek-v3","deepseek-reasoner"],mistral:["mistral-large","mistral-medium"],openrouter:["claude-sonnet","gpt-5","gemini"]},w=(a,b,c,d,e,f,g,h)=>({id:a,name:b,context:c,outputLimit:d,inputCost:e,outputCost:f,caps:{reasoning:!!g.reasoning,tools:!!g.tools,vision:!!g.vision},released:h}),x={anthropic:[w("claude-opus-4-8","Claude Opus 4.8",1e6,64e3,5,25,{reasoning:!0,tools:!0,vision:!0},"2026-02-01"),w("claude-opus-4-7","Claude Opus 4.7",1e6,64e3,5,25,{reasoning:!0,tools:!0,vision:!0},"2025-12-01"),w("claude-sonnet-4-6","Claude Sonnet 4.6",1e6,64e3,3,15,{reasoning:!0,tools:!0,vision:!0},"2026-01-15"),w("claude-haiku-4-5","Claude Haiku 4.5",2e5,32e3,1,5,{tools:!0,vision:!0},"2025-10-01")],openai:[w("gpt-5.2","GPT-5.2",4e5,128e3,1.25,10,{reasoning:!0,tools:!0,vision:!0},"2026-03-01"),w("gpt-5.1","GPT-5.1",4e5,128e3,1.25,10,{reasoning:!0,tools:!0,vision:!0},"2025-12-01"),w("gpt-5","GPT-5",4e5,128e3,1.25,10,{reasoning:!0,tools:!0,vision:!0},"2025-08-01"),w("o4-mini","o4-mini",2e5,1e5,1.1,4.4,{reasoning:!0,tools:!0},"2025-04-01")],google:[w("gemini-3-pro","Gemini 3 Pro",2e6,64e3,2,12,{reasoning:!0,tools:!0,vision:!0},"2026-02-01"),w("gemini-3-flash","Gemini 3 Flash",1e6,64e3,.3,2.5,{tools:!0,vision:!0},"2026-02-01"),w("gemini-2.5-pro","Gemini 2.5 Pro",2e6,64e3,1.25,10,{reasoning:!0,tools:!0,vision:!0},"2025-06-01")],xai:[w("grok-4.3","Grok 4.3",256e3,64e3,3,15,{reasoning:!0,tools:!0,vision:!0},"2026-02-01"),w("grok-4","Grok 4",256e3,64e3,3,15,{reasoning:!0,tools:!0,vision:!0},"2025-09-01"),w("grok-3","Grok 3",131072,32e3,3,15,{tools:!0,vision:!0},"2025-02-01")],deepseek:[w("deepseek-chat","DeepSeek Chat",128e3,8e3,.27,1.1,{tools:!0},"2025-12-01"),w("deepseek-reasoner","DeepSeek Reasoner",128e3,64e3,.55,2.19,{reasoning:!0,tools:!0},"2025-12-01")],groq:[w("llama-4-scout","Llama 4 Scout",131072,8e3,.11,.34,{tools:!0,vision:!0},"2025-04-01"),w("llama-3.3-70b","Llama 3.3 70B",131072,32e3,.59,.79,{tools:!0},"2024-12-01")]},y=null;function z(){return(0,r.join)((0,s.r$)(),"cache","models-dev.json")}async function A(){try{let a=await fetch("https://models.dev/api.json",{signal:AbortSignal.timeout(1e4),headers:{accept:"application/json"}});if(!a.ok)return null;let b=await a.json();if(!b||"object"!=typeof b)return null;let c={};for(let[a,d]of Object.entries(b)){let b=d?.models,e=function(a){if(!a||"object"!=typeof a)return[];let b=[];for(let[c,d]of Object.entries(a)){let a=d??{},e=String(a.id??c),f=e.includes("/")?e.split("/").pop():e;if(!f)continue;let g=a.modalities??{},h=Array.isArray(g.input)?g.input:[],i=a.limit??{},j=a.cost??{},k={reasoning:!0===a.reasoning,tools:!0===a.tool_call,vision:!0===a.attachment||h.includes("image")};b.push({id:f,name:String(a.name??f),context:Number(i.context??0)||0,outputLimit:Number(i.output??0)||0,inputCost:Number(j.input??0)||0,outputCost:Number(j.output??0)||0,caps:k,released:"string"==typeof a.release_date?a.release_date:""})}return b}(b);e.length&&(c[a]=e)}return Object.keys(c).length?c:null}catch{return null}}async function B(){if(y&&Date.now()-y.at<864e5)return y.data;let a=function(){try{let a=z();if(!(0,q.existsSync)(a))return null;let b=JSON.parse((0,q.readFileSync)(a,"utf8"));if(!b?.data||"object"!=typeof b.data)return null;return{at:Number(b.at??(0,q.statSync)(a).mtimeMs),data:b.data}}catch{return null}}();if(a&&Date.now()-a.at<864e5)return y=a,a.data;let b=await A();if(b){y={at:Date.now(),data:b};try{(0,q.mkdirSync)((0,r.join)((0,s.r$)(),"cache"),{recursive:!0}),(0,q.writeFileSync)(z(),JSON.stringify({at:Date.now(),data:b}),"utf8")}catch{}return b}return a?(y=a,a.data):{}}async function C(a){let b=u(a),c=await B();return c[b]?.length?c[b]:x[b]??[]}async function D(a,b,c=9e3){try{let d=await fetch(a,{headers:b,signal:AbortSignal.timeout(c)});if(!d.ok)return null;return await d.json()}catch{return null}}async function E(a){let{catalogId:b,adapter:c,baseUrl:d,apiKey:e}=a;if(c.startsWith("cli_"))return"cli_opencode"===c?(await (0,m.ZB)("opencode")).map(a=>({id:a})):"cli_aider"===c?(await (0,m.ZB)("aider")).map(a=>({id:a})):null;if(/ollama/i.test(b)||c.includes("ollama")){let a=(d||"http://127.0.0.1:11434").replace(/\/$/,"").replace(/\/v1$/,""),b=await D(`${a}/api/tags`,{});return b?(b.models??[]).map(a=>({id:String(a.name??"")})).filter(a=>a.id):[]}if(!d)return null;let f=d.replace(/\/$/,""),g="http_anthropic"===c||"anthropic"===b,h=g?"https://api.anthropic.com/v1/models":f.endsWith("/models")?f:f+(f.includes("/v1")?"/models":"/v1/models"),i=g?e?{"x-api-key":e,"anthropic-version":"2023-06-01"}:{}:e?{authorization:`Bearer ${e}`}:{},j=await D(h,i);return j?(Array.isArray(j.data)?j.data:Array.isArray(j.models)?j.models:[]).map(a=>{let b=String(a.id??a.name??"");if(!b)return null;let c={id:b};"string"==typeof a.display_name?c.name=a.display_name:"string"==typeof a.name&&(c.name=a.name),"number"==typeof a.context_length&&(c.context=a.context_length);let d=a.pricing;if(d){let a=Number(d.prompt),b=Number(d.completion);Number.isFinite(a)&&a>0&&(c.inputCost=1e6*a),Number.isFinite(b)&&b>0&&(c.outputCost=1e6*b)}return c}).filter(a=>!!a).slice(0,200):[]}async function F(){let a=await B(),b=new Map;for(let c of Object.values(a))for(let a of c){let c=a.id.toLowerCase();b.has(c)||b.set(c,a)}return b}async function G(a,b){let c=await C(a);if(!b||0===b.length)return c;let d=new Map;for(let a of c)d.set(a.id.toLowerCase(),a);let e=await F(),f=a=>{let b=a.toLowerCase(),c=a.includes("/")?a.split("/").pop().toLowerCase():b;return d.get(b)??d.get(c)??e.get(b)??e.get(c)},g=[];for(let a of b){let b=f(a.id);g.push({id:a.id,name:a.name||b?.name||a.id,context:a.context??b?.context??0,outputLimit:b?.outputLimit??0,inputCost:a.inputCost??b?.inputCost??0,outputCost:a.outputCost??b?.outputCost??0,caps:b?.caps??{reasoning:!1,tools:!1,vision:!1},released:b?.released??""})}return g}async function H(a,b){let{workspace:c}=await (0,j.nP)(),d=(0,l.kH)(a);if(!d)return;let f=(0,e.randomUUID)();await h.db.insert(i.provider).values({id:f,workspaceId:c.id,catalogId:a,adapter:d.defaultAdapter,kind:"cli"===d.category?"cli":"local_runtime"===d.category?"local":"cloud",auth:d.connectionTypes.includes("api_key")?"api_key":d.connectionTypes[0],status:"needs_sync",syncStatus:d.supportsModelSync?"implemented":"manual"}),b&&await (0,k.IW)(c.id,`${a}_api_key`,b,f),(0,g.revalidatePath)("/models"),await I(f)}async function I(a){let b,{workspace:c}=await (0,j.nP)(),[d]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,c.id)));if(!d)return{ok:!1,error:"not found"};let e=(0,l.kH)(d.catalogId);if(!e)return{ok:!1,error:"unknown provider"};let n=await (0,k.r6)(c.id,`${d.catalogId}_api_key`),o=await p(e,n),q=null;if("cli"===e.category){let a=(0,m.hW)(e.defaultAdapter);b=(q=await (0,m.$g)(a).catch(()=>null))?await (0,m.Kp)(a).catch(()=>"unknown"):"needs_login"}else b="local_runtime"===e.category?o.ok?"ready":"unknown":n&&o.ok?"ready":"needs_key";return await h.db.update(i.provider).set({status:o.ok?"connected":"error",modelCount:o.count,lastSync:new Date,cliVersion:q,authState:b}).where((0,f.eq)(i.provider.id,a)),o.ok&&await J(a).catch(()=>{}),(0,g.revalidatePath)("/models"),o}async function J(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));if(!c)return{ok:!1,count:0,error:"not found"};let d=await K(c);return(0,g.revalidatePath)("/models"),d}async function K(a){let b,c,d,g=(0,l.kH)(a.catalogId);if(!g)return{ok:!1,count:0,error:"unknown provider"};let j=await (0,k.r6)(a.workspaceId,`${a.catalogId}_api_key`),n="cli"===g.category;try{b=await E({catalogId:a.catalogId,adapter:a.adapter,baseUrl:g.baseUrl,apiKey:j})}catch{b=null}if(n){let e=(0,m.hW)(a.adapter);d=(c=await (0,m.$g)(e).catch(()=>null))?await (0,m.Kp)(e).catch(()=>"unknown"):"needs_login",null===b&&(b=(m.w5[a.adapter]??[]).filter(a=>"(default)"!==a).map(a=>({id:a})))}if(null===b)return{ok:!0,count:0};let o=await G(a.catalogId,b),p=new Date,q=o.length?function(a,b){if(!b.length)return"";let c=v[u(a)];if(c)for(let a of c){let c=b.filter(b=>b.id.toLowerCase().includes(a));if(c.length)return c.sort((a,b)=>(b.released||"").localeCompare(a.released||"")),c[0].id}let d=b.filter(a=>a.released);return d.length?(d.sort((a,b)=>b.released.localeCompare(a.released)),d[0].id):b[0].id}(a.catalogId,o):null;if(o.length)await h.db.delete(i.providerModel).where((0,f.eq)(i.providerModel.providerId,a.id)),await h.db.insert(i.providerModel).values(o.map(b=>({id:(0,e.randomUUID)(),workspaceId:a.workspaceId,providerId:a.id,catalogId:a.catalogId,modelId:b.id,name:b.name,context:b.context,outputLimit:b.outputLimit,inputCost:b.inputCost,outputCost:b.outputCost,caps:b.caps,released:b.released,isDefault:b.id===q,lastSeen:p})));else if(!n)return{ok:!1,count:0,error:"no models returned"};let r=n&&!c?"needs_sync":"connected";return await h.db.update(i.provider).set({status:r,modelCount:o.length||(n?a.modelCount:0),lastSync:p,defaultModel:q||a.defaultModel,...n?{cliVersion:c??null,authState:d??null}:{}}).where((0,f.eq)(i.provider.id,a.id)),{ok:!0,count:o.length}}async function L(a=12){let b,c=new Date(Date.now()-60*a*6e4);try{b=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.status,"connected"),(0,f.or)((0,f.kZ)(i.provider.lastSync),(0,f.lt)(i.provider.lastSync,c))))}catch{return{refreshed:0}}let d=0;for(let a of b.slice(0,50))try{let b=await K(a);b.ok&&b.count>0&&d++}catch{}return{refreshed:d}}async function M(a){let{workspace:b}=await (0,j.nP)(),c=(await h.db.select().from(i.providerModel).where((0,f.Uo)((0,f.eq)(i.providerModel.providerId,a),(0,f.eq)(i.providerModel.workspaceId,b.id)))).map(a=>({id:a.modelId,name:a.name,context:a.context,outputLimit:a.outputLimit,inputCost:a.inputCost,outputCost:a.outputCost,caps:a.caps??{reasoning:!1,tools:!1,vision:!1},released:a.released,isDefault:a.isDefault}));return c.sort((a,b)=>Number(b.isDefault)-Number(a.isDefault)||(b.released||"").localeCompare(a.released||"")||a.name.localeCompare(b.name)),{models:c}}async function N(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));if(!c)return{ok:!1,error:"not found"};let d=(0,l.kH)(c.catalogId);if(!d)return{ok:!1,error:"unknown provider"};let e=await (0,k.r6)(b.id,`${c.catalogId}_api_key`),m=await p(d,e);return await h.db.update(i.provider).set({status:m.ok?"connected":"error"}).where((0,f.eq)(i.provider.id,a)),(0,g.revalidatePath)("/models"),{ok:m.ok,error:m.error}}async function O(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));if(!c)return{models:[],error:"not found"};let d=(0,l.kH)(c.catalogId);if(!d?.baseUrl)return{models:[],error:"no public endpoint for this provider"};let e=await (0,k.r6)(b.id,`${c.catalogId}_api_key`),g=d.baseUrl.replace(/\/$/,"");try{let a=/ollama/i.test(c.catalogId)||c.adapter.includes("ollama")?`${g.replace(/\/v1$/,"")}/api/tags`:`${g}/models`,b=await fetch(a,{headers:e?{authorization:`Bearer ${e}`}:{},signal:AbortSignal.timeout(8e3)});if(!b.ok)return{models:[],error:`endpoint ${b.status}`};let d=await b.json();return{models:(d.data??d.models??[]).map(a=>a.id??a.name??"").filter(Boolean).slice(0,80)}}catch(b){let a=String(b instanceof Error?b.message:b);return{models:[],error:/abort|fetch failed|ECONN/i.test(a)?"endpoint unreachable":a}}}async function P(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));c&&await (0,k.Kh)(b.id,`${c.catalogId}_api_key`),await h.db.delete(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id))),(0,g.revalidatePath)("/models")}async function Q(a){let{workspace:b}=await (0,j.nP)(),[c]=await h.db.select().from(i.provider).where((0,f.Uo)((0,f.eq)(i.provider.id,a),(0,f.eq)(i.provider.workspaceId,b.id)));c&&(await (0,k.Kh)(b.id,`${c.catalogId}_api_key`),await h.db.update(i.provider).set({auth:"none",status:"needs_sync",modelCount:0}).where((0,f.eq)(i.provider.id,a)),(0,g.revalidatePath)("/models"))}(0,c(74252).D)([H,I,J,L,M,N,O,P,Q]),(0,d.A)(H,"60bdec14597a2402418a9153dbff11622c12dfd58e",null),(0,d.A)(I,"407eeda1dd6b19dfa06ac9af2c006223133feb94b3",null),(0,d.A)(J,"40f69e0eec9373f2ba113fc240678e663895f384eb",null),(0,d.A)(L,"4000f825adbb6c74572d70e17b9995709d1cbb122a",null),(0,d.A)(M,"406836dff841ba34c3bd419e038c83fef59ce53ba8",null),(0,d.A)(N,"40bd06c4c1aab8ecdfd0402fbd0a27917dcf1c6f88",null),(0,d.A)(O,"40ad8cc407db284a4237d2a2f3eb012ddf1050500b",null),(0,d.A)(P,"402e429d688574228a27b88515e0ac2b623fd0dc00",null),(0,d.A)(Q,"40d4835df2ba133a7be578a6d2ad50dba23e0a77be",null)}};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=8071,exports.ids=[7336,8071],exports.modules={4719:(a,b,c)=>{c.d(b,{ViewChrome:()=>d});let d=(0,c(62060).registerClientReference)(function(){throw Error("Attempted to call ViewChrome() from the server but ViewChrome is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\shell\\view-chrome.tsx","ViewChrome")},5323:(a,b,c)=>{c.d(b,{_:()=>g});var d=c(61576),e=c(1308),f=c(4719);function g({title:a,sub:b,right:c,icon:h,flush:i,children:j}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.b,{title:a}),(0,d.jsx)(f.ViewChrome,{title:a,sub:b,right:c,icon:h,flush:i,children:j})]})}},18137:(a,b,c)=>{c.r(b),c.d(b,{"002fec2d26110a9739fa280853926b598d1a49bd44":()=>x,"003d1836382188603c5b40a8fd0c7735cec69e7922":()=>i.V,"004385fd0fd07982e82eeb3fc0a146319a0c4cddcf":()=>y.PG,"004ec7f252351e38a9c4baf338040eebc632b425d2":()=>j.f,"0051a52502b49e09ad171c2a611bc2418ed1c1a9dc":()=>e.PE,"005a226f73ea851bb80ec4f9fdf3aedb50fb7fbcd1":()=>e.y_,"00703229b811528142c40576d5c57f3467b87b9b61":()=>d.bt,"008945e940738840c2c3f8cf09a767e9dff2d1d34b":()=>k.dj,"00989a2c152ceb87b200f52f9d56d6a1006b3ae418":()=>j.O,"009be10f119924c7536924e7aa423be2a59d4a0f40":()=>y.eU,"00a3d5009503b1be561d7520e2b68ce0587a6740c0":()=>y.pM,"00bb81b2ee7b45ce9f2c558b5098b2acbe223d936e":()=>k.eg,"00cdd261029ea6d12df690e0b43e69818dbfeca142":()=>h.x7,"00ce8a19facd18b6c85993ebd6da347d63d0579dfa":()=>k.io,"00d423e1c54f47493dd9e26787f081501532d5754f":()=>d.xU,"00df7e6e08eaa29f35def8db35d7aefb6c9acb9ce2":()=>e.KO,"00e68579200e3df5cde1803035a93f8406aa41e3b0":()=>h.Mp,"00ee824db0a18ba9e4b113a979c27e43db14785003":()=>e.GK,"4004cb652b9955d22ac032162768b4e0579a46079b":()=>e.ey,"400cec94da616f674817927789cb26482bba22cfbd":()=>y.Kg,"4010339d35fee3f9209079d6bec35c010e1bbd23f5":()=>m.y,"4012df9fe60cdc771539fe5ed6ee353f894150d310":()=>g.L,"40180769811ee904607ab5b31116043b8c5f8be1a1":()=>i.E_,"401b5fdc3d8fb095679094c177536777e53f9c06fd":()=>y.lP,"4021ca58f6081eea2ecbd22b042f8eb7cb116a2fc3":()=>i.zS,"40242806df9ad69eb1c87ff62b4b2b34b3abad98dd":()=>e.jc,"40249f352fbd111bf83a85129254e9e18ef8ea9d64":()=>l.TX,"404005f581c185523c57ba4de7b6e623b00422d422":()=>l.IL,"4049b65fc61de5f15ea027c832048d695017a2cadc":()=>d.GW,"404aa55a36511316cdf338b098de663d429f9e7c1f":()=>k.De,"4055d44350781ccf3333fcaf2f5cb371866c797769":()=>i.F,"406201c1d173ad16581e88feb7fdf42ebbc95ef841":()=>d.VL,"407c52c4d4449ab61d90dcfa9cbf1ddd27160f6838":()=>e.RG,"4087e6e58cd4d57932fba61705c67f27c76e9dbebb":()=>d.Wu,"40972d5b822e66513389d5179af32bb5f9ab77ca88":()=>g.p,"409743adf88b2fc6a237494fd51038d3a4527b0203":()=>h.lR,"4098f6bc6c8bcf5e0704daf3a5a7bab7ffa82a196c":()=>d.H7,"40a6b782c452b9d7da8220c5630efb6277ba4077a1":()=>h.sE,"40a7dc12aa0d1b7b04c68ad7e482ba71fd189a44a7":()=>i.VJ,"40b05730806e4d6ca81c8b097bbe58fc8b2a6a9c19":()=>e.lJ,"40b85e5a61026f49480c36b5f71ce876512194b848":()=>e.S,"40dd7a9ba904e27f9eeac05cd7a750583e8de84545":()=>d.rd,"40e311db584b685c4692979c63d0c6e43ebfbb3776":()=>e.r7,"40eca98781164e186e8b92598018c0247eee2533ed":()=>l.q4,"40faf10ed1dd931e743694b6ab07acfffa9f1c5fff":()=>d.gg,"600d82e3d7031f663a63e6110ba9f565e1925bac77":()=>d.Fu,"602541726f950df2e46bd648c470b35caff4290401":()=>l.Jp,"6028f21157caf9e4ebf73d2a6dedcc869505c929ee":()=>w,"60301fe28cb811b08550b91045a0558179995780c0":()=>d.ME,"6043588d0686a7654ec852ff74b41a1990afb8ad5b":()=>l.bk,"60581df9364a1b92ebc0d853d7c78efa696792047f":()=>d.rm,"605cdb117d7636ebc2c1655a5624f369a8c5530ef3":()=>l.bV,"605ee4201fe65199f85db7180e840b038e2e8ffd10":()=>d.n4,"60641a6b24e31ba5d7c698743071a038d3366fc586":()=>e.AA,"6089bcc5361f39d22c01d6f92038ab1a71d519835f":()=>f.k,"60b6a569caae9899b156707b836ab2851f5218fa91":()=>e.q$,"60c1724f6f00fd2d33760b52f4dde31de692d1b203":()=>f.I,"60e6371f54999c9587eca32148839e4ce8eef9abc3":()=>e.LZ,"60e9b223d15847a611ea2b6fdf59614eceb4151ee9":()=>d.jw,"700e7dc42f9902ba897ac4e36d45bfd5032bd56211":()=>d._z,"706d88c745d18277356678742d9b6b2b19c4f6e86d":()=>e.M8});var d=c(97140),e=c(15487),f=c(79505),g=c(51605),h=c(46363),i=c(46282),j=c(387),k=c(13604),l=c(7482),m=c(58169),n=c(6866),o=c(77598),p=c(97603),q=c(65705),r=c(1890),s=c(53993),t=c(83963),u=c(70149),v=c(24701);async function w(a,b){let{org:c,workspace:d}=await (0,s.nP)(),[e]=await q.db.select().from(r.docIndex).where((0,p.Uo)((0,p.eq)(r.docIndex.id,a),(0,p.eq)(r.docIndex.workspaceId,d.id)));return e?(await (0,t.g)(c.id,e.path,b),{ok:!0}):{ok:!1}}async function x(){let{org:a,workspace:b}=await (0,s.nP)(),c=await q.db.select().from(r.agent).where((0,p.eq)(r.agent.workspaceId,b.id)),d=c.find(a=>"barbara"===a.handle)??c.find(a=>/docs|writer/i.test(a.role))??c[0];if(!d)return{ok:!1,error:"no docs agent"};let e=(0,u.hW)(d.adapter,d.model),f="claude"===e?d.model.includes("opus")?"opus":d.model.includes("haiku")?"haiku":"sonnet":void 0,g=`You are ${d.name} (@${d.handle}), ${d.role} at ${b.name}.
|
|
2
|
-
Review the current state of this workspace directory (code, specs, structure) and write or refresh a single piece of project documentation in GitHub-flavoured Markdown.
|
|
3
|
-
Begin with one H1 title line. Cover what exists, how it is organised, and how to work with it. Be specific and truthful — describe only what the files actually show; do not invent features.
|
|
4
|
-
Output ONLY the Markdown document (no code fences).`,h=await (0,u.JN)(g,{orgId:a.id,binary:e,model:f,timeoutMs:24e4});(h.usd>0||h.inputTokens+h.outputTokens>0)&&await q.db.insert(r.costEntry).values({id:(0,o.randomUUID)(),workspaceId:b.id,agentId:d.id,provider:h.binary,model:h.model??d.model,usd:h.usd,tokens:h.inputTokens+h.outputTokens,at:new Date});let i=h.text.trim();if(!h.ok||!i)return await (0,v.I)(b.id,{kind:"info",text:"Docs generation failed",detail:(h.error??"no output").slice(0,300),agentId:d.id}),{ok:!1,error:h.error};let j=(i.split("\n").find(a=>a.trim())??"Documentation").replace(/^#+\s*/,"").slice(0,120)||"Documentation",k=j.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,60)||"doc",l=`DOCS/${k}.md`;return await (0,t.g)(a.id,l,i),await (0,v.I)(b.id,{kind:"done",text:`${d.name} updated the docs: ${j}`,detail:`Saved to ${l}`,agentId:d.id}),{ok:!0,path:l}}(0,c(74252).D)([w,x]),(0,n.A)(w,"6028f21157caf9e4ebf73d2a6dedcc869505c929ee",null),(0,n.A)(x,"002fec2d26110a9739fa280853926b598d1a49bd44",null);var y=c(52932)},47336:(a,b,c)=>{c.d(b,{checkForUpdate:()=>l});var d=c(73024),e=c(76760),f=c(30043);let g="constellai",h=null,i=a=>a.replace(/^v/,"").split("-")[0].split(".").map(a=>parseInt(a,10)||0);async function j(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.json():null}catch{return null}}async function k(a){try{let b=new AbortController,c=setTimeout(()=>b.abort(),3e3),d=await fetch(a,{signal:b.signal,headers:{"user-agent":"constella"}});return clearTimeout(c),d.ok?await d.text():null}catch{return null}}async function l(a=!1){let b,c,m=function(){if(process.env.CONSTELLA_VERSION)return process.env.CONSTELLA_VERSION;try{let a=JSON.parse((0,d.readFileSync)((0,e.join)((0,f.v)(),"package.json"),"utf8"));if(a?.version)return a.version}catch{}return"0.0.0"}(),n=`npm install -g ${g}@latest`;if(!a&&h&&Date.now()-h.at<216e5)return h.info;let o=await j(`https://registry.npmjs.org/${g}/latest`),p=o?.version??null,q=!!p&&function(a,b){let c=i(a),d=i(b);for(let a=0;a<3;a++){if((c[a]||0)>(d[a]||0))return!0;if((c[a]||0)<(d[a]||0))break}return!1}(p,m),r=null;if(q&&p){let a=await k("https://raw.githubusercontent.com/gabriel7silva/constella/main/CHANGELOG.md");r=a?function(a,b){let c=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=a.match(RegExp(`(^|\\n)##\\s*\\[?${c}\\]?[\\s\\S]*?(?=\\n##\\s|$)`));if(d)return d[0].trim();let e=a.split(/\n##\s/)[1];return e?"## "+e.trim():null}(a,p):null}let s={current:m,latest:p,updateAvailable:q,type:p?(b=i(p),c=i(m),b[0]>c[0]?"major":b[1]>c[1]?"minor":b[2]>c[2]?"patch":null):null,command:n,changelog:r};return h={at:Date.now(),info:s},s}},51221:(a,b,c)=>{c.d(b,{ViewChrome:()=>h});var d=c(4374),e=c(43526),f=c(48442),g=c(31819);function h({title:a,sub:b,right:c,icon:i,flush:j,children:k}){let l=(0,g.k)(),m=f.e.find(b=>b.title===a),n=i??m?.icon,o=m?l(`mod.${m.id}`):a;return(0,d.jsxs)("div",{className:"app-view",children:[(0,d.jsxs)("div",{className:"view-head",children:[n&&(0,d.jsx)("div",{className:"vh-icon",children:(0,d.jsx)(e.I,{name:n,size:18})}),(0,d.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,d.jsx)("div",{className:"view-title",children:o}),b&&(0,d.jsx)("div",{className:"view-sub",children:b})]}),c]}),(0,d.jsx)("div",{className:"view-body",style:j?{padding:0,overflow:"hidden"}:void 0,children:k})]})}},52932:(a,b,c)=>{c.d(b,{pM:()=>z,lP:()=>y,Kg:()=>x,eU:()=>B,PG:()=>A});var d=c(6866),e=c(53993),f=c(30043),g=c(64567),h=c(30170);function i(){return(0,h.n)()?"dev":"vps"===(0,g.T)()?"vps":"portable"===(0,g.T)()?"portable":/[\\/]_npx[\\/]/.test((0,f.v)())?"npx":"global"}var j=c(47336),k=c(73024),l=c(76760),m=c(48161),n=c(31421),o=c(57086);let p=()=>new Date().toISOString().replace(/[:.]/g,"-"),q=()=>(0,l.join)((0,o.r$)(),"backups","last-update.json");async function r(){let a=await (0,j.checkForUpdate)(!0),b=i(),c=a.command;if(!a.updateAvailable)return{ok:!0,context:b,command:c,message:"Already up to date."};let d=function(){try{let a=(0,o.r$)(),b=(0,l.join)(a,"backups",p());for(let c of((0,k.mkdirSync)(b,{recursive:!0}),[".env","constella.db","constella.db-wal","constella.db-shm"])){let d=(0,l.join)(a,c);if((0,k.existsSync)(d))try{(0,k.copyFileSync)(d,(0,l.join)(b,c))}catch{}}return b}catch{return null}}()??void 0;return"dev"===b?{ok:!1,context:b,command:c,backupDir:d,message:"Running from source — update with: git pull && pnpm install && pnpm build"}:"npx"===b?{ok:!1,context:b,command:c,backupDir:d,message:"npx runs an ephemeral copy — re-run: npx constellai@latest"}:"vps"===b?{ok:!1,context:b,command:"bash scripts/vps-update.sh",backupDir:d,needsRestart:!0,message:"On a VPS, update from a shell: `bash scripts/vps-update.sh` (or `npm install -g constellai@latest && sudo systemctl restart constella`). Your data in ~/.constella — DB, secrets, workspaces — is preserved; migrations run on the next boot."}:function(a,b,c,d){try{(0,k.writeFileSync)(q(),JSON.stringify({status:"running",to:a.latest,at:p()}));let e=process.env.CONSTELLA_RUN_MODE||"start",f=process.env.CONSTELLA_LAUNCHER_PID||(process.ppid?String(process.ppid):"0"),g=(0,o.r$)(),h=process.env.PORT||"3000",i=process.env.CONSTELLA_PKG_ROOT||process.cwd(),j=(0,l.join)(i,"bin","constella-update.mjs"),r=a.latest?["--version",a.latest]:[];return(0,n.spawn)(process.execPath,[j,"--quiet","--pid",f,"--mode",e,"--home",g,"--port",h,...r],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:(0,m.tmpdir)()}).unref(),{ok:!0,started:!0,needsRestart:!0,context:b,command:c,backupDir:d,message:`Updating to ${a.latest} and restarting — this page reconnects in a few seconds.`}}catch(a){return{ok:!1,context:b,command:c,backupDir:d,message:"Couldn't launch the updater: "+String(a instanceof Error?a.message:a)}}}(a,b,c,d)}var s=c(97603),t=c(65705),u=c(1890),v=c(10245);async function w(){let a=await t.db.select({lastPulse:u.agent.lastPulse}).from(u.agent).where((0,s.eq)(u.agent.status,"working")),b=Date.now()-v.fQ;return a.some(a=>null!=a.lastPulse&&new Date(a.lastPulse).getTime()>=b)}async function x(a=!1){return(0,j.checkForUpdate)(a)}async function y(a=!1){let[b,c]=await Promise.all([(0,j.checkForUpdate)(a),w()]);return{info:b,busy:c}}async function z(){return i()}async function A(){return(await (0,e.nP)(),await w())?{ok:!1,started:!1,blocked:!0,context:"",command:"",message:"An agent is working — pause it before updating."}:r()}async function B(){try{return JSON.parse((0,k.readFileSync)(q(),"utf8"))}catch{return{status:"idle"}}}(0,c(74252).D)([x,y,z,A,B]),(0,d.A)(x,"400cec94da616f674817927789cb26482bba22cfbd",null),(0,d.A)(y,"401b5fdc3d8fb095679094c177536777e53f9c06fd",null),(0,d.A)(z,"00a3d5009503b1be561d7520e2b68ce0587a6740c0",null),(0,d.A)(A,"004385fd0fd07982e82eeb3fc0a146319a0c4cddcf",null),(0,d.A)(B,"009be10f119924c7536924e7aa423be2a59d4a0f40",null)},64567:(a,b,c)=>{c.d(b,{T:()=>e});let d=["start","auth","vps","portable"];function e(){let a=process.env.CONSTELLA_RUN_MODE;return a&&d.includes(a)?a:"start"}},67949:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(79676),e=c(75785);async function f(){return(0,e.e)((await (0,d.cookies)()).get("cn-lang")?.value)}async function g(){let a=await f();return(b,c)=>(0,e.t)(a,b,c)}}};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=8102,exports.ids=[8102],exports.modules={33379:(a,b,c)=>{c.r(b),c.d(b,{"0028f961902c9e2476af137bbeb472cd7073047824":()=>d.Kd,"007022a76790c9702b4391280231b2e171ccb37259":()=>d.cT,"405c3175ae584fd80327c8ee43d0a247dd50e3c25b":()=>d.j0,"40834c7dee509b9fe3747f69a43078710b318bcdf5":()=>d.OD});var d=c(14565)},76402:(a,b,c)=>{c.r(b),c.d(b,{"003d1836382188603c5b40a8fd0c7735cec69e7922":()=>i.V,"004385fd0fd07982e82eeb3fc0a146319a0c4cddcf":()=>F.PG,"004ec7f252351e38a9c4baf338040eebc632b425d2":()=>j.f,"0051a52502b49e09ad171c2a611bc2418ed1c1a9dc":()=>e.PE,"005a226f73ea851bb80ec4f9fdf3aedb50fb7fbcd1":()=>e.y_,"00703229b811528142c40576d5c57f3467b87b9b61":()=>d.bt,"008945e940738840c2c3f8cf09a767e9dff2d1d34b":()=>k.dj,"00989a2c152ceb87b200f52f9d56d6a1006b3ae418":()=>j.O,"009be10f119924c7536924e7aa423be2a59d4a0f40":()=>F.eU,"00a3d5009503b1be561d7520e2b68ce0587a6740c0":()=>F.pM,"00ba14d2b5c3a4f458d7d2061711c1f5378dd90b92":()=>E,"00bb81b2ee7b45ce9f2c558b5098b2acbe223d936e":()=>k.eg,"00cdd261029ea6d12df690e0b43e69818dbfeca142":()=>h.x7,"00ce8a19facd18b6c85993ebd6da347d63d0579dfa":()=>k.io,"00d423e1c54f47493dd9e26787f081501532d5754f":()=>d.xU,"00df7e6e08eaa29f35def8db35d7aefb6c9acb9ce2":()=>e.KO,"00e68579200e3df5cde1803035a93f8406aa41e3b0":()=>h.Mp,"00ee824db0a18ba9e4b113a979c27e43db14785003":()=>e.GK,"4004cb652b9955d22ac032162768b4e0579a46079b":()=>e.ey,"400cec94da616f674817927789cb26482bba22cfbd":()=>F.Kg,"4010339d35fee3f9209079d6bec35c010e1bbd23f5":()=>m.y,"4012df9fe60cdc771539fe5ed6ee353f894150d310":()=>g.L,"401571128a88231061daa7ab3ca11b65af45af2ac4":()=>z,"40180769811ee904607ab5b31116043b8c5f8be1a1":()=>i.E_,"401b5fdc3d8fb095679094c177536777e53f9c06fd":()=>F.lP,"4021ca58f6081eea2ecbd22b042f8eb7cb116a2fc3":()=>i.zS,"40242806df9ad69eb1c87ff62b4b2b34b3abad98dd":()=>e.jc,"40249f352fbd111bf83a85129254e9e18ef8ea9d64":()=>l.TX,"404005f581c185523c57ba4de7b6e623b00422d422":()=>l.IL,"4049b65fc61de5f15ea027c832048d695017a2cadc":()=>d.GW,"404aa55a36511316cdf338b098de663d429f9e7c1f":()=>k.De,"4055d44350781ccf3333fcaf2f5cb371866c797769":()=>i.F,"406201c1d173ad16581e88feb7fdf42ebbc95ef841":()=>d.VL,"407c52c4d4449ab61d90dcfa9cbf1ddd27160f6838":()=>e.RG,"4087e6e58cd4d57932fba61705c67f27c76e9dbebb":()=>d.Wu,"40972d5b822e66513389d5179af32bb5f9ab77ca88":()=>g.p,"409743adf88b2fc6a237494fd51038d3a4527b0203":()=>h.lR,"4098f6bc6c8bcf5e0704daf3a5a7bab7ffa82a196c":()=>d.H7,"40a01c0931ff061f0f56472a225b21888d3cd32089":()=>D,"40a0e2ee30f5d3805b41c5e1f9061840788d507f84":()=>A,"40a6b782c452b9d7da8220c5630efb6277ba4077a1":()=>h.sE,"40a7dc12aa0d1b7b04c68ad7e482ba71fd189a44a7":()=>i.VJ,"40b05730806e4d6ca81c8b097bbe58fc8b2a6a9c19":()=>e.lJ,"40b85e5a61026f49480c36b5f71ce876512194b848":()=>e.S,"40ba9a6a07e06f168c8e61d97eab0b139c0826c41f":()=>C,"40dd7a9ba904e27f9eeac05cd7a750583e8de84545":()=>d.rd,"40e311db584b685c4692979c63d0c6e43ebfbb3776":()=>e.r7,"40eca98781164e186e8b92598018c0247eee2533ed":()=>l.q4,"40faf10ed1dd931e743694b6ab07acfffa9f1c5fff":()=>d.gg,"600d82e3d7031f663a63e6110ba9f565e1925bac77":()=>d.Fu,"602541726f950df2e46bd648c470b35caff4290401":()=>l.Jp,"60301fe28cb811b08550b91045a0558179995780c0":()=>d.ME,"6043588d0686a7654ec852ff74b41a1990afb8ad5b":()=>l.bk,"60581df9364a1b92ebc0d853d7c78efa696792047f":()=>d.rm,"605cdb117d7636ebc2c1655a5624f369a8c5530ef3":()=>l.bV,"605ee4201fe65199f85db7180e840b038e2e8ffd10":()=>d.n4,"60641a6b24e31ba5d7c698743071a038d3366fc586":()=>e.AA,"6064a3ad18a5503a5d815a28fe065218575a8c1c8b":()=>B,"6089bcc5361f39d22c01d6f92038ab1a71d519835f":()=>f.k,"609166d96c2602d5d974ddca3a1d7cc4aae8af0e36":()=>y,"60b6a569caae9899b156707b836ab2851f5218fa91":()=>e.q$,"60c1724f6f00fd2d33760b52f4dde31de692d1b203":()=>f.I,"60e6371f54999c9587eca32148839e4ce8eef9abc3":()=>e.LZ,"60e9b223d15847a611ea2b6fdf59614eceb4151ee9":()=>d.jw,"700e7dc42f9902ba897ac4e36d45bfd5032bd56211":()=>d._z,"706d88c745d18277356678742d9b6b2b19c4f6e86d":()=>e.M8});var d=c(97140),e=c(15487),f=c(79505),g=c(51605),h=c(46363),i=c(46282),j=c(387),k=c(13604),l=c(7482),m=c(58169),n=c(6866),o=c(77598),p=c(97603),q=c(31371),r=c(65705),s=c(1890),t=c(53993),u=c(70149),v=c(56338),w=c(24701),x=c(83963);async function y(a,b){let{workspace:c}=await (0,t.nP)();await r.db.update(s.routine).set({enabled:b}).where((0,p.Uo)((0,p.eq)(s.routine.id,a),(0,p.eq)(s.routine.workspaceId,c.id))),(0,q.revalidatePath)("/routines")}async function z(a){let{workspace:b}=await (0,t.nP)(),c=a.name.trim();return c?(await r.db.insert(s.routine).values({id:(0,o.randomUUID)(),workspaceId:b.id,name:c.slice(0,120),cmd:(a.cmd??"").trim().slice(0,500),freq:(a.freq??"Daily").trim()||"Daily",agentId:a.agentId||null,enabled:!0}),(0,q.revalidatePath)("/routines"),{ok:!0}):{ok:!1,error:"Name the routine."}}async function A(a){let{workspace:b}=await (0,t.nP)();await r.db.delete(s.routine).where((0,p.Uo)((0,p.eq)(s.routine.id,a),(0,p.eq)(s.routine.workspaceId,b.id))),(0,q.revalidatePath)("/routines")}async function B(a,b){let{workspace:c}=await (0,t.nP)();await r.db.update(s.plugin).set({enabled:b}).where((0,p.Uo)((0,p.eq)(s.plugin.id,a),(0,p.eq)(s.plugin.workspaceId,c.id))),(0,q.revalidatePath)("/plugins")}async function C(a){let{workspace:b}=await (0,t.nP)();await r.db.delete(s.inboxItem).where((0,p.Uo)((0,p.eq)(s.inboxItem.id,a),(0,p.eq)(s.inboxItem.workspaceId,b.id))),(0,q.revalidatePath)("/inbox")}async function D(a){let{workspace:b}=await (0,t.nP)();await r.db.update(s.finding).set({status:"fixed"}).where((0,p.Uo)((0,p.eq)(s.finding.id,a),(0,p.eq)(s.finding.workspaceId,b.id))),await r.db.insert(s.notification).values({id:(0,o.randomUUID)(),workspaceId:b.id,kind:"security",text:"Finding patched by the Code Review Agent",detail:"A security finding was fixed and a report was filed."}),(0,q.revalidatePath)("/security")}async function E(){let{org:a,workspace:b}=await (0,t.nP)(),c=await r.db.select().from(s.agent).where((0,p.eq)(s.agent.workspaceId,b.id)),d=c.find(a=>"whitfield"===a.handle)??c.find(a=>/cyber|sec/i.test(a.role))??c[0],e=(0,o.randomUUID)();if(!d)return{ok:!1,count:0,runId:e,error:"no agent"};await r.db.update(s.agent).set({status:"working"}).where((0,p.eq)(s.agent.id,d.id)),await (0,f.I)(b.id,{runId:e,channel:"security",agentId:d.id,kind:"thinking",target:`${d.name} is reviewing the workspace…`});let g=await r.db.select({name:s.skill.name,instructions:s.skill.instructions,summary:s.skill.summary}).from(s.agentSkill).innerJoin(s.skill,(0,p.eq)(s.agentSkill.skillId,s.skill.id)).where((0,p.Uo)((0,p.eq)(s.agentSkill.agentId,d.id),(0,p.RV)(s.skill.name,["owasp-top-10","owasp-asvs","appsec-fundamentals","secrets-management","secure-auth-sessions","dependency-supply-chain","review-code-perf-security","code-review-practices"]))),h=g.length?`
|
|
2
|
-
Apply these review skills (consult before judging):
|
|
3
|
-
${g.map(a=>`- ${a.name}: ${(a.instructions||a.summary).replace(/\s+/g," ").slice(0,300)}`).join("\n")}`:"",i=await (0,v.yY)(a.id,"security review: vulnerabilities, auth, secrets, prior findings and decisions",{agentHandle:d.handle,k:6}),j=i.context?`
|
|
4
|
-
Project knowledge (prior findings, decisions, patterns — do not contradict):
|
|
5
|
-
${i.context}`:"",k=[`You are ${d.name}, the security reviewer. Review the code in the current workspace directory for vulnerabilities, secret/token exposure, permission & workspace-isolation issues, and risky patterns.`,h,j,"Output ONLY a JSON array (no prose, no markdown fences) of findings:",'[{"sev":"high"|"med"|"low","title":"short title","file":"relative/path","suggestion":"how to fix"}]',"If the workspace is clean or empty, output []. Do not modify any files."].filter(Boolean).join("\n"),l=(0,u.hW)(d.adapter,d.model),m=(0,u.qX)(d.adapter),n=await (0,u.p1)(k,{orgId:a.id,binary:l,model:m,timeoutMs:24e4},a=>{(0,f.I)(b.id,{runId:e,channel:"security",agentId:d.id,kind:a.kind,target:a.target,detail:a.detail})}),y=[],z=n.text.match(/\[[\s\S]*\]/);if(z)try{y=JSON.parse(z[0])}catch{y=[]}for(let a of y.slice(0,40)){let c="high"===a.sev||"low"===a.sev?a.sev:"med";await r.db.insert(s.finding).values({id:(0,o.randomUUID)(),workspaceId:b.id,sev:c,title:String(a.title??"Finding").slice(0,200),file:String(a.file??""),suggestion:String(a.suggestion??""),status:"open"})}y.length&&(0,v.ru)(a.id,y.slice(0,40).map(a=>({type:"vuln",title:String(a.title??"Finding").slice(0,120),summary:`${a.sev??"med"}: ${String(a.suggestion??"")}`.slice(0,1e3),paths:a.file?[String(a.file)]:void 0,agentHandle:d.handle,sourceKind:"review",sourceRef:`${String(a.file??"")}::${String(a.title??"")}`.slice(0,200)}))).catch(()=>{}),(n.usd>0||n.inputTokens+n.outputTokens>0)&&await r.db.insert(s.costEntry).values({id:(0,o.randomUUID)(),workspaceId:b.id,agentId:d.id,provider:n.binary,model:n.model??d.model,usd:n.usd,tokens:n.inputTokens+n.outputTokens,at:new Date}),await r.db.update(s.workspace).set({settings:{...b.settings??{},lastSecurityRun:Date.now()}}).where((0,p.eq)(s.workspace.id,b.id)),await r.db.update(s.agent).set({status:"idle"}).where((0,p.eq)(s.agent.id,d.id));let A=new Date().toISOString().replace("T"," ").slice(0,19),B=`# Security review
|
|
6
|
-
|
|
7
|
-
_By @${d.handle} (${d.role}) \xb7 ${A}_
|
|
8
|
-
|
|
9
|
-
`+(y.length?`Filed ${y.length} finding(s):
|
|
10
|
-
|
|
11
|
-
`+y.slice(0,40).map(a=>`- **${a.sev??"med"}** ${a.title??"Finding"} — \`${a.file??"?"}\`
|
|
12
|
-
- ${a.suggestion??""}`).join("\n")+"\n":"No findings — the workspace looks clean.\n");try{await (0,x.g)(a.id,"Reports/security-review.md",B)}catch(a){console.error("[review] security report write failed:",a)}return await (0,f.I)(b.id,{runId:e,channel:"security",agentId:d.id,kind:n.ok?"done":"error",target:n.ok?`${y.length} finding(s) filed`:(n.error??"review failed").slice(0,200)}),await (0,w.I)(b.id,{kind:"security",text:"Security sweep finished",detail:`${d.name} filed ${y.length} finding(s).`,agentId:d.id}),(0,q.revalidatePath)("/security"),(0,q.revalidatePath)("/","layout"),{ok:n.ok,count:y.length,runId:e,error:n.error}}(0,c(74252).D)([y,z,A,B,C,D,E]),(0,n.A)(y,"609166d96c2602d5d974ddca3a1d7cc4aae8af0e36",null),(0,n.A)(z,"401571128a88231061daa7ab3ca11b65af45af2ac4",null),(0,n.A)(A,"40a0e2ee30f5d3805b41c5e1f9061840788d507f84",null),(0,n.A)(B,"6064a3ad18a5503a5d815a28fe065218575a8c1c8b",null),(0,n.A)(C,"40ba9a6a07e06f168c8e61d97eab0b139c0826c41f",null),(0,n.A)(D,"40a01c0931ff061f0f56472a225b21888d3cd32089",null),(0,n.A)(E,"00ba14d2b5c3a4f458d7d2061711c1f5378dd90b92",null);var F=c(52932)},86450:(a,b,c)=>{c.d(b,{FixButton:()=>f,RunReviewButton:()=>g,Toggle:()=>e});var d=c(62060);let e=(0,d.registerClientReference)(function(){throw Error("Attempted to call Toggle() from the server but Toggle is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\module-toggles.tsx","Toggle");(0,d.registerClientReference)(function(){throw Error("Attempted to call ResolveButton() from the server but ResolveButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\module-toggles.tsx","ResolveButton");let f=(0,d.registerClientReference)(function(){throw Error("Attempted to call FixButton() from the server but FixButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\module-toggles.tsx","FixButton"),g=(0,d.registerClientReference)(function(){throw Error("Attempted to call RunReviewButton() from the server but RunReviewButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\Usuario\\Documents\\constella\\src\\components\\modules\\module-toggles.tsx","RunReviewButton")},95140:(a,b,c)=>{c.d(b,{FixButton:()=>n,RunReviewButton:()=>o,Toggle:()=>m});var d=c(4374),e=c(74679),f=c(2910);let g=(0,f.createServerReference)("609166d96c2602d5d974ddca3a1d7cc4aae8af0e36",f.callServer,void 0,f.findSourceMapURL,"toggleRoutine"),h=(0,f.createServerReference)("6064a3ad18a5503a5d815a28fe065218575a8c1c8b",f.callServer,void 0,f.findSourceMapURL,"togglePlugin"),i=(0,f.createServerReference)("40a01c0931ff061f0f56472a225b21888d3cd32089",f.callServer,void 0,f.findSourceMapURL,"fixFinding"),j=(0,f.createServerReference)("00ba14d2b5c3a4f458d7d2061711c1f5378dd90b92",f.callServer,void 0,f.findSourceMapURL,"runReview");var k=c(43526),l=c(31819);function m({kind:a,id:b,on:c}){let[f,i]=(0,e.useTransition)(),j="routine"===a?g:h;return(0,d.jsx)("div",{className:"toggle"+(c?" on":""),"aria-disabled":f,role:"switch","aria-checked":c,onClick:()=>!f&&i(()=>j(b,!c))})}function n({id:a}){let b=(0,l.k)(),[c,f]=(0,e.useTransition)();return(0,d.jsxs)("button",{className:"sc2-btn",disabled:c,onClick:()=>f(()=>i(a)),children:[(0,d.jsx)(k.I,{name:"bot",size:12})," ",b("security.letAgentFix")]})}function o(){let a=(0,l.k)(),[b,c]=(0,e.useTransition)();return(0,d.jsxs)("button",{className:"btn-accent",disabled:b,onClick:()=>{window.dispatchEvent(new CustomEvent("constella:agent-run",{detail:{channel:"security"}})),c(async()=>{await j()})},children:[(0,d.jsx)(k.I,{name:"refresh",size:14,className:b?"sync-spin":""})," ",a(b?"security.reviewing":"security.runReview")]})}}};
|