wednesdayai 0.6.1-dev.47 → 0.6.1-dev.50
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/dist/{acp-cli-DwgE-JaK.js → acp-cli-COVr7c9K.js} +12 -12
- package/dist/{agent-DOJWHSTp.js → agent-BgBSmNaI.js} +11 -11
- package/dist/{agent-BzS-Bw92.js → agent-XU4Yrfkg.js} +19 -19
- package/dist/{agent-turn-enqueue-DNz67IZC.js → agent-turn-enqueue-C65boHpU.js} +6 -6
- package/dist/{agent-turn-execute-CVq_M1H9.js → agent-turn-execute-CijEn5uU.js} +81 -81
- package/dist/{agent-turn-recovery-adapter-CVhr928E.js → agent-turn-recovery-adapter-xa1CJlHy.js} +4 -4
- package/dist/{agent-turn-runner-MK7RWfZB.js → agent-turn-runner-ns-G6-qQ.js} +4 -4
- package/dist/{agent-turn-runner-BnpbHkgj.js → agent-turn-runner-zXi4ADUq.js} +6 -6
- package/dist/{agents-iPiwcs70.js → agents-DdxbZ1yR.js} +15 -15
- package/dist/{agents.config-Dh-NFmf1.js → agents.config-Du-EvARZ.js} +2 -2
- package/dist/{audit-D4zYMRNh.js → audit-0XGsgYln.js} +21 -21
- package/dist/{auth-BLSoSze_.js → auth-a3TKKlev.js} +4 -4
- package/dist/{auth-choice-2S2Bu397.js → auth-choice-6lPmGWX_.js} +13 -13
- package/dist/{auth-choice-CAlWQnS0.js → auth-choice-BlU5Jwiy.js} +16 -16
- package/dist/{auth-choice.apply-helpers-DXEH3kKc.js → auth-choice.apply-helpers-BT5h7Kd2.js} +1 -1
- package/dist/{auth-token-RZVdRVFL.js → auth-token-BJlagO1q.js} +2 -2
- package/dist/{banner-DPhzJGvu.js → banner-DTi0GYhj.js} +4 -4
- package/dist/{bonjour-discovery-BP2NnLb7.js → bonjour-discovery-BaPEhz6-.js} +3 -3
- package/dist/{browser-cli-DqPOdkfi.js → browser-cli-cJbbNuC-.js} +20 -20
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +32 -32
- package/dist/bundled/bootstrap-extra-files/handler.js +5 -5
- package/dist/bundled/command-logger/handler.js +2 -2
- package/dist/bundled/session-journal/handler.js +31 -31
- package/dist/bundled/session-memory/handler.js +32 -32
- package/dist/{call-DzGlAM6A.js → call-DC_l0C6c.js} +5 -5
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{catalog-feed-DAWwBcpU.js → catalog-feed-BPQiz-j4.js} +2 -2
- package/dist/{channel-account-context-DHCvTbB_.js → channel-account-context-BR30O-XA.js} +2 -2
- package/dist/{channel-options-C-m0chcy.js → channel-options-pWJ9tPoi.js} +3 -3
- package/dist/{channel-selection-o_GXmd3S.js → channel-selection-SzzxWFqF.js} +1 -1
- package/dist/{channels-cli-DDV8DQJF.js → channels-cli-DCPDMwOi.js} +102 -102
- package/dist/{channels-status-issues-CDGOGIDW.js → channels-status-issues-D7YJcPZY.js} +1 -1
- package/dist/{chrome-BblDtIhl.js → chrome-DaxSYq9x.js} +6 -6
- package/dist/{chrome-C1IRBXCq.js → chrome-cV7G42a8.js} +32 -32
- package/dist/{clack-prompter-X5gjXw2v.js → clack-prompter-CSTfawN7.js} +5 -5
- package/dist/clawbot-cli-N0qA9LCg.js +32 -0
- package/dist/cli-BS1xXWfW.js +147 -0
- package/dist/{client-RYxRFbaf.js → client-CXlXbWxa.js} +4 -4
- package/dist/{client-profiles-DJoOHmYb.js → client-profiles-BPSW-Pej.js} +2 -2
- package/dist/{clipboard-DqxGZScZ.js → clipboard-C0KqeNJz.js} +1 -1
- package/dist/{command-queue-CZNc1Y5b.js → command-queue-CypbHAAc.js} +1 -1
- package/dist/{command-queue-CgNl6dbc.js → command-queue-DCuGQ6oE.js} +1 -1
- package/dist/{command-registry-nGIVkV6u.js → command-registry-Dn80fYRF.js} +13 -13
- package/dist/{command-secret-targets-BwUg9MG7.js → command-secret-targets-DJebWnC0.js} +4 -4
- package/dist/{commands-P3aAWSG_.js → commands-C4yR5Eki.js} +1 -1
- package/dist/{commands-registry-jq_YarKY.js → commands-registry-DagIzqO7.js} +4 -4
- package/dist/{completion-cli-CdEHcp3V.js → completion-cli-CFOXdHq-.js} +5 -5
- package/dist/{config-cli-BDy6tJDD.js → config-cli-DtQjTEf3.js} +14 -14
- package/dist/{config-guard-I6AtTyZv.js → config-guard-J_hz16uv.js} +4 -4
- package/dist/{config-validation-otVjLKQn.js → config-validation-Db_ZJIqZ.js} +4 -4
- package/dist/{configure-u-u8aXM_.js → configure-DbO7EHyB.js} +22 -22
- package/dist/{console-CdR5lE0A.js → console-eDkX4znK.js} +1 -1
- package/dist/control-ui-v2/assets/{AgentsView-BtvwUvjT.js → AgentsView-K8DEVXxj.js} +1 -1
- package/dist/control-ui-v2/assets/{AutomationsView-Bm551KRf.js → AutomationsView-DO0ssbS6.js} +1 -1
- package/dist/control-ui-v2/assets/Badge-me4YM1lq.js +1 -0
- package/dist/control-ui-v2/assets/{Button-D5rMawzJ.js → Button-ralPMMNs.js} +1 -1
- package/dist/control-ui-v2/assets/{ChannelsView-Bmcrzyc8.js → ChannelsView-8vJB0hXL.js} +1 -1
- package/dist/control-ui-v2/assets/{ConfigForm-tS4Ekkuj.js → ConfigForm-IOs1Exic.js} +1 -1
- package/dist/control-ui-v2/assets/{ConfirmDialog-B-AAbwH-.js → ConfirmDialog-9ode6FP3.js} +1 -1
- package/dist/control-ui-v2/assets/{DataTable-BqqaNmU8.js → DataTable-BbRrWxor.js} +1 -1
- package/dist/control-ui-v2/assets/{DebugView-w3AcoKSJ.js → DebugView-hDoK-Miv.js} +1 -1
- package/dist/control-ui-v2/assets/{Dialog-Che1C2PS.js → Dialog-oJKnAIqZ.js} +1 -1
- package/dist/control-ui-v2/assets/{DreamsView-CRVOkZ0y.js → DreamsView-QBWBlJnW.js} +1 -1
- package/dist/control-ui-v2/assets/{EntityLink-D6UsLKQR.js → EntityLink-CMtTP9Dk.js} +1 -1
- package/dist/control-ui-v2/assets/{FilterPills-CA2lRy0A.js → FilterPills-C_zBIqFP.js} +1 -1
- package/dist/control-ui-v2/assets/{InstancesView-D1s_2Z-j.js → InstancesView-BlXUEHAU.js} +1 -1
- package/dist/control-ui-v2/assets/{LearningView-BOxsGx8P.js → LearningView-De4YeA4M.js} +1 -1
- package/dist/control-ui-v2/assets/{LogsView-DU03hzlQ.js → LogsView-CbllorCk.js} +1 -1
- package/dist/control-ui-v2/assets/{NodesView-DH8y_KeJ.js → NodesView-DD4GYH-6.js} +1 -1
- package/dist/control-ui-v2/assets/{OverviewView-DHPrvXcn.js → OverviewView-7YdkWdG1.js} +1 -1
- package/dist/control-ui-v2/assets/{Panel-DM0JsHgz.js → Panel-CqcbBXzJ.js} +1 -1
- package/dist/control-ui-v2/assets/{PluginMount-DfCGGLsN.js → PluginMount-CIP5T99f.js} +1 -1
- package/dist/control-ui-v2/assets/{PluginPageView-7zgkiz9P.js → PluginPageView-D-WSAQoY.js} +1 -1
- package/dist/control-ui-v2/assets/{PluginPanels-BfBbsH_Z.js → PluginPanels-AFbR8qyk.js} +1 -1
- package/dist/control-ui-v2/assets/{RecoveryView-CrGTo_hu.js → RecoveryView-wCA7Nq9J.js} +1 -1
- package/dist/control-ui-v2/assets/{RunsView-Dp6Mtciq.js → RunsView-DucoEAaM.js} +1 -1
- package/dist/control-ui-v2/assets/{SessionsView-DbjlMwqU.js → SessionsView-0DgZ_-MW.js} +1 -1
- package/dist/control-ui-v2/assets/{SettingsView-Ci22dw48.js → SettingsView-CfTJTK06.js} +1 -1
- package/dist/control-ui-v2/assets/{SkillsView-7BGQcoCn.js → SkillsView-C_sMCqlY.js} +1 -1
- package/dist/control-ui-v2/assets/{Stat-DQyb-fKe.js → Stat-BRQhQ01w.js} +1 -1
- package/dist/control-ui-v2/assets/{StatusDot-CRJsKnJw.js → StatusDot-CjtPcYD9.js} +1 -1
- package/dist/control-ui-v2/assets/{StorageView-5BqFOHli.js → StorageView-B3vVHqxH.js} +1 -1
- package/dist/control-ui-v2/assets/{UpdatedAgo-D_q8xIeZ.js → UpdatedAgo-CJqGVu6_.js} +1 -1
- package/dist/control-ui-v2/assets/{UsageView-Bm9sF-Wt.js → UsageView-BUZtG2MG.js} +1 -1
- package/dist/control-ui-v2/assets/{config-store-zXNM_umy.js → config-store-DiHUH-77.js} +1 -1
- package/dist/control-ui-v2/assets/{format-DpM2rlEo.js → format-BPrfsCHW.js} +1 -1
- package/dist/control-ui-v2/assets/{gateway-features-C0JaT4JI.js → gateway-features-SDBnjY95.js} +1 -1
- package/dist/control-ui-v2/assets/{index-CGoFdGyu.js → index-ChHyE-y3.js} +1 -1
- package/dist/control-ui-v2/assets/{links-Bcw24zqI.js → links-vgPLVF05.js} +2 -2
- package/dist/control-ui-v2/assets/{run-rows-DVijLB79.js → run-rows-1MUje5J6.js} +1 -1
- package/dist/control-ui-v2/assets/{runs-store-Cxbnn8K8.js → runs-store-BZTDbQro.js} +1 -1
- package/dist/control-ui-v2/assets/{use-gateway-query-xtY3vmte.js → use-gateway-query-7iLwemQz.js} +1 -1
- package/dist/control-ui-v2/index.html +7 -7
- package/dist/{controller-ClPKFt9H.js → controller-Bibu9RBu.js} +1 -1
- package/dist/{credentials-D8xf4kQ3.js → credentials-BzwRYS__.js} +1 -1
- package/dist/{cron-cli-BcTM_Nir.js → cron-cli-C3uwnjAJ.js} +16 -16
- package/dist/{daemon-cli-mpcai9ZB.js → daemon-cli-DhSeyb4s.js} +18 -18
- package/dist/{daemon-install-Mm9lvcvD.js → daemon-install-DCXozUs7.js} +11 -11
- package/dist/{daemon-install-helpers-D74OoyoM.js → daemon-install-helpers-CU4mnKsx.js} +2 -2
- package/dist/{delete-agent-sessions-Drf95Usu.js → delete-agent-sessions-BNaCeFyf.js} +1 -1
- package/dist/{deliver-Di5lG5OI.js → deliver-DTy7SNq9.js} +11 -11
- package/dist/{deliver-BukUfhSv.js → deliver-XZwPv99X.js} +28 -28
- package/dist/{devices-cli-DfnrI4Q4.js → devices-cli-BZzq7Fou.js} +14 -14
- package/dist/{diagnostic-B4mnFYUK.js → diagnostic-5TT45xHw.js} +4 -4
- package/dist/{diagnostic-C8nY3mdC.js → diagnostic-CeSjaots.js} +3 -3
- package/dist/{diagnostics-BzqDQMJ0.js → diagnostics-aJloMvRL.js} +1 -1
- package/dist/{directory-cli-tEju7zyL.js → directory-cli-BdfsQsAd.js} +12 -12
- package/dist/{dm-policy-shared-DuFgR_0W.js → dm-policy-shared-BZGS_0kS.js} +5 -5
- package/dist/{dns-cli-1Fm79fkk.js → dns-cli-BXbIk9ti.js} +11 -11
- package/dist/{docs-cli-PbTOsDX0.js → docs-cli-DpSAY3cX.js} +12 -12
- package/dist/{doctor-4PvP20jU.js → doctor-8FDQmndb.js} +1 -1
- package/dist/{doctor-completion-D_hqUq1a.js → doctor-completion-D3c2yROu.js} +3 -3
- package/dist/{doctor-config-flow-Cn3VGUWv.js → doctor-config-flow-DsjAW_i3.js} +12 -12
- package/dist/{enable-CoZmUN1F.js → enable-BD-5STUq.js} +2 -2
- package/dist/entry.js +2 -2
- package/dist/{errors-C-0CPtkE.js → errors-BaBvv30m.js} +1 -1
- package/dist/{exec-CP66JVDC.js → exec-DiLAfuLr.js} +3 -3
- package/dist/{exec-approvals-DEidE9cu.js → exec-approvals-BwBMqZpq.js} +2 -2
- package/dist/{exec-approvals-allowlist-D3VLWMn3.js → exec-approvals-allowlist-DeajDmQz.js} +1 -1
- package/dist/{exec-approvals-cli-CD0A7x-1.js → exec-approvals-cli-D0vutwdC.js} +23 -23
- package/dist/{exec-safe-bin-runtime-policy-DgsZVxiX.js → exec-safe-bin-runtime-policy-GyiNcLWt.js} +2 -2
- package/dist/{extension-relay-auth-C4DY3BoO.js → extension-relay-auth-Vn4eJEcQ.js} +3 -3
- package/dist/{fences-D0-yWVSH.js → fences-CISax-La.js} +16 -16
- package/dist/{fetch-guard-DVeFm4CZ.js → fetch-guard-Bnzd4qWS.js} +2 -2
- package/dist/{fetch-guard-Bx35q9u4.js → fetch-guard-CDkEddFV.js} +2 -2
- package/dist/{frontmatter-QVz_zD_W.js → frontmatter-BtfJx9Sg.js} +3 -3
- package/dist/{frontmatter-BUaSX8Fz.js → frontmatter-Bzvwr1W7.js} +3 -3
- package/dist/{fs-safe-DA9gVh9s.js → fs-safe-D8HkhuMZ.js} +3 -3
- package/dist/{fs-safe-BV3IWmYM.js → fs-safe-jXfn3Elb.js} +26 -26
- package/dist/{gateway-cli-BGDf_UXv.js → gateway-cli-lPADWps2.js} +152 -152
- package/dist/{gateway-rpc-DpYzInuu.js → gateway-rpc-DQG3hBI5.js} +3 -3
- package/dist/{globals-BVh-VW1y.js → globals-BOYJmqPO.js} +4 -4
- package/dist/{gmail-setup-utils-BUD74IWH.js → gmail-setup-utils-Db0ZWkas.js} +3 -3
- package/dist/{health-DoUNuepo.js → health-CqBDDLKJ.js} +12 -12
- package/dist/{health-format-D_7YEfOK.js → health-format-B3wM0UeC.js} +1 -1
- package/dist/{heartbeat-tick-BRGg7O46.js → heartbeat-tick-DWTPRSj2.js} +1 -1
- package/dist/{help-format-B9fBC7YQ.js → help-format-3m9GNcQp.js} +1 -1
- package/dist/{helpers-BMCu08tD.js → helpers-ByEDcAjf.js} +1 -1
- package/dist/{hooks-cli-D6KMUi8J.js → hooks-cli-CuvmA2a8.js} +90 -90
- package/dist/{hooks-status-DsJcrJdW.js → hooks-status-D42ilCFd.js} +3 -3
- package/dist/{identity-cli-hw9RP7bb.js → identity-cli-eGQmm7Uf.js} +20 -20
- package/dist/{identity-links-DGrSQOyI.js → identity-links-CMiIcgvn.js} +4 -4
- package/dist/{image-ops-oycM9vAs.js → image-ops-BT8bD5QW.js} +2 -2
- package/dist/{inspect-y-Rf7C9M.js → inspect-DHJbh1BK.js} +1 -1
- package/dist/{install-package-dir-cFGJwdjt.js → install-package-dir-atID3P53.js} +4 -4
- package/dist/{install-safe-path-BKMVgfRM.js → install-safe-path-5pN67hCN.js} +3 -3
- package/dist/{installs-BpMec9Cz.js → installs-C8HDE8ek.js} +10 -10
- package/dist/{ipv4-_5izhCOd.js → ipv4-D-LmFWW3.js} +2 -2
- package/dist/{issue-format-BcCT1LCp.js → issue-format-3AjTJZ-g.js} +1 -1
- package/dist/{jobs-BADjbSd0.js → jobs-BGleUcI-.js} +3 -3
- package/dist/{legacy-names-DpNvKeY4.js → legacy-names-BncMDG8I.js} +26 -26
- package/dist/{legacy-names-D-gFhJkB.js → legacy-names-m85yQK-H.js} +4 -4
- package/dist/{lifecycle-core-BDcQzbfM.js → lifecycle-core-lEWBgzfk.js} +8 -8
- package/dist/{links-CNDAkRQK.js → links-C3uVLgry.js} +1 -1
- package/dist/llm-slug-generator.js +31 -31
- package/dist/{log-tail-P2iIBET-.js → log-tail-BVn--aNY.js} +1 -1
- package/dist/{logging-BrtVmOug.js → logging-CasLPWvm.js} +1 -1
- package/dist/{logs-cli-DNJpQfm5.js → logs-cli-C8g9JGRK.js} +15 -15
- package/dist/{manager-qTIsRkIR.js → manager-COuC5aCY.js} +16 -16
- package/dist/{manager-ANr3eRjC.js → manager-DO4sftxl.js} +6 -6
- package/dist/{manager-Byt2W-zl.js → manager-zauhsMSz.js} +7 -7
- package/dist/{memory-cli-C-kkAcSv.js → memory-cli-C6ChdKAF.js} +15 -15
- package/dist/{model-C0zdj1IG.js → model-CY6irdbq.js} +2 -2
- package/dist/{model-catalog-D2OnT5G5.js → model-catalog-PS0jzDnI.js} +4 -4
- package/dist/{model-picker-DqmubfPT.js → model-picker-CTFCXSBm.js} +4 -4
- package/dist/{model-selection-BFwMLFJs.js → model-selection-LDnLrnn_.js} +78 -78
- package/dist/{models-CpRbKJuJ.js → models-C3BadlQJ.js} +20 -20
- package/dist/{models-cli-DZkw5Jdo.js → models-cli-nmVozi2V.js} +92 -92
- package/dist/{models-config-C3Tq7XpJ.js → models-config-QyFOywkg.js} +2 -2
- package/dist/{net-CsWibfvZ.js → net-D11xIRO3.js} +2 -2
- package/dist/{net-ZNMDyvE6.js → net-DqV0ZX0o.js} +1 -1
- package/dist/{node-cli-Cnez-SsZ.js → node-cli-S-iiWwOu.js} +37 -37
- package/dist/{node-command-policy-07YXEli2.js → node-command-policy-CgAWdzL5.js} +1 -1
- package/dist/{node-service-CAIBDHUL.js → node-service-DZ8fTOrl.js} +1 -1
- package/dist/{nodes-cli-tf4VB1mc.js → nodes-cli-BsGZc9ap.js} +22 -22
- package/dist/{nodes-screen-BeGrUDun.js → nodes-screen-CE5ExO2h.js} +4 -4
- package/dist/{note-DU3J-cLi.js → note-3jvXiQ6d.js} +2 -2
- package/dist/{npm-pack-install-LDEh8ibx.js → npm-pack-install-hlogNf3I.js} +2 -2
- package/dist/{npm-resolution-hwnRhJMY.js → npm-resolution-HrhqxZv1.js} +5 -5
- package/dist/{nudge-DO_XorIH.js → nudge-E00XAyaB.js} +9 -9
- package/dist/{nudge-BwlwOlHp.js → nudge-dYyHjBXU.js} +32 -32
- package/dist/{oauth-tls-preflight-Dml1qLXe.js → oauth-tls-preflight-JLBGc5N0.js} +1 -1
- package/dist/{onboard-Ca24xZMF.js → onboard-DlZ1BOYr.js} +11 -11
- package/dist/{onboard-channels-D9_949pz.js → onboard-channels-CgNpTkpG.js} +16 -16
- package/dist/{onboard-custom-B-Mkie4R.js → onboard-custom-DCm_Y_rq.js} +4 -4
- package/dist/{onboard-helpers-ByWR3CzW.js → onboard-helpers-DM-4vR0k.js} +8 -8
- package/dist/{onboard-hooks-BeOBPHVT.js → onboard-hooks-8Pr9LF3E.js} +8 -8
- package/dist/{onboard-remote-Bcj3rkca.js → onboard-remote-DmGboWPK.js} +5 -5
- package/dist/{onboard-skills-naWc0YmQ.js → onboard-skills-CWqQ6_nv.js} +4 -4
- package/dist/{onboarding-BGv0OTQ7.js → onboarding-DP9CpRIE.js} +18 -18
- package/dist/{onboarding.finalize-DXb_92Cl.js → onboarding.finalize-BopskbFm.js} +98 -98
- package/dist/{onboarding.gateway-config-CWPurA78.js → onboarding.gateway-config-F79AgW-W.js} +21 -21
- package/dist/{onboarding.secret-input-CWSgVFz4.js → onboarding.secret-input-Dg2d19bw.js} +1 -1
- package/dist/{openai-model-default-DqvDB0tE.js → openai-model-default-DZdYjkgw.js} +2 -2
- package/dist/{operator-commands-DucDPVYt.js → operator-commands-73Jy7Whh.js} +6 -6
- package/dist/{outbound-attachment-9K5W_qRv.js → outbound-attachment-BJKAbId_.js} +8 -8
- package/dist/{outbound-attachment-TmKpX3fK.js → outbound-attachment-BWJTBdLV.js} +9 -9
- package/dist/{outbound-send-deps-CZSYC14H.js → outbound-send-deps-DhCughCA.js} +4 -4
- package/dist/{pairing-cli-Cu9D7InY.js → pairing-cli-B_Py5VFV.js} +19 -19
- package/dist/{pairing-labels-ByiR4xag.js → pairing-labels-g02uyuXJ.js} +1 -1
- package/dist/{pairing-store-BwhC2WSm.js → pairing-store-C6blSyqu.js} +3 -3
- package/dist/{path-alias-guards-1poj6WAF.js → path-alias-guards-BQTkQXB8.js} +1 -1
- package/dist/{path-safety-DVOKipvs.js → path-safety-DiKe4sLz.js} +1 -1
- package/dist/{pi-embedded-CSaAlmuo.js → pi-embedded-BIha9wV3.js} +227 -227
- package/dist/{pi-embedded-helpers-D-rwFjbw.js → pi-embedded-helpers-D9jcApuf.js} +5 -5
- package/dist/{pi-embedded-recovery-adapter-gFm3nWut.js → pi-embedded-recovery-adapter-BwHVGYu3.js} +37 -37
- package/dist/{pi-model-discovery-BO1rPzPp.js → pi-model-discovery-Wg17i5yr.js} +7 -7
- package/dist/{pi-model-discovery-B7YaarSR.js → pi-model-discovery-qfeaBTmR.js} +1 -1
- package/dist/{pid-alive-Dp9yiDJm.js → pid-alive-CVi1kpc0.js} +1 -1
- package/dist/{plugin-auto-enable-vtMrJ3Bo.js → plugin-auto-enable-BndBdzvN.js} +4 -4
- package/dist/{plugin-owned-work-recovery-adapter-khLJn2o6.js → plugin-owned-work-recovery-adapter-CU0jgkGU.js} +9 -9
- package/dist/{plugin-registry-Bdf1V0v4.js → plugin-registry-j-zdK9Aj.js} +4 -4
- package/dist/plugin-sdk/{agent-Dpwqmur5.js → agent-BGApB_hH.js} +33 -33
- package/dist/plugin-sdk/{agent-turn-execute-B4f6kU8t.js → agent-turn-execute-CovKPB71.js} +47 -47
- package/dist/plugin-sdk/{agent-turn-runner-8-elIcKG.js → agent-turn-runner-x5EwBtiy.js} +6 -6
- package/dist/plugin-sdk/{chrome-DmrLIg1A.js → chrome-CWrDqDvu.js} +6 -6
- package/dist/plugin-sdk/{command-queue-DbyHTkqC.js → command-queue-BjQhBzl0.js} +1 -1
- package/dist/plugin-sdk/{deliver-DRb5wg9T.js → deliver-Bufpy1Nj.js} +10 -10
- package/dist/plugin-sdk/{diagnostic-BaEfjzoG.js → diagnostic-DWsfRRMb.js} +3 -3
- package/dist/plugin-sdk/{errors-Di-1W5oL.js → errors-CU4XzshA.js} +1 -1
- package/dist/plugin-sdk/{fetch-guard-D593bO1R.js → fetch-guard-Bkz_LvY1.js} +2 -2
- package/dist/plugin-sdk/{fs-safe-B9qlEOPl.js → fs-safe-mU6OF_le.js} +2 -2
- package/dist/plugin-sdk/{image-ops-ByQhA5AW.js → image-ops-BN9LfKcr.js} +2 -2
- package/dist/plugin-sdk/{manager-BlVhEJyV.js → manager-CHVkW_mo.js} +5 -5
- package/dist/plugin-sdk/{model-auth-BYzo7BMW.js → model-auth-A8ol0IK6.js} +6 -6
- package/dist/plugin-sdk/{models-config-Df7qxXDT.js → models-config-DwWNe4wJ.js} +2 -2
- package/dist/plugin-sdk/{nudge-8hrtI-uQ.js → nudge-DKWORgbV.js} +6 -6
- package/dist/plugin-sdk/{openai-compatible-video-CC8O8EEM.js → openai-compatible-video-zjvEDFQp.js} +6 -6
- package/dist/plugin-sdk/{outbound-attachment-D5Du9kSm.js → outbound-attachment-DDNTRL0U.js} +7 -7
- package/dist/plugin-sdk/{pi-embedded-helpers-DDrF73tt.js → pi-embedded-helpers-Pj_rV8qf.js} +13 -13
- package/dist/plugin-sdk/{pi-embedded-utils-DLlaty3W.js → pi-embedded-utils-D6jztEWf.js} +3 -3
- package/dist/plugin-sdk/{pi-model-discovery-Cgvb050_.js → pi-model-discovery-D_iAcUa4.js} +1 -1
- package/dist/plugin-sdk/provider-media-understanding.js +16 -16
- package/dist/plugin-sdk/{pw-ai-BEcGp8XY.js → pw-ai-BwgzJYjo.js} +8 -8
- package/dist/plugin-sdk/{qmd-manager-DXpe_ju8.js → qmd-manager-DAFEkAMD.js} +6 -6
- package/dist/plugin-sdk/{qmd-scope-DVIoXpLl.js → qmd-scope-DJLcA3NX.js} +1 -1
- package/dist/plugin-sdk/{query-expansion-D0qReab0.js → query-expansion-CkRCFmXy.js} +2 -2
- package/dist/plugin-sdk/{recorder-S1aQdgl5.js → recorder-Brvd3BNt.js} +2 -2
- package/dist/plugin-sdk/{redact-CcJnxu3z.js → redact-B42Dpjen.js} +1 -1
- package/dist/plugin-sdk/{reply-directives-CEvR8_X7.js → reply-directives-twMFpY3R.js} +2 -2
- package/dist/plugin-sdk/{runs-D6b6GEuq.js → runs-w3MS_VZ4.js} +7 -7
- package/dist/plugin-sdk/{send-_X4VJ-16.js → send-7QsCXN2z.js} +5 -5
- package/dist/plugin-sdk/{send-DC_wB-oy.js → send-7cDA7nYq.js} +4 -4
- package/dist/plugin-sdk/{sessions-V6UyW1ee.js → sessions-BkkGJf0L.js} +3 -3
- package/dist/plugin-sdk/{ssrf-BD-w1_r0.js → ssrf-Bul6kRmN.js} +1 -1
- package/dist/{subsystem-D1n05zOF.js → plugin-sdk/subsystem-ChbeeOSk.js} +5 -5
- package/dist/plugin-sdk/{tool-loop-detection-JyupU8MW.js → tool-loop-detection-CJDaraAN.js} +1 -1
- package/dist/plugin-sdk/{user-run-recording-BHAgBh4G.js → user-run-recording-BK8sYUEb.js} +2 -2
- package/dist/plugin-sdk/{ws-Cd1gQ37X.js → ws-zY8UZwJ_.js} +1 -1
- package/dist/{plugins-Do2VO-bb.js → plugins-50bsyRF5.js} +12 -12
- package/dist/{plugins-cli-ClCHi--i.js → plugins-cli-B7i09-Yu.js} +94 -94
- package/dist/{ports-wpTsMPMQ.js → ports-Cx-3VoKB.js} +1 -1
- package/dist/{ports-CkB6zd6B.js → ports-qsGNGnWb.js} +2 -2
- package/dist/{program-BNEbV10c.js → program-DVVCdH_Q.js} +91 -91
- package/dist/{progress-DRmPtDtg.js → progress-DLl5RtiT.js} +2 -2
- package/dist/{prompt-select-styled-CNJtUcHo.js → prompt-select-styled-kC6tnFRy.js} +39 -39
- package/dist/{prompt-style-DpZu7Rv0.js → prompt-style-C-jp54Ww.js} +1 -1
- package/dist/{provider-auth-helpers-BmlLx1lK.js → provider-auth-helpers-CoSW0VEc.js} +5 -5
- package/dist/{proxy-env-D2TojSO4.js → proxy-env-B8ko7FIe.js} +1 -1
- package/dist/{proxy-env-ieess7Mx.js → proxy-env-Cbti8B-h.js} +1 -1
- package/dist/{push-apns-B35KAhUm.js → push-apns-ouI2t6wj.js} +7 -7
- package/dist/{pw-ai-BP_oDyML.js → pw-ai-BHdnQCVz.js} +11 -11
- package/dist/{pw-ai-DBQU70P9.js → pw-ai-CXYAo13E.js} +15 -15
- package/dist/{qmd-manager-CHnF92RD.js → qmd-manager-BbwLXjLX.js} +9 -9
- package/dist/{qmd-manager-Cc8Yjnkj.js → qmd-manager-D53dwf0o.js} +11 -11
- package/dist/{qmd-scope-Bf9ewzqs.js → qmd-scope-BGPSkaGT.js} +1 -1
- package/dist/{qmd-scope-CS0DtNYO.js → qmd-scope-ZqGqqT7I.js} +1 -1
- package/dist/{qr-cli-BR65O0r3.js → qr-cli-C03g-Jln.js} +10 -10
- package/dist/{query-expansion-Bv4KqsqP.js → query-expansion-CfOEMDQH.js} +1 -1
- package/dist/{query-expansion-CRbSQ6uw.js → query-expansion-D6kYMMSG.js} +13 -13
- package/dist/{reconcile-bundled-DkR2LG6R.js → reconcile-bundled-BHSH7QIf.js} +3 -3
- package/dist/{recorder-Ln2SDZKW.js → recorder-B4tsZmjb.js} +2 -2
- package/dist/{recorder-DII7nv4x.js → recorder-CPMScZJa.js} +2 -2
- package/dist/{recovery-adapter-CyyO_Ekl.js → recovery-adapter-BJRNT8FV.js} +9 -9
- package/dist/{recovery-adapter-DOleMTp_.js → recovery-adapter-CZoZy-m9.js} +2 -2
- package/dist/{recovery-adapter-But7eE6o.js → recovery-adapter-CxLHOdbs.js} +3 -3
- package/dist/{recovery-prompt-BPdq27Tq.js → recovery-prompt-DjQfAUy6.js} +1 -1
- package/dist/{redact-CS0CgCEL.js → redact-DkgvOdb-.js} +1 -1
- package/dist/{redact-snapshot-CZVXlnxH.js → redact-snapshot-B0Hmde1v.js} +5 -5
- package/dist/{register.agent-BcT7F79Y.js → register.agent-CH14a6J3.js} +109 -109
- package/dist/register.configure-BXpFEa7d.js +152 -0
- package/dist/{register.maintenance-rxIW-tKO.js → register.maintenance-2jJXwpET.js} +111 -111
- package/dist/{register.message-BLuymT-f.js → register.message-o6R49haY.js} +86 -86
- package/dist/{register.onboard-PGgg72Sx.js → register.onboard-CYG4aJ_S.js} +26 -26
- package/dist/{register.setup-Fnakw3cB.js → register.setup-B9Mx2Csz.js} +28 -28
- package/dist/{register.status-health-sessions--aE04YLN.js → register.status-health-sessions-BdYJh1dD.js} +105 -105
- package/dist/{register.subclis-gCMZ4Bku.js → register.subclis-B8qYBt57.js} +34 -34
- package/dist/{reply-directives-DGXfbm15.js → reply-directives-C3TQE9y0.js} +49 -49
- package/dist/{reply-directives-Bzeg3um3.js → reply-directives-DL_tpnAW.js} +2 -2
- package/dist/{reset-B2CTuAPC.js → reset-CoOQ6-8Y.js} +1 -1
- package/dist/{rpc-C-oFxe45.js → rpc-gJ5XJBJ1.js} +3 -3
- package/dist/{run-main-B4g_4pz1.js → run-main-CtkFW7nv.js} +104 -104
- package/dist/{runs-KGTnMvSd.js → runs-CNSar-WP.js} +8 -8
- package/dist/{runs-HDGXsBua.js → runs-DLcRidXE.js} +6 -6
- package/dist/{runtime-CM06Vsh4.js → runtime-DQiHcfpT.js} +4 -4
- package/dist/{runtime-config-collectors-owiepuTT.js → runtime-config-collectors-CokvgXBK.js} +1 -1
- package/dist/{runtime-guard-BAkI3Ri4.js → runtime-guard-D4N1U69H.js} +1 -1
- package/dist/{sandbox-I0OArJYc.js → sandbox-CqhMEP_P.js} +15 -15
- package/dist/{sandbox-cli-Byd1iHHL.js → sandbox-cli-CJWXKmae.js} +35 -35
- package/dist/{secrets-cli-cvWxtbRr.js → secrets-cli-DEllaqgI.js} +17 -17
- package/dist/{security-cli-Dlr0WB3R.js → security-cli-CsBRazBA.js} +42 -42
- package/dist/{send-Bkdo82oz.js → send-41XrPhaV.js} +4 -4
- package/dist/{send-DVTBurfS.js → send-B3iJ8ToE.js} +5 -5
- package/dist/{send-CmECiyUu.js → send-Ch-mNnij.js} +4 -4
- package/dist/{send-C-k3_j2u.js → send-RssGHDsu.js} +4 -4
- package/dist/{server-CtKA1Cp0.js → server-BuyEF_-i.js} +23 -23
- package/dist/{server-context-Ca5AiDBb.js → server-context-Cm7u69Q7.js} +9 -9
- package/dist/{server-lifecycle-DTtM3Lhl.js → server-lifecycle-BG-u8nMU.js} +3 -3
- package/dist/{server-middleware-DDvaga1l.js → server-middleware-BizsA-re.js} +2 -2
- package/dist/{server-node-events-s5GkBDRY.js → server-node-events-C-Sm1NJJ.js} +87 -87
- package/dist/{service-BnFOyfze.js → service-Ox4QjIIv.js} +1 -1
- package/dist/{session-consumer-agents-FpCrtynZ.js → session-consumer-agents-Bjo2Pybw.js} +1 -1
- package/dist/{session-consumer-claim-sweep-Ccri2PgZ.js → session-consumer-claim-sweep-DcyQR1lf.js} +10 -10
- package/dist/{session-key-D38Dat68.js → session-key-DOpjqY4f.js} +1 -1
- package/dist/{session-storage-owner-B8-IRBP7.js → session-storage-owner-DSJotdF9.js} +8 -8
- package/dist/{session-storage-CAf99J7I.js → session-storage-sH-8KuPm.js} +7 -7
- package/dist/{session-store-targets-9oN46FBf.js → session-store-targets-BtKZ6O9-.js} +3 -3
- package/dist/{session-utils-CPdS25Fh.js → session-utils-acVEcYBx.js} +9 -9
- package/dist/{sessions-DjSoGXsL.js → sessions-B3-eoZNa.js} +6 -6
- package/dist/{sessions-CH1h_nhO.js → sessions-BoUKHlfq.js} +5 -5
- package/dist/{sessions-DoqXSqab.js → sessions-CkJwIbnD.js} +17 -17
- package/dist/{sessions-DyhCT0pp.js → sessions-WyhyMdoW.js} +5 -5
- package/dist/{sessions-claims-status-BzDkLrz5.js → sessions-claims-status-yyKjvPdI.js} +12 -12
- package/dist/{sessions-maintenance-core-Cnhlr59R.js → sessions-maintenance-core-DJHvi0-G.js} +5 -5
- package/dist/{setup-helpers-DtszvYvl.js → setup-helpers-BQv9HNqM.js} +1 -1
- package/dist/{shared-DneLSdUs.js → shared-BhyLuWyq.js} +4 -4
- package/dist/{shared-CgJjqVc_.js → shared-WARMxoiR.js} +2 -2
- package/dist/{skill-scanner-C2qUvy1A.js → skill-scanner-Dl8opLZe.js} +1 -1
- package/dist/{skills-CKjNigud.js → skills-BAtMgBiD.js} +4 -4
- package/dist/{skills-cli-DrWE30sF.js → skills-cli-BriosLsG.js} +19 -19
- package/dist/{skills-install-DYOyXyhf.js → skills-install-dlhAdjwE.js} +11 -11
- package/dist/{skills-status-CUqccvmE.js → skills-status-2pBbVUCf.js} +4 -4
- package/dist/{status-DJX7Nh9n.js → status-DWY8cs3q.js} +45 -45
- package/dist/{status.update-BjTs0tMA.js → status.update-C37l-lB3.js} +1 -1
- package/dist/{storage-config-MiCWhQ75.js → storage-config-CsGADkaH.js} +4 -4
- package/dist/{subsystem-BQlVwUGh.js → subsystem-C7-3a5Zr.js} +2 -2
- package/dist/{plugin-sdk/subsystem-BdiA7Q_t.js → subsystem-WQ4uaYQN.js} +74 -74
- package/dist/{supervisor-Tib9c0Rw.js → supervisor-CmU501hP.js} +2 -2
- package/dist/{system-cli-CE9TlrCx.js → system-cli-C5GELIKy.js} +14 -14
- package/dist/{system-run-command-CAIpFmMh.js → system-run-command-DU36hElD.js} +2 -2
- package/dist/{systemd-2lEi1s2h.js → systemd-BjNzb_4K.js} +2 -2
- package/dist/{systemd-hints-DQKdqw9A.js → systemd-hints-Ccpg4IDq.js} +3 -3
- package/dist/{systemd-linger-DUCPAGl8.js → systemd-linger-Om0p6z20.js} +2 -2
- package/dist/{table-BgEYg0Fr.js → table-aewm6YXw.js} +2 -2
- package/dist/{tailnet-Cf-zH8LX.js → tailnet-DFd-E-hz.js} +1 -1
- package/dist/{tailscale-CPYYbNsJ.js → tailscale-DAOiwlpJ.js} +2 -2
- package/dist/{task-pipeline-boot-MRo6ngzY.js → task-pipeline-boot-BYsUt1aD.js} +85 -85
- package/dist/{tasks-DlanUcxq.js → tasks-BH9BLMW5.js} +5 -5
- package/dist/{tasks-CEiohszX.js → tasks-zUDZ9WDS.js} +12 -12
- package/dist/{tool-display-BW2pVtBe.js → tool-display-gmmRfkw3.js} +1 -1
- package/dist/{tool-loop-detection-CEOjW4Zj.js → tool-loop-detection-CUWKSyGf.js} +2 -2
- package/dist/{tool-loop-detection-C0wLAXu8.js → tool-loop-detection-D_3ML-aV.js} +3 -3
- package/dist/{trash-DNn54Qs6.js → trash-ByCJFFqw.js} +3 -3
- package/dist/{tui-Df1UoEuB.js → tui-D3L5epd6.js} +9 -9
- package/dist/{tui-cli-Y-2Y0TeW.js → tui-cli-B9yGq3iI.js} +37 -37
- package/dist/{update-CmNsRKyB.js → update-BOw7sc5p.js} +3 -3
- package/dist/{update-cli-DSKMdoM3.js → update-cli-DMbakbAW.js} +120 -120
- package/dist/{update-runner-BiHwGWqV.js → update-runner-xWEkzp2Q.js} +5 -5
- package/dist/{user-run-recording-BijpJcES.js → user-run-recording-BxTnAUuI.js} +2 -2
- package/dist/{user-run-recording-DkuT1rGt.js → user-run-recording-CYg9LLHh.js} +2 -2
- package/dist/{validation-cli-exRDYYEc.js → validation-cli-CHqmdg5w.js} +84 -84
- package/dist/{web-cli-BX1XaHNZ.js → web-cli-DuQt0_V0.js} +3 -3
- package/dist/web-client/assets/{index-Cpg6_3Hi.js → index-CbKkwaEi.js} +1 -1
- package/dist/web-client/index.html +1 -1
- package/dist/{webhooks-cli-CkpR8Fzk.js → webhooks-cli-BmIhFbc4.js} +13 -13
- package/dist/{widearea-dns-DFhroEuN.js → widearea-dns-Dg8lFYi7.js} +1 -1
- package/dist/{with-timeout-DNQj_Xiv.js → with-timeout-maI6Hxh1.js} +6 -6
- package/dist/{workspace-Cl3X-aax.js → workspace-Bv2hEGNJ.js} +6 -6
- package/dist/{workspace-BmXTOUee.js → workspace-CNoka32n.js} +4 -4
- package/extensions/a2a/package.json +1 -1
- package/extensions/acpx/package.json +1 -1
- package/extensions/anthropic/package.json +1 -1
- package/extensions/bifrost/package.json +1 -1
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/deepgram/package.json +1 -1
- package/extensions/deepinfra/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/diffs/package.json +1 -1
- package/extensions/discord/package.json +1 -1
- package/extensions/dream-cycle/package.json +1 -1
- package/extensions/elevenlabs/package.json +1 -1
- package/extensions/feishu/package.json +1 -1
- package/extensions/gemini-search/package.json +1 -1
- package/extensions/google/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/package.json +1 -1
- package/extensions/grok-search/package.json +1 -1
- package/extensions/groq/package.json +1 -1
- package/extensions/identity-oidc/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/kimi-search/package.json +1 -1
- package/extensions/kokoro/package.json +1 -1
- package/extensions/learning-core/package.json +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +1 -1
- package/extensions/matrix/package.json +1 -1
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax/package.json +1 -1
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/mistral/package.json +1 -1
- package/extensions/moonshot/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +1 -1
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +1 -1
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/openai/package.json +1 -1
- package/extensions/openai-realtime/package.json +1 -1
- package/extensions/openrouter/package.json +1 -1
- package/extensions/perplexity-search/package.json +1 -1
- package/extensions/searxng-search/package.json +1 -1
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/package.json +1 -1
- package/extensions/synology-chat/package.json +1 -1
- package/extensions/telegram/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +1 -1
- package/extensions/twitch/package.json +1 -1
- package/extensions/ui-surfaces/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +1 -1
- package/extensions/voice-call/package.json +1 -1
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zai/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +1 -1
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +1 -1
- package/extensions/zalouser/package.json +1 -1
- package/package.json +1 -1
- package/dist/clawbot-cli-sRVUxd_s.js +0 -32
- package/dist/cli-ax3_7oZf.js +0 -147
- package/dist/control-ui-v2/assets/Badge-sUgH4suZ.js +0 -1
- package/dist/github-copilot-token-Bm6yG6tw.js +0 -106
- package/dist/paths-BIDPYPVC.js +0 -233
- package/dist/register.configure-C_6WuEbz.js +0 -152
- /package/dist/{config-1om7Pwz0.js → config-CM9p9U7m.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,c as t,h as n,i as r,l as i,s as a,t as o}from"./format-DpM2rlEo.js";import{n as s,o as c,t as l}from"./links-Bcw24zqI.js";import{t as u}from"./Button-D5rMawzJ.js";import{t as d}from"./Dialog-Che1C2PS.js";import{r as f}from"./config-store-zXNM_umy.js";import{n as p,t as m}from"./use-gateway-query-xtY3vmte.js";import{t as h}from"./Badge-sUgH4suZ.js";import{t as g}from"./Panel-DM0JsHgz.js";import{t as _}from"./EntityLink-D6UsLKQR.js";import{t as v}from"./Stat-DQyb-fKe.js";import{a as y,i as b,n as x,r as S}from"./skills-model-DANiC-ui.js";var C=e(n(),1),w=t();function T({src:e,emoji:t,label:n,large:r=!1,testId:i}){let[a,o]=(0,C.useState)(!1),[s,c]=(0,C.useState)(e);e!==s&&(c(e),o(!1));let l=[`ct-agents__avatar`,r?`ct-agents__avatar--lg`:null].filter(Boolean).join(` `);return e&&!a?(0,w.jsx)(`img`,{className:l,src:e,alt:``,"data-testid":i?`${i}-img`:void 0,onError:()=>o(!0)}):(0,w.jsx)(`span`,{className:l,"data-testid":i?`${i}-fallback`:void 0,"aria-hidden":`true`,children:t||n.slice(0,1).toUpperCase()})}function E(e){if(!e)return`-`;if(typeof e==`string`)return e.trim()||`-`;let t=P(e);if(!t)return`-`;let n=typeof t.primary==`string`?t.primary.trim():``;if(!n)return`-`;let r=Array.isArray(t.fallbacks)?t.fallbacks.length:0;return r>0?`${n} (+${r} fallback)`:n}function D(e){let t=e.match(/^(.+) \(\+\d+ fallback\)$/);return t?t[1]:e}function O(e){if(!e)return null;if(typeof e==`string`)return e.trim()||null;let t=P(e);return t&&(typeof t.primary==`string`?t.primary:typeof t.model==`string`?t.model:typeof t.id==`string`?t.id:typeof t.value==`string`?t.value:null)?.trim()||null}function k(e){let t=P(e);if(!t)return null;let n=Array.isArray(t.fallbacks)?t.fallbacks:Array.isArray(t.fallback)?t.fallback:null;return n?n.filter(e=>typeof e==`string`):null}function A(e,t){return k(e)??k(t)}function j(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function M(e,t){let n=(e||null)?.agents?.defaults?.models,r=[];if(n&&typeof n==`object`)for(let[e,t]of Object.entries(n)){let n=e.trim();if(!n)continue;let i=t?.alias?.trim(),a=i&&i!==n?`${i} (${n})`:n;r.push({value:n,label:a})}let i=t?r.some(e=>e.value===t):!1;return t&&!i&&r.unshift({value:t,label:`Current (${t})`}),r.length===0?[{value:``,label:`No configured models`,disabled:!0}]:r}function N(e){let t=new Map;for(let n of e){let e=n.team?.id??null,r=e??`\0`,i=t.get(r);i||(i={teamId:e,title:e===null?null:n.team?.name??e,agents:[]},t.set(r,i)),n.team?.role===`lead`?(e!==null&&n.team?.name&&(i.title=n.team.name),i.agents.unshift(n)):i.agents.push(n)}return[...t.values()].toSorted((e,t)=>e.teamId===null?1:t.teamId===null?-1:0)}function P(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function F(e){let t=P(e);return t&&typeof t.id==`string`?t.id:null}function I(e){return e.name?.trim()||e.identity?.name?.trim()||e.id}function L(e){let t=e.trim();if(!t||t.length>16)return!1;let n=!1;for(let e=0;e<t.length;e+=1)if(t.charCodeAt(e)>127){n=!0;break}return n?!t.includes(`://`)&&!t.includes(`/`)&&!t.includes(`.`):!1}function R(e,t){let n=t?.emoji?.trim();if(n&&L(n))return n;let r=e.identity?.emoji?.trim();if(r&&L(r))return r;let i=t?.avatar?.trim();if(i&&L(i))return i;let a=e.identity?.avatar?.trim();return a&&L(a)?a:``}function z(e,t){let n=[t?.avatar,e.identity?.avatarUrl,e.identity?.avatar];for(let e of n){let t=e?.trim();if(t&&!L(t))return t}return null}function ee(e,t){return t&&e===t?`default`:null}function te(e){if(e==null||!Number.isFinite(e))return`-`;if(e<1024)return`${e} B`;let t=[`KB`,`MB`,`GB`,`TB`],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n.toFixed(+(n<10))} ${t[r]}`}function B(e,t){let n=e||null;return{entry:(n?.agents?.list??[]).find(e=>F(e)===t)??null,defaults:n?.agents?.defaults??null}}function V(e,t){let n=e?e.agents?.list:void 0;return Array.isArray(n)?n.findIndex(e=>F(e)===t):-1}function ne(e){let{agent:t,config:n,filesWorkspace:r,defaultId:i,agentIdentity:a}=e,o=B(n,t.id),s=r||o.entry?.workspace||o.defaults?.workspace||`default`,c=o.entry?.model?E(o.entry?.model):E(o.defaults?.model),l=a?.name?.trim()||t.identity?.name?.trim()||t.name?.trim()||o.entry?.name||t.id,u=R(t,a)||`-`,d=Array.isArray(o.entry?.skills)?o.entry?.skills:null,f=d?.length??null;return{workspace:s,model:c,identityName:l,identityEmoji:u,skillsLabel:d?`${f} selected`:`all skills`,isDefault:!!(i&&t.id===i)}}function re(e,t){if(!e)return null;let n=P(e.channels)?.[t];return P(n)??P(e[t])}function ie(e){if(e==null)return`n/a`;if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return String(e);try{return JSON.stringify(e)}catch{return`n/a`}}function ae(e){let t=re(e.configForm,e.channelId);return t?e.fields.flatMap(e=>e in t?[{label:e,value:ie(t[e])}]:[]):[]}function oe(e){let t=e/6e4;if(t<60)return`${Math.round(t)}m`;let n=t/60;return n<24?`${Math.round(n*10)/10}h`:`${Math.round(n/24*10)/10}d`}function se(e){let t=e.schedule;if(t.kind===`at`){let e=Date.parse(t.at);return Number.isFinite(e)?`At ${new Date(e).toLocaleString()}`:`At ${t.at}`}return t.kind===`every`?`Every ${oe(t.everyMs)}`:`Cron ${t.expr}${t.tz?` (${t.tz})`:``}`}function ce(e){let t=e.payload;if(t.kind===`systemEvent`)return`System: ${t.text}`;if(t.kind===`wakeGate`){let e=t.gate.kind===`command`?t.gate.command:t.gate.model;return`Wake gate: ${t.gate.kind} (${e??`model`})`}return`Agent: ${t.message}`}var le=[`groupPolicy`,`streamMode`,`dmPolicy`];function ue(e,t){return e.channelMeta?.find(e=>e.id===t)?.label||e.channelLabels[t]||t}function de(e){if(!e)return[];let t=new Set;for(let n of e.channelOrder??[])t.add(n);for(let n of e.channelMeta??[])t.add(n.id);for(let n of Object.keys(e.channelAccounts??{}))t.add(n);let n=[],r=e.channelOrder?.length?e.channelOrder:Array.from(t);for(let e of r)t.has(e)&&(n.push(e),t.delete(e));for(let e of t)n.push(e);return n.map(t=>({id:t,label:ue(e,t),accounts:e.channelAccounts?.[t]??[]}))}function fe(e){let t=0,n=0,r=0;for(let i of e){let e=i.probe&&typeof i.probe==`object`&&`ok`in i.probe?!!i.probe.ok:!1;(i.connected===!0||i.running===!0||e)&&(t+=1),i.configured&&(n+=1),i.enabled&&(r+=1)}return{total:e.length,connected:t,configured:n,enabled:r}}function pe({context:e}){let t=p(`channels.status`,{probe:!1},{refreshMs:m}),n=he(),i=de(t.data),o=t.data?.ts??null;return(0,w.jsxs)(`div`,{"data-testid":`agent-channels`,children:[(0,w.jsx)(me,{context:e,subtitle:`Workspace, identity, and model configuration.`}),(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Channels`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Gateway-wide channel status snapshot.`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Last refresh: `,o?r(o):`never`]})]}),(0,w.jsx)(u,{size:`sm`,disabled:t.loading,onClick:t.reload,children:t.loading?`Refreshing…`:`Refresh`})]}),t.error?(0,w.jsx)(a,{tone:`error`,message:t.error}):null,t.loading&&!t.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading channels…`}):null,t.data&&i.length===0?(0,w.jsx)(a,{message:`No channels found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__channel-list`,children:i.map(e=>{let t=fe(e.accounts),r=t.total?`${t.connected}/${t.total} connected`:`no accounts`,i=t.configured?`${t.configured} configured`:`not configured`,a=t.total?`${t.enabled} enabled`:`disabled`,o=ae({configForm:n,channelId:e.id,fields:le});return(0,w.jsxs)(`div`,{className:`ct-agents__channel-row`,"data-testid":`agent-channel-${e.id}`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`div`,{className:`ct-agents__channel-label`,children:e.label}),(0,w.jsx)(`div`,{className:`ct-agents__channel-id ct-mono`,children:e.id})]}),(0,w.jsxs)(`div`,{className:`ct-agents__channel-meta`,children:[(0,w.jsx)(`span`,{children:r}),(0,w.jsx)(`span`,{children:i}),(0,w.jsx)(`span`,{children:a}),o.map(e=>(0,w.jsxs)(`span`,{children:[e.label,`: `,e.value]},e.label))]})]},e.id)})})]})}function me({context:e,subtitle:t}){let n=[[`Workspace`,e.workspace],[`Primary model`,e.model],[`Identity name`,e.identityName],[`Identity emoji`,e.identityEmoji],[`Skills filter`,e.skillsLabel],[`Default`,e.isDefault?`yes`:`no`]];return(0,w.jsxs)(`div`,{className:`ct-agents__context-card`,"data-testid":`agent-context-card`,children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Agent context`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:t}),(0,w.jsx)(`div`,{className:`ct-agents__kv-grid`,children:n.map(([e,t])=>(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:e}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value`,children:t})]},e))})]})}function he(){let e=f(e=>e.draft),t=f(e=>e.snapshot?.config??null);return e??t}var ge={includeDisabled:!0,limit:200,offset:0,sortBy:`nextRunAtMs`,sortDir:`asc`},_e=50;function ve(e){let t=i(e=>e.request),[n,r]=(0,C.useState)({jobs:[],loading:!1,error:null});return(0,C.useEffect)(()=>{if(!e||e.hasMore!==!0){r(e=>e.jobs.length===0&&!e.loading&&e.error===null?e:{jobs:[],loading:!1,error:null});return}let n=!1;return r(e=>({jobs:e.jobs,loading:!0,error:null})),(async()=>{let i=[],a=e.nextOffset??200;for(let e=0;e<_e;e+=1)try{let e=await t(`cron.list`,{...ge,offset:a});if(n)return;let r=e.jobs??[];if(i.push(...r),e.hasMore!==!0||r.length===0)break;a=e.nextOffset??a+r.length}catch(e){n||r({jobs:i,loading:!1,error:o(e)});return}n||r({jobs:i,loading:!1,error:null})})(),()=>{n=!0}},[e,t]),n}function ye({agentId:e,context:t}){let n=p(`cron.status`,{},{refreshMs:m}),i=p(`cron.list`,ge,{refreshMs:m}),o=ve(i.data),c=(0,C.useMemo)(()=>[...i.data?.jobs??[],...o.jobs].filter(t=>t.agentId===e),[i.data,o.jobs,e]),d=i.error??o.error;return(0,w.jsxs)(`div`,{"data-testid":`agent-cron`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__cron-top`,children:[(0,w.jsx)(me,{context:t,subtitle:`Workspace and scheduling targets.`}),(0,w.jsxs)(`div`,{className:`ct-agents__context-card`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Scheduler`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Gateway cron status.`})]}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,onClick:()=>{n.reload(),i.reload()},children:`Refresh`})]}),(0,w.jsxs)(`div`,{className:`ct-agents__stats`,children:[(0,w.jsx)(v,{label:`Enabled`,value:n.data?n.data.enabled?`Yes`:`No`:`n/a`}),(0,w.jsx)(v,{label:`Jobs`,value:n.data?.jobs??`n/a`}),(0,w.jsx)(v,{label:`Next wake`,value:r(n.data?.nextWakeAtMs??null)})]}),n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null]})]}),(0,w.jsx)(`div`,{className:`ct-agents__panel-head`,children:(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Agent cron jobs`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Scheduled jobs targeting this agent.`})]})}),d?(0,w.jsx)(a,{tone:`error`,message:d}):null,i.loading&&!i.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading jobs…`}):null,i.data&&!o.loading&&c.length===0?(0,w.jsx)(a,{message:`No jobs assigned.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__cron-list`,children:c.map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__cron-row`,"data-testid":`agent-cron-job-${e.id}`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__cron-main`,children:[(0,w.jsx)(`span`,{className:`ct-agents__channel-label`,children:e.name}),e.description?(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.description}):null,(0,w.jsxs)(`span`,{className:`ct-agents__chip-row`,children:[(0,w.jsx)(h,{children:se(e)}),(0,w.jsx)(h,{tone:e.enabled?`ok`:`warn`,children:e.enabled?`enabled`:`disabled`}),(0,w.jsx)(h,{children:e.sessionTarget})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__cron-meta`,children:[(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Last `,r(e.state?.lastRunAtMs),` · Next`,` `,r(e.state?.nextRunAtMs)]}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:ce(e)}),(0,w.jsx)(u,{size:`sm`,"data-testid":`agent-cron-open-${e.id}`,onClick:()=>l(s.automation(e.id)),children:`Open in Automations`})]})]},e.id))})]})}function be({agentId:e}){let t=i(e=>e.request),n=p(`agents.files.list`,{agentId:e}),[r,s]=(0,C.useState)({}),[c,l]=(0,C.useState)({}),[d,f]=(0,C.useState)(null),[m,h]=(0,C.useState)(!1),[g,_]=(0,C.useState)(null),v=(0,C.useRef)({}),y=n.data?.agentId===e?n.data.files??[]:[],b=d?y.find(e=>e.name===d)??null:null,x=d?r[d]??``:``,S=d?Object.hasOwn(r,d):!1,T=d?c[d]??x:``,E=d?T!==x:!1,D=(e,t)=>{v.current={...v.current,[e]:t},s(v.current)};(0,C.useEffect)(()=>{d&&y.length>0&&!y.some(e=>e.name===d)&&f(null)},[d,y]),(0,C.useEffect)(()=>{if(!d||Object.hasOwn(v.current,d))return;let n=!1,r=d;return t(`agents.files.get`,{agentId:e,name:r}).then(e=>{n||!e?.file||(D(r,e.file.content??``),l(t=>({...t,[r]:e.file.content??``})))}).catch(e=>{n||_(o(e))}),()=>{n=!0}},[d,e,t]);let O=async()=>{if(!d||!E||m)return;let i=d,a=c[i]??r[i]??``;h(!0),_(null);try{(await t(`agents.files.set`,{agentId:e,name:i,content:a}))?.file&&(D(i,a),l(e=>({...e,[i]:a})),n.reload())}catch(e){_(o(e))}finally{h(!1)}};return(0,w.jsxs)(`div`,{"data-testid":`agent-files`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Core files`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Bootstrap persona, identity, and tool guidance.`}),n.data?.agentId===e?(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub ct-mono`,children:[`Workspace: `,n.data.workspace]}):null]}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,"data-testid":`agent-files-refresh`,onClick:n.reload,children:n.loading?`Loading…`:`Refresh`})]}),n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading files…`}):null,g?(0,w.jsx)(`div`,{role:`alert`,className:`ct-agents__callout ct-agents__callout--danger`,"data-testid":`agent-files-error`,children:g}):null,n.data?y.length===0?(0,w.jsx)(a,{message:`No files found.`}):(0,w.jsxs)(`div`,{className:`ct-agents__files-grid`,children:[(0,w.jsx)(`div`,{className:`ct-agents__files-list`,"data-testid":`agent-files-list`,children:y.map(e=>(0,w.jsx)(xe,{file:e,active:d===e.name,onSelect:()=>f(e.name)},e.name))}),(0,w.jsx)(`div`,{className:`ct-agents__files-editor`,children:b?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`ct-agents__file-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`div`,{className:`ct-agents__file-name ct-mono`,children:b.name}),(0,w.jsx)(`div`,{className:`ct-agents__file-path ct-mono`,children:b.path})]}),(0,w.jsxs)(`div`,{className:`ct-agents__file-actions`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!E,"data-testid":`agent-file-reset`,onClick:()=>l(e=>({...e,[b.name]:x})),children:`Reset`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:m||!E,"data-testid":`agent-file-save`,onClick:()=>void O(),children:m?`Saving…`:`Save`})]})]}),b.missing?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`This file is missing. Saving will create it in the agent workspace.`}):null,(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Content`}),(0,w.jsx)(`textarea`,{"data-testid":`agent-file-editor`,rows:16,value:T,disabled:!S,placeholder:S?void 0:`Loading…`,onChange:e=>l(t=>({...t,[b.name]:e.target.value}))})]})]}):(0,w.jsx)(a,{message:`Select a file to edit.`})})]}):null]})}function xe({file:e,active:t,onSelect:n}){let i=e.missing?`Missing`:`${te(e.size)} · ${r(e.updatedAtMs??null)}`;return(0,w.jsxs)(`button`,{type:`button`,className:`ct-agents__file-row${t?` ct-agents__file-row--active`:``}`,"data-testid":`agent-file-${e.name}`,onClick:n,children:[(0,w.jsxs)(`span`,{className:`ct-agents__file-row-main`,children:[(0,w.jsx)(`span`,{className:`ct-agents__file-row-name ct-mono`,children:e.name}),(0,w.jsx)(`span`,{className:`ct-agents__file-row-meta`,children:i})]}),e.missing?(0,w.jsx)(`span`,{className:`ct-agents__pill ct-agents__pill--warn`,children:`missing`}):null]})}function H({testId:e,onBeforeSave:t}){let n=f(e=>e.dirty),r=f(e=>e.busy),i=f(e=>e.error),a=f(e=>e.snapshot!==null),o=async()=>{t?.(),await f.getState().save(`set`)};return(0,w.jsxs)(`div`,{className:`ct-agents__config-actions`,children:[i?(0,w.jsxs)(`div`,{className:`ct-agents__config-error`,role:`alert`,"data-testid":`${e}-error`,children:[(0,w.jsx)(`span`,{children:i}),(0,w.jsx)(u,{size:`sm`,"data-testid":`${e}-error-reload`,onClick:()=>void f.getState().load(),children:`Reload from gateway`})]}):null,(0,w.jsxs)(`div`,{className:`ct-agents__config-buttons`,children:[(0,w.jsx)(`span`,{className:`ct-agents__config-state`,"data-testid":`${e}-state`,children:a?n?`unsaved`:`saved`:`Config not loaded`}),(0,w.jsx)(u,{size:`sm`,disabled:r,"data-testid":`${e}-reload`,onClick:()=>void f.getState().load(),children:`Reload Config`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:r||!n,"data-testid":`${e}-save`,onClick:()=>void o(),children:r?`Saving…`:`Save`})]})]})}function Se(e){return e&&typeof e==`object`&&!Array.isArray(e)?`primary`in e&&typeof e.primary==`string`&&e.primary.trim()||null:typeof e==`string`&&e.trim()||null}function Ce(e,t,n,r,i){let a=V(e,t);if(a<0)return;let o=[`agents`,`list`,a,`model`];if(!n){i(o);return}let s=B(e,t).entry?.model;if(s&&typeof s==`object`&&!Array.isArray(s)){let e=k(s);r(o,{primary:n,...e?{fallbacks:e}:{}});return}r(o,n)}function we(e,t,n,r,i){let a=V(e,t);if(a<0)return;let o=[`agents`,`list`,a,`model`],s=Se(B(e,t).entry?.model);if(n.length===0){s?r(o,s):i(o);return}r(o,s?{primary:s,fallbacks:n}:{fallbacks:n})}function Te({agent:e,defaultId:t,identity:n,identityLoading:r,identityError:i}){let a=f(e=>e.draft),o=f(e=>e.snapshot?.config??null),s=f(e=>e.busy),c=f(e=>e.schema!==null),l=a??o,u=B(l,e.id),d=u.entry?.workspace||u.defaults?.workspace||`default`,p=u.entry?.model?E(u.entry.model):E(u.defaults?.model),m=E(u.defaults?.model),h=O(u.entry?.model)??(p===`-`?null:D(p))??O(u.defaults?.model)??(m===`-`?null:D(m)),g=A(u.entry?.model,u.defaults?.model),_=g?g.join(`, `):``,[v,y]=(0,C.useState)(null);(0,C.useEffect)(()=>{y(null)},[_]);let b=v??_,x=n?.name?.trim()||e.identity?.name?.trim()||e.name?.trim()||u.entry?.name||`-`,S=R(e,n)||`-`,T=Array.isArray(u.entry?.skills)?u.entry?.skills:null,k=r?`Loading…`:i?`Unavailable`:``,N=!!(t&&e.id===t),P=ne({agent:e,config:l,filesWorkspace:null,defaultId:t,agentIdentity:n}),F=!!l&&c&&!s,I=(e,t)=>f.getState().setPath(e,t),L=e=>f.getState().removePath(e),z=()=>{if(v===null||v===_){y(null);return}y(null),we(l,e.id,j(v),I,L)};return(0,w.jsxs)(`div`,{"data-testid":`agent-overview`,children:[(0,w.jsx)(`div`,{className:`ct-agents__kv-grid`,children:[[`Workspace`,d],[`Primary model`,p],[`Identity name`,x,k||void 0],[`Default`,N?`yes`:`no`],[`Identity emoji`,S],[`Skills filter`,T?`${T.length} selected`:`all skills`]].map(([e,t,n])=>(0,w.jsxs)(`div`,{className:`ct-agents__kv`,"data-testid":`agent-kv-${e.toLowerCase().replace(/\s+/g,`-`)}`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:e}),(0,w.jsx)(`span`,{className:e===`Workspace`?`ct-agents__kv-value ct-mono`:`ct-agents__kv-value`,children:t}),n?(0,w.jsx)(`span`,{className:`ct-agents__kv-note`,children:n}):null]},e))}),(0,w.jsxs)(`div`,{className:`ct-agents__model-edit`,"data-testid":`agent-model-edit`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Model selection`}),(0,w.jsxs)(`div`,{className:`ct-agents__model-fields`,children:[(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsxs)(`span`,{children:[`Primary model`,N?` (default)`:``]}),(0,w.jsxs)(`select`,{"data-testid":`agent-model-select`,value:h??``,disabled:!F,onChange:t=>Ce(l,e.id,t.target.value||null,I,L),children:[N?null:(0,w.jsx)(`option`,{value:``,children:m===`-`?`Inherit default`:`Inherit default (${m})`}),M(l,h).map(e=>(0,w.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]})]}),(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Fallbacks (comma-separated)`}),(0,w.jsx)(`input`,{"data-testid":`agent-fallbacks-input`,value:b,disabled:!F,placeholder:`provider/model, provider/model`,onChange:e=>y(e.target.value),onBlur:z})]})]}),(0,w.jsx)(H,{testId:`agent-config`,onBeforeSave:z})]}),(0,w.jsxs)(`p`,{className:`ct-agents__hint`,children:[`Routing context: `,P.model===`-`?`model unset`:P.model,`,`,` `,P.skillsLabel,`.`]})]})}var Ee=[{id:`fs`,label:`Files`},{id:`runtime`,label:`Runtime`},{id:`web`,label:`Web`},{id:`memory`,label:`Memory`},{id:`sessions`,label:`Sessions`},{id:`ui`,label:`UI`},{id:`messaging`,label:`Messaging`},{id:`automation`,label:`Automation`},{id:`nodes`,label:`Nodes`},{id:`agents`,label:`Agents`},{id:`media`,label:`Media`}],U=[{id:`read`,label:`read`,description:`Read file contents`,sectionId:`fs`,profiles:[`coding`]},{id:`write`,label:`write`,description:`Create or overwrite files`,sectionId:`fs`,profiles:[`coding`]},{id:`edit`,label:`edit`,description:`Make precise edits`,sectionId:`fs`,profiles:[`coding`]},{id:`delete`,label:`delete`,description:`Delete a workspace file`,sectionId:`fs`,profiles:[`coding`]},{id:`apply_patch`,label:`apply_patch`,description:`Patch files (OpenAI)`,sectionId:`fs`,profiles:[`coding`]},{id:`exec`,label:`exec`,description:`Run shell commands`,sectionId:`runtime`,profiles:[`coding`]},{id:`process`,label:`process`,description:`Manage background processes`,sectionId:`runtime`,profiles:[`coding`]},{id:`web_search`,label:`web_search`,description:`Search the web`,sectionId:`web`,profiles:[],includeInOpenClawGroup:!0},{id:`web_fetch`,label:`web_fetch`,description:`Fetch web content`,sectionId:`web`,profiles:[],includeInOpenClawGroup:!0},{id:`memory_search`,label:`memory_search`,description:`Semantic search`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`memory_get`,label:`memory_get`,description:`Read memory files`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`sessions_list`,label:`sessions_list`,description:`List sessions`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_history`,label:`sessions_history`,description:`Session history`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_send`,label:`sessions_send`,description:`Send to session`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`agents_nudge`,label:`agents_nudge`,description:`Wake another agent`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_spawn`,label:`sessions_spawn`,description:`Spawn sub-agent`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`subagents`,label:`subagents`,description:`Manage sub-agents`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`session_status`,label:`session_status`,description:`Session status`,sectionId:`sessions`,profiles:[`minimal`,`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`browser`,label:`browser`,description:`Control web browser`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`canvas`,label:`canvas`,description:`Control canvases`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`message`,label:`message`,description:`Send messages`,sectionId:`messaging`,profiles:[`messaging`],includeInOpenClawGroup:!0},{id:`cron`,label:`cron`,description:`Schedule tasks`,sectionId:`automation`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`gateway`,label:`gateway`,description:`Gateway control`,sectionId:`automation`,profiles:[],includeInOpenClawGroup:!0},{id:`nodes`,label:`nodes`,description:`Nodes + devices`,sectionId:`nodes`,profiles:[],includeInOpenClawGroup:!0},{id:`agents_list`,label:`agents_list`,description:`List agents`,sectionId:`agents`,profiles:[],includeInOpenClawGroup:!0},{id:`image`,label:`image`,description:`Image understanding`,sectionId:`media`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`tts`,label:`tts`,description:`Text-to-speech conversion`,sectionId:`media`,profiles:[],includeInOpenClawGroup:!0}];new Map(U.map(e=>[e.id,e]));function W(e){return U.filter(t=>t.profiles.includes(e)).map(e=>e.id)}var De={minimal:{allow:W(`minimal`)},coding:{allow:W(`coding`)},messaging:{allow:W(`messaging`)},full:{}};function Oe(){let e=new Map;for(let t of U){let n=`group:${t.sectionId}`,r=e.get(n)??[];r.push(t.id),e.set(n,r)}return{"group:openclaw":U.filter(e=>e.includeInOpenClawGroup).map(e=>e.id),...Object.fromEntries(e.entries())}}var ke=Oe(),Ae=[{id:`minimal`,label:`Minimal`},{id:`coding`,label:`Coding`},{id:`messaging`,label:`Messaging`},{id:`full`,label:`Full`}];function je(e){if(!e)return;let t=De[e];if(t&&!(!t.allow&&!t.deny))return{allow:t.allow?[...t.allow]:void 0,deny:t.deny?[...t.deny]:void 0}}function Me(){return Ee.map(e=>({id:e.id,label:e.label,tools:U.filter(t=>t.sectionId===e.id).map(e=>({id:e.id,label:e.label,description:e.description}))})).filter(e=>e.tools.length>0)}var Ne={bash:`exec`,"apply-patch":`apply_patch`},Pe={...ke};function G(e){let t=e.trim().toLowerCase();return Ne[t]??t}function Fe(e){return e?e.map(G).filter(Boolean):[]}function Ie(e){let t=Fe(e),n=[];for(let e of t){let t=Pe[e];if(t){n.push(...t);continue}n.push(e)}return Array.from(new Set(n))}function Le(e){return je(e)}var Re=Me().map(e=>({id:e.id,label:e.label,source:`core`,tools:e.tools.map(e=>({...e,source:`core`,defaultProfiles:[]}))})),ze=Ae.map(e=>({...e}));function Be(e){return(e?e.tools:void 0)??{}}function Ve(e){let t=G(e);if(!t)return{kind:`exact`,value:``};if(t===`*`)return{kind:`all`};if(!t.includes(`*`))return{kind:`exact`,value:t};let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return{kind:`regex`,value:RegExp(`^${n.replaceAll(`\\*`,`.*`)}$`)}}function K(e){return Array.isArray(e)?Ie(e).map(Ve).filter(e=>e.kind!==`exact`||e.value.length>0):[]}function q(e,t){for(let n of t)if(n.kind===`all`||n.kind===`exact`&&e===n.value||n.kind===`regex`&&n.value.test(e))return!0;return!1}function He(e,t){if(!t)return!0;let n=G(e);if(q(n,K(t.deny)))return!1;let r=K(t.allow);return r.length===0||q(n,r)?!0:n===`apply_patch`&&q(`exec`,r)}function J(e,t){if(!Array.isArray(t)||t.length===0)return!1;let n=G(e),r=K(t);return q(n,r)?!0:n===`apply_patch`&&q(`exec`,r)}function Ue(e){return Le(e)??void 0}function Y(e,t,n){let r=He(e,t),i=J(e,n.alsoAllow),a=J(e,n.deny);return{allowed:(r||i)&&!a,baseAllowed:r,denied:a}}function We(e){return e.map(e=>G(e)).filter(e=>e.length>0)}function Ge(e){let t=new Set(We(e.current.alsoAllow)),n=new Set(We(e.current.deny));for(let r of e.toggles){let i=G(r.toolId);i&&(r.enable?(n.delete(i),e.baseAllowed(i)||t.add(i)):(t.delete(i),n.add(i)))}return{alsoAllow:[...t],deny:[...n]}}function Ke(e){let t=e.current?e.current.map(e=>e.trim()).filter(Boolean):null,n=new Set(t??e.allSkills),r=e.skillName.trim();return e.enable?n.add(r):n.delete(r),[...n]}function qe({agent:e}){let t=e.id,n=p(`skills.status`,{agentId:t},{refreshMs:m}),r=f(e=>e.draft),i=f(e=>e.snapshot?.config??null),o=f(e=>e.busy),s=f(e=>e.schema!==null),[c,l]=(0,C.useState)(``),d=r??i,h=B(d,t),g=Array.isArray(h.entry?.skills)?h.entry.skills:void 0,_=new Set((g??[]).map(e=>e.trim()).filter(Boolean)),v=g!==void 0,x=n.data!==null,S=x?n.data?.skills??[]:[],T=b(S,c),E=y(T),D=v?S.filter(e=>_.has(e.name)).length:S.length,O=!!d&&s&&!o,k=e=>{let n=V(d,t);if(n<0)return;let r=[`agents`,`list`,n,`skills`],i=f.getState();e===null?i.removePath(r):i.setPath(r,e)},A=(e,t)=>{let n=e.name.trim();if(!O||!n)return;let r=S.map(e=>e.name).filter(Boolean);k(Ke({current:g??null,allSkills:r,skillName:n,enable:t}))};return(0,w.jsxs)(`div`,{"data-testid":`agent-skills`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Skills`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Per-agent skill allowlist and workspace skills.`,` `,S.length>0?(0,w.jsxs)(`span`,{className:`ct-mono`,"data-testid":`agent-skills-count`,children:[D,`/`,S.length]}):null]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!O,"data-testid":`agent-skills-use-all`,onClick:()=>k(null),children:`Use All`}),(0,w.jsx)(u,{size:`sm`,disabled:!O,"data-testid":`agent-skills-disable-all`,onClick:()=>k([]),children:`Disable All`}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,"data-testid":`agent-skills-refresh`,onClick:n.reload,children:n.loading?`Loading…`:`Refresh`}),(0,w.jsx)(H,{testId:`agent-skills`})]})]}),d?null:(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load the gateway config to set per-agent skills.`}),(0,w.jsx)(`div`,{className:`ct-agents__callout`,"data-testid":`agent-skills-callout`,children:v?`This agent uses a custom skill allowlist.`:`All skills are enabled. Disabling any skill will create a per-agent allowlist.`}),!x&&!n.loading?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load skills for this agent to view workspace-specific entries.`}):null,n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading skills…`}):null,(0,w.jsxs)(`div`,{className:`ct-agents__skills-filters`,children:[(0,w.jsx)(`input`,{type:`text`,"aria-label":`Filter skills`,placeholder:`Search skills`,"data-testid":`agent-skills-filter`,value:c,onChange:e=>l(e.target.value)}),(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,"data-testid":`agent-skills-shown`,children:[T.length,` shown`]})]}),x&&T.length===0?(0,w.jsx)(a,{message:`No skills found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__skills-groups`,children:E.map(e=>(0,w.jsxs)(`details`,{className:`ct-agents__skills-group`,open:!(e.id===`workspace`||e.id===`built-in`),"data-testid":`agent-skill-group-${e.id}`,children:[(0,w.jsxs)(`summary`,{children:[(0,w.jsx)(`span`,{children:e.label}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.skills.length})]}),(0,w.jsx)(`div`,{className:`ct-agents__skills-list`,children:e.skills.map(e=>(0,w.jsx)(Je,{skill:e,enabled:!v||_.has(e.name),editable:O,onToggle:t=>A(e,t)},e.skillKey))})]},e.id))})]})}function Je({skill:e,enabled:t,editable:n,onToggle:r}){let i=x(e),a=S(e);return(0,w.jsxs)(`div`,{className:`ct-agents__skill-row`,"data-testid":`agent-skill-row-${e.name}`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__skill-main`,children:[(0,w.jsxs)(`span`,{className:`ct-agents__channel-label`,children:[e.emoji?`${e.emoji} `:``,e.name]}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.description}),(0,w.jsxs)(`span`,{className:`ct-agents__chip-row`,children:[(0,w.jsx)(h,{children:e.source}),(0,w.jsx)(h,{tone:e.eligible?`ok`:`warn`,children:e.eligible?`eligible`:`blocked`}),e.disabled?(0,w.jsx)(h,{tone:`warn`,children:`disabled`}):null]}),i.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Missing: `,i.join(`, `)]}):null,a.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Reason: `,a.join(`, `)]}):null]}),(0,w.jsx)(`label`,{className:`ct-agents__tool-toggle`,children:(0,w.jsx)(`input`,{type:`checkbox`,"aria-label":`Enable ${e.name}`,checked:t,disabled:!n,onChange:e=>r(e.target.checked)})})]})}var Ye=[{id:`readonly`,label:`Readonly`},{id:`minimal`,label:`Minimal`},{id:`coding`,label:`Coding`},{id:`full`,label:`Full`}];function X(e,t){let n=V(e,t);return n<0?null:[`agents`,`list`,n,`tools`]}function Xe({agent:e}){let t=e.id,n=p(`tools.catalog`,{agentId:t,includePlugins:!0},{refreshMs:3e4}),r=f(e=>e.draft),i=f(e=>e.snapshot?.config??null),a=f(e=>e.busy),o=f(e=>e.schema!==null),s=r??i,c=B(s,t).entry?.tools??{},l=Be(s),d=c.profile??l.profile??`full`,m=c.profile?`agent override`:l.profile?`global default`:`default`,h=c.exec?.preset??l.exec?.preset??null,g=n.data&&n.data.agentId===t?n.data.execPolicy:void 0,_=g?.canExec??`full`,v=Array.isArray(c.allow)&&c.allow.length>0,y=Array.isArray(l.allow)&&l.allow.length>0,b=!!s&&o&&!a&&!v,x=!!s&&o&&!a,S={alsoAllow:v?[]:c.alsoAllow??[],deny:v?[]:c.deny??[]},C=v?{allow:c.allow??[],deny:c.deny??[]}:Ue(d),T=n.data?.groups?.length&&n.data.agentId===t?n.data.groups:Re,E=n.data?.profiles?.length&&n.data.agentId===t?n.data.profiles:ze,D=T.flatMap(e=>e.tools.map(e=>e.id)),O=e=>Y(e,C,S).baseAllowed,k=D.filter(e=>Y(e,C,S).allowed).length,A=e=>{let n=X(s,t);if(!n)return;let r=f.getState();e.alsoAllow.length>0?r.setPath([...n,`alsoAllow`],e.alsoAllow):r.removePath([...n,`alsoAllow`]),e.deny.length>0?r.setPath([...n,`deny`],e.deny):r.removePath([...n,`deny`])},j=(e,t)=>{A(Ge({current:S,baseAllowed:O,toggles:[{toolId:e,enable:t}]}))},M=e=>{A(Ge({current:S,baseAllowed:O,toggles:D.map(t=>({toolId:t,enable:e}))}))},N=(e,n)=>{let r=X(s,t);if(!r)return;let i=f.getState();e?i.setPath([...r,`profile`],e):i.removePath([...r,`profile`]),n&&i.removePath([...r,`allow`])},P=e=>{let n=X(s,t);if(!n)return;let r=f.getState();e?r.setPath([...n,`exec`,`preset`],e):r.removePath([...n,`exec`,`preset`])},F=Y(`exec`,C,S).allowed;return(0,w.jsxs)(`div`,{"data-testid":`agent-tools`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Tool access`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Profile + per-tool overrides for this agent.`,` `,(0,w.jsxs)(`span`,{className:`ct-mono`,children:[k,`/`,D.length]}),` `,`enabled.`]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!b,onClick:()=>M(!0),children:`Enable All`}),(0,w.jsx)(u,{size:`sm`,disabled:!b,onClick:()=>M(!1),children:`Disable All`}),(0,w.jsx)(H,{testId:`agent-tools`})]})]}),n.error?(0,w.jsx)(`div`,{className:`ct-agents__callout ct-agents__callout--warn`,role:`status`,children:`Could not load runtime tool catalog. Showing fallback list.`}):null,s?null:(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load the gateway config to adjust tool profiles.`}),v?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`This agent is using an explicit allowlist in config. Tool overrides are managed in the Config tab.`}):null,y?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Global tools.allow is set. Agent overrides cannot enable tools that are globally blocked.`}):null,F&&g?.canExec===`none`?(0,w.jsx)(`div`,{className:`ct-agents__callout ct-agents__callout--warn`,"data-testid":`agent-tools-exec-none`,children:`Exec tool is enabled but tools.exec security denies every command - pick a preset below or adjust tools.exec.security.`}):null,F&&_===`safebins-only`?(0,w.jsx)(`div`,{className:`ct-agents__callout`,"data-testid":`agent-tools-safebins`,children:`Exec is limited to safe bins; choose a preset to broaden read-only diagnostics.`}):null,(0,w.jsxs)(`div`,{className:`ct-agents__kv-grid ct-agents__kv-grid--tools`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Profile`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value ct-mono`,"data-testid":`agent-tools-profile`,children:d})]}),(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Source`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value`,children:m})]}),a?(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Status`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value ct-mono`,children:`unsaved`})]}):null,g?(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Exec`}),(0,w.jsxs)(`span`,{className:`ct-agents__kv-value ct-mono`,"data-testid":`agent-tools-exec-policy`,children:[g.presetId??g.security,` · `,g.ask,` · `,g.canExec]})]}):null]}),(0,w.jsxs)(`div`,{className:`ct-agents__presets`,"data-testid":`agent-tools-presets`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Quick presets`}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[E.map(e=>(0,w.jsx)(u,{size:`sm`,"aria-pressed":d===e.id,disabled:!b,onClick:()=>N(e.id,!0),children:e.label},e.id)),(0,w.jsx)(u,{size:`sm`,"aria-pressed":!1,disabled:!b,onClick:()=>N(null,!1),children:`Inherit`})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__presets`,"data-testid":`agent-exec-presets`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Exec policy`}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[Ye.map(e=>(0,w.jsx)(u,{size:`sm`,"aria-pressed":h===e.id,disabled:!x,onClick:()=>P(e.id),children:e.label},e.id)),(0,w.jsx)(u,{size:`sm`,"aria-pressed":!1,disabled:!x,onClick:()=>P(null),children:`Inherit`})]})]}),(0,w.jsx)(`div`,{className:`ct-agents__tools-grid`,children:T.map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__tools-section`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__tools-head`,children:[(0,w.jsx)(`span`,{children:e.label}),e.source===`plugin`?(0,w.jsx)(`span`,{className:`ct-mono`,children:`plugin`}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tools-list`,children:e.tools.map(e=>{let t=e.source===`plugin`?e.pluginId?`plugin:${e.pluginId}`:`plugin`:`core`;return(0,w.jsxs)(`div`,{className:`ct-agents__tool-row`,"data-testid":`agent-tool-${e.id}`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`div`,{className:`ct-agents__tool-title ct-mono`,children:[e.label,(0,w.jsx)(`span`,{className:`ct-agents__tool-source`,children:t}),e.optional===!0?(0,w.jsx)(`span`,{className:`ct-agents__tool-source`,children:`optional`}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tool-desc`,children:e.description})]}),(0,w.jsx)(`label`,{className:`ct-agents__tool-toggle`,children:(0,w.jsx)(`input`,{type:`checkbox`,"aria-label":`Enable ${e.label}`,checked:Y(e.id,C,S).allowed,disabled:!b,onChange:t=>j(e.id,t.target.checked)})})]},e.id)})})]},e.id))}),n.loading?(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Refreshing tool catalog…`}):null]})}var Z=[{id:`overview`,label:`Overview`},{id:`files`,label:`Files`},{id:`tools`,label:`Tools`},{id:`skills`,label:`Skills`},{id:`channels`,label:`Channels`},{id:`cron`,label:`Cron jobs`}];function Ze({agent:e,agents:t,defaultId:n,panel:r,onPanelChange:i}){let a=e.id,o=p(`agent.identity.get`,{agentId:a}),c=f(e=>e.draft),l=f(e=>e.snapshot?.config??null),u=c??l,d=o.data&&o.data.agentId===a?o.data:null,m=ee(a,n),g=I(e),v=e.description?.trim()||e.identity?.theme?.trim()||`Agent workspace and routing.`,y=z(e,d),b=R(e,d),x=e.team?.id,S=x===void 0?[]:t.filter(e=>e.team?.id===x&&e.id!==a).toSorted((e,t)=>Number(t.team?.role===`lead`)-Number(e.team?.role===`lead`)),C=ne({agent:e,config:u,filesWorkspace:null,defaultId:n,agentIdentity:d});return(0,w.jsxs)(`div`,{className:`ct-agents__detail`,"data-testid":`agent-detail`,children:[(0,w.jsxs)(`section`,{className:`ct-agents__header`,"data-testid":`agent-header`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__header-main`,children:[(0,w.jsx)(T,{src:y,emoji:b,label:g,large:!0,testId:`agent-avatar`}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h2`,{className:`ct-agents__name`,"data-testid":`agent-name`,children:g}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,"data-testid":`agent-subtitle`,children:v})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__header-meta`,children:[(0,w.jsx)(`span`,{className:`ct-mono`,"data-testid":`agent-id`,children:a}),e.team?(0,w.jsxs)(h,{tone:`neutral`,children:[e.team.name??e.team.id,` · `,e.team.role]}):null,m?(0,w.jsx)(h,{tone:`accent`,children:m}):null,o.error?(0,w.jsx)(h,{tone:`danger`,children:`identity unavailable`}):null]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__links`,"data-testid":`agent-links`,children:[(0,w.jsx)(_,{to:s.sessions({agent:a}),children:`Sessions`}),(0,w.jsx)(_,{to:s.runs({agent:a}),children:`Runs`}),S.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__team-links`,children:[`Team:`,S.map(e=>(0,w.jsx)(_,{to:s.agent(e.id),children:I(e)},e.id))]}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tabs`,role:`tablist`,"data-testid":`agent-tabs`,children:Z.map(e=>(0,w.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":r===e.id,className:`ct-agents__tab${r===e.id?` ct-agents__tab--active`:``}`,onClick:()=>i(e.id),children:e.label},e.id))}),r===`overview`?(0,w.jsx)(Te,{agent:e,defaultId:n,identity:d,identityLoading:o.loading,identityError:o.error}):null,r===`files`?(0,w.jsx)(be,{agentId:a},a):null,r===`tools`?(0,w.jsx)(Xe,{agent:e},a):null,r===`skills`?(0,w.jsx)(qe,{agent:e},a):null,r===`channels`?(0,w.jsx)(pe,{context:C},a):null,r===`cron`?(0,w.jsx)(ye,{agentId:a,context:C},a):null]})}var Q=`Check in`;function $(e){let t=new URL(window.location.href);t.searchParams.set(`agent`,e.agent),e.tab===`overview`?t.searchParams.delete(`tab`):t.searchParams.set(`tab`,e.tab),window.history.replaceState({},``,`${t.pathname}${t.search}`)}function Qe(){let e=c(),t=i(e=>e.request),n=p(`agents.list`,{},{refreshMs:m}),r=n.data?.agents??[],s=n.data?.defaultId??null,[l,h]=(0,C.useState)(()=>Z.find(t=>t.id===e.params.get(`tab`))?.id??`overview`),[_,v]=(0,C.useState)(()=>e.params.get(`agent`)),[y,b]=(0,C.useState)(!1),[x,S]=(0,C.useState)(Q),[T,E]=(0,C.useState)(!1),[D,O]=(0,C.useState)(null),k=(0,C.useRef)(!1),A=(0,C.useRef)(e.params.get(`agent`)),j=(0,C.useRef)(Z.find(t=>t.id===e.params.get(`tab`))?.id??`overview`),M=e.params.get(`agent`);(0,C.useEffect)(()=>{M!==A.current&&(A.current=M,M&&v(M))},[M]);let P=e.params.get(`tab`);(0,C.useEffect)(()=>{let e=Z.find(e=>e.id===P)?.id??`overview`;e!==j.current&&(j.current=e,h(e))},[P]);let F=r.find(e=>e.id===_)??r.find(e=>e.id===s)??r[0]??null;(0,C.useEffect)(()=>{k.current||(k.current=!0,f.getState().load())},[]);let I=e=>{e!==F?.id&&(A.current=e,v(e),$({agent:e,tab:l}))},L=e=>{h(e),j.current=e,F&&$({agent:F.id,tab:e})},R=async()=>{if(!F||T)return;let e=x.trim();if(e){E(!0),O(null);try{await t(`agent.nudge`,{agentId:F.id,text:e}),b(!1),S(Q)}catch(e){O(o(e))}finally{E(!1)}}};return(0,w.jsxs)(`div`,{className:`ct-page`,"data-testid":`agents-view`,children:[(0,w.jsx)(`header`,{className:`ct-page__head`,children:(0,w.jsxs)(`div`,{className:`ct-page__head-text`,children:[(0,w.jsx)(`h1`,{className:`ct-page__title`,children:`Agents`}),(0,w.jsx)(`p`,{className:`ct-page__sub`,children:`Personas, workspaces, tools and schedules.`})]})}),(0,w.jsxs)(`div`,{className:`ct-agents__layout`,children:[(0,w.jsxs)(g,{className:`ct-agents__sidebar`,title:`Agents`,sub:`${r.length} configured.`,actions:(0,w.jsx)(u,{size:`sm`,disabled:!F,"data-testid":`agents-nudge`,onClick:()=>{S(Q),O(null),b(!0)},children:`Nudge agent`}),children:[n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading agents…`}):null,n.data&&r.length===0?(0,w.jsx)(a,{message:`No agents found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__list`,"data-testid":`agent-list`,children:N(r).map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__group`,children:[e.title?(0,w.jsx)(`h3`,{className:`ct-agents__group-title`,"data-testid":`agent-group-${e.teamId}`,children:e.title}):null,e.agents.map(e=>(0,w.jsx)($e,{agent:e,defaultId:s,active:F?.id===e.id,onSelect:()=>I(e.id)},e.id))]},e.teamId??`__ungrouped`))})]}),F?(0,w.jsx)(Ze,{agent:F,agents:r,defaultId:s,panel:l,onPanelChange:L},F.id):(0,w.jsx)(g,{title:`Select an agent`,sub:`Pick an agent to inspect its workspace and tools.`,children:n.data&&r.length===0?(0,w.jsx)(a,{message:`No agents are configured on this gateway.`}):null})]}),(0,w.jsxs)(d,{open:y,title:`Nudge agent`,onClose:()=>b(!1),width:`sm`,footer:(0,w.jsxs)(`div`,{className:`ct-agents__dialog-actions`,children:[(0,w.jsx)(u,{size:`sm`,onClick:()=>b(!1),children:`Cancel`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:T||!x.trim(),"data-testid":`agents-nudge-send`,onClick:()=>void R(),children:T?`Sending…`:`Send nudge`})]}),children:[(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Message`}),(0,w.jsx)(`textarea`,{"data-testid":`agents-nudge-text`,rows:3,value:x,onChange:e=>S(e.target.value)})]}),D?(0,w.jsx)(`p`,{className:`ct-agents__callout ct-agents__callout--danger`,role:`alert`,children:D}):null]})]})}function $e({agent:e,defaultId:t,active:n,onSelect:r}){let i=I(e),a=ee(e.id,t);return(0,w.jsxs)(`button`,{type:`button`,className:`ct-agents__row${n?` ct-agents__row--active`:``}`,"data-testid":`agent-row-${e.id}`,"aria-current":n?`true`:void 0,onClick:r,children:[(0,w.jsx)(T,{src:z(e,null),emoji:R(e,null),label:i}),(0,w.jsxs)(`span`,{className:`ct-agents__row-info`,children:[(0,w.jsx)(`span`,{className:`ct-agents__row-name`,children:i}),(0,w.jsx)(`span`,{className:`ct-agents__row-id ct-mono`,children:e.id})]}),a?(0,w.jsx)(h,{tone:`accent`,children:a}):null,e.team?.role===`lead`?(0,w.jsx)(h,{tone:`neutral`,children:`lead`}):null,e.userFacing===!1?(0,w.jsx)(h,{tone:`neutral`,children:`internal`}):null]})}export{Qe as default};
|
|
1
|
+
import{_ as e,c as t,h as n,i as r,l as i,s as a,t as o}from"./format-BPrfsCHW.js";import{n as s,o as c,t as l}from"./links-vgPLVF05.js";import{t as u}from"./Button-ralPMMNs.js";import{t as d}from"./Dialog-oJKnAIqZ.js";import{r as f}from"./config-store-DiHUH-77.js";import{n as p,t as m}from"./use-gateway-query-7iLwemQz.js";import{t as h}from"./Badge-me4YM1lq.js";import{t as g}from"./Panel-CqcbBXzJ.js";import{t as _}from"./EntityLink-CMtTP9Dk.js";import{t as v}from"./Stat-BRQhQ01w.js";import{a as y,i as b,n as x,r as S}from"./skills-model-DANiC-ui.js";var C=e(n(),1),w=t();function T({src:e,emoji:t,label:n,large:r=!1,testId:i}){let[a,o]=(0,C.useState)(!1),[s,c]=(0,C.useState)(e);e!==s&&(c(e),o(!1));let l=[`ct-agents__avatar`,r?`ct-agents__avatar--lg`:null].filter(Boolean).join(` `);return e&&!a?(0,w.jsx)(`img`,{className:l,src:e,alt:``,"data-testid":i?`${i}-img`:void 0,onError:()=>o(!0)}):(0,w.jsx)(`span`,{className:l,"data-testid":i?`${i}-fallback`:void 0,"aria-hidden":`true`,children:t||n.slice(0,1).toUpperCase()})}function E(e){if(!e)return`-`;if(typeof e==`string`)return e.trim()||`-`;let t=P(e);if(!t)return`-`;let n=typeof t.primary==`string`?t.primary.trim():``;if(!n)return`-`;let r=Array.isArray(t.fallbacks)?t.fallbacks.length:0;return r>0?`${n} (+${r} fallback)`:n}function D(e){let t=e.match(/^(.+) \(\+\d+ fallback\)$/);return t?t[1]:e}function O(e){if(!e)return null;if(typeof e==`string`)return e.trim()||null;let t=P(e);return t&&(typeof t.primary==`string`?t.primary:typeof t.model==`string`?t.model:typeof t.id==`string`?t.id:typeof t.value==`string`?t.value:null)?.trim()||null}function k(e){let t=P(e);if(!t)return null;let n=Array.isArray(t.fallbacks)?t.fallbacks:Array.isArray(t.fallback)?t.fallback:null;return n?n.filter(e=>typeof e==`string`):null}function A(e,t){return k(e)??k(t)}function j(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function M(e,t){let n=(e||null)?.agents?.defaults?.models,r=[];if(n&&typeof n==`object`)for(let[e,t]of Object.entries(n)){let n=e.trim();if(!n)continue;let i=t?.alias?.trim(),a=i&&i!==n?`${i} (${n})`:n;r.push({value:n,label:a})}let i=t?r.some(e=>e.value===t):!1;return t&&!i&&r.unshift({value:t,label:`Current (${t})`}),r.length===0?[{value:``,label:`No configured models`,disabled:!0}]:r}function N(e){let t=new Map;for(let n of e){let e=n.team?.id??null,r=e??`\0`,i=t.get(r);i||(i={teamId:e,title:e===null?null:n.team?.name??e,agents:[]},t.set(r,i)),n.team?.role===`lead`?(e!==null&&n.team?.name&&(i.title=n.team.name),i.agents.unshift(n)):i.agents.push(n)}return[...t.values()].toSorted((e,t)=>e.teamId===null?1:t.teamId===null?-1:0)}function P(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function F(e){let t=P(e);return t&&typeof t.id==`string`?t.id:null}function I(e){return e.name?.trim()||e.identity?.name?.trim()||e.id}function L(e){let t=e.trim();if(!t||t.length>16)return!1;let n=!1;for(let e=0;e<t.length;e+=1)if(t.charCodeAt(e)>127){n=!0;break}return n?!t.includes(`://`)&&!t.includes(`/`)&&!t.includes(`.`):!1}function R(e,t){let n=t?.emoji?.trim();if(n&&L(n))return n;let r=e.identity?.emoji?.trim();if(r&&L(r))return r;let i=t?.avatar?.trim();if(i&&L(i))return i;let a=e.identity?.avatar?.trim();return a&&L(a)?a:``}function z(e,t){let n=[t?.avatar,e.identity?.avatarUrl,e.identity?.avatar];for(let e of n){let t=e?.trim();if(t&&!L(t))return t}return null}function ee(e,t){return t&&e===t?`default`:null}function te(e){if(e==null||!Number.isFinite(e))return`-`;if(e<1024)return`${e} B`;let t=[`KB`,`MB`,`GB`,`TB`],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n.toFixed(+(n<10))} ${t[r]}`}function B(e,t){let n=e||null;return{entry:(n?.agents?.list??[]).find(e=>F(e)===t)??null,defaults:n?.agents?.defaults??null}}function V(e,t){let n=e?e.agents?.list:void 0;return Array.isArray(n)?n.findIndex(e=>F(e)===t):-1}function ne(e){let{agent:t,config:n,filesWorkspace:r,defaultId:i,agentIdentity:a}=e,o=B(n,t.id),s=r||o.entry?.workspace||o.defaults?.workspace||`default`,c=o.entry?.model?E(o.entry?.model):E(o.defaults?.model),l=a?.name?.trim()||t.identity?.name?.trim()||t.name?.trim()||o.entry?.name||t.id,u=R(t,a)||`-`,d=Array.isArray(o.entry?.skills)?o.entry?.skills:null,f=d?.length??null;return{workspace:s,model:c,identityName:l,identityEmoji:u,skillsLabel:d?`${f} selected`:`all skills`,isDefault:!!(i&&t.id===i)}}function re(e,t){if(!e)return null;let n=P(e.channels)?.[t];return P(n)??P(e[t])}function ie(e){if(e==null)return`n/a`;if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return String(e);try{return JSON.stringify(e)}catch{return`n/a`}}function ae(e){let t=re(e.configForm,e.channelId);return t?e.fields.flatMap(e=>e in t?[{label:e,value:ie(t[e])}]:[]):[]}function oe(e){let t=e/6e4;if(t<60)return`${Math.round(t)}m`;let n=t/60;return n<24?`${Math.round(n*10)/10}h`:`${Math.round(n/24*10)/10}d`}function se(e){let t=e.schedule;if(t.kind===`at`){let e=Date.parse(t.at);return Number.isFinite(e)?`At ${new Date(e).toLocaleString()}`:`At ${t.at}`}return t.kind===`every`?`Every ${oe(t.everyMs)}`:`Cron ${t.expr}${t.tz?` (${t.tz})`:``}`}function ce(e){let t=e.payload;if(t.kind===`systemEvent`)return`System: ${t.text}`;if(t.kind===`wakeGate`){let e=t.gate.kind===`command`?t.gate.command:t.gate.model;return`Wake gate: ${t.gate.kind} (${e??`model`})`}return`Agent: ${t.message}`}var le=[`groupPolicy`,`streamMode`,`dmPolicy`];function ue(e,t){return e.channelMeta?.find(e=>e.id===t)?.label||e.channelLabels[t]||t}function de(e){if(!e)return[];let t=new Set;for(let n of e.channelOrder??[])t.add(n);for(let n of e.channelMeta??[])t.add(n.id);for(let n of Object.keys(e.channelAccounts??{}))t.add(n);let n=[],r=e.channelOrder?.length?e.channelOrder:Array.from(t);for(let e of r)t.has(e)&&(n.push(e),t.delete(e));for(let e of t)n.push(e);return n.map(t=>({id:t,label:ue(e,t),accounts:e.channelAccounts?.[t]??[]}))}function fe(e){let t=0,n=0,r=0;for(let i of e){let e=i.probe&&typeof i.probe==`object`&&`ok`in i.probe?!!i.probe.ok:!1;(i.connected===!0||i.running===!0||e)&&(t+=1),i.configured&&(n+=1),i.enabled&&(r+=1)}return{total:e.length,connected:t,configured:n,enabled:r}}function pe({context:e}){let t=p(`channels.status`,{probe:!1},{refreshMs:m}),n=he(),i=de(t.data),o=t.data?.ts??null;return(0,w.jsxs)(`div`,{"data-testid":`agent-channels`,children:[(0,w.jsx)(me,{context:e,subtitle:`Workspace, identity, and model configuration.`}),(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Channels`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Gateway-wide channel status snapshot.`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Last refresh: `,o?r(o):`never`]})]}),(0,w.jsx)(u,{size:`sm`,disabled:t.loading,onClick:t.reload,children:t.loading?`Refreshing…`:`Refresh`})]}),t.error?(0,w.jsx)(a,{tone:`error`,message:t.error}):null,t.loading&&!t.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading channels…`}):null,t.data&&i.length===0?(0,w.jsx)(a,{message:`No channels found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__channel-list`,children:i.map(e=>{let t=fe(e.accounts),r=t.total?`${t.connected}/${t.total} connected`:`no accounts`,i=t.configured?`${t.configured} configured`:`not configured`,a=t.total?`${t.enabled} enabled`:`disabled`,o=ae({configForm:n,channelId:e.id,fields:le});return(0,w.jsxs)(`div`,{className:`ct-agents__channel-row`,"data-testid":`agent-channel-${e.id}`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`div`,{className:`ct-agents__channel-label`,children:e.label}),(0,w.jsx)(`div`,{className:`ct-agents__channel-id ct-mono`,children:e.id})]}),(0,w.jsxs)(`div`,{className:`ct-agents__channel-meta`,children:[(0,w.jsx)(`span`,{children:r}),(0,w.jsx)(`span`,{children:i}),(0,w.jsx)(`span`,{children:a}),o.map(e=>(0,w.jsxs)(`span`,{children:[e.label,`: `,e.value]},e.label))]})]},e.id)})})]})}function me({context:e,subtitle:t}){let n=[[`Workspace`,e.workspace],[`Primary model`,e.model],[`Identity name`,e.identityName],[`Identity emoji`,e.identityEmoji],[`Skills filter`,e.skillsLabel],[`Default`,e.isDefault?`yes`:`no`]];return(0,w.jsxs)(`div`,{className:`ct-agents__context-card`,"data-testid":`agent-context-card`,children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Agent context`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:t}),(0,w.jsx)(`div`,{className:`ct-agents__kv-grid`,children:n.map(([e,t])=>(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:e}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value`,children:t})]},e))})]})}function he(){let e=f(e=>e.draft),t=f(e=>e.snapshot?.config??null);return e??t}var ge={includeDisabled:!0,limit:200,offset:0,sortBy:`nextRunAtMs`,sortDir:`asc`},_e=50;function ve(e){let t=i(e=>e.request),[n,r]=(0,C.useState)({jobs:[],loading:!1,error:null});return(0,C.useEffect)(()=>{if(!e||e.hasMore!==!0){r(e=>e.jobs.length===0&&!e.loading&&e.error===null?e:{jobs:[],loading:!1,error:null});return}let n=!1;return r(e=>({jobs:e.jobs,loading:!0,error:null})),(async()=>{let i=[],a=e.nextOffset??200;for(let e=0;e<_e;e+=1)try{let e=await t(`cron.list`,{...ge,offset:a});if(n)return;let r=e.jobs??[];if(i.push(...r),e.hasMore!==!0||r.length===0)break;a=e.nextOffset??a+r.length}catch(e){n||r({jobs:i,loading:!1,error:o(e)});return}n||r({jobs:i,loading:!1,error:null})})(),()=>{n=!0}},[e,t]),n}function ye({agentId:e,context:t}){let n=p(`cron.status`,{},{refreshMs:m}),i=p(`cron.list`,ge,{refreshMs:m}),o=ve(i.data),c=(0,C.useMemo)(()=>[...i.data?.jobs??[],...o.jobs].filter(t=>t.agentId===e),[i.data,o.jobs,e]),d=i.error??o.error;return(0,w.jsxs)(`div`,{"data-testid":`agent-cron`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__cron-top`,children:[(0,w.jsx)(me,{context:t,subtitle:`Workspace and scheduling targets.`}),(0,w.jsxs)(`div`,{className:`ct-agents__context-card`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Scheduler`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Gateway cron status.`})]}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,onClick:()=>{n.reload(),i.reload()},children:`Refresh`})]}),(0,w.jsxs)(`div`,{className:`ct-agents__stats`,children:[(0,w.jsx)(v,{label:`Enabled`,value:n.data?n.data.enabled?`Yes`:`No`:`n/a`}),(0,w.jsx)(v,{label:`Jobs`,value:n.data?.jobs??`n/a`}),(0,w.jsx)(v,{label:`Next wake`,value:r(n.data?.nextWakeAtMs??null)})]}),n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null]})]}),(0,w.jsx)(`div`,{className:`ct-agents__panel-head`,children:(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Agent cron jobs`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Scheduled jobs targeting this agent.`})]})}),d?(0,w.jsx)(a,{tone:`error`,message:d}):null,i.loading&&!i.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading jobs…`}):null,i.data&&!o.loading&&c.length===0?(0,w.jsx)(a,{message:`No jobs assigned.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__cron-list`,children:c.map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__cron-row`,"data-testid":`agent-cron-job-${e.id}`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__cron-main`,children:[(0,w.jsx)(`span`,{className:`ct-agents__channel-label`,children:e.name}),e.description?(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.description}):null,(0,w.jsxs)(`span`,{className:`ct-agents__chip-row`,children:[(0,w.jsx)(h,{children:se(e)}),(0,w.jsx)(h,{tone:e.enabled?`ok`:`warn`,children:e.enabled?`enabled`:`disabled`}),(0,w.jsx)(h,{children:e.sessionTarget})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__cron-meta`,children:[(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Last `,r(e.state?.lastRunAtMs),` · Next`,` `,r(e.state?.nextRunAtMs)]}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:ce(e)}),(0,w.jsx)(u,{size:`sm`,"data-testid":`agent-cron-open-${e.id}`,onClick:()=>l(s.automation(e.id)),children:`Open in Automations`})]})]},e.id))})]})}function be({agentId:e}){let t=i(e=>e.request),n=p(`agents.files.list`,{agentId:e}),[r,s]=(0,C.useState)({}),[c,l]=(0,C.useState)({}),[d,f]=(0,C.useState)(null),[m,h]=(0,C.useState)(!1),[g,_]=(0,C.useState)(null),v=(0,C.useRef)({}),y=n.data?.agentId===e?n.data.files??[]:[],b=d?y.find(e=>e.name===d)??null:null,x=d?r[d]??``:``,S=d?Object.hasOwn(r,d):!1,T=d?c[d]??x:``,E=d?T!==x:!1,D=(e,t)=>{v.current={...v.current,[e]:t},s(v.current)};(0,C.useEffect)(()=>{d&&y.length>0&&!y.some(e=>e.name===d)&&f(null)},[d,y]),(0,C.useEffect)(()=>{if(!d||Object.hasOwn(v.current,d))return;let n=!1,r=d;return t(`agents.files.get`,{agentId:e,name:r}).then(e=>{n||!e?.file||(D(r,e.file.content??``),l(t=>({...t,[r]:e.file.content??``})))}).catch(e=>{n||_(o(e))}),()=>{n=!0}},[d,e,t]);let O=async()=>{if(!d||!E||m)return;let i=d,a=c[i]??r[i]??``;h(!0),_(null);try{(await t(`agents.files.set`,{agentId:e,name:i,content:a}))?.file&&(D(i,a),l(e=>({...e,[i]:a})),n.reload())}catch(e){_(o(e))}finally{h(!1)}};return(0,w.jsxs)(`div`,{"data-testid":`agent-files`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Core files`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Bootstrap persona, identity, and tool guidance.`}),n.data?.agentId===e?(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub ct-mono`,children:[`Workspace: `,n.data.workspace]}):null]}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,"data-testid":`agent-files-refresh`,onClick:n.reload,children:n.loading?`Loading…`:`Refresh`})]}),n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading files…`}):null,g?(0,w.jsx)(`div`,{role:`alert`,className:`ct-agents__callout ct-agents__callout--danger`,"data-testid":`agent-files-error`,children:g}):null,n.data?y.length===0?(0,w.jsx)(a,{message:`No files found.`}):(0,w.jsxs)(`div`,{className:`ct-agents__files-grid`,children:[(0,w.jsx)(`div`,{className:`ct-agents__files-list`,"data-testid":`agent-files-list`,children:y.map(e=>(0,w.jsx)(xe,{file:e,active:d===e.name,onSelect:()=>f(e.name)},e.name))}),(0,w.jsx)(`div`,{className:`ct-agents__files-editor`,children:b?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`ct-agents__file-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`div`,{className:`ct-agents__file-name ct-mono`,children:b.name}),(0,w.jsx)(`div`,{className:`ct-agents__file-path ct-mono`,children:b.path})]}),(0,w.jsxs)(`div`,{className:`ct-agents__file-actions`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!E,"data-testid":`agent-file-reset`,onClick:()=>l(e=>({...e,[b.name]:x})),children:`Reset`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:m||!E,"data-testid":`agent-file-save`,onClick:()=>void O(),children:m?`Saving…`:`Save`})]})]}),b.missing?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`This file is missing. Saving will create it in the agent workspace.`}):null,(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Content`}),(0,w.jsx)(`textarea`,{"data-testid":`agent-file-editor`,rows:16,value:T,disabled:!S,placeholder:S?void 0:`Loading…`,onChange:e=>l(t=>({...t,[b.name]:e.target.value}))})]})]}):(0,w.jsx)(a,{message:`Select a file to edit.`})})]}):null]})}function xe({file:e,active:t,onSelect:n}){let i=e.missing?`Missing`:`${te(e.size)} · ${r(e.updatedAtMs??null)}`;return(0,w.jsxs)(`button`,{type:`button`,className:`ct-agents__file-row${t?` ct-agents__file-row--active`:``}`,"data-testid":`agent-file-${e.name}`,onClick:n,children:[(0,w.jsxs)(`span`,{className:`ct-agents__file-row-main`,children:[(0,w.jsx)(`span`,{className:`ct-agents__file-row-name ct-mono`,children:e.name}),(0,w.jsx)(`span`,{className:`ct-agents__file-row-meta`,children:i})]}),e.missing?(0,w.jsx)(`span`,{className:`ct-agents__pill ct-agents__pill--warn`,children:`missing`}):null]})}function H({testId:e,onBeforeSave:t}){let n=f(e=>e.dirty),r=f(e=>e.busy),i=f(e=>e.error),a=f(e=>e.snapshot!==null),o=async()=>{t?.(),await f.getState().save(`set`)};return(0,w.jsxs)(`div`,{className:`ct-agents__config-actions`,children:[i?(0,w.jsxs)(`div`,{className:`ct-agents__config-error`,role:`alert`,"data-testid":`${e}-error`,children:[(0,w.jsx)(`span`,{children:i}),(0,w.jsx)(u,{size:`sm`,"data-testid":`${e}-error-reload`,onClick:()=>void f.getState().load(),children:`Reload from gateway`})]}):null,(0,w.jsxs)(`div`,{className:`ct-agents__config-buttons`,children:[(0,w.jsx)(`span`,{className:`ct-agents__config-state`,"data-testid":`${e}-state`,children:a?n?`unsaved`:`saved`:`Config not loaded`}),(0,w.jsx)(u,{size:`sm`,disabled:r,"data-testid":`${e}-reload`,onClick:()=>void f.getState().load(),children:`Reload Config`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:r||!n,"data-testid":`${e}-save`,onClick:()=>void o(),children:r?`Saving…`:`Save`})]})]})}function Se(e){return e&&typeof e==`object`&&!Array.isArray(e)?`primary`in e&&typeof e.primary==`string`&&e.primary.trim()||null:typeof e==`string`&&e.trim()||null}function Ce(e,t,n,r,i){let a=V(e,t);if(a<0)return;let o=[`agents`,`list`,a,`model`];if(!n){i(o);return}let s=B(e,t).entry?.model;if(s&&typeof s==`object`&&!Array.isArray(s)){let e=k(s);r(o,{primary:n,...e?{fallbacks:e}:{}});return}r(o,n)}function we(e,t,n,r,i){let a=V(e,t);if(a<0)return;let o=[`agents`,`list`,a,`model`],s=Se(B(e,t).entry?.model);if(n.length===0){s?r(o,s):i(o);return}r(o,s?{primary:s,fallbacks:n}:{fallbacks:n})}function Te({agent:e,defaultId:t,identity:n,identityLoading:r,identityError:i}){let a=f(e=>e.draft),o=f(e=>e.snapshot?.config??null),s=f(e=>e.busy),c=f(e=>e.schema!==null),l=a??o,u=B(l,e.id),d=u.entry?.workspace||u.defaults?.workspace||`default`,p=u.entry?.model?E(u.entry.model):E(u.defaults?.model),m=E(u.defaults?.model),h=O(u.entry?.model)??(p===`-`?null:D(p))??O(u.defaults?.model)??(m===`-`?null:D(m)),g=A(u.entry?.model,u.defaults?.model),_=g?g.join(`, `):``,[v,y]=(0,C.useState)(null);(0,C.useEffect)(()=>{y(null)},[_]);let b=v??_,x=n?.name?.trim()||e.identity?.name?.trim()||e.name?.trim()||u.entry?.name||`-`,S=R(e,n)||`-`,T=Array.isArray(u.entry?.skills)?u.entry?.skills:null,k=r?`Loading…`:i?`Unavailable`:``,N=!!(t&&e.id===t),P=ne({agent:e,config:l,filesWorkspace:null,defaultId:t,agentIdentity:n}),F=!!l&&c&&!s,I=(e,t)=>f.getState().setPath(e,t),L=e=>f.getState().removePath(e),z=()=>{if(v===null||v===_){y(null);return}y(null),we(l,e.id,j(v),I,L)};return(0,w.jsxs)(`div`,{"data-testid":`agent-overview`,children:[(0,w.jsx)(`div`,{className:`ct-agents__kv-grid`,children:[[`Workspace`,d],[`Primary model`,p],[`Identity name`,x,k||void 0],[`Default`,N?`yes`:`no`],[`Identity emoji`,S],[`Skills filter`,T?`${T.length} selected`:`all skills`]].map(([e,t,n])=>(0,w.jsxs)(`div`,{className:`ct-agents__kv`,"data-testid":`agent-kv-${e.toLowerCase().replace(/\s+/g,`-`)}`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:e}),(0,w.jsx)(`span`,{className:e===`Workspace`?`ct-agents__kv-value ct-mono`:`ct-agents__kv-value`,children:t}),n?(0,w.jsx)(`span`,{className:`ct-agents__kv-note`,children:n}):null]},e))}),(0,w.jsxs)(`div`,{className:`ct-agents__model-edit`,"data-testid":`agent-model-edit`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Model selection`}),(0,w.jsxs)(`div`,{className:`ct-agents__model-fields`,children:[(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsxs)(`span`,{children:[`Primary model`,N?` (default)`:``]}),(0,w.jsxs)(`select`,{"data-testid":`agent-model-select`,value:h??``,disabled:!F,onChange:t=>Ce(l,e.id,t.target.value||null,I,L),children:[N?null:(0,w.jsx)(`option`,{value:``,children:m===`-`?`Inherit default`:`Inherit default (${m})`}),M(l,h).map(e=>(0,w.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]})]}),(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Fallbacks (comma-separated)`}),(0,w.jsx)(`input`,{"data-testid":`agent-fallbacks-input`,value:b,disabled:!F,placeholder:`provider/model, provider/model`,onChange:e=>y(e.target.value),onBlur:z})]})]}),(0,w.jsx)(H,{testId:`agent-config`,onBeforeSave:z})]}),(0,w.jsxs)(`p`,{className:`ct-agents__hint`,children:[`Routing context: `,P.model===`-`?`model unset`:P.model,`,`,` `,P.skillsLabel,`.`]})]})}var Ee=[{id:`fs`,label:`Files`},{id:`runtime`,label:`Runtime`},{id:`web`,label:`Web`},{id:`memory`,label:`Memory`},{id:`sessions`,label:`Sessions`},{id:`ui`,label:`UI`},{id:`messaging`,label:`Messaging`},{id:`automation`,label:`Automation`},{id:`nodes`,label:`Nodes`},{id:`agents`,label:`Agents`},{id:`media`,label:`Media`}],U=[{id:`read`,label:`read`,description:`Read file contents`,sectionId:`fs`,profiles:[`coding`]},{id:`write`,label:`write`,description:`Create or overwrite files`,sectionId:`fs`,profiles:[`coding`]},{id:`edit`,label:`edit`,description:`Make precise edits`,sectionId:`fs`,profiles:[`coding`]},{id:`delete`,label:`delete`,description:`Delete a workspace file`,sectionId:`fs`,profiles:[`coding`]},{id:`apply_patch`,label:`apply_patch`,description:`Patch files (OpenAI)`,sectionId:`fs`,profiles:[`coding`]},{id:`exec`,label:`exec`,description:`Run shell commands`,sectionId:`runtime`,profiles:[`coding`]},{id:`process`,label:`process`,description:`Manage background processes`,sectionId:`runtime`,profiles:[`coding`]},{id:`web_search`,label:`web_search`,description:`Search the web`,sectionId:`web`,profiles:[],includeInOpenClawGroup:!0},{id:`web_fetch`,label:`web_fetch`,description:`Fetch web content`,sectionId:`web`,profiles:[],includeInOpenClawGroup:!0},{id:`memory_search`,label:`memory_search`,description:`Semantic search`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`memory_get`,label:`memory_get`,description:`Read memory files`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`sessions_list`,label:`sessions_list`,description:`List sessions`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_history`,label:`sessions_history`,description:`Session history`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_send`,label:`sessions_send`,description:`Send to session`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`agents_nudge`,label:`agents_nudge`,description:`Wake another agent`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_spawn`,label:`sessions_spawn`,description:`Spawn sub-agent`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`subagents`,label:`subagents`,description:`Manage sub-agents`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`session_status`,label:`session_status`,description:`Session status`,sectionId:`sessions`,profiles:[`minimal`,`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`browser`,label:`browser`,description:`Control web browser`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`canvas`,label:`canvas`,description:`Control canvases`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`message`,label:`message`,description:`Send messages`,sectionId:`messaging`,profiles:[`messaging`],includeInOpenClawGroup:!0},{id:`cron`,label:`cron`,description:`Schedule tasks`,sectionId:`automation`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`gateway`,label:`gateway`,description:`Gateway control`,sectionId:`automation`,profiles:[],includeInOpenClawGroup:!0},{id:`nodes`,label:`nodes`,description:`Nodes + devices`,sectionId:`nodes`,profiles:[],includeInOpenClawGroup:!0},{id:`agents_list`,label:`agents_list`,description:`List agents`,sectionId:`agents`,profiles:[],includeInOpenClawGroup:!0},{id:`image`,label:`image`,description:`Image understanding`,sectionId:`media`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`tts`,label:`tts`,description:`Text-to-speech conversion`,sectionId:`media`,profiles:[],includeInOpenClawGroup:!0}];new Map(U.map(e=>[e.id,e]));function W(e){return U.filter(t=>t.profiles.includes(e)).map(e=>e.id)}var De={minimal:{allow:W(`minimal`)},coding:{allow:W(`coding`)},messaging:{allow:W(`messaging`)},full:{}};function Oe(){let e=new Map;for(let t of U){let n=`group:${t.sectionId}`,r=e.get(n)??[];r.push(t.id),e.set(n,r)}return{"group:openclaw":U.filter(e=>e.includeInOpenClawGroup).map(e=>e.id),...Object.fromEntries(e.entries())}}var ke=Oe(),Ae=[{id:`minimal`,label:`Minimal`},{id:`coding`,label:`Coding`},{id:`messaging`,label:`Messaging`},{id:`full`,label:`Full`}];function je(e){if(!e)return;let t=De[e];if(t&&!(!t.allow&&!t.deny))return{allow:t.allow?[...t.allow]:void 0,deny:t.deny?[...t.deny]:void 0}}function Me(){return Ee.map(e=>({id:e.id,label:e.label,tools:U.filter(t=>t.sectionId===e.id).map(e=>({id:e.id,label:e.label,description:e.description}))})).filter(e=>e.tools.length>0)}var Ne={bash:`exec`,"apply-patch":`apply_patch`},Pe={...ke};function G(e){let t=e.trim().toLowerCase();return Ne[t]??t}function Fe(e){return e?e.map(G).filter(Boolean):[]}function Ie(e){let t=Fe(e),n=[];for(let e of t){let t=Pe[e];if(t){n.push(...t);continue}n.push(e)}return Array.from(new Set(n))}function Le(e){return je(e)}var Re=Me().map(e=>({id:e.id,label:e.label,source:`core`,tools:e.tools.map(e=>({...e,source:`core`,defaultProfiles:[]}))})),ze=Ae.map(e=>({...e}));function Be(e){return(e?e.tools:void 0)??{}}function Ve(e){let t=G(e);if(!t)return{kind:`exact`,value:``};if(t===`*`)return{kind:`all`};if(!t.includes(`*`))return{kind:`exact`,value:t};let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return{kind:`regex`,value:RegExp(`^${n.replaceAll(`\\*`,`.*`)}$`)}}function K(e){return Array.isArray(e)?Ie(e).map(Ve).filter(e=>e.kind!==`exact`||e.value.length>0):[]}function q(e,t){for(let n of t)if(n.kind===`all`||n.kind===`exact`&&e===n.value||n.kind===`regex`&&n.value.test(e))return!0;return!1}function He(e,t){if(!t)return!0;let n=G(e);if(q(n,K(t.deny)))return!1;let r=K(t.allow);return r.length===0||q(n,r)?!0:n===`apply_patch`&&q(`exec`,r)}function J(e,t){if(!Array.isArray(t)||t.length===0)return!1;let n=G(e),r=K(t);return q(n,r)?!0:n===`apply_patch`&&q(`exec`,r)}function Ue(e){return Le(e)??void 0}function Y(e,t,n){let r=He(e,t),i=J(e,n.alsoAllow),a=J(e,n.deny);return{allowed:(r||i)&&!a,baseAllowed:r,denied:a}}function We(e){return e.map(e=>G(e)).filter(e=>e.length>0)}function Ge(e){let t=new Set(We(e.current.alsoAllow)),n=new Set(We(e.current.deny));for(let r of e.toggles){let i=G(r.toolId);i&&(r.enable?(n.delete(i),e.baseAllowed(i)||t.add(i)):(t.delete(i),n.add(i)))}return{alsoAllow:[...t],deny:[...n]}}function Ke(e){let t=e.current?e.current.map(e=>e.trim()).filter(Boolean):null,n=new Set(t??e.allSkills),r=e.skillName.trim();return e.enable?n.add(r):n.delete(r),[...n]}function qe({agent:e}){let t=e.id,n=p(`skills.status`,{agentId:t},{refreshMs:m}),r=f(e=>e.draft),i=f(e=>e.snapshot?.config??null),o=f(e=>e.busy),s=f(e=>e.schema!==null),[c,l]=(0,C.useState)(``),d=r??i,h=B(d,t),g=Array.isArray(h.entry?.skills)?h.entry.skills:void 0,_=new Set((g??[]).map(e=>e.trim()).filter(Boolean)),v=g!==void 0,x=n.data!==null,S=x?n.data?.skills??[]:[],T=b(S,c),E=y(T),D=v?S.filter(e=>_.has(e.name)).length:S.length,O=!!d&&s&&!o,k=e=>{let n=V(d,t);if(n<0)return;let r=[`agents`,`list`,n,`skills`],i=f.getState();e===null?i.removePath(r):i.setPath(r,e)},A=(e,t)=>{let n=e.name.trim();if(!O||!n)return;let r=S.map(e=>e.name).filter(Boolean);k(Ke({current:g??null,allSkills:r,skillName:n,enable:t}))};return(0,w.jsxs)(`div`,{"data-testid":`agent-skills`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Skills`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Per-agent skill allowlist and workspace skills.`,` `,S.length>0?(0,w.jsxs)(`span`,{className:`ct-mono`,"data-testid":`agent-skills-count`,children:[D,`/`,S.length]}):null]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!O,"data-testid":`agent-skills-use-all`,onClick:()=>k(null),children:`Use All`}),(0,w.jsx)(u,{size:`sm`,disabled:!O,"data-testid":`agent-skills-disable-all`,onClick:()=>k([]),children:`Disable All`}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,"data-testid":`agent-skills-refresh`,onClick:n.reload,children:n.loading?`Loading…`:`Refresh`}),(0,w.jsx)(H,{testId:`agent-skills`})]})]}),d?null:(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load the gateway config to set per-agent skills.`}),(0,w.jsx)(`div`,{className:`ct-agents__callout`,"data-testid":`agent-skills-callout`,children:v?`This agent uses a custom skill allowlist.`:`All skills are enabled. Disabling any skill will create a per-agent allowlist.`}),!x&&!n.loading?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load skills for this agent to view workspace-specific entries.`}):null,n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading skills…`}):null,(0,w.jsxs)(`div`,{className:`ct-agents__skills-filters`,children:[(0,w.jsx)(`input`,{type:`text`,"aria-label":`Filter skills`,placeholder:`Search skills`,"data-testid":`agent-skills-filter`,value:c,onChange:e=>l(e.target.value)}),(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,"data-testid":`agent-skills-shown`,children:[T.length,` shown`]})]}),x&&T.length===0?(0,w.jsx)(a,{message:`No skills found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__skills-groups`,children:E.map(e=>(0,w.jsxs)(`details`,{className:`ct-agents__skills-group`,open:!(e.id===`workspace`||e.id===`built-in`),"data-testid":`agent-skill-group-${e.id}`,children:[(0,w.jsxs)(`summary`,{children:[(0,w.jsx)(`span`,{children:e.label}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.skills.length})]}),(0,w.jsx)(`div`,{className:`ct-agents__skills-list`,children:e.skills.map(e=>(0,w.jsx)(Je,{skill:e,enabled:!v||_.has(e.name),editable:O,onToggle:t=>A(e,t)},e.skillKey))})]},e.id))})]})}function Je({skill:e,enabled:t,editable:n,onToggle:r}){let i=x(e),a=S(e);return(0,w.jsxs)(`div`,{className:`ct-agents__skill-row`,"data-testid":`agent-skill-row-${e.name}`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__skill-main`,children:[(0,w.jsxs)(`span`,{className:`ct-agents__channel-label`,children:[e.emoji?`${e.emoji} `:``,e.name]}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.description}),(0,w.jsxs)(`span`,{className:`ct-agents__chip-row`,children:[(0,w.jsx)(h,{children:e.source}),(0,w.jsx)(h,{tone:e.eligible?`ok`:`warn`,children:e.eligible?`eligible`:`blocked`}),e.disabled?(0,w.jsx)(h,{tone:`warn`,children:`disabled`}):null]}),i.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Missing: `,i.join(`, `)]}):null,a.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Reason: `,a.join(`, `)]}):null]}),(0,w.jsx)(`label`,{className:`ct-agents__tool-toggle`,children:(0,w.jsx)(`input`,{type:`checkbox`,"aria-label":`Enable ${e.name}`,checked:t,disabled:!n,onChange:e=>r(e.target.checked)})})]})}var Ye=[{id:`readonly`,label:`Readonly`},{id:`minimal`,label:`Minimal`},{id:`coding`,label:`Coding`},{id:`full`,label:`Full`}];function X(e,t){let n=V(e,t);return n<0?null:[`agents`,`list`,n,`tools`]}function Xe({agent:e}){let t=e.id,n=p(`tools.catalog`,{agentId:t,includePlugins:!0},{refreshMs:3e4}),r=f(e=>e.draft),i=f(e=>e.snapshot?.config??null),a=f(e=>e.busy),o=f(e=>e.schema!==null),s=r??i,c=B(s,t).entry?.tools??{},l=Be(s),d=c.profile??l.profile??`full`,m=c.profile?`agent override`:l.profile?`global default`:`default`,h=c.exec?.preset??l.exec?.preset??null,g=n.data&&n.data.agentId===t?n.data.execPolicy:void 0,_=g?.canExec??`full`,v=Array.isArray(c.allow)&&c.allow.length>0,y=Array.isArray(l.allow)&&l.allow.length>0,b=!!s&&o&&!a&&!v,x=!!s&&o&&!a,S={alsoAllow:v?[]:c.alsoAllow??[],deny:v?[]:c.deny??[]},C=v?{allow:c.allow??[],deny:c.deny??[]}:Ue(d),T=n.data?.groups?.length&&n.data.agentId===t?n.data.groups:Re,E=n.data?.profiles?.length&&n.data.agentId===t?n.data.profiles:ze,D=T.flatMap(e=>e.tools.map(e=>e.id)),O=e=>Y(e,C,S).baseAllowed,k=D.filter(e=>Y(e,C,S).allowed).length,A=e=>{let n=X(s,t);if(!n)return;let r=f.getState();e.alsoAllow.length>0?r.setPath([...n,`alsoAllow`],e.alsoAllow):r.removePath([...n,`alsoAllow`]),e.deny.length>0?r.setPath([...n,`deny`],e.deny):r.removePath([...n,`deny`])},j=(e,t)=>{A(Ge({current:S,baseAllowed:O,toggles:[{toolId:e,enable:t}]}))},M=e=>{A(Ge({current:S,baseAllowed:O,toggles:D.map(t=>({toolId:t,enable:e}))}))},N=(e,n)=>{let r=X(s,t);if(!r)return;let i=f.getState();e?i.setPath([...r,`profile`],e):i.removePath([...r,`profile`]),n&&i.removePath([...r,`allow`])},P=e=>{let n=X(s,t);if(!n)return;let r=f.getState();e?r.setPath([...n,`exec`,`preset`],e):r.removePath([...n,`exec`,`preset`])},F=Y(`exec`,C,S).allowed;return(0,w.jsxs)(`div`,{"data-testid":`agent-tools`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Tool access`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Profile + per-tool overrides for this agent.`,` `,(0,w.jsxs)(`span`,{className:`ct-mono`,children:[k,`/`,D.length]}),` `,`enabled.`]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!b,onClick:()=>M(!0),children:`Enable All`}),(0,w.jsx)(u,{size:`sm`,disabled:!b,onClick:()=>M(!1),children:`Disable All`}),(0,w.jsx)(H,{testId:`agent-tools`})]})]}),n.error?(0,w.jsx)(`div`,{className:`ct-agents__callout ct-agents__callout--warn`,role:`status`,children:`Could not load runtime tool catalog. Showing fallback list.`}):null,s?null:(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load the gateway config to adjust tool profiles.`}),v?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`This agent is using an explicit allowlist in config. Tool overrides are managed in the Config tab.`}):null,y?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Global tools.allow is set. Agent overrides cannot enable tools that are globally blocked.`}):null,F&&g?.canExec===`none`?(0,w.jsx)(`div`,{className:`ct-agents__callout ct-agents__callout--warn`,"data-testid":`agent-tools-exec-none`,children:`Exec tool is enabled but tools.exec security denies every command - pick a preset below or adjust tools.exec.security.`}):null,F&&_===`safebins-only`?(0,w.jsx)(`div`,{className:`ct-agents__callout`,"data-testid":`agent-tools-safebins`,children:`Exec is limited to safe bins; choose a preset to broaden read-only diagnostics.`}):null,(0,w.jsxs)(`div`,{className:`ct-agents__kv-grid ct-agents__kv-grid--tools`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Profile`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value ct-mono`,"data-testid":`agent-tools-profile`,children:d})]}),(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Source`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value`,children:m})]}),a?(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Status`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value ct-mono`,children:`unsaved`})]}):null,g?(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Exec`}),(0,w.jsxs)(`span`,{className:`ct-agents__kv-value ct-mono`,"data-testid":`agent-tools-exec-policy`,children:[g.presetId??g.security,` · `,g.ask,` · `,g.canExec]})]}):null]}),(0,w.jsxs)(`div`,{className:`ct-agents__presets`,"data-testid":`agent-tools-presets`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Quick presets`}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[E.map(e=>(0,w.jsx)(u,{size:`sm`,"aria-pressed":d===e.id,disabled:!b,onClick:()=>N(e.id,!0),children:e.label},e.id)),(0,w.jsx)(u,{size:`sm`,"aria-pressed":!1,disabled:!b,onClick:()=>N(null,!1),children:`Inherit`})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__presets`,"data-testid":`agent-exec-presets`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Exec policy`}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[Ye.map(e=>(0,w.jsx)(u,{size:`sm`,"aria-pressed":h===e.id,disabled:!x,onClick:()=>P(e.id),children:e.label},e.id)),(0,w.jsx)(u,{size:`sm`,"aria-pressed":!1,disabled:!x,onClick:()=>P(null),children:`Inherit`})]})]}),(0,w.jsx)(`div`,{className:`ct-agents__tools-grid`,children:T.map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__tools-section`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__tools-head`,children:[(0,w.jsx)(`span`,{children:e.label}),e.source===`plugin`?(0,w.jsx)(`span`,{className:`ct-mono`,children:`plugin`}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tools-list`,children:e.tools.map(e=>{let t=e.source===`plugin`?e.pluginId?`plugin:${e.pluginId}`:`plugin`:`core`;return(0,w.jsxs)(`div`,{className:`ct-agents__tool-row`,"data-testid":`agent-tool-${e.id}`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`div`,{className:`ct-agents__tool-title ct-mono`,children:[e.label,(0,w.jsx)(`span`,{className:`ct-agents__tool-source`,children:t}),e.optional===!0?(0,w.jsx)(`span`,{className:`ct-agents__tool-source`,children:`optional`}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tool-desc`,children:e.description})]}),(0,w.jsx)(`label`,{className:`ct-agents__tool-toggle`,children:(0,w.jsx)(`input`,{type:`checkbox`,"aria-label":`Enable ${e.label}`,checked:Y(e.id,C,S).allowed,disabled:!b,onChange:t=>j(e.id,t.target.checked)})})]},e.id)})})]},e.id))}),n.loading?(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Refreshing tool catalog…`}):null]})}var Z=[{id:`overview`,label:`Overview`},{id:`files`,label:`Files`},{id:`tools`,label:`Tools`},{id:`skills`,label:`Skills`},{id:`channels`,label:`Channels`},{id:`cron`,label:`Cron jobs`}];function Ze({agent:e,agents:t,defaultId:n,panel:r,onPanelChange:i}){let a=e.id,o=p(`agent.identity.get`,{agentId:a}),c=f(e=>e.draft),l=f(e=>e.snapshot?.config??null),u=c??l,d=o.data&&o.data.agentId===a?o.data:null,m=ee(a,n),g=I(e),v=e.description?.trim()||e.identity?.theme?.trim()||`Agent workspace and routing.`,y=z(e,d),b=R(e,d),x=e.team?.id,S=x===void 0?[]:t.filter(e=>e.team?.id===x&&e.id!==a).toSorted((e,t)=>Number(t.team?.role===`lead`)-Number(e.team?.role===`lead`)),C=ne({agent:e,config:u,filesWorkspace:null,defaultId:n,agentIdentity:d});return(0,w.jsxs)(`div`,{className:`ct-agents__detail`,"data-testid":`agent-detail`,children:[(0,w.jsxs)(`section`,{className:`ct-agents__header`,"data-testid":`agent-header`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__header-main`,children:[(0,w.jsx)(T,{src:y,emoji:b,label:g,large:!0,testId:`agent-avatar`}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h2`,{className:`ct-agents__name`,"data-testid":`agent-name`,children:g}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,"data-testid":`agent-subtitle`,children:v})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__header-meta`,children:[(0,w.jsx)(`span`,{className:`ct-mono`,"data-testid":`agent-id`,children:a}),e.team?(0,w.jsxs)(h,{tone:`neutral`,children:[e.team.name??e.team.id,` · `,e.team.role]}):null,m?(0,w.jsx)(h,{tone:`accent`,children:m}):null,o.error?(0,w.jsx)(h,{tone:`danger`,children:`identity unavailable`}):null]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__links`,"data-testid":`agent-links`,children:[(0,w.jsx)(_,{to:s.sessions({agent:a}),children:`Sessions`}),(0,w.jsx)(_,{to:s.runs({agent:a}),children:`Runs`}),S.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__team-links`,children:[`Team:`,S.map(e=>(0,w.jsx)(_,{to:s.agent(e.id),children:I(e)},e.id))]}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tabs`,role:`tablist`,"data-testid":`agent-tabs`,children:Z.map(e=>(0,w.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":r===e.id,className:`ct-agents__tab${r===e.id?` ct-agents__tab--active`:``}`,onClick:()=>i(e.id),children:e.label},e.id))}),r===`overview`?(0,w.jsx)(Te,{agent:e,defaultId:n,identity:d,identityLoading:o.loading,identityError:o.error}):null,r===`files`?(0,w.jsx)(be,{agentId:a},a):null,r===`tools`?(0,w.jsx)(Xe,{agent:e},a):null,r===`skills`?(0,w.jsx)(qe,{agent:e},a):null,r===`channels`?(0,w.jsx)(pe,{context:C},a):null,r===`cron`?(0,w.jsx)(ye,{agentId:a,context:C},a):null]})}var Q=`Check in`;function $(e){let t=new URL(window.location.href);t.searchParams.set(`agent`,e.agent),e.tab===`overview`?t.searchParams.delete(`tab`):t.searchParams.set(`tab`,e.tab),window.history.replaceState({},``,`${t.pathname}${t.search}`)}function Qe(){let e=c(),t=i(e=>e.request),n=p(`agents.list`,{},{refreshMs:m}),r=n.data?.agents??[],s=n.data?.defaultId??null,[l,h]=(0,C.useState)(()=>Z.find(t=>t.id===e.params.get(`tab`))?.id??`overview`),[_,v]=(0,C.useState)(()=>e.params.get(`agent`)),[y,b]=(0,C.useState)(!1),[x,S]=(0,C.useState)(Q),[T,E]=(0,C.useState)(!1),[D,O]=(0,C.useState)(null),k=(0,C.useRef)(!1),A=(0,C.useRef)(e.params.get(`agent`)),j=(0,C.useRef)(Z.find(t=>t.id===e.params.get(`tab`))?.id??`overview`),M=e.params.get(`agent`);(0,C.useEffect)(()=>{M!==A.current&&(A.current=M,M&&v(M))},[M]);let P=e.params.get(`tab`);(0,C.useEffect)(()=>{let e=Z.find(e=>e.id===P)?.id??`overview`;e!==j.current&&(j.current=e,h(e))},[P]);let F=r.find(e=>e.id===_)??r.find(e=>e.id===s)??r[0]??null;(0,C.useEffect)(()=>{k.current||(k.current=!0,f.getState().load())},[]);let I=e=>{e!==F?.id&&(A.current=e,v(e),$({agent:e,tab:l}))},L=e=>{h(e),j.current=e,F&&$({agent:F.id,tab:e})},R=async()=>{if(!F||T)return;let e=x.trim();if(e){E(!0),O(null);try{await t(`agent.nudge`,{agentId:F.id,text:e}),b(!1),S(Q)}catch(e){O(o(e))}finally{E(!1)}}};return(0,w.jsxs)(`div`,{className:`ct-page`,"data-testid":`agents-view`,children:[(0,w.jsx)(`header`,{className:`ct-page__head`,children:(0,w.jsxs)(`div`,{className:`ct-page__head-text`,children:[(0,w.jsx)(`h1`,{className:`ct-page__title`,children:`Agents`}),(0,w.jsx)(`p`,{className:`ct-page__sub`,children:`Personas, workspaces, tools and schedules.`})]})}),(0,w.jsxs)(`div`,{className:`ct-agents__layout`,children:[(0,w.jsxs)(g,{className:`ct-agents__sidebar`,title:`Agents`,sub:`${r.length} configured.`,actions:(0,w.jsx)(u,{size:`sm`,disabled:!F,"data-testid":`agents-nudge`,onClick:()=>{S(Q),O(null),b(!0)},children:`Nudge agent`}),children:[n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading agents…`}):null,n.data&&r.length===0?(0,w.jsx)(a,{message:`No agents found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__list`,"data-testid":`agent-list`,children:N(r).map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__group`,children:[e.title?(0,w.jsx)(`h3`,{className:`ct-agents__group-title`,"data-testid":`agent-group-${e.teamId}`,children:e.title}):null,e.agents.map(e=>(0,w.jsx)($e,{agent:e,defaultId:s,active:F?.id===e.id,onSelect:()=>I(e.id)},e.id))]},e.teamId??`__ungrouped`))})]}),F?(0,w.jsx)(Ze,{agent:F,agents:r,defaultId:s,panel:l,onPanelChange:L},F.id):(0,w.jsx)(g,{title:`Select an agent`,sub:`Pick an agent to inspect its workspace and tools.`,children:n.data&&r.length===0?(0,w.jsx)(a,{message:`No agents are configured on this gateway.`}):null})]}),(0,w.jsxs)(d,{open:y,title:`Nudge agent`,onClose:()=>b(!1),width:`sm`,footer:(0,w.jsxs)(`div`,{className:`ct-agents__dialog-actions`,children:[(0,w.jsx)(u,{size:`sm`,onClick:()=>b(!1),children:`Cancel`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:T||!x.trim(),"data-testid":`agents-nudge-send`,onClick:()=>void R(),children:T?`Sending…`:`Send nudge`})]}),children:[(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Message`}),(0,w.jsx)(`textarea`,{"data-testid":`agents-nudge-text`,rows:3,value:x,onChange:e=>S(e.target.value)})]}),D?(0,w.jsx)(`p`,{className:`ct-agents__callout ct-agents__callout--danger`,role:`alert`,children:D}):null]})]})}function $e({agent:e,defaultId:t,active:n,onSelect:r}){let i=I(e),a=ee(e.id,t);return(0,w.jsxs)(`button`,{type:`button`,className:`ct-agents__row${n?` ct-agents__row--active`:``}`,"data-testid":`agent-row-${e.id}`,"aria-current":n?`true`:void 0,onClick:r,children:[(0,w.jsx)(T,{src:z(e,null),emoji:R(e,null),label:i}),(0,w.jsxs)(`span`,{className:`ct-agents__row-info`,children:[(0,w.jsx)(`span`,{className:`ct-agents__row-name`,children:i}),(0,w.jsx)(`span`,{className:`ct-agents__row-id ct-mono`,children:e.id})]}),a?(0,w.jsx)(h,{tone:`accent`,children:a}):null,e.team?.role===`lead`?(0,w.jsx)(h,{tone:`neutral`,children:`lead`}):null,e.userFacing===!1?(0,w.jsx)(h,{tone:`neutral`,children:`internal`}):null]})}export{Qe as default};
|
package/dist/control-ui-v2/assets/{AutomationsView-Bm551KRf.js → AutomationsView-DO0ssbS6.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,c as t,h as n,i as r,l as i,r as a,s as o,t as s}from"./format-DpM2rlEo.js";import{a as c,n as l,o as u}from"./links-Bcw24zqI.js";import{t as d}from"./Button-D5rMawzJ.js";import{t as f}from"./Dialog-Che1C2PS.js";import{n as p,t as m}from"./use-gateway-query-xtY3vmte.js";import{t as h}from"./Badge-sUgH4suZ.js";import{t as g}from"./Panel-DM0JsHgz.js";import{t as _}from"./EntityLink-D6UsLKQR.js";import{t as v}from"./Stat-DQyb-fKe.js";import{t as ee}from"./DataTable-BqqaNmU8.js";import{t as y}from"./FilterPills-CA2lRy0A.js";import{t as b}from"./StatusDot-CRJsKnJw.js";var x=e(n(),1),S=`last`,C={name:``,description:``,agentId:``,sessionKey:``,identity:``,clearAgent:!1,enabled:!0,deleteAfterRun:!0,scheduleKind:`every`,scheduleAt:``,everyAmount:`30`,everyUnit:`minutes`,cronExpr:`0 7 * * *`,cronTz:``,scheduleExact:!1,staggerAmount:``,staggerUnit:`seconds`,jobType:`assistantTask`,sessionTarget:`isolated`,wakeMode:`now`,payloadKind:`agentTurn`,wakeGateKind:`command`,wakeGateCommand:``,wakeGateModel:``,wakeGateProvider:``,wakeGatePrompt:``,wakeGateReason:``,payloadText:``,payloadModel:``,payloadThinking:``,payloadLightContext:!1,deliveryMode:`announce`,deliveryChannel:S,deliveryTo:``,deliveryAccountId:``,deliveryBestEffort:!1,failureAlertMode:`inherit`,failureAlertAfter:`2`,failureAlertCooldownSeconds:`3600`,failureAlertChannel:S,failureAlertTo:``,failureAlertDeliveryMode:`announce`,failureAlertAccountId:``,failureDestinationChannel:`last`,failureDestinationTo:``,failureDestinationAccountId:``,failureDestinationMode:`announce`,timeoutSeconds:``};function w(e,t){let n=Number(e);return Number.isFinite(n)?n:t}function T(e){let t=(e??``).trim();return t&&t.toLowerCase().replaceAll(/[^a-z0-9_-]+/g,`-`).replaceAll(/^-+|-+$/g,``).slice(0,64)||`main`}function E(e,t){return t===`timelineMessage`?{...e,jobType:t,sessionTarget:`main`,payloadKind:`systemEvent`,deliveryMode:`none`,identity:``}:t===`wakeGateCheck`?{...e,jobType:t,sessionTarget:`main`,payloadKind:`wakeGate`,deliveryMode:`none`,identity:``}:{...e,jobType:t,sessionTarget:`isolated`,payloadKind:`agentTurn`}}function D(e){return e.sessionTarget===`main`&&e.payloadKind===`systemEvent`?`timelineMessage`:e.sessionTarget===`main`&&e.payloadKind===`wakeGate`?`wakeGateCheck`:`assistantTask`}function O(e){return e.sessionTarget===`isolated`&&e.payloadKind===`agentTurn`}function te(e){return e.sessionTarget===`isolated`&&e.payloadKind===`agentTurn`}function k(e){return e.deliveryMode!==`announce`||O(e)?e:{...e,deliveryMode:`none`}}function A(e,t={}){let n={};if(e.name.trim()||(n.name=`cron.errors.nameRequired`),e.scheduleKind===`at`){let t=Date.parse(e.scheduleAt);Number.isFinite(t)||(n.scheduleAt=`cron.errors.scheduleAtInvalid`)}else if(e.scheduleKind===`every`)w(e.everyAmount,0)<=0&&(n.everyAmount=`cron.errors.everyAmountInvalid`);else if(e.cronExpr.trim()||(n.cronExpr=`cron.errors.cronExprRequired`),!e.scheduleExact){let t=e.staggerAmount.trim();t&&w(t,0)<=0&&(n.staggerAmount=`cron.errors.staggerAmountInvalid`)}if(e.sessionTarget===`main`){e.payloadKind!==`systemEvent`&&e.payloadKind!==`wakeGate`&&(n.payloadText=`cron.errors.mainJobPayload`);let r=e.clearAgent?``:e.agentId.trim(),i=t.defaultAgentId?.trim()||`main`;r&&T(r)!==T(i)&&!n.payloadText&&(n.agentId=`cron.errors.mainJobAgent`)}else e.payloadKind===`systemEvent`?n.payloadText=`cron.errors.isolatedJobPayload`:e.payloadKind===`wakeGate`&&(n.wakeGateCommand=`cron.errors.isolatedJobPayload`);if(e.payloadKind===`wakeGate`?e.wakeGateKind===`command`&&!e.wakeGateCommand.trim()&&!n.wakeGateCommand&&(n.wakeGateCommand=`cron.errors.systemTextRequired`):!e.payloadText.trim()&&!n.payloadText&&(n.payloadText=e.payloadKind===`systemEvent`?`cron.errors.systemTextRequired`:`cron.errors.agentMessageRequired`),e.payloadKind===`agentTurn`){let t=e.timeoutSeconds.trim();t&&w(t,0)<=0&&(n.timeoutSeconds=`cron.errors.timeoutInvalid`)}if(e.deliveryMode===`webhook`){let t=e.deliveryTo.trim();t?/^https?:\/\//i.test(t)||(n.deliveryTo=`cron.errors.webhookUrlInvalid`):n.deliveryTo=`cron.errors.webhookUrlRequired`}if(e.failureAlertMode===`custom`){let t=e.failureAlertAfter.trim();if(t){let e=w(t,0);(!Number.isFinite(e)||e<=0)&&(n.failureAlertAfter=`cron.errors.failureAlertAfterInvalid`)}let r=e.failureAlertCooldownSeconds.trim();if(r){let e=w(r,-1);(!Number.isFinite(e)||e<0)&&(n.failureAlertCooldownSeconds=`cron.errors.failureAlertCooldownInvalid`)}}return n}function j(e){return Object.keys(e).length>0}function M(e){let t=Date.parse(e);if(!Number.isFinite(t))return``;let n=new Date(t);return`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,`0`)}-${String(n.getDate()).padStart(2,`0`)}T${String(n.getHours()).padStart(2,`0`)}:${String(n.getMinutes()).padStart(2,`0`)}`}function N(e){if(e%864e5==0)return{everyAmount:String(Math.max(1,e/864e5)),everyUnit:`days`};if(e%36e5==0)return{everyAmount:String(Math.max(1,e/36e5)),everyUnit:`hours`};let t=Math.max(1,Math.ceil(e/6e4));return{everyAmount:String(t),everyUnit:`minutes`}}function P(e){return e===0?{scheduleExact:!0,staggerAmount:``,staggerUnit:`seconds`}:typeof e!=`number`||!Number.isFinite(e)||e<0?{scheduleExact:!1,staggerAmount:``,staggerUnit:`seconds`}:e%6e4==0?{scheduleExact:!1,staggerAmount:String(Math.max(1,e/6e4)),staggerUnit:`minutes`}:{scheduleExact:!1,staggerAmount:String(Math.max(1,Math.ceil(e/1e3))),staggerUnit:`seconds`}}function F(e,t){let n=e.failureAlert,r={...t,name:e.name,description:e.description??``,agentId:e.agentId??``,sessionKey:e.sessionKey??``,identity:e.identity??``,clearAgent:!1,enabled:e.enabled,deleteAfterRun:e.deleteAfterRun??!1,scheduleKind:e.schedule.kind,scheduleAt:``,everyAmount:t.everyAmount,everyUnit:t.everyUnit,cronExpr:t.cronExpr,cronTz:``,scheduleExact:!1,staggerAmount:``,staggerUnit:`seconds`,jobType:D({sessionTarget:e.sessionTarget,payloadKind:e.payload.kind}),sessionTarget:e.sessionTarget,wakeMode:e.wakeMode,payloadKind:e.payload.kind,payloadText:e.payload.kind===`systemEvent`?e.payload.text:e.payload.kind===`agentTurn`?e.payload.message:``,payloadModel:e.payload.kind===`agentTurn`?e.payload.model??``:``,payloadThinking:e.payload.kind===`agentTurn`?e.payload.thinking??``:``,payloadLightContext:e.payload.kind===`agentTurn`&&e.payload.lightContext===!0,wakeGateKind:e.payload.kind===`wakeGate`?e.payload.gate.kind:`command`,wakeGateCommand:e.payload.kind===`wakeGate`&&e.payload.gate.kind===`command`?e.payload.gate.command:``,wakeGateModel:e.payload.kind===`wakeGate`&&e.payload.gate.kind===`model`?e.payload.gate.model??``:``,wakeGateProvider:e.payload.kind===`wakeGate`&&e.payload.gate.kind===`model`?e.payload.gate.provider??``:``,wakeGatePrompt:e.payload.kind===`wakeGate`&&e.payload.gate.kind===`model`?e.payload.gate.prompt??``:``,wakeGateReason:e.payload.kind===`wakeGate`?e.payload.reason??``:``,deliveryMode:e.delivery?.mode??`none`,deliveryChannel:e.delivery?.channel??`last`,deliveryTo:e.delivery?.to??``,deliveryAccountId:e.delivery?.accountId??``,deliveryBestEffort:e.delivery?.bestEffort??!1,failureAlertMode:n===!1?`disabled`:n&&typeof n==`object`?`custom`:`inherit`,failureAlertAfter:n&&typeof n==`object`&&typeof n.after==`number`?String(n.after):C.failureAlertAfter,failureAlertCooldownSeconds:n&&typeof n==`object`&&typeof n.cooldownMs==`number`?String(Math.floor(n.cooldownMs/1e3)):C.failureAlertCooldownSeconds,failureAlertChannel:n&&typeof n==`object`?n.channel??`last`:S,failureAlertTo:n&&typeof n==`object`?n.to??``:``,failureAlertDeliveryMode:n&&typeof n==`object`?n.mode??`announce`:`announce`,failureAlertAccountId:n&&typeof n==`object`?n.accountId??``:``,failureDestinationChannel:e.delivery?.failureDestination?.channel??`last`,failureDestinationTo:e.delivery?.failureDestination?.to??``,failureDestinationAccountId:e.delivery?.failureDestination?.accountId??``,failureDestinationMode:e.delivery?.failureDestination?.mode??`announce`,timeoutSeconds:e.payload.kind===`agentTurn`&&typeof e.payload.timeoutSeconds==`number`?String(e.payload.timeoutSeconds):``};if(e.schedule.kind===`at`)r.scheduleAt=M(e.schedule.at);else if(e.schedule.kind===`every`){let t=N(e.schedule.everyMs);r.everyAmount=t.everyAmount,r.everyUnit=t.everyUnit}else{r.cronExpr=e.schedule.expr,r.cronTz=e.schedule.tz??``;let t=P(e.schedule.staggerMs);r.scheduleExact=t.scheduleExact,r.staggerAmount=t.staggerAmount,r.staggerUnit=t.staggerUnit}return k(r)}function I(e){if(e.scheduleKind===`at`){let t=Date.parse(e.scheduleAt);if(!Number.isFinite(t))throw Error(`Enter a valid run time.`);return{kind:`at`,at:new Date(t).toISOString()}}if(e.scheduleKind===`every`){let t=w(e.everyAmount,0);if(t<=0)throw Error(`Interval must be greater than zero.`);let n=e.everyUnit;return{kind:`every`,everyMs:t*(n===`minutes`?6e4:n===`hours`?36e5:864e5)}}let t=e.cronExpr.trim();if(!t)throw Error(`Cron expression is required.`);if(e.scheduleExact)return{kind:`cron`,expr:t,tz:e.cronTz.trim()||void 0,staggerMs:0};let n=e.staggerAmount.trim();if(!n)return{kind:`cron`,expr:t,tz:e.cronTz.trim()||void 0};let r=w(n,0);if(r<=0)throw Error(`Stagger must be greater than zero.`);let i=e.staggerUnit===`minutes`?r*6e4:r*1e3;return{kind:`cron`,expr:t,tz:e.cronTz.trim()||void 0,staggerMs:i}}function ne(e){if(e.payloadKind===`wakeGate`){let t=e.wakeGateReason.trim()||void 0;if(e.wakeGateKind===`command`){let n=e.wakeGateCommand.trim();if(!n)throw Error(`Gate command is required.`);return{kind:`wakeGate`,gate:{kind:`command`,command:n},reason:t}}let n={kind:`model`},r=e.wakeGateModel.trim();r&&(n.model=r);let i=e.wakeGateProvider.trim();i&&(n.provider=i);let a=e.wakeGatePrompt.trim();return a&&(n.prompt=a),{kind:`wakeGate`,gate:n,reason:t}}if(e.payloadKind===`systemEvent`){let t=e.payloadText.trim();if(!t)throw Error(`System event text is required.`);return{kind:`systemEvent`,text:t}}let t=e.payloadText.trim();if(!t)throw Error(`Agent message is required.`);let n={kind:`agentTurn`,message:t},r=e.payloadModel.trim();r&&(n.model=r);let i=e.payloadThinking.trim();i&&(n.thinking=i);let a=w(e.timeoutSeconds,0);return a>0&&(n.timeoutSeconds=a),e.payloadLightContext&&(n.lightContext=!0),n}function L(e){if(e.failureAlertMode===`disabled`)return!1;if(e.failureAlertMode!==`custom`)return;let t=w(e.failureAlertAfter.trim(),0),n=e.failureAlertCooldownSeconds.trim(),r=n.length>0?w(n,0):void 0,i=r!==void 0&&Number.isFinite(r)&&r>=0?Math.floor(r*1e3):void 0,a=e.failureAlertAccountId.trim();return{after:t>0?Math.floor(t):void 0,channel:e.failureAlertChannel.trim()||`last`,to:e.failureAlertTo.trim()||void 0,...i===void 0?{}:{cooldownMs:i},mode:e.failureAlertDeliveryMode,accountId:a||void 0}}function R(e,t={}){let n=k(e),r=t.editingJob??null,i=I(n),a=ne(n);if(a.kind===`agentTurn`){let e=r?.payload.kind===`agentTurn`?r.payload.lightContext:void 0;!n.payloadLightContext&&r&&e!==void 0&&(a.lightContext=!1)}let o=n.deliveryMode,s=n.sessionTarget===`isolated`||o===`webhook`,c=n.failureDestinationTo.trim()||n.failureDestinationAccountId.trim(),l=s&&c?{channel:n.failureDestinationChannel.trim()||void 0,to:n.failureDestinationTo.trim()||void 0,accountId:n.failureDestinationAccountId.trim()||void 0,mode:n.failureDestinationMode}:void 0,u=o&&o!==`none`?{mode:o,channel:o===`announce`?n.deliveryChannel.trim()||`last`:void 0,to:n.deliveryTo.trim()||void 0,accountId:o===`announce`?n.deliveryAccountId.trim():void 0,bestEffort:n.deliveryBestEffort,...l?{failureDestination:l}:{}}:o===`none`?{mode:`none`}:void 0,d=L(n),f=n.clearAgent?null:n.agentId.trim(),p=n.sessionKey.trim()||(r?.sessionKey?null:void 0),m=(te(n)?n.identity.trim():``)||(r?.identity?null:void 0);return{name:n.name.trim(),description:n.description.trim(),agentId:f===null?null:f||void 0,sessionKey:p,identity:m,enabled:n.enabled,deleteAfterRun:n.deleteAfterRun,schedule:i,sessionTarget:n.sessionTarget,wakeMode:n.wakeMode,payload:a,delivery:u,failureAlert:d}}function z(e,t){let n=e.trim()||`Job`,r=`${n} copy`;if(!t.has(r.toLowerCase()))return r;let i=2;for(;i<1e3;){let e=`${n} copy ${i}`;if(!t.has(e.toLowerCase()))return e;i+=1}return`${n} copy ${Date.now()}`}function re(e,t,n){return e.filter(e=>!(t!==`all`&&e.schedule.kind!==t||n!==`all`&&e.state?.lastStatus!==n))}function ie(e){let t=e.schedule;if(t.kind===`at`)return`at ${M(t.at)||t.at}`;if(t.kind===`every`){let e=N(t.everyMs);return`every ${e.everyAmount} ${e.everyUnit}`}let n=t.staggerMs===0,r=typeof t.staggerMs==`number`&&t.staggerMs>0?` (stagger ${Math.round(t.staggerMs/1e3)}s)`:``;return`${t.expr}${t.tz?` (${t.tz})`:``}${n?` (exact)`:r}`}var B={"cron.errors.nameRequired":`Name is required.`,"cron.errors.scheduleAtInvalid":`Enter a valid run time.`,"cron.errors.everyAmountInvalid":`Interval must be greater than zero.`,"cron.errors.cronExprRequired":`Cron expression is required.`,"cron.errors.staggerAmountInvalid":`Stagger must be greater than zero.`,"cron.errors.mainJobPayload":`Main-session jobs need a system event or wake-gate payload.`,"cron.errors.mainJobAgent":`Main-session jobs run on the default agent.`,"cron.errors.isolatedJobPayload":`Isolated jobs need an agent turn payload.`,"cron.errors.systemTextRequired":`System event text is required.`,"cron.errors.agentMessageRequired":`Agent message is required.`,"cron.errors.timeoutInvalid":`Timeout must be greater than zero.`,"cron.errors.webhookUrlRequired":`Webhook URL is required.`,"cron.errors.webhookUrlInvalid":`Webhook URL must start with http:// or https://.`,"cron.errors.failureAlertAfterInvalid":`Alert threshold must be greater than zero.`,"cron.errors.failureAlertCooldownInvalid":`Cooldown cannot be negative.`},ae={timelineMessage:`Timeline message`,assistantTask:`Assistant task`,wakeGateCheck:`Check first, then nudge`},V={ok:`OK`,error:`Error`,skipped:`Skipped`},oe={delivered:`Delivered`,"not-delivered":`Not delivered`,unknown:`Delivery unknown`,"not-requested":`Delivery not requested`},H={ok:`ok`,error:`danger`,skipped:`warn`},se={delivered:`ok`,"not-delivered":`danger`,unknown:`warn`,"not-requested":`neutral`},U={ok:`ok`,error:`danger`,skipped:`warn`};function W(e){return ae[D({sessionTarget:e.sessionTarget,payloadKind:e.payload.kind})]}function G(e){return e?e.clientDisplayName?`${e.clientId}/${e.clientDisplayName}`:e.clientId:null}function K(e){return e.summary??e.error??`No summary.`}function ce(e){return e?typeof e.total_tokens==`number`?`${e.total_tokens} tokens`:typeof e.input_tokens==`number`&&typeof e.output_tokens==`number`?`${e.input_tokens} in / ${e.output_tokens} out`:null:null}var q=t(),le=[{value:`all`,label:`All`},{value:`enabled`,label:`Enabled`},{value:`disabled`,label:`Disabled`}],ue=[{value:`all`,label:`All`},{value:`at`,label:`At`},{value:`every`,label:`Every`},{value:`cron`,label:`Cron`}],de=[{value:`all`,label:`All`},{value:`ok`,label:`OK`},{value:`error`,label:`Error`},{value:`skipped`,label:`Skipped`}],fe={nextRunAtMs:`Next run`,updatedAtMs:`Recently updated`,name:`Name`},pe={query:``,enabled:`all`,kind:`all`,lastStatus:`all`,sortBy:`nextRunAtMs`,sortDir:`asc`};function me(e){let t=e=>e.stopPropagation();return[{key:`name`,label:`Name`,render:e=>(0,q.jsxs)(`div`,{className:`ct-cell-stack`,children:[(0,q.jsx)(`span`,{className:`ct-cell-stack__main`,children:e.name}),e.description?(0,q.jsx)(`span`,{className:`ct-cell-stack__sub`,children:e.description}):null]})},{key:`schedule`,label:`Schedule`,render:ie},{key:`type`,label:`Type`,render:e=>(0,q.jsx)(h,{tone:`neutral`,children:W(e)})},{key:`status`,label:`Status`,render:e=>(0,q.jsxs)(`span`,{className:`ct-cron-state-row`,children:[(0,q.jsx)(h,{tone:e.enabled?`ok`:`neutral`,children:e.enabled?`Enabled`:`Disabled`}),e.state?.lastStatus?(0,q.jsx)(b,{tone:U[e.state.lastStatus],label:`Last run ${V[e.state.lastStatus]}`}):null]})},{key:`last`,label:`Last run`,render:e=>r(e.state?.lastRunAtMs)},{key:`next`,label:`Next run`,render:e=>r(e.state?.nextRunAtMs)},{key:`actions`,label:`Actions`,render:n=>{let r=e.busyId===n.id,i=n.payload.kind===`wakeGate`;return(0,q.jsxs)(`div`,{className:`ct-cron-row-actions`,children:[(0,q.jsx)(d,{size:`sm`,disabled:r,onClick:r=>{t(r),e.onEdit(n)},children:`Edit`}),(0,q.jsx)(d,{size:`sm`,disabled:r,onClick:r=>{t(r),e.onClone(n)},children:`Clone`}),(0,q.jsx)(d,{size:`sm`,disabled:r,title:i?`Evaluates the wake check now; may skip with wake-gate-empty.`:`Ignores the schedule and runs immediately.`,onClick:r=>{t(r),e.onRun(n)},children:r?`Running…`:i?`Test check`:`Run now`}),(0,q.jsx)(d,{size:`sm`,disabled:r,onClick:r=>{t(r),e.onToggle(n,!n.enabled)},children:n.enabled?`Disable`:`Enable`}),(0,q.jsx)(d,{size:`sm`,variant:`danger`,disabled:r,onClick:r=>{t(r),e.onRemove(n)},children:`Delete`})]})}}]}var J=[`off`,`minimal`,`low`,`medium`,`high`];function Y({code:e}){return(0,q.jsx)(`div`,{className:`ct-field-error`,children:B[e]??e})}function X({id:e,label:t,help:n,checked:r,onChange:i}){return(0,q.jsxs)(`div`,{className:`ct-check`,children:[(0,q.jsxs)(`label`,{htmlFor:e,children:[(0,q.jsx)(`input`,{id:e,type:`checkbox`,checked:r,onChange:e=>i(e.target.checked)}),(0,q.jsx)(`span`,{children:t})]}),n?(0,q.jsx)(`div`,{className:`ct-help`,children:n}):null]})}function Z(e,t){return n=>t({...e,...n})}function he({form:e,fieldErrors:t,onFormChange:n}){let r=Z(e,n),i=p(`models.list`,{}),a=e.payloadKind===`agentTurn`,o=e.payloadKind===`wakeGate`,s=(0,x.useMemo)(()=>{let e=(i.data?.models??[]).map(e=>e.id).filter(e=>e.length>0).toSorted((e,t)=>e.localeCompare(t));return Array.from(new Set(e))},[i.data]);return(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Execution`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[e.sessionTarget===`isolated`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-wake-mode`,children:`Wake mode`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-wake-mode`,value:e.wakeMode,onChange:e=>r({wakeMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`now`,children:`Now`}),(0,q.jsx)(`option`,{value:`next-heartbeat`,children:`Next heartbeat`})]})})]}):null,o?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-gate-kind`,children:`Gate type`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-gate-kind`,value:e.wakeGateKind,onChange:e=>r({wakeGateKind:e.target.value}),children:[(0,q.jsx)(`option`,{value:`command`,children:`Command`}),(0,q.jsx)(`option`,{value:`model`,children:`Model`})]})}),e.wakeGateKind===`command`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-gate-command`,children:`Gate command`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`textarea`,{id:`cron-gate-command`,rows:3,value:e.wakeGateCommand,"aria-invalid":t.wakeGateCommand?!0:void 0,onChange:e=>r({wakeGateCommand:e.target.value})}),t.wakeGateCommand?(0,q.jsx)(Y,{code:t.wakeGateCommand}):null]})]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-gate-model`,children:`Gate model`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-gate-model`,value:e.wakeGateModel,onChange:e=>r({wakeGateModel:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-gate-provider`,children:`Gate provider`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-gate-provider`,value:e.wakeGateProvider,onChange:e=>r({wakeGateProvider:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-gate-prompt`,children:`Gate prompt`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`textarea`,{id:`cron-gate-prompt`,rows:3,value:e.wakeGatePrompt,onChange:e=>r({wakeGatePrompt:e.target.value})})})]}),(0,q.jsx)(`label`,{htmlFor:`cron-gate-reason`,children:`Nudge reason`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-gate-reason`,value:e.wakeGateReason,onChange:e=>r({wakeGateReason:e.target.value}),placeholder:`e.g., inbox, calendar, weather`})})]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-payload-text`,children:e.payloadKind===`systemEvent`?`Main timeline message`:`Assistant task prompt`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`textarea`,{id:`cron-payload-text`,rows:4,value:e.payloadText,"aria-invalid":t.payloadText?!0:void 0,onChange:e=>r({payloadText:e.target.value})}),t.payloadText?(0,q.jsx)(Y,{code:t.payloadText}):null]})]}),a?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-payload-model`,children:`Model`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-payload-model`,value:e.payloadModel,list:`cron-model-suggestions`,onChange:e=>r({payloadModel:e.target.value}),placeholder:`Agent default`}),(0,q.jsx)(`datalist`,{id:`cron-model-suggestions`,children:s.map(e=>(0,q.jsx)(`option`,{value:e},e))})]}),(0,q.jsx)(`label`,{htmlFor:`cron-payload-thinking`,children:`Thinking`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-payload-thinking`,value:e.payloadThinking,list:`cron-thinking-suggestions`,onChange:e=>r({payloadThinking:e.target.value}),placeholder:`low`}),(0,q.jsx)(`datalist`,{id:`cron-thinking-suggestions`,children:J.map(e=>(0,q.jsx)(`option`,{value:e},e))})]}),(0,q.jsx)(`label`,{htmlFor:`cron-timeout-seconds`,children:`Timeout (seconds)`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-timeout-seconds`,value:e.timeoutSeconds,"aria-invalid":t.timeoutSeconds?!0:void 0,onChange:e=>r({timeoutSeconds:e.target.value}),placeholder:`Optional, e.g. 90`}),t.timeoutSeconds?(0,q.jsx)(Y,{code:t.timeoutSeconds}):null]}),(0,q.jsx)(X,{id:`cron-light-context`,label:`Use shorter startup context`,checked:e.payloadLightContext,onChange:e=>r({payloadLightContext:e})})]}):null]})]})}function ge({form:e,fieldErrors:t,onFormChange:n}){let r=Z(e,n),i=O(e),a=e.sessionTarget===`isolated`||e.deliveryMode===`webhook`;return(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Delivery`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[(0,q.jsx)(`label`,{htmlFor:`cron-delivery-mode`,children:`Where summaries go`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-delivery-mode`,value:e.deliveryMode,onChange:e=>r({deliveryMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`none`,children:`None (internal)`}),i?(0,q.jsx)(`option`,{value:`announce`,children:`Announce summary`}):null,(0,q.jsx)(`option`,{value:`webhook`,children:`Webhook POST`})]})}),e.deliveryMode===`announce`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-delivery-channel`,children:`Channel`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-delivery-channel`,value:e.deliveryChannel,onChange:e=>r({deliveryChannel:e.target.value}),placeholder:`last`})}),(0,q.jsx)(`label`,{htmlFor:`cron-delivery-account`,children:`Account ID`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-delivery-account`,value:e.deliveryAccountId,onChange:e=>r({deliveryAccountId:e.target.value})})})]}):null,e.deliveryMode===`none`?null:(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-delivery-to`,children:e.deliveryMode===`webhook`?`Webhook URL`:`To`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-delivery-to`,value:e.deliveryTo,"aria-invalid":t.deliveryTo?!0:void 0,onChange:e=>r({deliveryTo:e.target.value}),placeholder:e.deliveryMode===`webhook`?`https://example.com/cron`:`+1555... or chat id`}),t.deliveryTo?(0,q.jsx)(Y,{code:t.deliveryTo}):null]})]}),e.deliveryMode===`announce`?(0,q.jsx)(X,{id:`cron-best-effort`,label:`Best effort delivery`,help:`Do not fail the job if delivery itself fails.`,checked:e.deliveryBestEffort,onChange:e=>r({deliveryBestEffort:e})}):null,a?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-fd-to`,children:`Failure destination to`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-fd-to`,value:e.failureDestinationTo,onChange:e=>r({failureDestinationTo:e.target.value}),placeholder:`Separate recipient for failure notifications`})}),(0,q.jsx)(`label`,{htmlFor:`cron-fd-channel`,children:`Failure destination channel`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-fd-channel`,value:e.failureDestinationChannel,onChange:e=>r({failureDestinationChannel:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-fd-account`,children:`Failure destination account ID`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-fd-account`,value:e.failureDestinationAccountId,onChange:e=>r({failureDestinationAccountId:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-fd-mode`,children:`Failure destination mode`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-fd-mode`,value:e.failureDestinationMode,onChange:e=>r({failureDestinationMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`announce`,children:`Announce (via channel)`}),(0,q.jsx)(`option`,{value:`webhook`,children:`Webhook (HTTP POST)`})]})})]}):null]})]})}function Q({form:e,fieldErrors:t,onFormChange:n}){let r=Z(e,n);return(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Failure alerts`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[(0,q.jsx)(`label`,{htmlFor:`cron-alert-mode`,children:`Alert mode`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-alert-mode`,value:e.failureAlertMode,onChange:e=>r({failureAlertMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`inherit`,children:`Inherit global setting`}),(0,q.jsx)(`option`,{value:`disabled`,children:`Disable for this job`}),(0,q.jsx)(`option`,{value:`custom`,children:`Custom per-job settings`})]})}),e.failureAlertMode===`custom`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-alert-after`,children:`Alert after`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-alert-after`,value:e.failureAlertAfter,"aria-invalid":t.failureAlertAfter?!0:void 0,onChange:e=>r({failureAlertAfter:e.target.value})}),t.failureAlertAfter?(0,q.jsx)(Y,{code:t.failureAlertAfter}):null]}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-cooldown`,children:`Cooldown (seconds)`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-alert-cooldown`,value:e.failureAlertCooldownSeconds,"aria-invalid":t.failureAlertCooldownSeconds?!0:void 0,onChange:e=>r({failureAlertCooldownSeconds:e.target.value})}),t.failureAlertCooldownSeconds?(0,q.jsx)(Y,{code:t.failureAlertCooldownSeconds}):null]}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-channel`,children:`Alert channel`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-alert-channel`,value:e.failureAlertChannel,onChange:e=>r({failureAlertChannel:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-to`,children:`Alert to`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-alert-to`,value:e.failureAlertTo,onChange:e=>r({failureAlertTo:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-account`,children:`Alert account ID`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-alert-account`,value:e.failureAlertAccountId,onChange:e=>r({failureAlertAccountId:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-delivery`,children:`Alert delivery`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-alert-delivery`,value:e.failureAlertDeliveryMode,onChange:e=>r({failureAlertDeliveryMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`announce`,children:`Announce (via channel)`}),(0,q.jsx)(`option`,{value:`webhook`,children:`Webhook (HTTP POST)`})]})})]}):null]})]})}function _e({form:e,fieldErrors:t,busy:n,error:r,editing:i,onFormChange:a,onSubmit:o,onClose:s}){let c=t=>a({...e,...t}),l=te(e);return(0,q.jsxs)(f,{open:!0,title:i?`Edit job`:`New job`,onClose:s,width:`lg`,children:[(0,q.jsxs)(`div`,{className:`ct-cron-form`,children:[(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Basics`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[(0,q.jsx)(`label`,{htmlFor:`cron-name`,children:`Name`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-name`,value:e.name,"aria-invalid":t.name?!0:void 0,onChange:e=>c({name:e.target.value}),placeholder:`Morning brief`}),t.name?(0,q.jsx)(Y,{code:t.name}):null]}),(0,q.jsx)(`label`,{htmlFor:`cron-description`,children:`Description`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-description`,value:e.description,onChange:e=>c({description:e.target.value}),placeholder:`Optional context for this job`})}),(0,q.jsx)(`label`,{htmlFor:`cron-job-type`,children:`Job type`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-job-type`,value:e.jobType,onChange:t=>a(E(e,t.target.value)),children:[(0,q.jsx)(`option`,{value:`assistantTask`,children:`Assistant task`}),(0,q.jsx)(`option`,{value:`timelineMessage`,children:`Timeline message`}),(0,q.jsx)(`option`,{value:`wakeGateCheck`,children:`Check first, then nudge`})]})}),(0,q.jsx)(`label`,{htmlFor:`cron-agent-id`,children:`Agent ID`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-agent-id`,value:e.agentId,disabled:e.clearAgent,"aria-invalid":t.agentId?!0:void 0,onChange:e=>c({agentId:e.target.value}),placeholder:`main or ops`}),t.agentId?(0,q.jsx)(Y,{code:t.agentId}):null]}),(0,q.jsx)(X,{id:`cron-clear-agent`,label:`Use default agent`,checked:e.clearAgent,onChange:e=>c({clearAgent:e})}),l?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-identity`,children:`Attributed user`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-identity`,value:e.identity,onChange:e=>c({identity:e.target.value}),placeholder:`identityLinks key, e.g. YourName`})})]}):null,e.sessionTarget===`isolated`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-session-key`,children:`Agent/session route`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-session-key`,value:e.sessionKey,onChange:e=>c({sessionKey:e.target.value}),placeholder:`Optional routing key`})})]}):null,(0,q.jsx)(X,{id:`cron-enabled`,label:`Enabled`,checked:e.enabled,onChange:e=>c({enabled:e})}),(0,q.jsx)(X,{id:`cron-delete-after-run`,label:`Remove after successful one-shot run`,checked:e.deleteAfterRun,onChange:e=>c({deleteAfterRun:e})})]})]}),(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Schedule`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[(0,q.jsx)(`label`,{htmlFor:`cron-schedule-kind`,children:`Repeats`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-schedule-kind`,value:e.scheduleKind,onChange:e=>c({scheduleKind:e.target.value}),children:[(0,q.jsx)(`option`,{value:`every`,children:`Every`}),(0,q.jsx)(`option`,{value:`at`,children:`At`}),(0,q.jsx)(`option`,{value:`cron`,children:`Cron`})]})}),e.scheduleKind===`at`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-schedule-at`,children:`Run at`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-schedule-at`,type:`datetime-local`,value:e.scheduleAt,"aria-invalid":t.scheduleAt?!0:void 0,onChange:e=>c({scheduleAt:e.target.value})}),t.scheduleAt?(0,q.jsx)(Y,{code:t.scheduleAt}):null]})]}):null,e.scheduleKind===`every`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-every-amount`,children:`Every`}),(0,q.jsxs)(`div`,{className:`ct-cron-inline`,children:[(0,q.jsx)(`input`,{id:`cron-every-amount`,value:e.everyAmount,"aria-invalid":t.everyAmount?!0:void 0,onChange:e=>c({everyAmount:e.target.value}),placeholder:`30`}),(0,q.jsxs)(`select`,{"aria-label":`Every unit`,value:e.everyUnit,onChange:e=>c({everyUnit:e.target.value}),children:[(0,q.jsx)(`option`,{value:`minutes`,children:`Minutes`}),(0,q.jsx)(`option`,{value:`hours`,children:`Hours`}),(0,q.jsx)(`option`,{value:`days`,children:`Days`})]})]}),t.everyAmount?(0,q.jsx)(Y,{code:t.everyAmount}):null]}):null,e.scheduleKind===`cron`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-expr`,children:`Expression`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-expr`,value:e.cronExpr,"aria-invalid":t.cronExpr?!0:void 0,onChange:e=>c({cronExpr:e.target.value}),placeholder:`0 7 * * *`}),t.cronExpr?(0,q.jsx)(Y,{code:t.cronExpr}):null]}),(0,q.jsx)(`label`,{htmlFor:`cron-tz`,children:`Timezone (optional)`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-tz`,value:e.cronTz,onChange:e=>c({cronTz:e.target.value}),placeholder:`America/Los_Angeles`})}),(0,q.jsx)(X,{id:`cron-exact`,label:`Run at the exact scheduled time`,checked:e.scheduleExact,onChange:e=>c({scheduleExact:e})}),(0,q.jsx)(`label`,{htmlFor:`cron-stagger-amount`,children:`Stagger window`}),(0,q.jsxs)(`div`,{className:`ct-cron-inline`,children:[(0,q.jsx)(`input`,{id:`cron-stagger-amount`,value:e.staggerAmount,disabled:e.scheduleExact,"aria-invalid":t.staggerAmount?!0:void 0,onChange:e=>c({staggerAmount:e.target.value}),placeholder:`30`}),(0,q.jsxs)(`select`,{"aria-label":`Stagger unit`,value:e.staggerUnit,disabled:e.scheduleExact,onChange:e=>c({staggerUnit:e.target.value}),children:[(0,q.jsx)(`option`,{value:`seconds`,children:`Seconds`}),(0,q.jsx)(`option`,{value:`minutes`,children:`Minutes`})]})]}),t.staggerAmount?(0,q.jsx)(Y,{code:t.staggerAmount}):null]}):null]})]}),(0,q.jsx)(he,{form:e,fieldErrors:t,onFormChange:a}),(0,q.jsx)(ge,{form:e,fieldErrors:t,onFormChange:a}),(0,q.jsx)(Q,{form:e,fieldErrors:t,onFormChange:a})]}),r?(0,q.jsx)(`div`,{className:`ct-cron-callout`,role:`alert`,children:r}):null,(0,q.jsxs)(`footer`,{className:`ct-cron-actions`,children:[(0,q.jsx)(d,{onClick:s,disabled:n,children:`Close`}),(0,q.jsx)(d,{variant:`primary`,onClick:o,disabled:n,children:n?`Saving…`:i?`Save changes`:`Add job`})]})]})}var $=[{value:`all`,label:`All statuses`},{value:`ok`,label:`OK runs`},{value:`error`,label:`Failed runs`},{value:`skipped`,label:`Skipped runs`}],ve=[{value:`all`,label:`All delivery`},{value:`delivered`,label:`Delivered`},{value:`not-delivered`,label:`Not delivered`},{value:`unknown`,label:`Delivery unknown`},{value:`not-requested`,label:`Not requested`}],ye=[{key:`when`,label:`When`,render:e=>(0,q.jsx)(`span`,{title:new Date(e.ts).toISOString(),children:r(e.ts)})},{key:`job`,label:`Job`,mono:!0,render:e=>e.jobName??e.jobId},{key:`status`,label:`Status`,render:e=>(0,q.jsx)(h,{tone:H[e.status??`skipped`],children:e.status?V[e.status]:`Unknown`})},{key:`delivery`,label:`Delivery`,render:e=>e.deliveryStatus?(0,q.jsx)(h,{tone:se[e.deliveryStatus],children:oe[e.deliveryStatus]}):`—`},{key:`duration`,label:`Duration`,align:`end`,render:e=>a(e.durationMs)},{key:`summary`,label:`Summary`,render:e=>(0,q.jsx)(`span`,{className:`ct-cron-run-summary`,children:K(e)})}];function be({job:e}){let t=e.state??{},n=G(e.createdBy);return(0,q.jsxs)(`div`,{className:`ct-cron-inspect`,"data-testid":`cron-selected-job`,children:[(0,q.jsxs)(`div`,{className:`ct-cron-inspect__main`,children:[(0,q.jsx)(`div`,{className:`ct-cron-inspect__title`,children:e.name}),(0,q.jsxs)(`div`,{className:`ct-cron-inspect__sub`,children:[W(e),` · `,ie(e)]}),(0,q.jsxs)(`div`,{className:`ct-cron-inspect__meta`,children:[e.agentId?(0,q.jsxs)(`span`,{children:[`Agent: `,e.agentId]}):null,e.sessionKey?(0,q.jsx)(_,{to:l.session(e.sessionKey),children:(0,q.jsx)(`span`,{className:`ct-mono`,children:e.sessionKey})}):null,n?(0,q.jsxs)(`span`,{children:[`Created by: `,n]}):null]})]}),(0,q.jsxs)(`dl`,{className:`ct-cron-inspect__state`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:`Status`}),(0,q.jsx)(`dd`,{children:(0,q.jsxs)(`span`,{className:`ct-cron-state-row`,children:[(0,q.jsx)(b,{tone:t.lastStatus?H[t.lastStatus]:`neutral`,label:t.lastStatus?V[t.lastStatus]:`No runs yet`}),t.lastStatus?V[t.lastStatus]:`No runs yet`]})})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:`Next`}),(0,q.jsx)(`dd`,{title:t.nextRunAtMs?new Date(t.nextRunAtMs).toISOString():void 0,children:r(t.nextRunAtMs)})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:`Last`}),(0,q.jsx)(`dd`,{title:t.lastRunAtMs?new Date(t.lastRunAtMs).toISOString():void 0,children:r(t.lastRunAtMs)})]}),t.lastError?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:`Last error`}),(0,q.jsx)(`dd`,{className:`ct-cron-inspect__error`,children:t.lastError})]}):null]})]})}function xe({entry:e}){let t=ce(e.usage);return(0,q.jsxs)(`div`,{className:`ct-cron-run-details`,"data-testid":`cron-run-details`,children:[(0,q.jsxs)(`div`,{className:`ct-cron-run-details__head`,children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__title`,children:K(e)}),(0,q.jsx)(`span`,{className:`ct-muted`,children:new Date(e.ts).toISOString()})]}),e.error?(0,q.jsx)(`div`,{className:`ct-cron-run-details__error`,children:e.error}):null,e.deliveryError?(0,q.jsxs)(`div`,{className:`ct-cron-run-details__error`,children:[`Delivery: `,e.deliveryError]}):null,(0,q.jsxs)(`div`,{className:`ct-cron-run-details__grid`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Run at`}),(0,q.jsx)(`span`,{children:typeof e.runAtMs==`number`?new Date(e.runAtMs).toISOString():`—`})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Duration`}),(0,q.jsx)(`span`,{children:a(e.durationMs)})]}),typeof e.nextRunAtMs==`number`?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Next run`}),(0,q.jsx)(`span`,{children:r(e.nextRunAtMs)})]}):null,e.model?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Model`}),(0,q.jsxs)(`span`,{children:[e.model,e.provider?` (${e.provider})`:``]})]}):null,t?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Usage`}),(0,q.jsx)(`span`,{children:t})]}):null,e.sessionKey?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Session`}),(0,q.jsx)(_,{to:l.session(e.sessionKey),children:(0,q.jsx)(`span`,{className:`ct-mono`,children:e.sessionKey})})]}):null]})]})}function Se({selectedJob:e,entries:t,total:n,hasMore:r,loading:i,error:a,scopeAll:s,statusFilter:c,deliveryFilter:l,query:u,sortDir:f,onScopeChange:p,onStatusFilterChange:m,onDeliveryFilterChange:h,onQueryChange:_,onSortDirChange:v,onLoadMore:b}){let S=e=>`${e.jobId}:${e.ts}`,[C,w]=(0,x.useState)(null);(0,x.useEffect)(()=>{w(null)},[s?`all`:e?.id??`none`]);let T=C===null?null:t.find(e=>S(e)===C)??null;return(0,q.jsxs)(g,{title:`Run history`,sub:s?`All jobs`:e?.name??`Select a job`,testId:`cron-runs`,children:[e?(0,q.jsx)(be,{job:e}):null,(0,q.jsxs)(`div`,{className:`ct-cron-run-filters`,children:[(0,q.jsx)(y,{label:`Run scope`,value:s?`all`:`job`,options:[{value:`all`,label:`All jobs`},{value:`job`,label:`This job`,disabled:e==null}],onChange:e=>p(e===`all`)}),(0,q.jsxs)(`label`,{className:`ct-search`,children:[(0,q.jsx)(`span`,{className:`ct-muted`,children:`Search`}),(0,q.jsx)(`input`,{className:`ct-search__input`,value:u,placeholder:`Search runs`,"aria-label":`Search runs`,onChange:e=>_(e.target.value)})]}),(0,q.jsx)(y,{label:`Run order`,value:f,options:[{value:`desc`,label:`Newest first`},{value:`asc`,label:`Oldest first`}],onChange:v})]}),(0,q.jsxs)(`div`,{className:`ct-cron-run-filters`,children:[(0,q.jsx)(y,{label:`Run status filter`,value:c,options:$,onChange:m}),(0,q.jsx)(y,{label:`Delivery filter`,value:l,options:ve,onChange:h})]}),a?(0,q.jsx)(o,{tone:`error`,message:a}):null,!a&&i&&t.length===0?(0,q.jsx)(o,{tone:`loading`,message:`Loading run history…`}):null,!a&&!i&&t.length===0?(0,q.jsx)(o,{message:`No runs match the current filters.`}):null,t.length>0?(0,q.jsx)(ee,{label:`Run history`,columns:ye,rows:t,rowKey:S,onRowClick:e=>w(S(e)),selectedKey:C}):null,T?(0,q.jsx)(xe,{entry:T}):null,(0,q.jsxs)(`div`,{className:`ct-cron-run-foot`,children:[(0,q.jsxs)(`span`,{className:`ct-muted`,children:[`Showing `,t.length,` of `,n]}),r?(0,q.jsx)(d,{size:`sm`,onClick:b,children:`Load more`}):null]})]})}var Ce=200;function we(e,t,n){let r=i(e=>e.request),[a,o]=(0,x.useState)(null),[c,l]=(0,x.useState)(null),u=(0,x.useRef)(null),d=e!==null&&t.some(t=>t.id===e);return(0,x.useEffect)(()=>{if(!e||n)return;if(d||a?.id===e){l(null);return}if(u.current===e)return;let t=!1;return l(null),(async()=>{for(let n=0;;n+=Ce)try{let i=await r(`cron.list`,{includeDisabled:!0,limit:Ce,offset:n,sortBy:`nextRunAtMs`,sortDir:`asc`});if(t)return;let a=(i.jobs??[]).find(t=>t.id===e);if(a){u.current=e,o(a);return}if(i.hasMore===!1||(i.jobs?.length??0)===0){u.current=e,l(`Job ${e} not found.`);return}}catch(e){t||l(s(e));return}})(),()=>{t=!0}},[e,n,d,a,r]),{job:a,error:c}}function Te(e){let[t,n]=(0,x.useState)(null),[r,i]=(0,x.useState)({}),[a,o]=(0,x.useState)(!1),[l,u]=(0,x.useState)(null),d=(0,x.useRef)(C),{jobParam:f,jobsQueryLoading:p,allJobs:m,deepLinkJob:h,onDeepLinkOpen:g}=e;return(0,x.useEffect)(()=>{if(!f||t||p)return;let e=m.find(e=>e.id===f)??(h?.id===f?h:null);e&&(g(e.id),i({}),u(null),n({mode:`edit`,job:e,form:F(e,d.current)}))},[f,t,p,m,h,g]),{drawer:t,setDrawer:n,drawerErrors:r,setDrawerErrors:i,drawerError:l,setDrawerError:u,drawerBusy:a,submitDrawer:async()=>{if(!t||a)return;let r=A(t.form,{defaultAgentId:e.defaultAgentId});if(i(r),j(r))return;let l=t.mode===`edit`?t.job:null,p=R(t.form,{editingJob:l});o(!0),u(null);try{l?await e.request(`cron.update`,{id:l.id,patch:p}):await e.request(`cron.add`,p),d.current=t.form,n(null),i({}),f!==null&&c(`automations`,{}),e.onSaved()}catch(e){u(s(e))}finally{o(!1)}},closeDrawer:()=>{t&&(d.current=t.form),n(null),i({}),u(null),f!==null&&c(`automations`,{})},openEdit:e=>{i({}),u(null),n({mode:`edit`,job:e,form:F(e,d.current)})},openClone:t=>{let r=new Set;for(let t of e.listJobs)r.add(t.name.trim().toLowerCase());i({}),u(null),n({mode:`create`,job:null,form:{...F(t,d.current),name:z(t.name,r)}})}}}function Ee(e){let t=(0,x.useRef)(e);t.current=e;let[n,r]=(0,x.useState)([]),[i,a]=(0,x.useState)(!1),[o,c]=(0,x.useState)(null),[l,u]=(0,x.useState)(!1),d=(0,x.useRef)(0),f=(0,x.useCallback)(()=>{d.current+=1,r([]),a(!1),c(null),u(!1)},[]);return(0,x.useEffect)(()=>{f()},[e.resetKey,f]),{rows:(0,x.useMemo)(()=>n.flat(),[n]),hasMore:e.baseHasMore&&!i,busy:l,loadMore:async()=>{if(l)return;let e=t.current,n=d.current,i=o??e.baseNextOffset??e.fallbackOffset;u(!0);try{let t=await e.fetchPage({...e.params,offset:i});if(n!==d.current)return;r(e=>[...e,t.rows]),t.hasMore?c(t.nextOffset??i+t.rows.length):(a(!0),c(null))}catch(t){n===d.current&&e.onError(s(t))}finally{n===d.current&&u(!1)}},reset:f}}function De(){let e=u(),t=i(e=>e.request),n=e.params.get(`job`),[a,c]=(0,x.useState)(null),[l,h]=(0,x.useState)(null),[_,b]=(0,x.useState)(null),S=p(`cron.status`,{},{refreshMs:m,invalidateOn:[`cron`]}),w=p(`agents.list`,{}),[T,E]=(0,x.useState)(pe),D=(0,x.useMemo)(()=>({includeDisabled:T.enabled===`all`,limit:50,offset:0,query:T.query.trim()||void 0,enabled:T.enabled,sortBy:T.sortBy,sortDir:T.sortDir}),[T]),O=p(`cron.list`,D,{refreshMs:m,invalidateOn:[`cron`]}),te=JSON.stringify(D),[k,A]=(0,x.useState)(null),j=O.data?.jobs??[],M=Ee({params:D,fetchPage:e=>t(`cron.list`,e).then(e=>({rows:e.jobs??[],hasMore:e.hasMore===!0,nextOffset:e.nextOffset??null})),resetKey:te,baseHasMore:O.data?.hasMore===!0,baseNextOffset:O.data?.nextOffset??null,fallbackOffset:0,onError:h}),N=(0,x.useMemo)(()=>{let e=new Set;return[...j,...M.rows].filter(t=>!e.has(t.id)&&e.add(t.id))},[j,M.rows]),P=we(n,N,O.loading),F=P.job,I=(0,x.useMemo)(()=>(F?[...N,F]:N).find(e=>e.id===k)??null,[N,F,k]),[ne,L]=(0,x.useState)(!0),R=!ne&&I!==null,[z,ie]=(0,x.useState)(``),[B,ae]=(0,x.useState)(`all`),[V,oe]=(0,x.useState)(`all`),[H,se]=(0,x.useState)(`desc`),U=(0,x.useMemo)(()=>({scope:R?`job`:`all`,id:R?I?.id??void 0:void 0,limit:50,offset:0,status:B===`all`?void 0:B,deliveryStatuses:V===`all`?void 0:[V],query:z.trim()||void 0,sortDir:H}),[R,I,B,V,z,H]),W=p(`cron.runs`,U,{refreshMs:m,invalidateOn:[`cron`]}),G=Ee({params:U,fetchPage:e=>t(`cron.runs`,e).then(e=>({rows:e.entries??[],hasMore:e.hasMore===!0,nextOffset:e.nextOffset??null})),resetKey:JSON.stringify(U),baseHasMore:W.data?.hasMore===!0,baseNextOffset:W.data?.nextOffset??null,fallbackOffset:0,onError:h}),K=(0,x.useRef)({status:S,jobsQuery:O,runs:W});K.current={status:S,jobsQuery:O,runs:W};let ce=(0,x.useCallback)(e=>{A(e),L(!1)},[]),J=Te({jobParam:n,jobsQueryLoading:O.loading,allJobs:N,listJobs:j,deepLinkJob:F,defaultAgentId:w.data?.defaultId??null,request:t,onSaved:Q,onDeepLinkOpen:ce}),Y=re(N,T.kind,T.lastStatus),X=O.data?.total??j.length,Z=M.hasMore,he=W.data?.entries??[],ge=(0,x.useMemo)(()=>{let e=new Set,t=[];for(let n of[...he,...G.rows]){let r=`${n.jobId}:${n.ts}`;e.has(r)||(e.add(r),t.push(n))}return t},[he,G.rows]);function Q(){M.reset(),G.reset();let e=K.current;e.status.reload(),e.jobsQuery.reload(),e.runs.reload()}let $=async(e,n,r)=>{c(e),h(null);try{await t(n,r)}catch(e){h(s(e))}finally{c(null),Q()}},ve=async()=>{let e=_;e&&(b(null),J.drawer?.job?.id===e.id&&J.closeDrawer(),await $(e.id,`cron.remove`,{id:e.id}))},ye=e=>{A(e.id),L(!1)},be=me({onEdit:J.openEdit,onClone:J.openClone,onToggle:(e,t)=>void $(e.id,`cron.update`,{id:e.id,patch:{enabled:t}}),onRun:e=>{A(e.id),L(!1),$(e.id,`cron.run`,{id:e.id,mode:`force`})},onRemove:b,busyId:a});return(0,q.jsxs)(`div`,{className:`ct-page`,"data-testid":`automations-view`,children:[(0,q.jsxs)(g,{title:`Automations`,sub:`Scheduled wakeups, agent runs and wake-gate checks.`,testId:`cron-status`,actions:(0,q.jsx)(d,{size:`sm`,onClick:()=>Q(),children:`Refresh`}),children:[(0,q.jsxs)(`div`,{className:`ct-cron-summary`,children:[(0,q.jsx)(v,{label:`Scheduler`,tone:S.data?.enabled?`ok`:`danger`,value:S.data?S.data.enabled?`On`:`Off`:`—`}),(0,q.jsx)(v,{label:`Jobs`,value:S.data?S.data.jobs:`—`}),(0,q.jsx)(v,{label:`Next wake`,value:r(S.data?.nextWakeAtMs??null)})]}),S.error?(0,q.jsx)(o,{tone:`error`,message:S.error}):null,S.loading&&!S.data?(0,q.jsx)(o,{tone:`loading`,message:`Loading scheduler status…`}):null]}),(0,q.jsxs)(g,{title:`Jobs`,sub:`Showing ${Y.length} of ${X}`,testId:`automations-jobs`,actions:(0,q.jsx)(d,{variant:`primary`,size:`sm`,onClick:()=>{J.setDrawerErrors({}),J.setDrawerError(null),J.setDrawer({mode:`create`,job:null,form:{...C}})},children:`New job`}),children:[(0,q.jsxs)(`div`,{className:`ct-cron-filters`,children:[(0,q.jsxs)(`label`,{className:`ct-search`,children:[(0,q.jsx)(`span`,{className:`ct-muted`,children:`Search`}),(0,q.jsx)(`input`,{className:`ct-search__input`,value:T.query,placeholder:`Search jobs`,"aria-label":`Search jobs`,onChange:e=>E(t=>({...t,query:e.target.value}))})]}),(0,q.jsx)(y,{label:`Enabled filter`,value:T.enabled,options:le,onChange:e=>E(t=>({...t,enabled:e}))}),(0,q.jsx)(y,{label:`Schedule kind filter`,value:T.kind,options:ue,onChange:e=>E(t=>({...t,kind:e}))}),(0,q.jsx)(y,{label:`Last status filter`,value:T.lastStatus,options:de,onChange:e=>E(t=>({...t,lastStatus:e}))}),(0,q.jsxs)(`label`,{className:`ct-cron-sort`,children:[(0,q.jsx)(`span`,{className:`ct-muted`,children:`Sort`}),(0,q.jsx)(`select`,{"aria-label":`Sort jobs by`,value:T.sortBy,onChange:e=>E(t=>({...t,sortBy:e.target.value})),children:Object.keys(fe).map(e=>(0,q.jsx)(`option`,{value:e,children:fe[e]},e))})]}),(0,q.jsx)(y,{label:`Sort direction`,value:T.sortDir,options:[{value:`asc`,label:`Ascending`},{value:`desc`,label:`Descending`}],onChange:e=>E(t=>({...t,sortDir:e}))})]}),O.error?(0,q.jsx)(o,{tone:`error`,message:O.error}):null,P.error?(0,q.jsx)(`div`,{className:`ct-cron-callout`,role:`alert`,children:P.error}):null,O.loading&&!O.data?(0,q.jsx)(o,{tone:`loading`,message:`Loading jobs…`}):null,!O.error&&!O.loading&&j.length===0?(0,q.jsx)(o,{message:`No automations configured`,hint:`Create a job to run prompts on a schedule.`}):null,!O.error&&j.length>0&&Y.length===0?(0,q.jsx)(o,{message:`No jobs match the current filters.`}):null,Y.length>0?(0,q.jsx)(ee,{label:`Automations`,columns:be,rows:Y,rowKey:e=>e.id,onRowClick:ye,selectedKey:k}):null,Z?(0,q.jsx)(`div`,{className:`ct-load-more`,children:(0,q.jsx)(d,{size:`sm`,disabled:M.busy||O.loading,onClick:()=>void M.loadMore(),children:M.busy?`Loading…`:`Load more`})}):null,l?(0,q.jsx)(`div`,{className:`ct-cron-callout`,role:`alert`,children:l}):null]}),(0,q.jsx)(Se,{selectedJob:I,entries:ge,total:W.data?.total??ge.length,hasMore:G.hasMore,loading:W.loading,error:W.error,scopeAll:!R,statusFilter:B,deliveryFilter:V,query:z,sortDir:H,onScopeChange:L,onStatusFilterChange:ae,onDeliveryFilterChange:oe,onQueryChange:ie,onSortDirChange:se,onLoadMore:()=>void G.loadMore()}),J.drawer?(0,q.jsx)(_e,{form:J.drawer.form,fieldErrors:J.drawerErrors,busy:J.drawerBusy,error:J.drawerError,editing:J.drawer.mode===`edit`,onFormChange:e=>J.setDrawer(t=>t&&{...t,form:e}),onSubmit:()=>void J.submitDrawer(),onClose:J.closeDrawer}):null,(0,q.jsx)(f,{open:_!==null,title:`Remove job`,width:`sm`,onClose:()=>b(null),footer:(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(d,{onClick:()=>b(null),children:`Cancel`}),(0,q.jsx)(d,{variant:`danger`,onClick:()=>void ve(),children:`Remove`})]}),children:(0,q.jsxs)(`p`,{children:[`Remove `,(0,q.jsx)(`strong`,{children:_?.name}),`? Its schedule and run history stop immediately. This cannot be undone.`]})})]})}export{De as default};
|
|
1
|
+
import{_ as e,c as t,h as n,i as r,l as i,r as a,s as o,t as s}from"./format-BPrfsCHW.js";import{a as c,n as l,o as u}from"./links-vgPLVF05.js";import{t as d}from"./Button-ralPMMNs.js";import{t as f}from"./Dialog-oJKnAIqZ.js";import{n as p,t as m}from"./use-gateway-query-7iLwemQz.js";import{t as h}from"./Badge-me4YM1lq.js";import{t as g}from"./Panel-CqcbBXzJ.js";import{t as _}from"./EntityLink-CMtTP9Dk.js";import{t as v}from"./Stat-BRQhQ01w.js";import{t as ee}from"./DataTable-BbRrWxor.js";import{t as y}from"./FilterPills-C_zBIqFP.js";import{t as b}from"./StatusDot-CjtPcYD9.js";var x=e(n(),1),S=`last`,C={name:``,description:``,agentId:``,sessionKey:``,identity:``,clearAgent:!1,enabled:!0,deleteAfterRun:!0,scheduleKind:`every`,scheduleAt:``,everyAmount:`30`,everyUnit:`minutes`,cronExpr:`0 7 * * *`,cronTz:``,scheduleExact:!1,staggerAmount:``,staggerUnit:`seconds`,jobType:`assistantTask`,sessionTarget:`isolated`,wakeMode:`now`,payloadKind:`agentTurn`,wakeGateKind:`command`,wakeGateCommand:``,wakeGateModel:``,wakeGateProvider:``,wakeGatePrompt:``,wakeGateReason:``,payloadText:``,payloadModel:``,payloadThinking:``,payloadLightContext:!1,deliveryMode:`announce`,deliveryChannel:S,deliveryTo:``,deliveryAccountId:``,deliveryBestEffort:!1,failureAlertMode:`inherit`,failureAlertAfter:`2`,failureAlertCooldownSeconds:`3600`,failureAlertChannel:S,failureAlertTo:``,failureAlertDeliveryMode:`announce`,failureAlertAccountId:``,failureDestinationChannel:`last`,failureDestinationTo:``,failureDestinationAccountId:``,failureDestinationMode:`announce`,timeoutSeconds:``};function w(e,t){let n=Number(e);return Number.isFinite(n)?n:t}function T(e){let t=(e??``).trim();return t&&t.toLowerCase().replaceAll(/[^a-z0-9_-]+/g,`-`).replaceAll(/^-+|-+$/g,``).slice(0,64)||`main`}function E(e,t){return t===`timelineMessage`?{...e,jobType:t,sessionTarget:`main`,payloadKind:`systemEvent`,deliveryMode:`none`,identity:``}:t===`wakeGateCheck`?{...e,jobType:t,sessionTarget:`main`,payloadKind:`wakeGate`,deliveryMode:`none`,identity:``}:{...e,jobType:t,sessionTarget:`isolated`,payloadKind:`agentTurn`}}function D(e){return e.sessionTarget===`main`&&e.payloadKind===`systemEvent`?`timelineMessage`:e.sessionTarget===`main`&&e.payloadKind===`wakeGate`?`wakeGateCheck`:`assistantTask`}function O(e){return e.sessionTarget===`isolated`&&e.payloadKind===`agentTurn`}function te(e){return e.sessionTarget===`isolated`&&e.payloadKind===`agentTurn`}function k(e){return e.deliveryMode!==`announce`||O(e)?e:{...e,deliveryMode:`none`}}function A(e,t={}){let n={};if(e.name.trim()||(n.name=`cron.errors.nameRequired`),e.scheduleKind===`at`){let t=Date.parse(e.scheduleAt);Number.isFinite(t)||(n.scheduleAt=`cron.errors.scheduleAtInvalid`)}else if(e.scheduleKind===`every`)w(e.everyAmount,0)<=0&&(n.everyAmount=`cron.errors.everyAmountInvalid`);else if(e.cronExpr.trim()||(n.cronExpr=`cron.errors.cronExprRequired`),!e.scheduleExact){let t=e.staggerAmount.trim();t&&w(t,0)<=0&&(n.staggerAmount=`cron.errors.staggerAmountInvalid`)}if(e.sessionTarget===`main`){e.payloadKind!==`systemEvent`&&e.payloadKind!==`wakeGate`&&(n.payloadText=`cron.errors.mainJobPayload`);let r=e.clearAgent?``:e.agentId.trim(),i=t.defaultAgentId?.trim()||`main`;r&&T(r)!==T(i)&&!n.payloadText&&(n.agentId=`cron.errors.mainJobAgent`)}else e.payloadKind===`systemEvent`?n.payloadText=`cron.errors.isolatedJobPayload`:e.payloadKind===`wakeGate`&&(n.wakeGateCommand=`cron.errors.isolatedJobPayload`);if(e.payloadKind===`wakeGate`?e.wakeGateKind===`command`&&!e.wakeGateCommand.trim()&&!n.wakeGateCommand&&(n.wakeGateCommand=`cron.errors.systemTextRequired`):!e.payloadText.trim()&&!n.payloadText&&(n.payloadText=e.payloadKind===`systemEvent`?`cron.errors.systemTextRequired`:`cron.errors.agentMessageRequired`),e.payloadKind===`agentTurn`){let t=e.timeoutSeconds.trim();t&&w(t,0)<=0&&(n.timeoutSeconds=`cron.errors.timeoutInvalid`)}if(e.deliveryMode===`webhook`){let t=e.deliveryTo.trim();t?/^https?:\/\//i.test(t)||(n.deliveryTo=`cron.errors.webhookUrlInvalid`):n.deliveryTo=`cron.errors.webhookUrlRequired`}if(e.failureAlertMode===`custom`){let t=e.failureAlertAfter.trim();if(t){let e=w(t,0);(!Number.isFinite(e)||e<=0)&&(n.failureAlertAfter=`cron.errors.failureAlertAfterInvalid`)}let r=e.failureAlertCooldownSeconds.trim();if(r){let e=w(r,-1);(!Number.isFinite(e)||e<0)&&(n.failureAlertCooldownSeconds=`cron.errors.failureAlertCooldownInvalid`)}}return n}function j(e){return Object.keys(e).length>0}function M(e){let t=Date.parse(e);if(!Number.isFinite(t))return``;let n=new Date(t);return`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,`0`)}-${String(n.getDate()).padStart(2,`0`)}T${String(n.getHours()).padStart(2,`0`)}:${String(n.getMinutes()).padStart(2,`0`)}`}function N(e){if(e%864e5==0)return{everyAmount:String(Math.max(1,e/864e5)),everyUnit:`days`};if(e%36e5==0)return{everyAmount:String(Math.max(1,e/36e5)),everyUnit:`hours`};let t=Math.max(1,Math.ceil(e/6e4));return{everyAmount:String(t),everyUnit:`minutes`}}function P(e){return e===0?{scheduleExact:!0,staggerAmount:``,staggerUnit:`seconds`}:typeof e!=`number`||!Number.isFinite(e)||e<0?{scheduleExact:!1,staggerAmount:``,staggerUnit:`seconds`}:e%6e4==0?{scheduleExact:!1,staggerAmount:String(Math.max(1,e/6e4)),staggerUnit:`minutes`}:{scheduleExact:!1,staggerAmount:String(Math.max(1,Math.ceil(e/1e3))),staggerUnit:`seconds`}}function F(e,t){let n=e.failureAlert,r={...t,name:e.name,description:e.description??``,agentId:e.agentId??``,sessionKey:e.sessionKey??``,identity:e.identity??``,clearAgent:!1,enabled:e.enabled,deleteAfterRun:e.deleteAfterRun??!1,scheduleKind:e.schedule.kind,scheduleAt:``,everyAmount:t.everyAmount,everyUnit:t.everyUnit,cronExpr:t.cronExpr,cronTz:``,scheduleExact:!1,staggerAmount:``,staggerUnit:`seconds`,jobType:D({sessionTarget:e.sessionTarget,payloadKind:e.payload.kind}),sessionTarget:e.sessionTarget,wakeMode:e.wakeMode,payloadKind:e.payload.kind,payloadText:e.payload.kind===`systemEvent`?e.payload.text:e.payload.kind===`agentTurn`?e.payload.message:``,payloadModel:e.payload.kind===`agentTurn`?e.payload.model??``:``,payloadThinking:e.payload.kind===`agentTurn`?e.payload.thinking??``:``,payloadLightContext:e.payload.kind===`agentTurn`&&e.payload.lightContext===!0,wakeGateKind:e.payload.kind===`wakeGate`?e.payload.gate.kind:`command`,wakeGateCommand:e.payload.kind===`wakeGate`&&e.payload.gate.kind===`command`?e.payload.gate.command:``,wakeGateModel:e.payload.kind===`wakeGate`&&e.payload.gate.kind===`model`?e.payload.gate.model??``:``,wakeGateProvider:e.payload.kind===`wakeGate`&&e.payload.gate.kind===`model`?e.payload.gate.provider??``:``,wakeGatePrompt:e.payload.kind===`wakeGate`&&e.payload.gate.kind===`model`?e.payload.gate.prompt??``:``,wakeGateReason:e.payload.kind===`wakeGate`?e.payload.reason??``:``,deliveryMode:e.delivery?.mode??`none`,deliveryChannel:e.delivery?.channel??`last`,deliveryTo:e.delivery?.to??``,deliveryAccountId:e.delivery?.accountId??``,deliveryBestEffort:e.delivery?.bestEffort??!1,failureAlertMode:n===!1?`disabled`:n&&typeof n==`object`?`custom`:`inherit`,failureAlertAfter:n&&typeof n==`object`&&typeof n.after==`number`?String(n.after):C.failureAlertAfter,failureAlertCooldownSeconds:n&&typeof n==`object`&&typeof n.cooldownMs==`number`?String(Math.floor(n.cooldownMs/1e3)):C.failureAlertCooldownSeconds,failureAlertChannel:n&&typeof n==`object`?n.channel??`last`:S,failureAlertTo:n&&typeof n==`object`?n.to??``:``,failureAlertDeliveryMode:n&&typeof n==`object`?n.mode??`announce`:`announce`,failureAlertAccountId:n&&typeof n==`object`?n.accountId??``:``,failureDestinationChannel:e.delivery?.failureDestination?.channel??`last`,failureDestinationTo:e.delivery?.failureDestination?.to??``,failureDestinationAccountId:e.delivery?.failureDestination?.accountId??``,failureDestinationMode:e.delivery?.failureDestination?.mode??`announce`,timeoutSeconds:e.payload.kind===`agentTurn`&&typeof e.payload.timeoutSeconds==`number`?String(e.payload.timeoutSeconds):``};if(e.schedule.kind===`at`)r.scheduleAt=M(e.schedule.at);else if(e.schedule.kind===`every`){let t=N(e.schedule.everyMs);r.everyAmount=t.everyAmount,r.everyUnit=t.everyUnit}else{r.cronExpr=e.schedule.expr,r.cronTz=e.schedule.tz??``;let t=P(e.schedule.staggerMs);r.scheduleExact=t.scheduleExact,r.staggerAmount=t.staggerAmount,r.staggerUnit=t.staggerUnit}return k(r)}function I(e){if(e.scheduleKind===`at`){let t=Date.parse(e.scheduleAt);if(!Number.isFinite(t))throw Error(`Enter a valid run time.`);return{kind:`at`,at:new Date(t).toISOString()}}if(e.scheduleKind===`every`){let t=w(e.everyAmount,0);if(t<=0)throw Error(`Interval must be greater than zero.`);let n=e.everyUnit;return{kind:`every`,everyMs:t*(n===`minutes`?6e4:n===`hours`?36e5:864e5)}}let t=e.cronExpr.trim();if(!t)throw Error(`Cron expression is required.`);if(e.scheduleExact)return{kind:`cron`,expr:t,tz:e.cronTz.trim()||void 0,staggerMs:0};let n=e.staggerAmount.trim();if(!n)return{kind:`cron`,expr:t,tz:e.cronTz.trim()||void 0};let r=w(n,0);if(r<=0)throw Error(`Stagger must be greater than zero.`);let i=e.staggerUnit===`minutes`?r*6e4:r*1e3;return{kind:`cron`,expr:t,tz:e.cronTz.trim()||void 0,staggerMs:i}}function ne(e){if(e.payloadKind===`wakeGate`){let t=e.wakeGateReason.trim()||void 0;if(e.wakeGateKind===`command`){let n=e.wakeGateCommand.trim();if(!n)throw Error(`Gate command is required.`);return{kind:`wakeGate`,gate:{kind:`command`,command:n},reason:t}}let n={kind:`model`},r=e.wakeGateModel.trim();r&&(n.model=r);let i=e.wakeGateProvider.trim();i&&(n.provider=i);let a=e.wakeGatePrompt.trim();return a&&(n.prompt=a),{kind:`wakeGate`,gate:n,reason:t}}if(e.payloadKind===`systemEvent`){let t=e.payloadText.trim();if(!t)throw Error(`System event text is required.`);return{kind:`systemEvent`,text:t}}let t=e.payloadText.trim();if(!t)throw Error(`Agent message is required.`);let n={kind:`agentTurn`,message:t},r=e.payloadModel.trim();r&&(n.model=r);let i=e.payloadThinking.trim();i&&(n.thinking=i);let a=w(e.timeoutSeconds,0);return a>0&&(n.timeoutSeconds=a),e.payloadLightContext&&(n.lightContext=!0),n}function L(e){if(e.failureAlertMode===`disabled`)return!1;if(e.failureAlertMode!==`custom`)return;let t=w(e.failureAlertAfter.trim(),0),n=e.failureAlertCooldownSeconds.trim(),r=n.length>0?w(n,0):void 0,i=r!==void 0&&Number.isFinite(r)&&r>=0?Math.floor(r*1e3):void 0,a=e.failureAlertAccountId.trim();return{after:t>0?Math.floor(t):void 0,channel:e.failureAlertChannel.trim()||`last`,to:e.failureAlertTo.trim()||void 0,...i===void 0?{}:{cooldownMs:i},mode:e.failureAlertDeliveryMode,accountId:a||void 0}}function R(e,t={}){let n=k(e),r=t.editingJob??null,i=I(n),a=ne(n);if(a.kind===`agentTurn`){let e=r?.payload.kind===`agentTurn`?r.payload.lightContext:void 0;!n.payloadLightContext&&r&&e!==void 0&&(a.lightContext=!1)}let o=n.deliveryMode,s=n.sessionTarget===`isolated`||o===`webhook`,c=n.failureDestinationTo.trim()||n.failureDestinationAccountId.trim(),l=s&&c?{channel:n.failureDestinationChannel.trim()||void 0,to:n.failureDestinationTo.trim()||void 0,accountId:n.failureDestinationAccountId.trim()||void 0,mode:n.failureDestinationMode}:void 0,u=o&&o!==`none`?{mode:o,channel:o===`announce`?n.deliveryChannel.trim()||`last`:void 0,to:n.deliveryTo.trim()||void 0,accountId:o===`announce`?n.deliveryAccountId.trim():void 0,bestEffort:n.deliveryBestEffort,...l?{failureDestination:l}:{}}:o===`none`?{mode:`none`}:void 0,d=L(n),f=n.clearAgent?null:n.agentId.trim(),p=n.sessionKey.trim()||(r?.sessionKey?null:void 0),m=(te(n)?n.identity.trim():``)||(r?.identity?null:void 0);return{name:n.name.trim(),description:n.description.trim(),agentId:f===null?null:f||void 0,sessionKey:p,identity:m,enabled:n.enabled,deleteAfterRun:n.deleteAfterRun,schedule:i,sessionTarget:n.sessionTarget,wakeMode:n.wakeMode,payload:a,delivery:u,failureAlert:d}}function z(e,t){let n=e.trim()||`Job`,r=`${n} copy`;if(!t.has(r.toLowerCase()))return r;let i=2;for(;i<1e3;){let e=`${n} copy ${i}`;if(!t.has(e.toLowerCase()))return e;i+=1}return`${n} copy ${Date.now()}`}function re(e,t,n){return e.filter(e=>!(t!==`all`&&e.schedule.kind!==t||n!==`all`&&e.state?.lastStatus!==n))}function ie(e){let t=e.schedule;if(t.kind===`at`)return`at ${M(t.at)||t.at}`;if(t.kind===`every`){let e=N(t.everyMs);return`every ${e.everyAmount} ${e.everyUnit}`}let n=t.staggerMs===0,r=typeof t.staggerMs==`number`&&t.staggerMs>0?` (stagger ${Math.round(t.staggerMs/1e3)}s)`:``;return`${t.expr}${t.tz?` (${t.tz})`:``}${n?` (exact)`:r}`}var B={"cron.errors.nameRequired":`Name is required.`,"cron.errors.scheduleAtInvalid":`Enter a valid run time.`,"cron.errors.everyAmountInvalid":`Interval must be greater than zero.`,"cron.errors.cronExprRequired":`Cron expression is required.`,"cron.errors.staggerAmountInvalid":`Stagger must be greater than zero.`,"cron.errors.mainJobPayload":`Main-session jobs need a system event or wake-gate payload.`,"cron.errors.mainJobAgent":`Main-session jobs run on the default agent.`,"cron.errors.isolatedJobPayload":`Isolated jobs need an agent turn payload.`,"cron.errors.systemTextRequired":`System event text is required.`,"cron.errors.agentMessageRequired":`Agent message is required.`,"cron.errors.timeoutInvalid":`Timeout must be greater than zero.`,"cron.errors.webhookUrlRequired":`Webhook URL is required.`,"cron.errors.webhookUrlInvalid":`Webhook URL must start with http:// or https://.`,"cron.errors.failureAlertAfterInvalid":`Alert threshold must be greater than zero.`,"cron.errors.failureAlertCooldownInvalid":`Cooldown cannot be negative.`},ae={timelineMessage:`Timeline message`,assistantTask:`Assistant task`,wakeGateCheck:`Check first, then nudge`},V={ok:`OK`,error:`Error`,skipped:`Skipped`},oe={delivered:`Delivered`,"not-delivered":`Not delivered`,unknown:`Delivery unknown`,"not-requested":`Delivery not requested`},H={ok:`ok`,error:`danger`,skipped:`warn`},se={delivered:`ok`,"not-delivered":`danger`,unknown:`warn`,"not-requested":`neutral`},U={ok:`ok`,error:`danger`,skipped:`warn`};function W(e){return ae[D({sessionTarget:e.sessionTarget,payloadKind:e.payload.kind})]}function G(e){return e?e.clientDisplayName?`${e.clientId}/${e.clientDisplayName}`:e.clientId:null}function K(e){return e.summary??e.error??`No summary.`}function ce(e){return e?typeof e.total_tokens==`number`?`${e.total_tokens} tokens`:typeof e.input_tokens==`number`&&typeof e.output_tokens==`number`?`${e.input_tokens} in / ${e.output_tokens} out`:null:null}var q=t(),le=[{value:`all`,label:`All`},{value:`enabled`,label:`Enabled`},{value:`disabled`,label:`Disabled`}],ue=[{value:`all`,label:`All`},{value:`at`,label:`At`},{value:`every`,label:`Every`},{value:`cron`,label:`Cron`}],de=[{value:`all`,label:`All`},{value:`ok`,label:`OK`},{value:`error`,label:`Error`},{value:`skipped`,label:`Skipped`}],fe={nextRunAtMs:`Next run`,updatedAtMs:`Recently updated`,name:`Name`},pe={query:``,enabled:`all`,kind:`all`,lastStatus:`all`,sortBy:`nextRunAtMs`,sortDir:`asc`};function me(e){let t=e=>e.stopPropagation();return[{key:`name`,label:`Name`,render:e=>(0,q.jsxs)(`div`,{className:`ct-cell-stack`,children:[(0,q.jsx)(`span`,{className:`ct-cell-stack__main`,children:e.name}),e.description?(0,q.jsx)(`span`,{className:`ct-cell-stack__sub`,children:e.description}):null]})},{key:`schedule`,label:`Schedule`,render:ie},{key:`type`,label:`Type`,render:e=>(0,q.jsx)(h,{tone:`neutral`,children:W(e)})},{key:`status`,label:`Status`,render:e=>(0,q.jsxs)(`span`,{className:`ct-cron-state-row`,children:[(0,q.jsx)(h,{tone:e.enabled?`ok`:`neutral`,children:e.enabled?`Enabled`:`Disabled`}),e.state?.lastStatus?(0,q.jsx)(b,{tone:U[e.state.lastStatus],label:`Last run ${V[e.state.lastStatus]}`}):null]})},{key:`last`,label:`Last run`,render:e=>r(e.state?.lastRunAtMs)},{key:`next`,label:`Next run`,render:e=>r(e.state?.nextRunAtMs)},{key:`actions`,label:`Actions`,render:n=>{let r=e.busyId===n.id,i=n.payload.kind===`wakeGate`;return(0,q.jsxs)(`div`,{className:`ct-cron-row-actions`,children:[(0,q.jsx)(d,{size:`sm`,disabled:r,onClick:r=>{t(r),e.onEdit(n)},children:`Edit`}),(0,q.jsx)(d,{size:`sm`,disabled:r,onClick:r=>{t(r),e.onClone(n)},children:`Clone`}),(0,q.jsx)(d,{size:`sm`,disabled:r,title:i?`Evaluates the wake check now; may skip with wake-gate-empty.`:`Ignores the schedule and runs immediately.`,onClick:r=>{t(r),e.onRun(n)},children:r?`Running…`:i?`Test check`:`Run now`}),(0,q.jsx)(d,{size:`sm`,disabled:r,onClick:r=>{t(r),e.onToggle(n,!n.enabled)},children:n.enabled?`Disable`:`Enable`}),(0,q.jsx)(d,{size:`sm`,variant:`danger`,disabled:r,onClick:r=>{t(r),e.onRemove(n)},children:`Delete`})]})}}]}var J=[`off`,`minimal`,`low`,`medium`,`high`];function Y({code:e}){return(0,q.jsx)(`div`,{className:`ct-field-error`,children:B[e]??e})}function X({id:e,label:t,help:n,checked:r,onChange:i}){return(0,q.jsxs)(`div`,{className:`ct-check`,children:[(0,q.jsxs)(`label`,{htmlFor:e,children:[(0,q.jsx)(`input`,{id:e,type:`checkbox`,checked:r,onChange:e=>i(e.target.checked)}),(0,q.jsx)(`span`,{children:t})]}),n?(0,q.jsx)(`div`,{className:`ct-help`,children:n}):null]})}function Z(e,t){return n=>t({...e,...n})}function he({form:e,fieldErrors:t,onFormChange:n}){let r=Z(e,n),i=p(`models.list`,{}),a=e.payloadKind===`agentTurn`,o=e.payloadKind===`wakeGate`,s=(0,x.useMemo)(()=>{let e=(i.data?.models??[]).map(e=>e.id).filter(e=>e.length>0).toSorted((e,t)=>e.localeCompare(t));return Array.from(new Set(e))},[i.data]);return(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Execution`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[e.sessionTarget===`isolated`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-wake-mode`,children:`Wake mode`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-wake-mode`,value:e.wakeMode,onChange:e=>r({wakeMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`now`,children:`Now`}),(0,q.jsx)(`option`,{value:`next-heartbeat`,children:`Next heartbeat`})]})})]}):null,o?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-gate-kind`,children:`Gate type`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-gate-kind`,value:e.wakeGateKind,onChange:e=>r({wakeGateKind:e.target.value}),children:[(0,q.jsx)(`option`,{value:`command`,children:`Command`}),(0,q.jsx)(`option`,{value:`model`,children:`Model`})]})}),e.wakeGateKind===`command`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-gate-command`,children:`Gate command`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`textarea`,{id:`cron-gate-command`,rows:3,value:e.wakeGateCommand,"aria-invalid":t.wakeGateCommand?!0:void 0,onChange:e=>r({wakeGateCommand:e.target.value})}),t.wakeGateCommand?(0,q.jsx)(Y,{code:t.wakeGateCommand}):null]})]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-gate-model`,children:`Gate model`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-gate-model`,value:e.wakeGateModel,onChange:e=>r({wakeGateModel:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-gate-provider`,children:`Gate provider`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-gate-provider`,value:e.wakeGateProvider,onChange:e=>r({wakeGateProvider:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-gate-prompt`,children:`Gate prompt`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`textarea`,{id:`cron-gate-prompt`,rows:3,value:e.wakeGatePrompt,onChange:e=>r({wakeGatePrompt:e.target.value})})})]}),(0,q.jsx)(`label`,{htmlFor:`cron-gate-reason`,children:`Nudge reason`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-gate-reason`,value:e.wakeGateReason,onChange:e=>r({wakeGateReason:e.target.value}),placeholder:`e.g., inbox, calendar, weather`})})]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-payload-text`,children:e.payloadKind===`systemEvent`?`Main timeline message`:`Assistant task prompt`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`textarea`,{id:`cron-payload-text`,rows:4,value:e.payloadText,"aria-invalid":t.payloadText?!0:void 0,onChange:e=>r({payloadText:e.target.value})}),t.payloadText?(0,q.jsx)(Y,{code:t.payloadText}):null]})]}),a?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-payload-model`,children:`Model`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-payload-model`,value:e.payloadModel,list:`cron-model-suggestions`,onChange:e=>r({payloadModel:e.target.value}),placeholder:`Agent default`}),(0,q.jsx)(`datalist`,{id:`cron-model-suggestions`,children:s.map(e=>(0,q.jsx)(`option`,{value:e},e))})]}),(0,q.jsx)(`label`,{htmlFor:`cron-payload-thinking`,children:`Thinking`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-payload-thinking`,value:e.payloadThinking,list:`cron-thinking-suggestions`,onChange:e=>r({payloadThinking:e.target.value}),placeholder:`low`}),(0,q.jsx)(`datalist`,{id:`cron-thinking-suggestions`,children:J.map(e=>(0,q.jsx)(`option`,{value:e},e))})]}),(0,q.jsx)(`label`,{htmlFor:`cron-timeout-seconds`,children:`Timeout (seconds)`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-timeout-seconds`,value:e.timeoutSeconds,"aria-invalid":t.timeoutSeconds?!0:void 0,onChange:e=>r({timeoutSeconds:e.target.value}),placeholder:`Optional, e.g. 90`}),t.timeoutSeconds?(0,q.jsx)(Y,{code:t.timeoutSeconds}):null]}),(0,q.jsx)(X,{id:`cron-light-context`,label:`Use shorter startup context`,checked:e.payloadLightContext,onChange:e=>r({payloadLightContext:e})})]}):null]})]})}function ge({form:e,fieldErrors:t,onFormChange:n}){let r=Z(e,n),i=O(e),a=e.sessionTarget===`isolated`||e.deliveryMode===`webhook`;return(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Delivery`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[(0,q.jsx)(`label`,{htmlFor:`cron-delivery-mode`,children:`Where summaries go`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-delivery-mode`,value:e.deliveryMode,onChange:e=>r({deliveryMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`none`,children:`None (internal)`}),i?(0,q.jsx)(`option`,{value:`announce`,children:`Announce summary`}):null,(0,q.jsx)(`option`,{value:`webhook`,children:`Webhook POST`})]})}),e.deliveryMode===`announce`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-delivery-channel`,children:`Channel`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-delivery-channel`,value:e.deliveryChannel,onChange:e=>r({deliveryChannel:e.target.value}),placeholder:`last`})}),(0,q.jsx)(`label`,{htmlFor:`cron-delivery-account`,children:`Account ID`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-delivery-account`,value:e.deliveryAccountId,onChange:e=>r({deliveryAccountId:e.target.value})})})]}):null,e.deliveryMode===`none`?null:(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-delivery-to`,children:e.deliveryMode===`webhook`?`Webhook URL`:`To`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-delivery-to`,value:e.deliveryTo,"aria-invalid":t.deliveryTo?!0:void 0,onChange:e=>r({deliveryTo:e.target.value}),placeholder:e.deliveryMode===`webhook`?`https://example.com/cron`:`+1555... or chat id`}),t.deliveryTo?(0,q.jsx)(Y,{code:t.deliveryTo}):null]})]}),e.deliveryMode===`announce`?(0,q.jsx)(X,{id:`cron-best-effort`,label:`Best effort delivery`,help:`Do not fail the job if delivery itself fails.`,checked:e.deliveryBestEffort,onChange:e=>r({deliveryBestEffort:e})}):null,a?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-fd-to`,children:`Failure destination to`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-fd-to`,value:e.failureDestinationTo,onChange:e=>r({failureDestinationTo:e.target.value}),placeholder:`Separate recipient for failure notifications`})}),(0,q.jsx)(`label`,{htmlFor:`cron-fd-channel`,children:`Failure destination channel`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-fd-channel`,value:e.failureDestinationChannel,onChange:e=>r({failureDestinationChannel:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-fd-account`,children:`Failure destination account ID`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-fd-account`,value:e.failureDestinationAccountId,onChange:e=>r({failureDestinationAccountId:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-fd-mode`,children:`Failure destination mode`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-fd-mode`,value:e.failureDestinationMode,onChange:e=>r({failureDestinationMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`announce`,children:`Announce (via channel)`}),(0,q.jsx)(`option`,{value:`webhook`,children:`Webhook (HTTP POST)`})]})})]}):null]})]})}function Q({form:e,fieldErrors:t,onFormChange:n}){let r=Z(e,n);return(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Failure alerts`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[(0,q.jsx)(`label`,{htmlFor:`cron-alert-mode`,children:`Alert mode`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-alert-mode`,value:e.failureAlertMode,onChange:e=>r({failureAlertMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`inherit`,children:`Inherit global setting`}),(0,q.jsx)(`option`,{value:`disabled`,children:`Disable for this job`}),(0,q.jsx)(`option`,{value:`custom`,children:`Custom per-job settings`})]})}),e.failureAlertMode===`custom`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-alert-after`,children:`Alert after`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-alert-after`,value:e.failureAlertAfter,"aria-invalid":t.failureAlertAfter?!0:void 0,onChange:e=>r({failureAlertAfter:e.target.value})}),t.failureAlertAfter?(0,q.jsx)(Y,{code:t.failureAlertAfter}):null]}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-cooldown`,children:`Cooldown (seconds)`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-alert-cooldown`,value:e.failureAlertCooldownSeconds,"aria-invalid":t.failureAlertCooldownSeconds?!0:void 0,onChange:e=>r({failureAlertCooldownSeconds:e.target.value})}),t.failureAlertCooldownSeconds?(0,q.jsx)(Y,{code:t.failureAlertCooldownSeconds}):null]}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-channel`,children:`Alert channel`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-alert-channel`,value:e.failureAlertChannel,onChange:e=>r({failureAlertChannel:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-to`,children:`Alert to`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-alert-to`,value:e.failureAlertTo,onChange:e=>r({failureAlertTo:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-account`,children:`Alert account ID`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-alert-account`,value:e.failureAlertAccountId,onChange:e=>r({failureAlertAccountId:e.target.value})})}),(0,q.jsx)(`label`,{htmlFor:`cron-alert-delivery`,children:`Alert delivery`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-alert-delivery`,value:e.failureAlertDeliveryMode,onChange:e=>r({failureAlertDeliveryMode:e.target.value}),children:[(0,q.jsx)(`option`,{value:`announce`,children:`Announce (via channel)`}),(0,q.jsx)(`option`,{value:`webhook`,children:`Webhook (HTTP POST)`})]})})]}):null]})]})}function _e({form:e,fieldErrors:t,busy:n,error:r,editing:i,onFormChange:a,onSubmit:o,onClose:s}){let c=t=>a({...e,...t}),l=te(e);return(0,q.jsxs)(f,{open:!0,title:i?`Edit job`:`New job`,onClose:s,width:`lg`,children:[(0,q.jsxs)(`div`,{className:`ct-cron-form`,children:[(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Basics`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[(0,q.jsx)(`label`,{htmlFor:`cron-name`,children:`Name`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-name`,value:e.name,"aria-invalid":t.name?!0:void 0,onChange:e=>c({name:e.target.value}),placeholder:`Morning brief`}),t.name?(0,q.jsx)(Y,{code:t.name}):null]}),(0,q.jsx)(`label`,{htmlFor:`cron-description`,children:`Description`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-description`,value:e.description,onChange:e=>c({description:e.target.value}),placeholder:`Optional context for this job`})}),(0,q.jsx)(`label`,{htmlFor:`cron-job-type`,children:`Job type`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-job-type`,value:e.jobType,onChange:t=>a(E(e,t.target.value)),children:[(0,q.jsx)(`option`,{value:`assistantTask`,children:`Assistant task`}),(0,q.jsx)(`option`,{value:`timelineMessage`,children:`Timeline message`}),(0,q.jsx)(`option`,{value:`wakeGateCheck`,children:`Check first, then nudge`})]})}),(0,q.jsx)(`label`,{htmlFor:`cron-agent-id`,children:`Agent ID`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-agent-id`,value:e.agentId,disabled:e.clearAgent,"aria-invalid":t.agentId?!0:void 0,onChange:e=>c({agentId:e.target.value}),placeholder:`main or ops`}),t.agentId?(0,q.jsx)(Y,{code:t.agentId}):null]}),(0,q.jsx)(X,{id:`cron-clear-agent`,label:`Use default agent`,checked:e.clearAgent,onChange:e=>c({clearAgent:e})}),l?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-identity`,children:`Attributed user`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-identity`,value:e.identity,onChange:e=>c({identity:e.target.value}),placeholder:`identityLinks key, e.g. YourName`})})]}):null,e.sessionTarget===`isolated`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-session-key`,children:`Agent/session route`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-session-key`,value:e.sessionKey,onChange:e=>c({sessionKey:e.target.value}),placeholder:`Optional routing key`})})]}):null,(0,q.jsx)(X,{id:`cron-enabled`,label:`Enabled`,checked:e.enabled,onChange:e=>c({enabled:e})}),(0,q.jsx)(X,{id:`cron-delete-after-run`,label:`Remove after successful one-shot run`,checked:e.deleteAfterRun,onChange:e=>c({deleteAfterRun:e})})]})]}),(0,q.jsxs)(`section`,{className:`ct-cron-section`,children:[(0,q.jsx)(`h3`,{children:`Schedule`}),(0,q.jsxs)(`div`,{className:`ct-cron-grid`,children:[(0,q.jsx)(`label`,{htmlFor:`cron-schedule-kind`,children:`Repeats`}),(0,q.jsx)(`div`,{children:(0,q.jsxs)(`select`,{id:`cron-schedule-kind`,value:e.scheduleKind,onChange:e=>c({scheduleKind:e.target.value}),children:[(0,q.jsx)(`option`,{value:`every`,children:`Every`}),(0,q.jsx)(`option`,{value:`at`,children:`At`}),(0,q.jsx)(`option`,{value:`cron`,children:`Cron`})]})}),e.scheduleKind===`at`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-schedule-at`,children:`Run at`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-schedule-at`,type:`datetime-local`,value:e.scheduleAt,"aria-invalid":t.scheduleAt?!0:void 0,onChange:e=>c({scheduleAt:e.target.value})}),t.scheduleAt?(0,q.jsx)(Y,{code:t.scheduleAt}):null]})]}):null,e.scheduleKind===`every`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-every-amount`,children:`Every`}),(0,q.jsxs)(`div`,{className:`ct-cron-inline`,children:[(0,q.jsx)(`input`,{id:`cron-every-amount`,value:e.everyAmount,"aria-invalid":t.everyAmount?!0:void 0,onChange:e=>c({everyAmount:e.target.value}),placeholder:`30`}),(0,q.jsxs)(`select`,{"aria-label":`Every unit`,value:e.everyUnit,onChange:e=>c({everyUnit:e.target.value}),children:[(0,q.jsx)(`option`,{value:`minutes`,children:`Minutes`}),(0,q.jsx)(`option`,{value:`hours`,children:`Hours`}),(0,q.jsx)(`option`,{value:`days`,children:`Days`})]})]}),t.everyAmount?(0,q.jsx)(Y,{code:t.everyAmount}):null]}):null,e.scheduleKind===`cron`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`label`,{htmlFor:`cron-expr`,children:`Expression`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`input`,{id:`cron-expr`,value:e.cronExpr,"aria-invalid":t.cronExpr?!0:void 0,onChange:e=>c({cronExpr:e.target.value}),placeholder:`0 7 * * *`}),t.cronExpr?(0,q.jsx)(Y,{code:t.cronExpr}):null]}),(0,q.jsx)(`label`,{htmlFor:`cron-tz`,children:`Timezone (optional)`}),(0,q.jsx)(`div`,{children:(0,q.jsx)(`input`,{id:`cron-tz`,value:e.cronTz,onChange:e=>c({cronTz:e.target.value}),placeholder:`America/Los_Angeles`})}),(0,q.jsx)(X,{id:`cron-exact`,label:`Run at the exact scheduled time`,checked:e.scheduleExact,onChange:e=>c({scheduleExact:e})}),(0,q.jsx)(`label`,{htmlFor:`cron-stagger-amount`,children:`Stagger window`}),(0,q.jsxs)(`div`,{className:`ct-cron-inline`,children:[(0,q.jsx)(`input`,{id:`cron-stagger-amount`,value:e.staggerAmount,disabled:e.scheduleExact,"aria-invalid":t.staggerAmount?!0:void 0,onChange:e=>c({staggerAmount:e.target.value}),placeholder:`30`}),(0,q.jsxs)(`select`,{"aria-label":`Stagger unit`,value:e.staggerUnit,disabled:e.scheduleExact,onChange:e=>c({staggerUnit:e.target.value}),children:[(0,q.jsx)(`option`,{value:`seconds`,children:`Seconds`}),(0,q.jsx)(`option`,{value:`minutes`,children:`Minutes`})]})]}),t.staggerAmount?(0,q.jsx)(Y,{code:t.staggerAmount}):null]}):null]})]}),(0,q.jsx)(he,{form:e,fieldErrors:t,onFormChange:a}),(0,q.jsx)(ge,{form:e,fieldErrors:t,onFormChange:a}),(0,q.jsx)(Q,{form:e,fieldErrors:t,onFormChange:a})]}),r?(0,q.jsx)(`div`,{className:`ct-cron-callout`,role:`alert`,children:r}):null,(0,q.jsxs)(`footer`,{className:`ct-cron-actions`,children:[(0,q.jsx)(d,{onClick:s,disabled:n,children:`Close`}),(0,q.jsx)(d,{variant:`primary`,onClick:o,disabled:n,children:n?`Saving…`:i?`Save changes`:`Add job`})]})]})}var $=[{value:`all`,label:`All statuses`},{value:`ok`,label:`OK runs`},{value:`error`,label:`Failed runs`},{value:`skipped`,label:`Skipped runs`}],ve=[{value:`all`,label:`All delivery`},{value:`delivered`,label:`Delivered`},{value:`not-delivered`,label:`Not delivered`},{value:`unknown`,label:`Delivery unknown`},{value:`not-requested`,label:`Not requested`}],ye=[{key:`when`,label:`When`,render:e=>(0,q.jsx)(`span`,{title:new Date(e.ts).toISOString(),children:r(e.ts)})},{key:`job`,label:`Job`,mono:!0,render:e=>e.jobName??e.jobId},{key:`status`,label:`Status`,render:e=>(0,q.jsx)(h,{tone:H[e.status??`skipped`],children:e.status?V[e.status]:`Unknown`})},{key:`delivery`,label:`Delivery`,render:e=>e.deliveryStatus?(0,q.jsx)(h,{tone:se[e.deliveryStatus],children:oe[e.deliveryStatus]}):`—`},{key:`duration`,label:`Duration`,align:`end`,render:e=>a(e.durationMs)},{key:`summary`,label:`Summary`,render:e=>(0,q.jsx)(`span`,{className:`ct-cron-run-summary`,children:K(e)})}];function be({job:e}){let t=e.state??{},n=G(e.createdBy);return(0,q.jsxs)(`div`,{className:`ct-cron-inspect`,"data-testid":`cron-selected-job`,children:[(0,q.jsxs)(`div`,{className:`ct-cron-inspect__main`,children:[(0,q.jsx)(`div`,{className:`ct-cron-inspect__title`,children:e.name}),(0,q.jsxs)(`div`,{className:`ct-cron-inspect__sub`,children:[W(e),` · `,ie(e)]}),(0,q.jsxs)(`div`,{className:`ct-cron-inspect__meta`,children:[e.agentId?(0,q.jsxs)(`span`,{children:[`Agent: `,e.agentId]}):null,e.sessionKey?(0,q.jsx)(_,{to:l.session(e.sessionKey),children:(0,q.jsx)(`span`,{className:`ct-mono`,children:e.sessionKey})}):null,n?(0,q.jsxs)(`span`,{children:[`Created by: `,n]}):null]})]}),(0,q.jsxs)(`dl`,{className:`ct-cron-inspect__state`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:`Status`}),(0,q.jsx)(`dd`,{children:(0,q.jsxs)(`span`,{className:`ct-cron-state-row`,children:[(0,q.jsx)(b,{tone:t.lastStatus?H[t.lastStatus]:`neutral`,label:t.lastStatus?V[t.lastStatus]:`No runs yet`}),t.lastStatus?V[t.lastStatus]:`No runs yet`]})})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:`Next`}),(0,q.jsx)(`dd`,{title:t.nextRunAtMs?new Date(t.nextRunAtMs).toISOString():void 0,children:r(t.nextRunAtMs)})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:`Last`}),(0,q.jsx)(`dd`,{title:t.lastRunAtMs?new Date(t.lastRunAtMs).toISOString():void 0,children:r(t.lastRunAtMs)})]}),t.lastError?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`dt`,{children:`Last error`}),(0,q.jsx)(`dd`,{className:`ct-cron-inspect__error`,children:t.lastError})]}):null]})]})}function xe({entry:e}){let t=ce(e.usage);return(0,q.jsxs)(`div`,{className:`ct-cron-run-details`,"data-testid":`cron-run-details`,children:[(0,q.jsxs)(`div`,{className:`ct-cron-run-details__head`,children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__title`,children:K(e)}),(0,q.jsx)(`span`,{className:`ct-muted`,children:new Date(e.ts).toISOString()})]}),e.error?(0,q.jsx)(`div`,{className:`ct-cron-run-details__error`,children:e.error}):null,e.deliveryError?(0,q.jsxs)(`div`,{className:`ct-cron-run-details__error`,children:[`Delivery: `,e.deliveryError]}):null,(0,q.jsxs)(`div`,{className:`ct-cron-run-details__grid`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Run at`}),(0,q.jsx)(`span`,{children:typeof e.runAtMs==`number`?new Date(e.runAtMs).toISOString():`—`})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Duration`}),(0,q.jsx)(`span`,{children:a(e.durationMs)})]}),typeof e.nextRunAtMs==`number`?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Next run`}),(0,q.jsx)(`span`,{children:r(e.nextRunAtMs)})]}):null,e.model?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Model`}),(0,q.jsxs)(`span`,{children:[e.model,e.provider?` (${e.provider})`:``]})]}):null,t?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Usage`}),(0,q.jsx)(`span`,{children:t})]}):null,e.sessionKey?(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`ct-cron-run-details__key`,children:`Session`}),(0,q.jsx)(_,{to:l.session(e.sessionKey),children:(0,q.jsx)(`span`,{className:`ct-mono`,children:e.sessionKey})})]}):null]})]})}function Se({selectedJob:e,entries:t,total:n,hasMore:r,loading:i,error:a,scopeAll:s,statusFilter:c,deliveryFilter:l,query:u,sortDir:f,onScopeChange:p,onStatusFilterChange:m,onDeliveryFilterChange:h,onQueryChange:_,onSortDirChange:v,onLoadMore:b}){let S=e=>`${e.jobId}:${e.ts}`,[C,w]=(0,x.useState)(null);(0,x.useEffect)(()=>{w(null)},[s?`all`:e?.id??`none`]);let T=C===null?null:t.find(e=>S(e)===C)??null;return(0,q.jsxs)(g,{title:`Run history`,sub:s?`All jobs`:e?.name??`Select a job`,testId:`cron-runs`,children:[e?(0,q.jsx)(be,{job:e}):null,(0,q.jsxs)(`div`,{className:`ct-cron-run-filters`,children:[(0,q.jsx)(y,{label:`Run scope`,value:s?`all`:`job`,options:[{value:`all`,label:`All jobs`},{value:`job`,label:`This job`,disabled:e==null}],onChange:e=>p(e===`all`)}),(0,q.jsxs)(`label`,{className:`ct-search`,children:[(0,q.jsx)(`span`,{className:`ct-muted`,children:`Search`}),(0,q.jsx)(`input`,{className:`ct-search__input`,value:u,placeholder:`Search runs`,"aria-label":`Search runs`,onChange:e=>_(e.target.value)})]}),(0,q.jsx)(y,{label:`Run order`,value:f,options:[{value:`desc`,label:`Newest first`},{value:`asc`,label:`Oldest first`}],onChange:v})]}),(0,q.jsxs)(`div`,{className:`ct-cron-run-filters`,children:[(0,q.jsx)(y,{label:`Run status filter`,value:c,options:$,onChange:m}),(0,q.jsx)(y,{label:`Delivery filter`,value:l,options:ve,onChange:h})]}),a?(0,q.jsx)(o,{tone:`error`,message:a}):null,!a&&i&&t.length===0?(0,q.jsx)(o,{tone:`loading`,message:`Loading run history…`}):null,!a&&!i&&t.length===0?(0,q.jsx)(o,{message:`No runs match the current filters.`}):null,t.length>0?(0,q.jsx)(ee,{label:`Run history`,columns:ye,rows:t,rowKey:S,onRowClick:e=>w(S(e)),selectedKey:C}):null,T?(0,q.jsx)(xe,{entry:T}):null,(0,q.jsxs)(`div`,{className:`ct-cron-run-foot`,children:[(0,q.jsxs)(`span`,{className:`ct-muted`,children:[`Showing `,t.length,` of `,n]}),r?(0,q.jsx)(d,{size:`sm`,onClick:b,children:`Load more`}):null]})]})}var Ce=200;function we(e,t,n){let r=i(e=>e.request),[a,o]=(0,x.useState)(null),[c,l]=(0,x.useState)(null),u=(0,x.useRef)(null),d=e!==null&&t.some(t=>t.id===e);return(0,x.useEffect)(()=>{if(!e||n)return;if(d||a?.id===e){l(null);return}if(u.current===e)return;let t=!1;return l(null),(async()=>{for(let n=0;;n+=Ce)try{let i=await r(`cron.list`,{includeDisabled:!0,limit:Ce,offset:n,sortBy:`nextRunAtMs`,sortDir:`asc`});if(t)return;let a=(i.jobs??[]).find(t=>t.id===e);if(a){u.current=e,o(a);return}if(i.hasMore===!1||(i.jobs?.length??0)===0){u.current=e,l(`Job ${e} not found.`);return}}catch(e){t||l(s(e));return}})(),()=>{t=!0}},[e,n,d,a,r]),{job:a,error:c}}function Te(e){let[t,n]=(0,x.useState)(null),[r,i]=(0,x.useState)({}),[a,o]=(0,x.useState)(!1),[l,u]=(0,x.useState)(null),d=(0,x.useRef)(C),{jobParam:f,jobsQueryLoading:p,allJobs:m,deepLinkJob:h,onDeepLinkOpen:g}=e;return(0,x.useEffect)(()=>{if(!f||t||p)return;let e=m.find(e=>e.id===f)??(h?.id===f?h:null);e&&(g(e.id),i({}),u(null),n({mode:`edit`,job:e,form:F(e,d.current)}))},[f,t,p,m,h,g]),{drawer:t,setDrawer:n,drawerErrors:r,setDrawerErrors:i,drawerError:l,setDrawerError:u,drawerBusy:a,submitDrawer:async()=>{if(!t||a)return;let r=A(t.form,{defaultAgentId:e.defaultAgentId});if(i(r),j(r))return;let l=t.mode===`edit`?t.job:null,p=R(t.form,{editingJob:l});o(!0),u(null);try{l?await e.request(`cron.update`,{id:l.id,patch:p}):await e.request(`cron.add`,p),d.current=t.form,n(null),i({}),f!==null&&c(`automations`,{}),e.onSaved()}catch(e){u(s(e))}finally{o(!1)}},closeDrawer:()=>{t&&(d.current=t.form),n(null),i({}),u(null),f!==null&&c(`automations`,{})},openEdit:e=>{i({}),u(null),n({mode:`edit`,job:e,form:F(e,d.current)})},openClone:t=>{let r=new Set;for(let t of e.listJobs)r.add(t.name.trim().toLowerCase());i({}),u(null),n({mode:`create`,job:null,form:{...F(t,d.current),name:z(t.name,r)}})}}}function Ee(e){let t=(0,x.useRef)(e);t.current=e;let[n,r]=(0,x.useState)([]),[i,a]=(0,x.useState)(!1),[o,c]=(0,x.useState)(null),[l,u]=(0,x.useState)(!1),d=(0,x.useRef)(0),f=(0,x.useCallback)(()=>{d.current+=1,r([]),a(!1),c(null),u(!1)},[]);return(0,x.useEffect)(()=>{f()},[e.resetKey,f]),{rows:(0,x.useMemo)(()=>n.flat(),[n]),hasMore:e.baseHasMore&&!i,busy:l,loadMore:async()=>{if(l)return;let e=t.current,n=d.current,i=o??e.baseNextOffset??e.fallbackOffset;u(!0);try{let t=await e.fetchPage({...e.params,offset:i});if(n!==d.current)return;r(e=>[...e,t.rows]),t.hasMore?c(t.nextOffset??i+t.rows.length):(a(!0),c(null))}catch(t){n===d.current&&e.onError(s(t))}finally{n===d.current&&u(!1)}},reset:f}}function De(){let e=u(),t=i(e=>e.request),n=e.params.get(`job`),[a,c]=(0,x.useState)(null),[l,h]=(0,x.useState)(null),[_,b]=(0,x.useState)(null),S=p(`cron.status`,{},{refreshMs:m,invalidateOn:[`cron`]}),w=p(`agents.list`,{}),[T,E]=(0,x.useState)(pe),D=(0,x.useMemo)(()=>({includeDisabled:T.enabled===`all`,limit:50,offset:0,query:T.query.trim()||void 0,enabled:T.enabled,sortBy:T.sortBy,sortDir:T.sortDir}),[T]),O=p(`cron.list`,D,{refreshMs:m,invalidateOn:[`cron`]}),te=JSON.stringify(D),[k,A]=(0,x.useState)(null),j=O.data?.jobs??[],M=Ee({params:D,fetchPage:e=>t(`cron.list`,e).then(e=>({rows:e.jobs??[],hasMore:e.hasMore===!0,nextOffset:e.nextOffset??null})),resetKey:te,baseHasMore:O.data?.hasMore===!0,baseNextOffset:O.data?.nextOffset??null,fallbackOffset:0,onError:h}),N=(0,x.useMemo)(()=>{let e=new Set;return[...j,...M.rows].filter(t=>!e.has(t.id)&&e.add(t.id))},[j,M.rows]),P=we(n,N,O.loading),F=P.job,I=(0,x.useMemo)(()=>(F?[...N,F]:N).find(e=>e.id===k)??null,[N,F,k]),[ne,L]=(0,x.useState)(!0),R=!ne&&I!==null,[z,ie]=(0,x.useState)(``),[B,ae]=(0,x.useState)(`all`),[V,oe]=(0,x.useState)(`all`),[H,se]=(0,x.useState)(`desc`),U=(0,x.useMemo)(()=>({scope:R?`job`:`all`,id:R?I?.id??void 0:void 0,limit:50,offset:0,status:B===`all`?void 0:B,deliveryStatuses:V===`all`?void 0:[V],query:z.trim()||void 0,sortDir:H}),[R,I,B,V,z,H]),W=p(`cron.runs`,U,{refreshMs:m,invalidateOn:[`cron`]}),G=Ee({params:U,fetchPage:e=>t(`cron.runs`,e).then(e=>({rows:e.entries??[],hasMore:e.hasMore===!0,nextOffset:e.nextOffset??null})),resetKey:JSON.stringify(U),baseHasMore:W.data?.hasMore===!0,baseNextOffset:W.data?.nextOffset??null,fallbackOffset:0,onError:h}),K=(0,x.useRef)({status:S,jobsQuery:O,runs:W});K.current={status:S,jobsQuery:O,runs:W};let ce=(0,x.useCallback)(e=>{A(e),L(!1)},[]),J=Te({jobParam:n,jobsQueryLoading:O.loading,allJobs:N,listJobs:j,deepLinkJob:F,defaultAgentId:w.data?.defaultId??null,request:t,onSaved:Q,onDeepLinkOpen:ce}),Y=re(N,T.kind,T.lastStatus),X=O.data?.total??j.length,Z=M.hasMore,he=W.data?.entries??[],ge=(0,x.useMemo)(()=>{let e=new Set,t=[];for(let n of[...he,...G.rows]){let r=`${n.jobId}:${n.ts}`;e.has(r)||(e.add(r),t.push(n))}return t},[he,G.rows]);function Q(){M.reset(),G.reset();let e=K.current;e.status.reload(),e.jobsQuery.reload(),e.runs.reload()}let $=async(e,n,r)=>{c(e),h(null);try{await t(n,r)}catch(e){h(s(e))}finally{c(null),Q()}},ve=async()=>{let e=_;e&&(b(null),J.drawer?.job?.id===e.id&&J.closeDrawer(),await $(e.id,`cron.remove`,{id:e.id}))},ye=e=>{A(e.id),L(!1)},be=me({onEdit:J.openEdit,onClone:J.openClone,onToggle:(e,t)=>void $(e.id,`cron.update`,{id:e.id,patch:{enabled:t}}),onRun:e=>{A(e.id),L(!1),$(e.id,`cron.run`,{id:e.id,mode:`force`})},onRemove:b,busyId:a});return(0,q.jsxs)(`div`,{className:`ct-page`,"data-testid":`automations-view`,children:[(0,q.jsxs)(g,{title:`Automations`,sub:`Scheduled wakeups, agent runs and wake-gate checks.`,testId:`cron-status`,actions:(0,q.jsx)(d,{size:`sm`,onClick:()=>Q(),children:`Refresh`}),children:[(0,q.jsxs)(`div`,{className:`ct-cron-summary`,children:[(0,q.jsx)(v,{label:`Scheduler`,tone:S.data?.enabled?`ok`:`danger`,value:S.data?S.data.enabled?`On`:`Off`:`—`}),(0,q.jsx)(v,{label:`Jobs`,value:S.data?S.data.jobs:`—`}),(0,q.jsx)(v,{label:`Next wake`,value:r(S.data?.nextWakeAtMs??null)})]}),S.error?(0,q.jsx)(o,{tone:`error`,message:S.error}):null,S.loading&&!S.data?(0,q.jsx)(o,{tone:`loading`,message:`Loading scheduler status…`}):null]}),(0,q.jsxs)(g,{title:`Jobs`,sub:`Showing ${Y.length} of ${X}`,testId:`automations-jobs`,actions:(0,q.jsx)(d,{variant:`primary`,size:`sm`,onClick:()=>{J.setDrawerErrors({}),J.setDrawerError(null),J.setDrawer({mode:`create`,job:null,form:{...C}})},children:`New job`}),children:[(0,q.jsxs)(`div`,{className:`ct-cron-filters`,children:[(0,q.jsxs)(`label`,{className:`ct-search`,children:[(0,q.jsx)(`span`,{className:`ct-muted`,children:`Search`}),(0,q.jsx)(`input`,{className:`ct-search__input`,value:T.query,placeholder:`Search jobs`,"aria-label":`Search jobs`,onChange:e=>E(t=>({...t,query:e.target.value}))})]}),(0,q.jsx)(y,{label:`Enabled filter`,value:T.enabled,options:le,onChange:e=>E(t=>({...t,enabled:e}))}),(0,q.jsx)(y,{label:`Schedule kind filter`,value:T.kind,options:ue,onChange:e=>E(t=>({...t,kind:e}))}),(0,q.jsx)(y,{label:`Last status filter`,value:T.lastStatus,options:de,onChange:e=>E(t=>({...t,lastStatus:e}))}),(0,q.jsxs)(`label`,{className:`ct-cron-sort`,children:[(0,q.jsx)(`span`,{className:`ct-muted`,children:`Sort`}),(0,q.jsx)(`select`,{"aria-label":`Sort jobs by`,value:T.sortBy,onChange:e=>E(t=>({...t,sortBy:e.target.value})),children:Object.keys(fe).map(e=>(0,q.jsx)(`option`,{value:e,children:fe[e]},e))})]}),(0,q.jsx)(y,{label:`Sort direction`,value:T.sortDir,options:[{value:`asc`,label:`Ascending`},{value:`desc`,label:`Descending`}],onChange:e=>E(t=>({...t,sortDir:e}))})]}),O.error?(0,q.jsx)(o,{tone:`error`,message:O.error}):null,P.error?(0,q.jsx)(`div`,{className:`ct-cron-callout`,role:`alert`,children:P.error}):null,O.loading&&!O.data?(0,q.jsx)(o,{tone:`loading`,message:`Loading jobs…`}):null,!O.error&&!O.loading&&j.length===0?(0,q.jsx)(o,{message:`No automations configured`,hint:`Create a job to run prompts on a schedule.`}):null,!O.error&&j.length>0&&Y.length===0?(0,q.jsx)(o,{message:`No jobs match the current filters.`}):null,Y.length>0?(0,q.jsx)(ee,{label:`Automations`,columns:be,rows:Y,rowKey:e=>e.id,onRowClick:ye,selectedKey:k}):null,Z?(0,q.jsx)(`div`,{className:`ct-load-more`,children:(0,q.jsx)(d,{size:`sm`,disabled:M.busy||O.loading,onClick:()=>void M.loadMore(),children:M.busy?`Loading…`:`Load more`})}):null,l?(0,q.jsx)(`div`,{className:`ct-cron-callout`,role:`alert`,children:l}):null]}),(0,q.jsx)(Se,{selectedJob:I,entries:ge,total:W.data?.total??ge.length,hasMore:G.hasMore,loading:W.loading,error:W.error,scopeAll:!R,statusFilter:B,deliveryFilter:V,query:z,sortDir:H,onScopeChange:L,onStatusFilterChange:ae,onDeliveryFilterChange:oe,onQueryChange:ie,onSortDirChange:se,onLoadMore:()=>void G.loadMore()}),J.drawer?(0,q.jsx)(_e,{form:J.drawer.form,fieldErrors:J.drawerErrors,busy:J.drawerBusy,error:J.drawerError,editing:J.drawer.mode===`edit`,onFormChange:e=>J.setDrawer(t=>t&&{...t,form:e}),onSubmit:()=>void J.submitDrawer(),onClose:J.closeDrawer}):null,(0,q.jsx)(f,{open:_!==null,title:`Remove job`,width:`sm`,onClose:()=>b(null),footer:(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(d,{onClick:()=>b(null),children:`Cancel`}),(0,q.jsx)(d,{variant:`danger`,onClick:()=>void ve(),children:`Remove`})]}),children:(0,q.jsxs)(`p`,{children:[`Remove `,(0,q.jsx)(`strong`,{children:_?.name}),`? Its schedule and run history stop immediately. This cannot be undone.`]})})]})}export{De as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as e}from"./format-BPrfsCHW.js";var t=e();function n({tone:e=`neutral`,children:n}){return(0,t.jsx)(`span`,{className:`ct-badge ct-badge--${e}`,children:n})}export{n as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as e}from"./format-
|
|
1
|
+
import{c as e}from"./format-BPrfsCHW.js";var t=e();function n({variant:e=`secondary`,size:n=`md`,className:r,type:i=`button`,children:a,...o}){return(0,t.jsx)(`button`,{type:i,className:[`ct-btn`,`ct-btn--${e}`,n===`sm`?`ct-btn--sm`:null,r].filter(Boolean).join(` `),...o,children:a})}export{n as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,c as t,h as n,i as r,l as i,r as a,s as o,t as s}from"./format-DpM2rlEo.js";import{t as c}from"./Button-D5rMawzJ.js";import{r as l}from"./config-store-zXNM_umy.js";import{n as u,t as d}from"./use-gateway-query-xtY3vmte.js";import{t as f}from"./Panel-DM0JsHgz.js";import{t as p}from"./ConfigForm-tS4Ekkuj.js";import{t as m}from"./ConfirmDialog-B-AAbwH-.js";var h=e(n(),1),g=[`whatsapp`,`telegram`,`discord`,`googlechat`,`slack`,`signal`,`imessage`,`nostr`],_=600*1e3;function v(e,t){let n=e?.channels?.[t];return typeof n==`object`&&n?n:void 0}function y(e,t){if(!e)return!1;let n=v(e,t),r=e=>n?.[e]===!0,i=(e.channelAccounts?.[t]??[]).some(e=>e.configured||e.running||e.connected);return r(`configured`)||r(`running`)||r(`connected`)||i}function b(e){return(e?.channelMeta&&e.channelMeta.length>0?e.channelMeta.map(e=>e.id):e?.channelOrder&&e.channelOrder.length>0?e.channelOrder:g).map((t,n)=>({key:t,enabled:y(e,t),order:n})).toSorted((e,t)=>e.enabled===t.enabled?e.order-t.order:e.enabled?-1:1).map(e=>e.key)}function x(e,t){return e?.channelMeta?.find(e=>e.id===t)?.label??e?.channelLabels?.[t]??t}function S(e,t){let n=v(e,t);if(!n)return{};let r={};return typeof n.configured==`boolean`&&(r.configured=n.configured),typeof n.running==`boolean`&&(r.running=n.running),typeof n.connected==`boolean`&&(r.connected=n.connected),typeof n.lastError==`string`&&(r.lastError=n.lastError),typeof n.lastStartAt==`number`&&(r.lastStartAt=n.lastStartAt),typeof n.lastProbeAt==`number`&&(r.lastProbeAt=n.lastProbeAt),typeof n.probe==`object`&&n.probe!==null&&(r.probe=n.probe),r}var C={googlechat:[`credentialSource`,`audienceType`,`audience`],signal:[`baseUrl`]};function w(e,t){let n=v(e,t);return n?(C[t]??[]).flatMap(e=>e in n?[{label:e,value:L(n[e])}]:[]):[]}function T(e){return e==null||e===``?`n/a`:typeof e==`boolean`?e?`Yes`:`No`:typeof e!=`string`&&typeof e!=`number`?`n/a`:String(e)}function E(e){return e?r(e):`n/a`}function D(e){if(typeof e!=`object`||!e||!(`ok`in e))return null;let{ok:t,status:n,error:r}=e,i=t?`Probe ok`:`Probe failed`,a=[n,r].filter(e=>e!=null&&e!==``);return a.length>0?`${i} · ${a.join(` `)}`:i}function O(e,t=Date.now()){return e.lastInboundAt?t-e.lastInboundAt<_:!1}function k(e,t=Date.now()){return e.running?`Yes`:O(e,t)?`Active`:`No`}function A(e,t=Date.now()){return e.connected===!0?`Yes`:e.connected===!1?`No`:O(e,t)?`Active`:`n/a`}function j(e){return e?e.length<=20?e:`${e.slice(0,8)}...${e.slice(-8)}`:`n/a`}function M(e){return[...e?.lastApiRequests??[]].toReversed().find(e=>e.error)?.error??e?.lastError??null}function N(e,t,n){return e.filter(e=>e.channelCorrelation?.channel===t&&e.channelCorrelation.accountId===n)}function P(e){let t=e.channelCorrelation;return`${t?.runId??(t?.updateId===void 0?void 0:`update:${t.updateId}`)??`telegram run`} ${e.state} q:${e.queueDepth}`}var F=[`groupPolicy`,`streamMode`,`dmPolicy`];function I(e,t){if(!e)return null;let n=(e.channels??{})[t];if(n&&typeof n==`object`)return n;let r=e[t];return r&&typeof r==`object`?r:null}function L(e){if(e==null)return`n/a`;if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return String(e);try{return JSON.stringify(e)}catch{return`n/a`}}function R(e,t){let n=I(e,t);return n?F.flatMap(e=>e in n?[{label:e,value:L(n[e])}]:[]):[]}var z=t();function B({channelId:e,onAfterSave:t,onAfterReload:n}){let r=l(e=>e.draft),i=l(e=>e.schema),a=l(e=>e.busy),o=l(e=>e.dirty),s=l(e=>e.error),u=R(r,e),d=async()=>{await l.getState().save(`set`),t()},f=async()=>{await l.getState().load(),n()};return(0,z.jsxs)(`div`,{className:`ct-channels__config`,"data-testid":`channel-config-${e}`,children:[a&&!i?(0,z.jsx)(`p`,{className:`ct-muted`,children:`Loading config schema…`}):(0,z.jsx)(p,{schema:i?.schema??null,uiHints:i?.uiHints??{},value:r,disabled:a,rootPath:[`channels`,e],onPatch:(e,t)=>l.getState().setPath(e,t)}),u.length>0?(0,z.jsx)(`dl`,{className:`ct-kv ct-channels__extras`,children:u.map(e=>(0,z.jsxs)(`div`,{className:`ct-kv__row`,children:[(0,z.jsx)(`dt`,{children:e.label}),(0,z.jsx)(`dd`,{children:e.value})]},e.label))}):null,s?(0,z.jsx)(`div`,{className:`ct-channels__callout ct-channels__callout--danger`,role:`alert`,children:s}):null,(0,z.jsxs)(`div`,{className:`ct-channels__actions`,children:[(0,z.jsx)(c,{variant:`primary`,disabled:a||!o,"data-testid":`channel-config-save-${e}`,onClick:()=>void d(),children:a?`Saving…`:`Save`}),(0,z.jsx)(c,{disabled:a,onClick:()=>void f(),children:`Reload`})]})]})}function V({rows:e}){return(0,z.jsx)(`dl`,{className:`ct-kv ct-channels__status`,children:e.map(([e,t])=>(0,z.jsxs)(`div`,{className:`ct-kv__row`,children:[(0,z.jsx)(`dt`,{children:e}),(0,z.jsx)(`dd`,{children:t})]},e))})}function H({tone:e=`info`,children:t}){return(0,z.jsx)(`div`,{className:`ct-channels__callout ct-channels__callout--${e}`,role:e===`danger`?`alert`:void 0,children:t})}function U({title:e,accountId:t,rows:n,children:r}){return(0,z.jsxs)(`div`,{className:`ct-channels__account`,children:[(0,z.jsxs)(`div`,{className:`ct-channels__account-head`,children:[(0,z.jsx)(`span`,{className:`ct-channels__account-title`,children:e}),(0,z.jsx)(`span`,{className:`ct-channels__account-id ct-mono`,children:t})]}),(0,z.jsx)(V,{rows:n}),r]})}function W({id:e,label:t,flags:n,extras:r,accounts:i,probeBusy:a=!1,onProbe:o,configSection:s}){let l=D(n.probe);return(0,z.jsxs)(f,{testId:`channel-card-${e}`,title:t,sub:`Channel status and configuration.`,actions:(0,z.jsx)(c,{onClick:o,disabled:a,children:`Probe`}),children:[i.length>=2?(0,z.jsxs)(`div`,{className:`ct-channels__count`,children:[`Accounts (`,i.length,`)`]}):null,i.length>0?(0,z.jsx)(`div`,{className:`ct-channels__accounts`,children:i.map(e=>(0,z.jsx)(U,{title:e.name||e.accountId,accountId:e.accountId,rows:[[`Running`,k(e)],[`Configured`,T(e.configured)],[`Connected`,A(e)],[`Last inbound`,E(e.lastInboundAt)]],children:e.lastError?(0,z.jsx)(`div`,{className:`ct-channels__account-error`,children:e.lastError}):null},e.accountId))}):(0,z.jsx)(V,{rows:[[`Configured`,T(n.configured)],[`Running`,T(n.running)],[`Connected`,T(n.connected)],[`Last start`,E(n.lastStartAt)],[`Last probe`,E(n.lastProbeAt)]]}),r.length>0?(0,z.jsx)(V,{rows:r.map(e=>[e.label,e.value])}):null,n.lastError?(0,z.jsx)(H,{tone:`danger`,children:n.lastError}):null,l?(0,z.jsx)(H,{children:l}):null,s]})}var G=[`name`,`displayName`,`about`,`picture`,`banner`,`website`,`nip05`,`lud16`];function K(e){let t=Object.fromEntries(G.map(t=>[t,e?.[t]??``]));return{values:t,original:{...t},saving:!1,importing:!1,error:null,success:null,fieldErrors:{},showAdvanced:!!(e?.banner||e?.website||e?.nip05||e?.lud16)}}function q(e){return G.some(t=>e.values[t]!==e.original[t])}function J(e){return Object.fromEntries(G.map(t=>[t,e[t]]).filter(e=>e[1]!==``))}function Y(e){if(!Array.isArray(e))return{};let t={};for(let n of e){if(typeof n!=`string`)continue;let e=n.indexOf(`:`);if(e<=0)continue;let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();r&&i&&(t[r]=i)}return t}function X(e,t){let n={...e.values,...t};return{values:n,showAdvanced:!!(n.banner||n.website||n.nip05||n.lud16)}}async function Z(e,t,n,r,i){let a=await fetch(`/api/channels/nostr/${encodeURIComponent(e)}${t}`,{method:n,headers:{"Content-Type":`application/json`,...r?{Authorization:`Bearer ${r}`}:{}},body:i===void 0?void 0:JSON.stringify(i)}),o=await a.json().catch(()=>null),s=o===null?null:{...o,...o.error===void 0?{}:{error:ee(o.error,a.status)}};return{status:a.status,data:s}}function ee(e,t){if(typeof e==`string`&&e.trim().length>0)return e;if(e&&typeof e==`object`&&`message`in e){let t=e.message;if(typeof t==`string`&&t.trim().length>0)return t}return`Request failed (${t})`}function Q({label:e,value:t,multiline:n,placeholder:r,help:i,error:a,disabled:o,onChange:s}){let c={value:t,placeholder:r??``,disabled:o,onChange:e=>s(e.target.value)};return(0,z.jsxs)(`div`,{className:`ct-channels__field`,children:[(0,z.jsxs)(`label`,{children:[e,n?(0,z.jsx)(`textarea`,{...c,rows:3,maxLength:2e3}):(0,z.jsx)(`input`,{...c,type:`text`,maxLength:256})]}),i?(0,z.jsx)(`div`,{className:`ct-channels__field-help`,children:i}):null,a?(0,z.jsx)(`div`,{className:`ct-channels__field-error`,children:a}):null]})}function te({nostr:e,accounts:t,onRefresh:n,onProfilePublished:r,configSection:i}){let a=t[0],o=a?.accountId??`default`,l=e?.configured??a?.configured??!1,u=e?.lastError??a?.lastError??null,d=a?.profile??e?.profile??null,[p,m]=(0,h.useState)(null),[g,_]=(0,h.useState)(``),v=(e,t)=>{m(n=>n&&{...n,values:{...n.values,[e]:t}})},y=async()=>{if(!(!p||p.saving)){m({...p,saving:!0,error:null,success:null,fieldErrors:{}});try{let{status:e,data:t}=await Z(o,`/profile`,`PUT`,g.trim(),J(p.values));if(!t?.ok){m(n=>n&&{...n,saving:!1,error:t?.error??`Profile update failed (${e})`,fieldErrors:Y(t?.details)});return}if(!t.persisted){m(e=>e&&{...e,saving:!1,error:`Profile publish failed on all relays.`});return}m(e=>e&&{...e,saving:!1,error:null,success:`Profile published to relays.`,fieldErrors:{},original:{...e.values}}),r()}catch(e){m(t=>t&&{...t,saving:!1,error:`Profile update failed: ${s(e)}`})}}},b=async()=>{if(!(!p||p.importing||p.saving)){m({...p,importing:!0,error:null,success:null});try{let{status:e,data:t}=await Z(o,`/profile/import`,`POST`,g.trim(),{autoMerge:!0});if(!t?.ok){m(n=>n&&{...n,importing:!1,error:t?.error??`Profile import failed (${e})`});return}let n=X(p,t.merged??t.imported??null);m(e=>e&&{...e,...n,importing:!1,success:t.saved?`Profile imported from relays. Review and publish.`:`Profile imported. Review and publish.`}),t.saved&&r()}catch(e){m(t=>t&&{...t,importing:!1,error:`Profile import failed: ${s(e)}`})}}};return(0,z.jsxs)(f,{testId:`channel-card-nostr`,title:`Nostr`,sub:`Decentralized DMs via Nostr relays (NIP-04).`,actions:(0,z.jsx)(c,{onClick:n,disabled:p?.saving,children:`Refresh`}),children:[t.length>1?(0,z.jsx)(`div`,{className:`ct-channels__accounts`,children:t.map(e=>(0,z.jsx)(U,{title:e.profile?.displayName??e.profile?.name??e.name??e.accountId,accountId:e.accountId,rows:[[`Running`,T(e.running)],[`Configured`,T(e.configured)],[`Public Key`,j(e.publicKey)],[`Last inbound`,E(e.lastInboundAt)]],children:e.lastError?(0,z.jsx)(`div`,{className:`ct-channels__account-error`,children:e.lastError}):null},e.accountId))}):(0,z.jsx)(V,{rows:[[`Configured`,T(l)],[`Running`,T(e?.running??a?.running??!1)],[`Public Key`,j(e?.publicKey??a?.publicKey)],[`Last start`,E(e?.lastStartAt??a?.lastStartAt??null)]]}),u?(0,z.jsx)(H,{tone:`danger`,children:u}):null,(()=>{if(p)return(0,z.jsxs)(`div`,{className:`ct-channels__profile-form`,"data-testid":`nostr-profile-form`,children:[(0,z.jsxs)(`div`,{className:`ct-channels__profile-head`,children:[(0,z.jsx)(`strong`,{children:`Edit Profile`}),(0,z.jsxs)(`span`,{className:`ct-muted`,children:[`Account: `,o]})]}),p.error?(0,z.jsx)(H,{tone:`danger`,children:p.error}):null,p.success?(0,z.jsx)(H,{children:p.success}):null,(0,z.jsx)(Q,{label:`Username`,value:p.values.name??``,placeholder:`satoshi`,help:`Short username (e.g., satoshi)`,error:p.fieldErrors.name,disabled:p.saving,onChange:e=>v(`name`,e)}),(0,z.jsx)(Q,{label:`Display Name`,value:p.values.displayName??``,placeholder:`Satoshi Nakamoto`,help:`Your full display name`,error:p.fieldErrors.displayName,disabled:p.saving,onChange:e=>v(`displayName`,e)}),(0,z.jsx)(Q,{label:`Bio`,value:p.values.about??``,multiline:!0,placeholder:`Tell people about yourself...`,help:`A brief bio or description`,error:p.fieldErrors.about,disabled:p.saving,onChange:e=>v(`about`,e)}),(0,z.jsx)(Q,{label:`Avatar URL`,value:p.values.picture??``,placeholder:`https://example.com/avatar.jpg`,help:`HTTPS URL to your profile picture`,error:p.fieldErrors.picture,disabled:p.saving,onChange:e=>v(`picture`,e)}),p.showAdvanced?(0,z.jsxs)(`div`,{className:`ct-channels__profile-advanced`,children:[(0,z.jsx)(`div`,{className:`ct-muted`,children:`Advanced`}),(0,z.jsx)(Q,{label:`Banner URL`,value:p.values.banner??``,error:p.fieldErrors.banner,disabled:p.saving,onChange:e=>v(`banner`,e)}),(0,z.jsx)(Q,{label:`Website`,value:p.values.website??``,error:p.fieldErrors.website,disabled:p.saving,onChange:e=>v(`website`,e)}),(0,z.jsx)(Q,{label:`NIP-05 Identifier`,value:p.values.nip05??``,placeholder:`you@example.com`,help:`Verifiable identifier (e.g., you@domain.com)`,error:p.fieldErrors.nip05,disabled:p.saving,onChange:e=>v(`nip05`,e)}),(0,z.jsx)(Q,{label:`Lightning Address`,value:p.values.lud16??``,placeholder:`you@getalby.com`,help:`Lightning address for tips (LUD-16)`,error:p.fieldErrors.lud16,disabled:p.saving,onChange:e=>v(`lud16`,e)})]}):null,(0,z.jsxs)(`div`,{className:`ct-channels__field`,children:[(0,z.jsxs)(`label`,{htmlFor:`nostr-gateway-credential`,children:[`Gateway token or password`,(0,z.jsx)(`input`,{id:`nostr-gateway-credential`,type:`password`,autoComplete:`off`,placeholder:`Required on token/password gateways`,value:g,disabled:p.saving||p.importing,onChange:e=>_(e.target.value)})]}),(0,z.jsx)(`div`,{className:`ct-channels__field-help`,children:`Sent only as this request's Authorization header; never stored.`})]}),(0,z.jsxs)(`div`,{className:`ct-channels__actions`,children:[(0,z.jsx)(c,{variant:`primary`,disabled:p.saving||!q(p),onClick:()=>void y(),children:p.saving?`Saving…`:`Save & Publish`}),(0,z.jsx)(c,{disabled:p.importing||p.saving,onClick:()=>void b(),children:p.importing?`Importing…`:`Import from Relays`}),(0,z.jsx)(c,{onClick:()=>m({...p,showAdvanced:!p.showAdvanced}),children:p.showAdvanced?`Hide Advanced`:`Show Advanced`}),(0,z.jsx)(c,{disabled:p.saving,onClick:()=>{m(null),_(``)},children:`Cancel`})]}),q(p)?(0,z.jsx)(`div`,{className:`ct-channels__field-help`,children:`You have unsaved changes`}):null]});let{name:e,displayName:t,about:n,nip05:r}=d??{};return(0,z.jsxs)(`div`,{className:`ct-channels__profile`,"data-testid":`nostr-profile`,children:[(0,z.jsxs)(`div`,{className:`ct-channels__profile-head`,children:[(0,z.jsx)(`strong`,{children:`Profile`}),l?(0,z.jsx)(c,{size:`sm`,onClick:()=>m(K(d??void 0)),children:`Edit Profile`}):null]}),e||t||n||r?(0,z.jsx)(V,{rows:[[`Name`,T(e)],[`Display Name`,T(t)],[`About`,n??`n/a`],[`NIP-05`,T(r)]]}):(0,z.jsx)(`p`,{className:`ct-muted`,children:`No profile set. Click "Edit Profile" to add your name, bio, and avatar.`})]})})(),i]})}function ne({telegram:e,accounts:t,activeRuns:n,probeBusy:r=!1,onProbe:i,configSection:a}){let o=t.length>0,s=e=>{let t=e.application?.telegram??null,r=t?.poll,i=t?.webhook,a=t?.delivery,o=e.probe?.bot?.username,s=N(n,`telegram`,e.accountId),c=[[`Running`,T(e.running)],[`Configured`,T(e.configured)],[`Mode`,T(t?.mode??e.mode)],[`State`,T(t?.state)],[`Owner`,T(t?.owner??r?.owner)],[`Last poll`,E(r?.lastPollAt)],[`Webhook`,T(i?.lastRequestOutcome??i?.path)],[`Webhook receipt`,E(i?.lastRequestAt)],[`Pending updates`,T(i?.pendingUpdateCount)],[`Retry`,T(t?.retryAt??a?.nextRetryAt)],[`Queue`,T(a?.queueDepth)],[`Last delivery`,T(a?.lastDeliveryStatus)],[`Last inbound`,E(e.lastInboundAt)],[`Last outbound`,E(e.lastOutboundAt)],[`Last API error`,T(M(t))]];return s.length>0&&c.push([`Active runs`,s.map(e=>P(e)).join(`, `)]),(0,z.jsxs)(U,{title:o?`@${o}`:e.name||e.accountId,accountId:e.accountId,rows:c,children:[a?.lastDeliveryError?(0,z.jsx)(`div`,{className:`ct-channels__account-error`,children:a.lastDeliveryError}):null,t?.lastError||e.lastError?(0,z.jsx)(`div`,{className:`ct-channels__account-error`,children:t?.lastError??e.lastError}):null]},e.accountId)},l=D(e?.probe);return(0,z.jsxs)(f,{testId:`channel-card-telegram`,title:`Telegram`,sub:`Bot status and channel configuration.`,actions:(0,z.jsx)(c,{onClick:i,disabled:r,children:`Probe`}),children:[o?(0,z.jsx)(`div`,{className:`ct-channels__accounts`,children:t.map(s)}):(0,z.jsx)(V,{rows:[[`Configured`,T(e?.configured)],[`Running`,T(e?.running)],[`Mode`,T(e?.mode)],[`Last start`,E(e?.lastStartAt)],[`Last probe`,E(e?.lastProbeAt)]]}),e?.lastError?(0,z.jsx)(H,{tone:`danger`,children:e.lastError}):null,l?(0,z.jsx)(H,{children:l}):null,a]})}function re({whatsapp:e,login:t,onShowQr:n,onRelink:r,onWait:i,onLogout:o,onRefresh:s,configSection:l}){let[u,d]=(0,h.useState)(!1),p=t.busy;return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(f,{testId:`channel-card-whatsapp`,title:`WhatsApp`,sub:`Link WhatsApp Web and monitor connection health.`,children:[(0,z.jsx)(V,{rows:[[`Configured`,T(e?.configured)],[`Linked`,T(e?.linked)],[`Running`,T(e?.running)],[`Connected`,T(e?.connected)],[`Last connect`,E(e?.lastConnectedAt)],[`Last message`,E(e?.lastMessageAt)],[`Auth age`,e?.authAgeMs==null?`n/a`:a(e.authAgeMs)]]}),e?.lastError?(0,z.jsx)(H,{tone:`danger`,children:e.lastError}):null,t.message?(0,z.jsx)(H,{children:t.message}):null,t.qrDataUrl?(0,z.jsx)(`div`,{className:`ct-channels__qr`,children:(0,z.jsx)(`img`,{src:t.qrDataUrl,alt:`WhatsApp QR`,"data-testid":`whatsapp-qr`})}):null,(0,z.jsxs)(`div`,{className:`ct-channels__actions`,children:[(0,z.jsx)(c,{variant:`primary`,disabled:p,onClick:n,children:p?`Working…`:`Show QR`}),(0,z.jsx)(c,{disabled:p,onClick:r,children:`Relink`}),(0,z.jsx)(c,{disabled:p,onClick:i,children:`Wait for scan`}),(0,z.jsx)(c,{variant:`danger`,disabled:p,onClick:()=>d(!0),children:`Logout`}),(0,z.jsx)(c,{onClick:s,children:`Refresh`})]}),l]}),(0,z.jsx)(m,{open:u,title:`Log out of WhatsApp`,body:`Log this WhatsApp account out? The linked session is disconnected and you will need to scan the QR code again to relink.`,confirmLabel:`Log out`,danger:!0,busy:p,bodyClassName:`ct-channels__confirm-body`,onConfirm:()=>{d(!1),o()},onCancel:()=>d(!1)})]})}var $=8e3,ie={busy:!1,message:null,qrDataUrl:null,connected:null};function ae(){let e=i(e=>e.request),t=u(`channels.status`,{probe:!1,timeoutMs:$},{refreshMs:d}),[n,r]=(0,h.useState)(null),[a,f]=(0,h.useState)(null),[p,m]=(0,h.useState)(ie),[g,_]=(0,h.useState)([]),v=n??t.data;(0,h.useEffect)(()=>{r(null)},[t.data]),(0,h.useEffect)(()=>{let e=l.getState();(!e.snapshot||!e.schema)&&e.load()},[]),(0,h.useEffect)(()=>{let{subscribe:e}=i.getState();return e(`sessions.runsUpdate`,e=>{let t=e?.runs;Array.isArray(t)&&_(t)})},[]);let y=(0,h.useCallback)(async t=>{try{let n=await e(`channels.status`,{probe:t,timeoutMs:$});r(n),f(null)}catch(e){f(s(e))}},[e]),C=async(t,n,r)=>{m(e=>({...e,busy:!0}));try{let i=await e(t,n);m(e=>r(i,e))}catch(e){m(t=>({busy:!1,message:s(e),qrDataUrl:t.qrDataUrl,connected:null}))}y(!0)},T=()=>void C(`web.login.start`,{force:!1,timeoutMs:3e4},e=>({busy:!1,message:e.message??null,qrDataUrl:e.qrDataUrl??null,connected:null})),E=()=>void C(`web.login.start`,{force:!0,timeoutMs:3e4},e=>({busy:!1,message:e.message??null,qrDataUrl:e.qrDataUrl??null,connected:null})),D=()=>void C(`web.login.wait`,{timeoutMs:12e4},(e,t)=>({busy:!1,message:e.message??null,qrDataUrl:e.connected?null:t.qrDataUrl,connected:e.connected??null})),O=()=>void C(`channels.logout`,{channel:`whatsapp`},()=>({busy:!1,message:`Logged out.`,qrDataUrl:null,connected:null})),k=e=>{let t=v?.channels??{},n=v?.channelAccounts?.[e]??[],r=(0,z.jsx)(B,{channelId:e,onAfterSave:()=>void y(!0),onAfterReload:()=>void y(!0)});if(e===`whatsapp`){let n=t.whatsapp;return(0,z.jsx)(re,{whatsapp:n,login:p,onShowQr:T,onRelink:E,onWait:D,onLogout:O,onRefresh:()=>void y(!0),configSection:r},e)}return e===`telegram`?(0,z.jsx)(ne,{telegram:t.telegram,accounts:n,activeRuns:g,onProbe:()=>void y(!0),configSection:r},e):e===`nostr`?(0,z.jsx)(te,{nostr:t.nostr,accounts:n,onRefresh:()=>void y(!1),onProfilePublished:()=>void y(!0),configSection:r},e):(0,z.jsx)(W,{id:e,label:x(v,e),flags:S(v,e),extras:w(v,e),accounts:n,onProbe:()=>void y(!0),configSection:r},e)},A=v?b(v):[];return(0,z.jsxs)(`div`,{className:`ct-page`,"data-testid":`channels-view`,children:[(0,z.jsx)(`header`,{className:`ct-page__head`,children:(0,z.jsxs)(`div`,{className:`ct-page__head-text`,children:[(0,z.jsx)(`h1`,{className:`ct-page__title`,children:`Channels`}),(0,z.jsx)(`p`,{className:`ct-page__sub`,children:`Messaging channels, their connection health and per-channel configuration.`})]})}),a?(0,z.jsx)(`div`,{className:`ct-channels__callout ct-channels__callout--danger`,role:`alert`,children:a}):null,!v&&t.loading?(0,z.jsx)(o,{tone:`loading`,message:`Loading channels…`}):null,!v&&t.error?(0,z.jsx)(o,{tone:`error`,message:t.error,hint:(0,z.jsx)(c,{onClick:t.reload,children:`Retry`})}):null,v&&A.length===0?(0,z.jsx)(o,{message:`No channels are configured on this gateway.`}):null,v&&A.length>0?(0,z.jsx)(`div`,{className:`ct-channels__grid`,children:A.map(k)}):null]})}export{ae as default};
|
|
1
|
+
import{_ as e,c as t,h as n,i as r,l as i,r as a,s as o,t as s}from"./format-BPrfsCHW.js";import{t as c}from"./Button-ralPMMNs.js";import{r as l}from"./config-store-DiHUH-77.js";import{n as u,t as d}from"./use-gateway-query-7iLwemQz.js";import{t as f}from"./Panel-CqcbBXzJ.js";import{t as p}from"./ConfigForm-IOs1Exic.js";import{t as m}from"./ConfirmDialog-9ode6FP3.js";var h=e(n(),1),g=[`whatsapp`,`telegram`,`discord`,`googlechat`,`slack`,`signal`,`imessage`,`nostr`],_=600*1e3;function v(e,t){let n=e?.channels?.[t];return typeof n==`object`&&n?n:void 0}function y(e,t){if(!e)return!1;let n=v(e,t),r=e=>n?.[e]===!0,i=(e.channelAccounts?.[t]??[]).some(e=>e.configured||e.running||e.connected);return r(`configured`)||r(`running`)||r(`connected`)||i}function b(e){return(e?.channelMeta&&e.channelMeta.length>0?e.channelMeta.map(e=>e.id):e?.channelOrder&&e.channelOrder.length>0?e.channelOrder:g).map((t,n)=>({key:t,enabled:y(e,t),order:n})).toSorted((e,t)=>e.enabled===t.enabled?e.order-t.order:e.enabled?-1:1).map(e=>e.key)}function x(e,t){return e?.channelMeta?.find(e=>e.id===t)?.label??e?.channelLabels?.[t]??t}function S(e,t){let n=v(e,t);if(!n)return{};let r={};return typeof n.configured==`boolean`&&(r.configured=n.configured),typeof n.running==`boolean`&&(r.running=n.running),typeof n.connected==`boolean`&&(r.connected=n.connected),typeof n.lastError==`string`&&(r.lastError=n.lastError),typeof n.lastStartAt==`number`&&(r.lastStartAt=n.lastStartAt),typeof n.lastProbeAt==`number`&&(r.lastProbeAt=n.lastProbeAt),typeof n.probe==`object`&&n.probe!==null&&(r.probe=n.probe),r}var C={googlechat:[`credentialSource`,`audienceType`,`audience`],signal:[`baseUrl`]};function w(e,t){let n=v(e,t);return n?(C[t]??[]).flatMap(e=>e in n?[{label:e,value:L(n[e])}]:[]):[]}function T(e){return e==null||e===``?`n/a`:typeof e==`boolean`?e?`Yes`:`No`:typeof e!=`string`&&typeof e!=`number`?`n/a`:String(e)}function E(e){return e?r(e):`n/a`}function D(e){if(typeof e!=`object`||!e||!(`ok`in e))return null;let{ok:t,status:n,error:r}=e,i=t?`Probe ok`:`Probe failed`,a=[n,r].filter(e=>e!=null&&e!==``);return a.length>0?`${i} · ${a.join(` `)}`:i}function O(e,t=Date.now()){return e.lastInboundAt?t-e.lastInboundAt<_:!1}function k(e,t=Date.now()){return e.running?`Yes`:O(e,t)?`Active`:`No`}function A(e,t=Date.now()){return e.connected===!0?`Yes`:e.connected===!1?`No`:O(e,t)?`Active`:`n/a`}function j(e){return e?e.length<=20?e:`${e.slice(0,8)}...${e.slice(-8)}`:`n/a`}function M(e){return[...e?.lastApiRequests??[]].toReversed().find(e=>e.error)?.error??e?.lastError??null}function N(e,t,n){return e.filter(e=>e.channelCorrelation?.channel===t&&e.channelCorrelation.accountId===n)}function P(e){let t=e.channelCorrelation;return`${t?.runId??(t?.updateId===void 0?void 0:`update:${t.updateId}`)??`telegram run`} ${e.state} q:${e.queueDepth}`}var F=[`groupPolicy`,`streamMode`,`dmPolicy`];function I(e,t){if(!e)return null;let n=(e.channels??{})[t];if(n&&typeof n==`object`)return n;let r=e[t];return r&&typeof r==`object`?r:null}function L(e){if(e==null)return`n/a`;if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return String(e);try{return JSON.stringify(e)}catch{return`n/a`}}function R(e,t){let n=I(e,t);return n?F.flatMap(e=>e in n?[{label:e,value:L(n[e])}]:[]):[]}var z=t();function B({channelId:e,onAfterSave:t,onAfterReload:n}){let r=l(e=>e.draft),i=l(e=>e.schema),a=l(e=>e.busy),o=l(e=>e.dirty),s=l(e=>e.error),u=R(r,e),d=async()=>{await l.getState().save(`set`),t()},f=async()=>{await l.getState().load(),n()};return(0,z.jsxs)(`div`,{className:`ct-channels__config`,"data-testid":`channel-config-${e}`,children:[a&&!i?(0,z.jsx)(`p`,{className:`ct-muted`,children:`Loading config schema…`}):(0,z.jsx)(p,{schema:i?.schema??null,uiHints:i?.uiHints??{},value:r,disabled:a,rootPath:[`channels`,e],onPatch:(e,t)=>l.getState().setPath(e,t)}),u.length>0?(0,z.jsx)(`dl`,{className:`ct-kv ct-channels__extras`,children:u.map(e=>(0,z.jsxs)(`div`,{className:`ct-kv__row`,children:[(0,z.jsx)(`dt`,{children:e.label}),(0,z.jsx)(`dd`,{children:e.value})]},e.label))}):null,s?(0,z.jsx)(`div`,{className:`ct-channels__callout ct-channels__callout--danger`,role:`alert`,children:s}):null,(0,z.jsxs)(`div`,{className:`ct-channels__actions`,children:[(0,z.jsx)(c,{variant:`primary`,disabled:a||!o,"data-testid":`channel-config-save-${e}`,onClick:()=>void d(),children:a?`Saving…`:`Save`}),(0,z.jsx)(c,{disabled:a,onClick:()=>void f(),children:`Reload`})]})]})}function V({rows:e}){return(0,z.jsx)(`dl`,{className:`ct-kv ct-channels__status`,children:e.map(([e,t])=>(0,z.jsxs)(`div`,{className:`ct-kv__row`,children:[(0,z.jsx)(`dt`,{children:e}),(0,z.jsx)(`dd`,{children:t})]},e))})}function H({tone:e=`info`,children:t}){return(0,z.jsx)(`div`,{className:`ct-channels__callout ct-channels__callout--${e}`,role:e===`danger`?`alert`:void 0,children:t})}function U({title:e,accountId:t,rows:n,children:r}){return(0,z.jsxs)(`div`,{className:`ct-channels__account`,children:[(0,z.jsxs)(`div`,{className:`ct-channels__account-head`,children:[(0,z.jsx)(`span`,{className:`ct-channels__account-title`,children:e}),(0,z.jsx)(`span`,{className:`ct-channels__account-id ct-mono`,children:t})]}),(0,z.jsx)(V,{rows:n}),r]})}function W({id:e,label:t,flags:n,extras:r,accounts:i,probeBusy:a=!1,onProbe:o,configSection:s}){let l=D(n.probe);return(0,z.jsxs)(f,{testId:`channel-card-${e}`,title:t,sub:`Channel status and configuration.`,actions:(0,z.jsx)(c,{onClick:o,disabled:a,children:`Probe`}),children:[i.length>=2?(0,z.jsxs)(`div`,{className:`ct-channels__count`,children:[`Accounts (`,i.length,`)`]}):null,i.length>0?(0,z.jsx)(`div`,{className:`ct-channels__accounts`,children:i.map(e=>(0,z.jsx)(U,{title:e.name||e.accountId,accountId:e.accountId,rows:[[`Running`,k(e)],[`Configured`,T(e.configured)],[`Connected`,A(e)],[`Last inbound`,E(e.lastInboundAt)]],children:e.lastError?(0,z.jsx)(`div`,{className:`ct-channels__account-error`,children:e.lastError}):null},e.accountId))}):(0,z.jsx)(V,{rows:[[`Configured`,T(n.configured)],[`Running`,T(n.running)],[`Connected`,T(n.connected)],[`Last start`,E(n.lastStartAt)],[`Last probe`,E(n.lastProbeAt)]]}),r.length>0?(0,z.jsx)(V,{rows:r.map(e=>[e.label,e.value])}):null,n.lastError?(0,z.jsx)(H,{tone:`danger`,children:n.lastError}):null,l?(0,z.jsx)(H,{children:l}):null,s]})}var G=[`name`,`displayName`,`about`,`picture`,`banner`,`website`,`nip05`,`lud16`];function K(e){let t=Object.fromEntries(G.map(t=>[t,e?.[t]??``]));return{values:t,original:{...t},saving:!1,importing:!1,error:null,success:null,fieldErrors:{},showAdvanced:!!(e?.banner||e?.website||e?.nip05||e?.lud16)}}function q(e){return G.some(t=>e.values[t]!==e.original[t])}function J(e){return Object.fromEntries(G.map(t=>[t,e[t]]).filter(e=>e[1]!==``))}function Y(e){if(!Array.isArray(e))return{};let t={};for(let n of e){if(typeof n!=`string`)continue;let e=n.indexOf(`:`);if(e<=0)continue;let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();r&&i&&(t[r]=i)}return t}function X(e,t){let n={...e.values,...t};return{values:n,showAdvanced:!!(n.banner||n.website||n.nip05||n.lud16)}}async function Z(e,t,n,r,i){let a=await fetch(`/api/channels/nostr/${encodeURIComponent(e)}${t}`,{method:n,headers:{"Content-Type":`application/json`,...r?{Authorization:`Bearer ${r}`}:{}},body:i===void 0?void 0:JSON.stringify(i)}),o=await a.json().catch(()=>null),s=o===null?null:{...o,...o.error===void 0?{}:{error:ee(o.error,a.status)}};return{status:a.status,data:s}}function ee(e,t){if(typeof e==`string`&&e.trim().length>0)return e;if(e&&typeof e==`object`&&`message`in e){let t=e.message;if(typeof t==`string`&&t.trim().length>0)return t}return`Request failed (${t})`}function Q({label:e,value:t,multiline:n,placeholder:r,help:i,error:a,disabled:o,onChange:s}){let c={value:t,placeholder:r??``,disabled:o,onChange:e=>s(e.target.value)};return(0,z.jsxs)(`div`,{className:`ct-channels__field`,children:[(0,z.jsxs)(`label`,{children:[e,n?(0,z.jsx)(`textarea`,{...c,rows:3,maxLength:2e3}):(0,z.jsx)(`input`,{...c,type:`text`,maxLength:256})]}),i?(0,z.jsx)(`div`,{className:`ct-channels__field-help`,children:i}):null,a?(0,z.jsx)(`div`,{className:`ct-channels__field-error`,children:a}):null]})}function te({nostr:e,accounts:t,onRefresh:n,onProfilePublished:r,configSection:i}){let a=t[0],o=a?.accountId??`default`,l=e?.configured??a?.configured??!1,u=e?.lastError??a?.lastError??null,d=a?.profile??e?.profile??null,[p,m]=(0,h.useState)(null),[g,_]=(0,h.useState)(``),v=(e,t)=>{m(n=>n&&{...n,values:{...n.values,[e]:t}})},y=async()=>{if(!(!p||p.saving)){m({...p,saving:!0,error:null,success:null,fieldErrors:{}});try{let{status:e,data:t}=await Z(o,`/profile`,`PUT`,g.trim(),J(p.values));if(!t?.ok){m(n=>n&&{...n,saving:!1,error:t?.error??`Profile update failed (${e})`,fieldErrors:Y(t?.details)});return}if(!t.persisted){m(e=>e&&{...e,saving:!1,error:`Profile publish failed on all relays.`});return}m(e=>e&&{...e,saving:!1,error:null,success:`Profile published to relays.`,fieldErrors:{},original:{...e.values}}),r()}catch(e){m(t=>t&&{...t,saving:!1,error:`Profile update failed: ${s(e)}`})}}},b=async()=>{if(!(!p||p.importing||p.saving)){m({...p,importing:!0,error:null,success:null});try{let{status:e,data:t}=await Z(o,`/profile/import`,`POST`,g.trim(),{autoMerge:!0});if(!t?.ok){m(n=>n&&{...n,importing:!1,error:t?.error??`Profile import failed (${e})`});return}let n=X(p,t.merged??t.imported??null);m(e=>e&&{...e,...n,importing:!1,success:t.saved?`Profile imported from relays. Review and publish.`:`Profile imported. Review and publish.`}),t.saved&&r()}catch(e){m(t=>t&&{...t,importing:!1,error:`Profile import failed: ${s(e)}`})}}};return(0,z.jsxs)(f,{testId:`channel-card-nostr`,title:`Nostr`,sub:`Decentralized DMs via Nostr relays (NIP-04).`,actions:(0,z.jsx)(c,{onClick:n,disabled:p?.saving,children:`Refresh`}),children:[t.length>1?(0,z.jsx)(`div`,{className:`ct-channels__accounts`,children:t.map(e=>(0,z.jsx)(U,{title:e.profile?.displayName??e.profile?.name??e.name??e.accountId,accountId:e.accountId,rows:[[`Running`,T(e.running)],[`Configured`,T(e.configured)],[`Public Key`,j(e.publicKey)],[`Last inbound`,E(e.lastInboundAt)]],children:e.lastError?(0,z.jsx)(`div`,{className:`ct-channels__account-error`,children:e.lastError}):null},e.accountId))}):(0,z.jsx)(V,{rows:[[`Configured`,T(l)],[`Running`,T(e?.running??a?.running??!1)],[`Public Key`,j(e?.publicKey??a?.publicKey)],[`Last start`,E(e?.lastStartAt??a?.lastStartAt??null)]]}),u?(0,z.jsx)(H,{tone:`danger`,children:u}):null,(()=>{if(p)return(0,z.jsxs)(`div`,{className:`ct-channels__profile-form`,"data-testid":`nostr-profile-form`,children:[(0,z.jsxs)(`div`,{className:`ct-channels__profile-head`,children:[(0,z.jsx)(`strong`,{children:`Edit Profile`}),(0,z.jsxs)(`span`,{className:`ct-muted`,children:[`Account: `,o]})]}),p.error?(0,z.jsx)(H,{tone:`danger`,children:p.error}):null,p.success?(0,z.jsx)(H,{children:p.success}):null,(0,z.jsx)(Q,{label:`Username`,value:p.values.name??``,placeholder:`satoshi`,help:`Short username (e.g., satoshi)`,error:p.fieldErrors.name,disabled:p.saving,onChange:e=>v(`name`,e)}),(0,z.jsx)(Q,{label:`Display Name`,value:p.values.displayName??``,placeholder:`Satoshi Nakamoto`,help:`Your full display name`,error:p.fieldErrors.displayName,disabled:p.saving,onChange:e=>v(`displayName`,e)}),(0,z.jsx)(Q,{label:`Bio`,value:p.values.about??``,multiline:!0,placeholder:`Tell people about yourself...`,help:`A brief bio or description`,error:p.fieldErrors.about,disabled:p.saving,onChange:e=>v(`about`,e)}),(0,z.jsx)(Q,{label:`Avatar URL`,value:p.values.picture??``,placeholder:`https://example.com/avatar.jpg`,help:`HTTPS URL to your profile picture`,error:p.fieldErrors.picture,disabled:p.saving,onChange:e=>v(`picture`,e)}),p.showAdvanced?(0,z.jsxs)(`div`,{className:`ct-channels__profile-advanced`,children:[(0,z.jsx)(`div`,{className:`ct-muted`,children:`Advanced`}),(0,z.jsx)(Q,{label:`Banner URL`,value:p.values.banner??``,error:p.fieldErrors.banner,disabled:p.saving,onChange:e=>v(`banner`,e)}),(0,z.jsx)(Q,{label:`Website`,value:p.values.website??``,error:p.fieldErrors.website,disabled:p.saving,onChange:e=>v(`website`,e)}),(0,z.jsx)(Q,{label:`NIP-05 Identifier`,value:p.values.nip05??``,placeholder:`you@example.com`,help:`Verifiable identifier (e.g., you@domain.com)`,error:p.fieldErrors.nip05,disabled:p.saving,onChange:e=>v(`nip05`,e)}),(0,z.jsx)(Q,{label:`Lightning Address`,value:p.values.lud16??``,placeholder:`you@getalby.com`,help:`Lightning address for tips (LUD-16)`,error:p.fieldErrors.lud16,disabled:p.saving,onChange:e=>v(`lud16`,e)})]}):null,(0,z.jsxs)(`div`,{className:`ct-channels__field`,children:[(0,z.jsxs)(`label`,{htmlFor:`nostr-gateway-credential`,children:[`Gateway token or password`,(0,z.jsx)(`input`,{id:`nostr-gateway-credential`,type:`password`,autoComplete:`off`,placeholder:`Required on token/password gateways`,value:g,disabled:p.saving||p.importing,onChange:e=>_(e.target.value)})]}),(0,z.jsx)(`div`,{className:`ct-channels__field-help`,children:`Sent only as this request's Authorization header; never stored.`})]}),(0,z.jsxs)(`div`,{className:`ct-channels__actions`,children:[(0,z.jsx)(c,{variant:`primary`,disabled:p.saving||!q(p),onClick:()=>void y(),children:p.saving?`Saving…`:`Save & Publish`}),(0,z.jsx)(c,{disabled:p.importing||p.saving,onClick:()=>void b(),children:p.importing?`Importing…`:`Import from Relays`}),(0,z.jsx)(c,{onClick:()=>m({...p,showAdvanced:!p.showAdvanced}),children:p.showAdvanced?`Hide Advanced`:`Show Advanced`}),(0,z.jsx)(c,{disabled:p.saving,onClick:()=>{m(null),_(``)},children:`Cancel`})]}),q(p)?(0,z.jsx)(`div`,{className:`ct-channels__field-help`,children:`You have unsaved changes`}):null]});let{name:e,displayName:t,about:n,nip05:r}=d??{};return(0,z.jsxs)(`div`,{className:`ct-channels__profile`,"data-testid":`nostr-profile`,children:[(0,z.jsxs)(`div`,{className:`ct-channels__profile-head`,children:[(0,z.jsx)(`strong`,{children:`Profile`}),l?(0,z.jsx)(c,{size:`sm`,onClick:()=>m(K(d??void 0)),children:`Edit Profile`}):null]}),e||t||n||r?(0,z.jsx)(V,{rows:[[`Name`,T(e)],[`Display Name`,T(t)],[`About`,n??`n/a`],[`NIP-05`,T(r)]]}):(0,z.jsx)(`p`,{className:`ct-muted`,children:`No profile set. Click "Edit Profile" to add your name, bio, and avatar.`})]})})(),i]})}function ne({telegram:e,accounts:t,activeRuns:n,probeBusy:r=!1,onProbe:i,configSection:a}){let o=t.length>0,s=e=>{let t=e.application?.telegram??null,r=t?.poll,i=t?.webhook,a=t?.delivery,o=e.probe?.bot?.username,s=N(n,`telegram`,e.accountId),c=[[`Running`,T(e.running)],[`Configured`,T(e.configured)],[`Mode`,T(t?.mode??e.mode)],[`State`,T(t?.state)],[`Owner`,T(t?.owner??r?.owner)],[`Last poll`,E(r?.lastPollAt)],[`Webhook`,T(i?.lastRequestOutcome??i?.path)],[`Webhook receipt`,E(i?.lastRequestAt)],[`Pending updates`,T(i?.pendingUpdateCount)],[`Retry`,T(t?.retryAt??a?.nextRetryAt)],[`Queue`,T(a?.queueDepth)],[`Last delivery`,T(a?.lastDeliveryStatus)],[`Last inbound`,E(e.lastInboundAt)],[`Last outbound`,E(e.lastOutboundAt)],[`Last API error`,T(M(t))]];return s.length>0&&c.push([`Active runs`,s.map(e=>P(e)).join(`, `)]),(0,z.jsxs)(U,{title:o?`@${o}`:e.name||e.accountId,accountId:e.accountId,rows:c,children:[a?.lastDeliveryError?(0,z.jsx)(`div`,{className:`ct-channels__account-error`,children:a.lastDeliveryError}):null,t?.lastError||e.lastError?(0,z.jsx)(`div`,{className:`ct-channels__account-error`,children:t?.lastError??e.lastError}):null]},e.accountId)},l=D(e?.probe);return(0,z.jsxs)(f,{testId:`channel-card-telegram`,title:`Telegram`,sub:`Bot status and channel configuration.`,actions:(0,z.jsx)(c,{onClick:i,disabled:r,children:`Probe`}),children:[o?(0,z.jsx)(`div`,{className:`ct-channels__accounts`,children:t.map(s)}):(0,z.jsx)(V,{rows:[[`Configured`,T(e?.configured)],[`Running`,T(e?.running)],[`Mode`,T(e?.mode)],[`Last start`,E(e?.lastStartAt)],[`Last probe`,E(e?.lastProbeAt)]]}),e?.lastError?(0,z.jsx)(H,{tone:`danger`,children:e.lastError}):null,l?(0,z.jsx)(H,{children:l}):null,a]})}function re({whatsapp:e,login:t,onShowQr:n,onRelink:r,onWait:i,onLogout:o,onRefresh:s,configSection:l}){let[u,d]=(0,h.useState)(!1),p=t.busy;return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(f,{testId:`channel-card-whatsapp`,title:`WhatsApp`,sub:`Link WhatsApp Web and monitor connection health.`,children:[(0,z.jsx)(V,{rows:[[`Configured`,T(e?.configured)],[`Linked`,T(e?.linked)],[`Running`,T(e?.running)],[`Connected`,T(e?.connected)],[`Last connect`,E(e?.lastConnectedAt)],[`Last message`,E(e?.lastMessageAt)],[`Auth age`,e?.authAgeMs==null?`n/a`:a(e.authAgeMs)]]}),e?.lastError?(0,z.jsx)(H,{tone:`danger`,children:e.lastError}):null,t.message?(0,z.jsx)(H,{children:t.message}):null,t.qrDataUrl?(0,z.jsx)(`div`,{className:`ct-channels__qr`,children:(0,z.jsx)(`img`,{src:t.qrDataUrl,alt:`WhatsApp QR`,"data-testid":`whatsapp-qr`})}):null,(0,z.jsxs)(`div`,{className:`ct-channels__actions`,children:[(0,z.jsx)(c,{variant:`primary`,disabled:p,onClick:n,children:p?`Working…`:`Show QR`}),(0,z.jsx)(c,{disabled:p,onClick:r,children:`Relink`}),(0,z.jsx)(c,{disabled:p,onClick:i,children:`Wait for scan`}),(0,z.jsx)(c,{variant:`danger`,disabled:p,onClick:()=>d(!0),children:`Logout`}),(0,z.jsx)(c,{onClick:s,children:`Refresh`})]}),l]}),(0,z.jsx)(m,{open:u,title:`Log out of WhatsApp`,body:`Log this WhatsApp account out? The linked session is disconnected and you will need to scan the QR code again to relink.`,confirmLabel:`Log out`,danger:!0,busy:p,bodyClassName:`ct-channels__confirm-body`,onConfirm:()=>{d(!1),o()},onCancel:()=>d(!1)})]})}var $=8e3,ie={busy:!1,message:null,qrDataUrl:null,connected:null};function ae(){let e=i(e=>e.request),t=u(`channels.status`,{probe:!1,timeoutMs:$},{refreshMs:d}),[n,r]=(0,h.useState)(null),[a,f]=(0,h.useState)(null),[p,m]=(0,h.useState)(ie),[g,_]=(0,h.useState)([]),v=n??t.data;(0,h.useEffect)(()=>{r(null)},[t.data]),(0,h.useEffect)(()=>{let e=l.getState();(!e.snapshot||!e.schema)&&e.load()},[]),(0,h.useEffect)(()=>{let{subscribe:e}=i.getState();return e(`sessions.runsUpdate`,e=>{let t=e?.runs;Array.isArray(t)&&_(t)})},[]);let y=(0,h.useCallback)(async t=>{try{let n=await e(`channels.status`,{probe:t,timeoutMs:$});r(n),f(null)}catch(e){f(s(e))}},[e]),C=async(t,n,r)=>{m(e=>({...e,busy:!0}));try{let i=await e(t,n);m(e=>r(i,e))}catch(e){m(t=>({busy:!1,message:s(e),qrDataUrl:t.qrDataUrl,connected:null}))}y(!0)},T=()=>void C(`web.login.start`,{force:!1,timeoutMs:3e4},e=>({busy:!1,message:e.message??null,qrDataUrl:e.qrDataUrl??null,connected:null})),E=()=>void C(`web.login.start`,{force:!0,timeoutMs:3e4},e=>({busy:!1,message:e.message??null,qrDataUrl:e.qrDataUrl??null,connected:null})),D=()=>void C(`web.login.wait`,{timeoutMs:12e4},(e,t)=>({busy:!1,message:e.message??null,qrDataUrl:e.connected?null:t.qrDataUrl,connected:e.connected??null})),O=()=>void C(`channels.logout`,{channel:`whatsapp`},()=>({busy:!1,message:`Logged out.`,qrDataUrl:null,connected:null})),k=e=>{let t=v?.channels??{},n=v?.channelAccounts?.[e]??[],r=(0,z.jsx)(B,{channelId:e,onAfterSave:()=>void y(!0),onAfterReload:()=>void y(!0)});if(e===`whatsapp`){let n=t.whatsapp;return(0,z.jsx)(re,{whatsapp:n,login:p,onShowQr:T,onRelink:E,onWait:D,onLogout:O,onRefresh:()=>void y(!0),configSection:r},e)}return e===`telegram`?(0,z.jsx)(ne,{telegram:t.telegram,accounts:n,activeRuns:g,onProbe:()=>void y(!0),configSection:r},e):e===`nostr`?(0,z.jsx)(te,{nostr:t.nostr,accounts:n,onRefresh:()=>void y(!1),onProfilePublished:()=>void y(!0),configSection:r},e):(0,z.jsx)(W,{id:e,label:x(v,e),flags:S(v,e),extras:w(v,e),accounts:n,onProbe:()=>void y(!0),configSection:r},e)},A=v?b(v):[];return(0,z.jsxs)(`div`,{className:`ct-page`,"data-testid":`channels-view`,children:[(0,z.jsx)(`header`,{className:`ct-page__head`,children:(0,z.jsxs)(`div`,{className:`ct-page__head-text`,children:[(0,z.jsx)(`h1`,{className:`ct-page__title`,children:`Channels`}),(0,z.jsx)(`p`,{className:`ct-page__sub`,children:`Messaging channels, their connection health and per-channel configuration.`})]})}),a?(0,z.jsx)(`div`,{className:`ct-channels__callout ct-channels__callout--danger`,role:`alert`,children:a}):null,!v&&t.loading?(0,z.jsx)(o,{tone:`loading`,message:`Loading channels…`}):null,!v&&t.error?(0,z.jsx)(o,{tone:`error`,message:t.error,hint:(0,z.jsx)(c,{onClick:t.reload,children:`Retry`})}):null,v&&A.length===0?(0,z.jsx)(o,{message:`No channels are configured on this gateway.`}):null,v&&A.length>0?(0,z.jsx)(`div`,{className:`ct-channels__grid`,children:A.map(k)}):null]})}export{ae as default};
|