@sunshinelife83/hearth 1.0.0
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/LICENSE +21 -0
- package/README.md +323 -0
- package/bin/hearth-agentd.js +4 -0
- package/bin/hearth.js +4 -0
- package/bin/run-entrypoint.js +20 -0
- package/dist/agent-tools.js +738 -0
- package/dist/app-version.js +16 -0
- package/dist/apply-patch.js +402 -0
- package/dist/artifact-error.js +8 -0
- package/dist/artifact-tools.js +377 -0
- package/dist/cli-workspace.js +36 -0
- package/dist/cli.js +1086 -0
- package/dist/config-migration.js +82 -0
- package/dist/config-schema.js +136 -0
- package/dist/config.js +115 -0
- package/dist/context/context-tools.js +150 -0
- package/dist/context/repo-map.js +102 -0
- package/dist/dashboard/app.js +226 -0
- package/dist/dashboard/index.html +45 -0
- package/dist/dashboard/landing.html +57 -0
- package/dist/dashboard/styles.css +23 -0
- package/dist/dashboard.js +271 -0
- package/dist/db/client.js +29 -0
- package/dist/db/migrations.js +262 -0
- package/dist/db/schema.js +85 -0
- package/dist/device-tokens.js +61 -0
- package/dist/git-worktrees.js +134 -0
- package/dist/git.js +41 -0
- package/dist/incoming-artifacts.js +378 -0
- package/dist/local-agent-acp.js +768 -0
- package/dist/local-agent-adapters.js +20 -0
- package/dist/local-agent-availability.js +92 -0
- package/dist/local-agent-catalog.js +51 -0
- package/dist/local-agent-claude.js +334 -0
- package/dist/local-agent-client.js +519 -0
- package/dist/local-agent-codex.js +532 -0
- package/dist/local-agent-config.js +34 -0
- package/dist/local-agent-daemon-lifecycle.js +195 -0
- package/dist/local-agent-daemon-main.js +86 -0
- package/dist/local-agent-daemon-protocol.js +302 -0
- package/dist/local-agent-daemon.js +407 -0
- package/dist/local-agent-errors.js +378 -0
- package/dist/local-agent-grok.js +202 -0
- package/dist/local-agent-manager.js +715 -0
- package/dist/local-agent-opencode.js +463 -0
- package/dist/local-agent-path.js +24 -0
- package/dist/local-agent-pi-sandbox.js +472 -0
- package/dist/local-agent-pi.js +298 -0
- package/dist/local-agent-presentation.js +104 -0
- package/dist/local-agent-profiles.js +127 -0
- package/dist/local-agent-runtime-pool.js +481 -0
- package/dist/local-agent-runtime.js +1 -0
- package/dist/local-agent-store.js +193 -0
- package/dist/local-agent-targets.js +97 -0
- package/dist/logger.js +97 -0
- package/dist/machine-id.js +35 -0
- package/dist/mcp-modern-server.js +65 -0
- package/dist/oauth-provider.js +331 -0
- package/dist/oauth-store.js +144 -0
- package/dist/onboarding.js +35 -0
- package/dist/orchestration/brief.js +70 -0
- package/dist/orchestration/lanes.js +145 -0
- package/dist/orchestration/result.js +46 -0
- package/dist/orchestration/scope.js +61 -0
- package/dist/pi-tools.js +58 -0
- package/dist/policy/command-policy.js +104 -0
- package/dist/policy/env-allowlist.js +96 -0
- package/dist/policy/sandbox.js +68 -0
- package/dist/policy/workspace-profiles.js +47 -0
- package/dist/process-journal.js +116 -0
- package/dist/process-platform.js +49 -0
- package/dist/process-sessions.js +388 -0
- package/dist/rate-limit.js +77 -0
- package/dist/request-meta.js +9 -0
- package/dist/review-checkpoints.js +349 -0
- package/dist/roots.js +37 -0
- package/dist/server-shutdown.js +12 -0
- package/dist/server.js +980 -0
- package/dist/skills.js +84 -0
- package/dist/snapshot-manager.js +123 -0
- package/dist/stdio-server.js +80 -0
- package/dist/task-store.js +203 -0
- package/dist/task-tools.js +455 -0
- package/dist/tool-surfaces/claude.js +220 -0
- package/dist/tool-surfaces/codex.js +255 -0
- package/dist/tool-surfaces/index.js +15 -0
- package/dist/tool-surfaces/shared.js +228 -0
- package/dist/tool-surfaces/types.js +27 -0
- package/dist/ui/.vite/manifest.json +2544 -0
- package/dist/ui/assets/abap-CLvhMVsD.js +1 -0
- package/dist/ui/assets/actionscript-3--17pq3dv.js +1 -0
- package/dist/ui/assets/ada-C5qYipkI.js +1 -0
- package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
- package/dist/ui/assets/angular-html-DrbO3_Xe.js +1 -0
- package/dist/ui/assets/angular-ts-CmTVzHJx.js +1 -0
- package/dist/ui/assets/apache-U0d_L8uA.js +1 -0
- package/dist/ui/assets/apex-CGTLDQj6.js +1 -0
- package/dist/ui/assets/apl-BOpCpqXf.js +1 -0
- package/dist/ui/assets/applescript-CCn79oCD.js +1 -0
- package/dist/ui/assets/ara-4CJ0cIlV.js +1 -0
- package/dist/ui/assets/asciidoc-DE70LPWp.js +1 -0
- package/dist/ui/assets/asm-Cmm7eHzH.js +1 -0
- package/dist/ui/assets/astro-CxPeBwei.js +1 -0
- package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
- package/dist/ui/assets/awk-BWXHIvNe.js +1 -0
- package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
- package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/dist/ui/assets/ballerina-B7ZEbQpA.js +1 -0
- package/dist/ui/assets/bat-Bo4NYOV-.js +1 -0
- package/dist/ui/assets/beancount-D-usSTwE.js +1 -0
- package/dist/ui/assets/berry-DKpUyyne.js +1 -0
- package/dist/ui/assets/bibtex-Ci_nEsc7.js +1 -0
- package/dist/ui/assets/bicep-CUHmPFLl.js +1 -0
- package/dist/ui/assets/bird2-C2hNVINV.js +1 -0
- package/dist/ui/assets/blade-DtsAAG4P.js +1 -0
- package/dist/ui/assets/bsl-BkkzgIyY.js +1 -0
- package/dist/ui/assets/c-D9hLjNUM.js +1 -0
- package/dist/ui/assets/c3-CnJL0r0V.js +1 -0
- package/dist/ui/assets/cadence-CQ2zXKGN.js +1 -0
- package/dist/ui/assets/cairo-DLTphjLi.js +1 -0
- package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
- package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
- package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
- package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
- package/dist/ui/assets/clarity-SemFz856.js +1 -0
- package/dist/ui/assets/clojure-DqKBuwfJ.js +1 -0
- package/dist/ui/assets/cmake-Bj61d0ZC.js +1 -0
- package/dist/ui/assets/cobol-C1SWlvZm.js +1 -0
- package/dist/ui/assets/codeowners-C8r90Shi.js +1 -0
- package/dist/ui/assets/codeql-oeQT6MSM.js +1 -0
- package/dist/ui/assets/coffee-B71R3v2U.js +1 -0
- package/dist/ui/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/dist/ui/assets/coq-BrsZFFmf.js +1 -0
- package/dist/ui/assets/cpp--5a4c3v4.js +1 -0
- package/dist/ui/assets/crystal-AtqWYtE0.js +1 -0
- package/dist/ui/assets/csharp-Ct8U2NOr.js +1 -0
- package/dist/ui/assets/css-CbqKSHI-.js +1 -0
- package/dist/ui/assets/csv-Dx-8-gkx.js +1 -0
- package/dist/ui/assets/cue-CE9AQfxI.js +1 -0
- package/dist/ui/assets/cypher-ClKdZ_lG.js +1 -0
- package/dist/ui/assets/d-qD-0Kul2.js +1 -0
- package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
- package/dist/ui/assets/dart-DkHntEIa.js +1 -0
- package/dist/ui/assets/dax-BkyTk9wS.js +1 -0
- package/dist/ui/assets/desktop-Dlh5hvp9.js +1 -0
- package/dist/ui/assets/diff-woXpYk--.js +1 -0
- package/dist/ui/assets/docker-IyjqRm3v.js +1 -0
- package/dist/ui/assets/dotenv-_5a1GRtc.js +1 -0
- package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
- package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
- package/dist/ui/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/dist/ui/assets/edge-BPwY_RrJ.js +1 -0
- package/dist/ui/assets/elixir-DVH2yLJf.js +1 -0
- package/dist/ui/assets/elm-BrleA6gS.js +1 -0
- package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +1 -0
- package/dist/ui/assets/erb-2SHiYe30.js +1 -0
- package/dist/ui/assets/erlang-Cphh6RMH.js +1 -0
- package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
- package/dist/ui/assets/fennel-DQxkIbk2.js +1 -0
- package/dist/ui/assets/fish-BJitypiv.js +1 -0
- package/dist/ui/assets/fluent-C03EYrpw.js +1 -0
- package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/dist/ui/assets/fsharp-D13ZGOAj.js +1 -0
- package/dist/ui/assets/gdresource-C0sCabJj.js +1 -0
- package/dist/ui/assets/gdscript-Cp2uCuqX.js +1 -0
- package/dist/ui/assets/gdshader-CBce3t8t.js +1 -0
- package/dist/ui/assets/genie-CV2tkWYe.js +1 -0
- package/dist/ui/assets/gherkin-DExj1W_8.js +1 -0
- package/dist/ui/assets/git-commit-BSykSTBG.js +1 -0
- package/dist/ui/assets/git-rebase-Bc7atMaV.js +1 -0
- package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
- package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/dist/ui/assets/gleam-CSRkHgEL.js +1 -0
- package/dist/ui/assets/glimmer-js-DXeTDPtW.js +1 -0
- package/dist/ui/assets/glimmer-ts-CEOoXHU4.js +1 -0
- package/dist/ui/assets/glsl-5-43-Gsg.js +1 -0
- package/dist/ui/assets/gn-ilITqXS6.js +1 -0
- package/dist/ui/assets/gnuplot-7GGW24-e.js +1 -0
- package/dist/ui/assets/go-BJwz_mda.js +1 -0
- package/dist/ui/assets/graphql-Bk7Ah1KA.js +1 -0
- package/dist/ui/assets/groovy-CacY0gHj.js +1 -0
- package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/dist/ui/assets/hack-DUHz4rCJ.js +1 -0
- package/dist/ui/assets/haml-BPCuuTPR.js +1 -0
- package/dist/ui/assets/handlebars-CHxmUsnU.js +1 -0
- package/dist/ui/assets/haskell-D8IpX4py.js +1 -0
- package/dist/ui/assets/haxe-OTjmBuCE.js +1 -0
- package/dist/ui/assets/hcl-Dh228itO.js +1 -0
- package/dist/ui/assets/hjson-CxZEssPk.js +1 -0
- package/dist/ui/assets/hlsl-Cvrh5tZx.js +1 -0
- package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
- package/dist/ui/assets/horizon-bright-Br1oVSNq.js +1 -0
- package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
- package/dist/ui/assets/html-BBJqizz0.js +1 -0
- package/dist/ui/assets/html-derivative-ShTPCcKN.js +1 -0
- package/dist/ui/assets/http-VFTyziwA.js +1 -0
- package/dist/ui/assets/hurl-B8yxTa4r.js +1 -0
- package/dist/ui/assets/hxml-B0Qn7Nwc.js +1 -0
- package/dist/ui/assets/hy-CZbG8q4J.js +1 -0
- package/dist/ui/assets/imba-DsUTQ-LC.js +1 -0
- package/dist/ui/assets/ini-B5eOa1yu.js +1 -0
- package/dist/ui/assets/java-BZ5DAgJZ.js +1 -0
- package/dist/ui/assets/javascript-C_zuIEaC.js +1 -0
- package/dist/ui/assets/jinja-DWd6xfNr.js +1 -0
- package/dist/ui/assets/jison-BbY63d1V.js +1 -0
- package/dist/ui/assets/json-C4DnajZs.js +1 -0
- package/dist/ui/assets/json5-BR5RXkoi.js +1 -0
- package/dist/ui/assets/jsonc-CYpm1nAK.js +1 -0
- package/dist/ui/assets/jsonl-CmCQp5Yx.js +1 -0
- package/dist/ui/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/dist/ui/assets/jssm-DXw9l8Rf.js +1 -0
- package/dist/ui/assets/jsx-C4AACieZ.js +1 -0
- package/dist/ui/assets/julia-sRu7EFMW.js +1 -0
- package/dist/ui/assets/just-DpZ9Sx1v.js +1 -0
- package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
- package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +1 -0
- package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +1 -0
- package/dist/ui/assets/kdl-CsD5j6eV.js +1 -0
- package/dist/ui/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/ui/assets/kusto-BUv0MjJC.js +1 -0
- package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
- package/dist/ui/assets/latex-B6a_uum7.js +1 -0
- package/dist/ui/assets/lean-CewbzKMR.js +1 -0
- package/dist/ui/assets/less-DVTAwKKz.js +1 -0
- package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
- package/dist/ui/assets/liquid-B2sVpjjr.js +1 -0
- package/dist/ui/assets/llvm-Cm23YOpf.js +1 -0
- package/dist/ui/assets/log-BNLmms1o.js +1 -0
- package/dist/ui/assets/logo-Cluzi2Zq.js +1 -0
- package/dist/ui/assets/lua-DxJJll61.js +1 -0
- package/dist/ui/assets/luau-CNKltnaQ.js +1 -0
- package/dist/ui/assets/make-Dixweg8N.js +1 -0
- package/dist/ui/assets/markdown-BYOwaDjH.js +1 -0
- package/dist/ui/assets/marko-Dx8mw-Wx.js +1 -0
- package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
- package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/dist/ui/assets/matlab-D7qyCx1q.js +1 -0
- package/dist/ui/assets/mdc-vNKeXEwR.js +1 -0
- package/dist/ui/assets/mdx-DQZ5AkYe.js +1 -0
- package/dist/ui/assets/mermaid-Bk4SNUv9.js +1 -0
- package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
- package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
- package/dist/ui/assets/mipsasm-BMqwQI7S.js +1 -0
- package/dist/ui/assets/mojo-BgCJLMeH.js +1 -0
- package/dist/ui/assets/monokai-CdkpiU2Y.js +1 -0
- package/dist/ui/assets/moonbit-CaWjb8XO.js +1 -0
- package/dist/ui/assets/move-B1IS1UjX.js +1 -0
- package/dist/ui/assets/narrat-_X_XdTYD.js +1 -0
- package/dist/ui/assets/nextflow-Bbiyy34d.js +1 -0
- package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +1 -0
- package/dist/ui/assets/nginx-DScQAGLT.js +1 -0
- package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
- package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/dist/ui/assets/nim-lAJch9uT.js +1 -0
- package/dist/ui/assets/nix-IvuFDN5E.js +1 -0
- package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
- package/dist/ui/assets/nushell-DcLAeLz5.js +1 -0
- package/dist/ui/assets/objective-c-D1A_Heim.js +1 -0
- package/dist/ui/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/dist/ui/assets/ocaml-O90oeIOV.js +1 -0
- package/dist/ui/assets/odin-B1RWQWA5.js +1 -0
- package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
- package/dist/ui/assets/openscad-BUDT5pXO.js +1 -0
- package/dist/ui/assets/pascal-4ZHwLPI5.js +1 -0
- package/dist/ui/assets/perl-C_GkVo_E.js +1 -0
- package/dist/ui/assets/php-DziV3K6J.js +1 -0
- package/dist/ui/assets/pierre-dark-CpLgRqie.js +1 -0
- package/dist/ui/assets/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
- package/dist/ui/assets/pierre-dark-soft-kZQmAZld.js +1 -0
- package/dist/ui/assets/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
- package/dist/ui/assets/pierre-dark-vibrant-CpQYzh95.js +1 -0
- package/dist/ui/assets/pierre-light-CoaEpmwp.js +1 -0
- package/dist/ui/assets/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
- package/dist/ui/assets/pierre-light-soft-lWLdNTOI.js +1 -0
- package/dist/ui/assets/pierre-light-tritanopia-CEbqgOJL.js +1 -0
- package/dist/ui/assets/pierre-light-vibrant-D80Fkn33.js +1 -0
- package/dist/ui/assets/pkl-ot-7Btpt.js +1 -0
- package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
- package/dist/ui/assets/plsql-DGHpHOYJ.js +1 -0
- package/dist/ui/assets/po-BiJDBrnU.js +1 -0
- package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
- package/dist/ui/assets/polar-C7UOKdEL.js +1 -0
- package/dist/ui/assets/postcss-BXeXVLqQ.js +1 -0
- package/dist/ui/assets/powerquery-DNMTfnFr.js +1 -0
- package/dist/ui/assets/powershell-DshXNtvi.js +1 -0
- package/dist/ui/assets/prisma-BsRQq5mF.js +1 -0
- package/dist/ui/assets/prolog-iXnhIJG7.js +1 -0
- package/dist/ui/assets/proto-DB4EqR-F.js +1 -0
- package/dist/ui/assets/pug-z75UIWVK.js +1 -0
- package/dist/ui/assets/puppet-CDv2pdJW.js +1 -0
- package/dist/ui/assets/purescript-9MfHhQsQ.js +1 -0
- package/dist/ui/assets/python-gzcpVVnB.js +1 -0
- package/dist/ui/assets/qml-Cmm4coz1.js +1 -0
- package/dist/ui/assets/qmldir-DCQb3MpD.js +1 -0
- package/dist/ui/assets/qss-Fe1Jh2GI.js +1 -0
- package/dist/ui/assets/r-Brd0axBE.js +1 -0
- package/dist/ui/assets/racket-DcIDlBhZ.js +1 -0
- package/dist/ui/assets/raku-B3gFvitq.js +1 -0
- package/dist/ui/assets/razor-DSbwmoiu.js +1 -0
- package/dist/ui/assets/red-CJ3rzSJv.js +1 -0
- package/dist/ui/assets/reg-CRGYupPL.js +1 -0
- package/dist/ui/assets/regexp-Bs3Uk-pY.js +1 -0
- package/dist/ui/assets/rel-BtDbiS_P.js +1 -0
- package/dist/ui/assets/review-payload-CbwCBKB1.js +1580 -0
- package/dist/ui/assets/riscv-Ckw8ddFX.js +1 -0
- package/dist/ui/assets/ron-VUp2lXgN.js +1 -0
- package/dist/ui/assets/rose-pine-BthvhNj6.js +1 -0
- package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
- package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +1 -0
- package/dist/ui/assets/rosmsg-CAekHB0j.js +1 -0
- package/dist/ui/assets/rst-ChIyKpUC.js +1 -0
- package/dist/ui/assets/ruby-BdAmvOMO.js +1 -0
- package/dist/ui/assets/rust-Cfkwpbl8.js +1 -0
- package/dist/ui/assets/sas-DpXn8hc5.js +1 -0
- package/dist/ui/assets/sass-DXrisJhu.js +1 -0
- package/dist/ui/assets/scala-DKOlJaKm.js +1 -0
- package/dist/ui/assets/scheme-DQCgrYNe.js +1 -0
- package/dist/ui/assets/scss-atX1Uuef.js +1 -0
- package/dist/ui/assets/sdbl-bTVj8UrX.js +1 -0
- package/dist/ui/assets/shaderlab-TOUzSsQk.js +1 -0
- package/dist/ui/assets/shellscript-BqgcAeMK.js +1 -0
- package/dist/ui/assets/shellsession-DfQSMRN5.js +1 -0
- package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
- package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/dist/ui/assets/smalltalk-B16xEiuN.js +1 -0
- package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/dist/ui/assets/solarized-dark-DV17i1UV.js +1 -0
- package/dist/ui/assets/solarized-light-DSh2HLQt.js +1 -0
- package/dist/ui/assets/solidity-CKzVLygQ.js +1 -0
- package/dist/ui/assets/soy-DzP7zZTB.js +1 -0
- package/dist/ui/assets/sparql-D_iOobhT.js +1 -0
- package/dist/ui/assets/splunk-BC2Px7Mm.js +1 -0
- package/dist/ui/assets/sql-gmaLk66z.js +1 -0
- package/dist/ui/assets/ssh-config-BgfXC-Er.js +1 -0
- package/dist/ui/assets/stata-CJ0YTMcV.js +1 -0
- package/dist/ui/assets/stylus-B6D30XZt.js +1 -0
- package/dist/ui/assets/surrealql-LH7FciQz.js +1 -0
- package/dist/ui/assets/svelte-BME2PU6V.js +1 -0
- package/dist/ui/assets/swift-DonLKvLd.js +1 -0
- package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/dist/ui/assets/system-verilog-DJ5XKQeo.js +1 -0
- package/dist/ui/assets/systemd-BxMlprV5.js +1 -0
- package/dist/ui/assets/talonscript-CohzipZa.js +1 -0
- package/dist/ui/assets/tasl-DMoTqEGO.js +1 -0
- package/dist/ui/assets/tcl-CZd0xW_V.js +1 -0
- package/dist/ui/assets/templ-DHBNIfYW.js +1 -0
- package/dist/ui/assets/terraform-DswuEJGm.js +1 -0
- package/dist/ui/assets/tex-C8-kPEzO.js +1 -0
- package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/dist/ui/assets/toml-CcmNWLt0.js +1 -0
- package/dist/ui/assets/ts-tags-CiewV0vR.js +1 -0
- package/dist/ui/assets/tsv-sltzmVWM.js +1 -0
- package/dist/ui/assets/tsx-CUYPqmnq.js +1 -0
- package/dist/ui/assets/turtle-ByJddavk.js +1 -0
- package/dist/ui/assets/twig-BTkvsl0b.js +1 -0
- package/dist/ui/assets/typescript-DDQMaPwj.js +1 -0
- package/dist/ui/assets/typespec-B88KGewJ.js +1 -0
- package/dist/ui/assets/typst-DI99ib-x.js +1 -0
- package/dist/ui/assets/v-DETTlOr0.js +1 -0
- package/dist/ui/assets/vala-zf12oZj6.js +1 -0
- package/dist/ui/assets/vb-Djn5o6TS.js +1 -0
- package/dist/ui/assets/verilog-CiiDBU1e.js +1 -0
- package/dist/ui/assets/vesper-D5bVUKB1.js +1 -0
- package/dist/ui/assets/vhdl-BroJfC0k.js +1 -0
- package/dist/ui/assets/viml-DvXPmvsu.js +1 -0
- package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
- package/dist/ui/assets/vue-BH5SEWRH.js +1 -0
- package/dist/ui/assets/vue-html-BT7yeYez.js +1 -0
- package/dist/ui/assets/vue-vine-Cs5IN2rs.js +1 -0
- package/dist/ui/assets/vyper-CgoNMtux.js +1 -0
- package/dist/ui/assets/wasm-BnjxR4X6.js +1 -0
- package/dist/ui/assets/wasm-ByWQv1Qj.js +1 -0
- package/dist/ui/assets/wenyan-C8pVoKbM.js +1 -0
- package/dist/ui/assets/wgsl-BsKzXJz4.js +1 -0
- package/dist/ui/assets/wikitext-ClFFjSW2.js +1 -0
- package/dist/ui/assets/wit-DdvCle-K.js +1 -0
- package/dist/ui/assets/wolfram-DLL8P-h_.js +1 -0
- package/dist/ui/assets/workspace-app-B_BnSEHO.css +1 -0
- package/dist/ui/assets/workspace-app-DSFpnrIC.js +115 -0
- package/dist/ui/assets/xml-D3_1BEcO.js +1 -0
- package/dist/ui/assets/xsl-BBOCDn4Y.js +1 -0
- package/dist/ui/assets/yaml-lThBDT45.js +1 -0
- package/dist/ui/assets/zenscript-BnlCZFoB.js +1 -0
- package/dist/ui/assets/zig-CMLA9XwU.js +1 -0
- package/dist/ui/workspace-app.html +15 -0
- package/dist/user-config.js +228 -0
- package/dist/verification.js +74 -0
- package/dist/workspace-store.js +133 -0
- package/dist/workspaces.js +433 -0
- package/docs/adr/devspace-x-implementation-adrs.md +159 -0
- package/docs/agent-profile-schema.md +203 -0
- package/docs/artifact-exchange.md +44 -0
- package/docs/assets/devspace-logo-light.png +0 -0
- package/docs/assets/devspace-screenshot.png +0 -0
- package/docs/assets/v11-review-ui-after.png +0 -0
- package/docs/assets/v11-review-ui-before.png +0 -0
- package/docs/chatgpt-coding-workflow.md +215 -0
- package/docs/configuration.md +217 -0
- package/docs/gotchas.md +294 -0
- package/docs/local-agent-daemon.md +101 -0
- package/docs/security.md +197 -0
- package/docs/setup.md +174 -0
- package/examples/agents/claude-implementer.md +30 -0
- package/examples/agents/codex-explorer.md +27 -0
- package/examples/agents/codex-qa-tester.md +29 -0
- package/examples/agents/codex-worker.md +25 -0
- package/examples/agents/copilot-reviewer.md +25 -0
- package/examples/agents/cursor-agent-worker.md +26 -0
- package/examples/agents/grok-builder.md +10 -0
- package/examples/agents/opencode-explorer.md +27 -0
- package/examples/agents/pi-reviewer.md +27 -0
- package/package.json +102 -0
- package/schema/v1/hearth.schema.json +529 -0
- package/scripts/copy-dashboard.mjs +9 -0
- package/scripts/fix-node-pty-permissions.mjs +22 -0
- package/scripts/generate-config-schema.ts +9 -0
- package/skills/subagents/SKILL.md +57 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { matchError, Result, TaggedError, } from "better-result";
|
|
2
|
+
import { isLocalAgentProvider, } from "./local-agent-profiles.js";
|
|
3
|
+
export class AgentTargetError extends TaggedError("AgentTargetError")() {
|
|
4
|
+
}
|
|
5
|
+
export class AgentConflictError extends TaggedError("AgentConflictError")() {
|
|
6
|
+
}
|
|
7
|
+
export class AgentScopeError extends TaggedError("AgentScopeError")() {
|
|
8
|
+
}
|
|
9
|
+
export class AgentProviderUnavailableError extends TaggedError("AgentProviderUnavailableError")() {
|
|
10
|
+
}
|
|
11
|
+
export class AgentProviderCancelledError extends TaggedError("AgentProviderCancelledError")() {
|
|
12
|
+
}
|
|
13
|
+
export class AgentProviderProtocolError extends TaggedError("AgentProviderProtocolError")() {
|
|
14
|
+
}
|
|
15
|
+
export class AgentProviderExecutionError extends TaggedError("AgentProviderExecutionError")() {
|
|
16
|
+
}
|
|
17
|
+
export class AgentDaemonUnavailableError extends TaggedError("AgentDaemonUnavailableError")() {
|
|
18
|
+
}
|
|
19
|
+
export class AgentDaemonStartupError extends TaggedError("AgentDaemonStartupError")() {
|
|
20
|
+
}
|
|
21
|
+
export class AgentDaemonTimeoutError extends TaggedError("AgentDaemonTimeoutError")() {
|
|
22
|
+
}
|
|
23
|
+
export class AgentDaemonProtocolMismatchError extends TaggedError("AgentDaemonProtocolMismatchError")() {
|
|
24
|
+
}
|
|
25
|
+
export class AgentDaemonUnauthorizedError extends TaggedError("AgentDaemonUnauthorizedError")() {
|
|
26
|
+
}
|
|
27
|
+
export class AgentDaemonInvalidRequestError extends TaggedError("AgentDaemonInvalidRequestError")() {
|
|
28
|
+
}
|
|
29
|
+
export class AgentDaemonInvalidResponseError extends TaggedError("AgentDaemonInvalidResponseError")() {
|
|
30
|
+
}
|
|
31
|
+
export class AgentDaemonInternalError extends TaggedError("AgentDaemonInternalError")() {
|
|
32
|
+
}
|
|
33
|
+
export class AgentStoreError extends TaggedError("AgentStoreError")() {
|
|
34
|
+
constructor(operation, cause, message) {
|
|
35
|
+
super({
|
|
36
|
+
code: "AGENT_STORE_ERROR",
|
|
37
|
+
operation,
|
|
38
|
+
retryable: false,
|
|
39
|
+
cause,
|
|
40
|
+
message: message ?? `Subagent persistence operation failed: ${operation}.`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function isAgentProviderError(error) {
|
|
45
|
+
return AgentProviderUnavailableError.is(error)
|
|
46
|
+
|| AgentProviderCancelledError.is(error)
|
|
47
|
+
|| AgentProviderProtocolError.is(error)
|
|
48
|
+
|| AgentProviderExecutionError.is(error);
|
|
49
|
+
}
|
|
50
|
+
export function isAgentDaemonError(error) {
|
|
51
|
+
return AgentDaemonUnavailableError.is(error)
|
|
52
|
+
|| AgentDaemonStartupError.is(error)
|
|
53
|
+
|| AgentDaemonTimeoutError.is(error)
|
|
54
|
+
|| AgentDaemonProtocolMismatchError.is(error)
|
|
55
|
+
|| AgentDaemonUnauthorizedError.is(error)
|
|
56
|
+
|| AgentDaemonInvalidRequestError.is(error)
|
|
57
|
+
|| AgentDaemonInvalidResponseError.is(error)
|
|
58
|
+
|| AgentDaemonInternalError.is(error);
|
|
59
|
+
}
|
|
60
|
+
export function isLocalAgentError(error) {
|
|
61
|
+
return AgentTargetError.is(error)
|
|
62
|
+
|| AgentConflictError.is(error)
|
|
63
|
+
|| AgentScopeError.is(error)
|
|
64
|
+
|| isAgentProviderError(error)
|
|
65
|
+
|| AgentStoreError.is(error)
|
|
66
|
+
|| isAgentDaemonError(error);
|
|
67
|
+
}
|
|
68
|
+
export function toAgentErrorPayload(error) {
|
|
69
|
+
return matchError(error, {
|
|
70
|
+
AgentTargetError: targetErrorPayload,
|
|
71
|
+
AgentConflictError: conflictErrorPayload,
|
|
72
|
+
AgentScopeError: scopeErrorPayload,
|
|
73
|
+
AgentProviderUnavailableError: providerErrorPayload,
|
|
74
|
+
AgentProviderCancelledError: providerErrorPayload,
|
|
75
|
+
AgentProviderProtocolError: providerErrorPayload,
|
|
76
|
+
AgentProviderExecutionError: providerErrorPayload,
|
|
77
|
+
AgentDaemonUnavailableError: daemonErrorPayload,
|
|
78
|
+
AgentDaemonStartupError: daemonErrorPayload,
|
|
79
|
+
AgentDaemonTimeoutError: daemonErrorPayload,
|
|
80
|
+
AgentDaemonProtocolMismatchError: daemonErrorPayload,
|
|
81
|
+
AgentDaemonUnauthorizedError: daemonErrorPayload,
|
|
82
|
+
AgentDaemonInvalidRequestError: daemonErrorPayload,
|
|
83
|
+
AgentDaemonInvalidResponseError: daemonErrorPayload,
|
|
84
|
+
AgentDaemonInternalError: daemonErrorPayload,
|
|
85
|
+
AgentStoreError: storeErrorPayload,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export function agentErrorFromPayload(payload) {
|
|
89
|
+
const retryable = payload.retryable ?? false;
|
|
90
|
+
const provider = payload.provider && isLocalAgentProvider(payload.provider)
|
|
91
|
+
? payload.provider
|
|
92
|
+
: undefined;
|
|
93
|
+
switch (payload.code) {
|
|
94
|
+
case "UNKNOWN_TARGET":
|
|
95
|
+
case "AGENT_NOT_FOUND":
|
|
96
|
+
case "PROVIDER_DISABLED":
|
|
97
|
+
case "PROVIDER_NOT_CONFIGURED":
|
|
98
|
+
case "TARGET_RESOLUTION_FAILED":
|
|
99
|
+
return new AgentTargetError({
|
|
100
|
+
code: payload.code,
|
|
101
|
+
target: payload.target ?? payload.agentId ?? payload.provider ?? "unknown",
|
|
102
|
+
provider,
|
|
103
|
+
operation: payload.operation,
|
|
104
|
+
retryable,
|
|
105
|
+
message: payload.message,
|
|
106
|
+
});
|
|
107
|
+
case "AGENT_CONFLICT":
|
|
108
|
+
return new AgentConflictError({
|
|
109
|
+
code: payload.code,
|
|
110
|
+
agentId: payload.agentId,
|
|
111
|
+
operation: payload.operation ?? "request",
|
|
112
|
+
retryable,
|
|
113
|
+
message: payload.message,
|
|
114
|
+
});
|
|
115
|
+
case "WORKSPACE_MISMATCH":
|
|
116
|
+
case "WORKSPACE_NOT_ALLOWED":
|
|
117
|
+
case "WORKSPACE_SCOPE_REQUIRED":
|
|
118
|
+
return new AgentScopeError({
|
|
119
|
+
code: payload.code,
|
|
120
|
+
agentId: payload.agentId,
|
|
121
|
+
workspaceId: payload.workspaceId,
|
|
122
|
+
operation: payload.operation ?? "request",
|
|
123
|
+
retryable,
|
|
124
|
+
message: payload.message,
|
|
125
|
+
});
|
|
126
|
+
case "PROVIDER_UNAVAILABLE":
|
|
127
|
+
case "PROVIDER_CANCELLED":
|
|
128
|
+
case "PROVIDER_PROTOCOL_ERROR":
|
|
129
|
+
case "PROVIDER_EXECUTION_ERROR": {
|
|
130
|
+
if (!provider)
|
|
131
|
+
return undefined;
|
|
132
|
+
const fields = {
|
|
133
|
+
provider,
|
|
134
|
+
agentId: payload.agentId,
|
|
135
|
+
operation: payload.operation ?? "run",
|
|
136
|
+
retryable,
|
|
137
|
+
message: payload.message,
|
|
138
|
+
};
|
|
139
|
+
if (payload.code === "PROVIDER_UNAVAILABLE") {
|
|
140
|
+
return new AgentProviderUnavailableError({ code: payload.code, ...fields });
|
|
141
|
+
}
|
|
142
|
+
if (payload.code === "PROVIDER_CANCELLED") {
|
|
143
|
+
return new AgentProviderCancelledError({ code: payload.code, ...fields });
|
|
144
|
+
}
|
|
145
|
+
if (payload.code === "PROVIDER_PROTOCOL_ERROR") {
|
|
146
|
+
return new AgentProviderProtocolError({ code: payload.code, ...fields });
|
|
147
|
+
}
|
|
148
|
+
return new AgentProviderExecutionError({ code: payload.code, ...fields });
|
|
149
|
+
}
|
|
150
|
+
case "AGENT_STORE_ERROR":
|
|
151
|
+
return new AgentStoreError(payload.operation ?? "request", undefined, payload.message);
|
|
152
|
+
case "DAEMON_UNAVAILABLE":
|
|
153
|
+
return new AgentDaemonUnavailableError({
|
|
154
|
+
code: payload.code,
|
|
155
|
+
operation: payload.operation ?? "request",
|
|
156
|
+
retryable,
|
|
157
|
+
message: payload.message,
|
|
158
|
+
});
|
|
159
|
+
case "DAEMON_STARTUP_FAILURE":
|
|
160
|
+
return new AgentDaemonStartupError({
|
|
161
|
+
code: payload.code,
|
|
162
|
+
operation: payload.operation ?? "startup",
|
|
163
|
+
retryable,
|
|
164
|
+
message: payload.message,
|
|
165
|
+
});
|
|
166
|
+
case "DAEMON_TIMEOUT":
|
|
167
|
+
return new AgentDaemonTimeoutError({
|
|
168
|
+
code: payload.code,
|
|
169
|
+
operation: payload.operation ?? "request",
|
|
170
|
+
retryable,
|
|
171
|
+
message: payload.message,
|
|
172
|
+
});
|
|
173
|
+
case "DAEMON_PROTOCOL_MISMATCH":
|
|
174
|
+
return new AgentDaemonProtocolMismatchError({
|
|
175
|
+
code: payload.code,
|
|
176
|
+
operation: payload.operation ?? "hello",
|
|
177
|
+
retryable,
|
|
178
|
+
message: payload.message,
|
|
179
|
+
});
|
|
180
|
+
case "DAEMON_UNAUTHORIZED":
|
|
181
|
+
return new AgentDaemonUnauthorizedError({
|
|
182
|
+
code: payload.code,
|
|
183
|
+
operation: payload.operation ?? "request",
|
|
184
|
+
retryable,
|
|
185
|
+
message: payload.message,
|
|
186
|
+
});
|
|
187
|
+
case "DAEMON_INVALID_REQUEST":
|
|
188
|
+
return new AgentDaemonInvalidRequestError({
|
|
189
|
+
code: payload.code,
|
|
190
|
+
operation: payload.operation ?? "request",
|
|
191
|
+
retryable,
|
|
192
|
+
message: payload.message,
|
|
193
|
+
});
|
|
194
|
+
case "DAEMON_INVALID_RESPONSE":
|
|
195
|
+
return new AgentDaemonInvalidResponseError({
|
|
196
|
+
code: payload.code,
|
|
197
|
+
operation: payload.operation ?? "request",
|
|
198
|
+
retryable,
|
|
199
|
+
message: payload.message,
|
|
200
|
+
});
|
|
201
|
+
case "DAEMON_INTERNAL_ERROR":
|
|
202
|
+
return new AgentDaemonInternalError({
|
|
203
|
+
code: payload.code,
|
|
204
|
+
operation: payload.operation ?? "request",
|
|
205
|
+
retryable,
|
|
206
|
+
message: payload.message,
|
|
207
|
+
});
|
|
208
|
+
default:
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* One-line cause summary for error messages. A bare "execution failed" hides
|
|
214
|
+
* the actual provider failure from dashboards and reviewers; the bounded
|
|
215
|
+
* cause text is what makes failures diagnosable.
|
|
216
|
+
*/
|
|
217
|
+
function causeSummary(cause) {
|
|
218
|
+
const raw = cause instanceof Error ? cause.message : typeof cause === "string" ? cause : undefined;
|
|
219
|
+
if (!raw)
|
|
220
|
+
return undefined;
|
|
221
|
+
const flat = raw.replace(/\s+/g, " ").trim();
|
|
222
|
+
if (!flat)
|
|
223
|
+
return undefined;
|
|
224
|
+
return flat.length > 300 ? `${flat.slice(0, 297)}...` : flat;
|
|
225
|
+
}
|
|
226
|
+
export function providerErrorFromCause(input) {
|
|
227
|
+
if (isAgentProviderError(input.cause))
|
|
228
|
+
return input.cause;
|
|
229
|
+
if (isLocalAgentError(input.cause))
|
|
230
|
+
return undefined;
|
|
231
|
+
const unavailable = unavailableCauseKind(input.cause);
|
|
232
|
+
if (unavailable) {
|
|
233
|
+
return new AgentProviderUnavailableError({
|
|
234
|
+
code: "PROVIDER_UNAVAILABLE",
|
|
235
|
+
provider: input.provider,
|
|
236
|
+
agentId: input.agentId,
|
|
237
|
+
operation: input.operation,
|
|
238
|
+
retryable: unavailable === "transient",
|
|
239
|
+
cause: input.cause,
|
|
240
|
+
message: `${displayProvider(input.provider)} provider is unavailable.`,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (isProgrammerDefect(input.cause))
|
|
244
|
+
return undefined;
|
|
245
|
+
if (isAbortError(input.cause)) {
|
|
246
|
+
return new AgentProviderCancelledError({
|
|
247
|
+
code: "PROVIDER_CANCELLED",
|
|
248
|
+
provider: input.provider,
|
|
249
|
+
agentId: input.agentId,
|
|
250
|
+
operation: input.operation,
|
|
251
|
+
retryable: false,
|
|
252
|
+
cause: input.cause,
|
|
253
|
+
message: `${displayProvider(input.provider)} agent turn was cancelled.`,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return new AgentProviderExecutionError({
|
|
257
|
+
code: "PROVIDER_EXECUTION_ERROR",
|
|
258
|
+
provider: input.provider,
|
|
259
|
+
agentId: input.agentId,
|
|
260
|
+
operation: input.operation,
|
|
261
|
+
retryable: false,
|
|
262
|
+
cause: input.cause,
|
|
263
|
+
message: causeSummary(input.cause)
|
|
264
|
+
? `${displayProvider(input.provider)} agent execution failed: ${causeSummary(input.cause)}`
|
|
265
|
+
: `${displayProvider(input.provider)} agent execution failed.`,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
export async function captureAgentProviderResult(input) {
|
|
269
|
+
try {
|
|
270
|
+
return Result.ok(await input.run());
|
|
271
|
+
}
|
|
272
|
+
catch (cause) {
|
|
273
|
+
const error = providerErrorFromCause({
|
|
274
|
+
provider: input.provider,
|
|
275
|
+
agentId: input.agentId,
|
|
276
|
+
operation: input.operation,
|
|
277
|
+
cause,
|
|
278
|
+
});
|
|
279
|
+
if (!error)
|
|
280
|
+
throw cause;
|
|
281
|
+
return Result.err(error);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
export function isProgrammerDefect(error) {
|
|
285
|
+
if (unavailableCauseKind(error))
|
|
286
|
+
return false;
|
|
287
|
+
return error instanceof TypeError
|
|
288
|
+
|| error instanceof ReferenceError
|
|
289
|
+
|| error instanceof SyntaxError
|
|
290
|
+
|| error instanceof RangeError
|
|
291
|
+
|| (error instanceof Error && error.name === "AssertionError");
|
|
292
|
+
}
|
|
293
|
+
function isAbortError(error) {
|
|
294
|
+
return Boolean(error
|
|
295
|
+
&& typeof error === "object"
|
|
296
|
+
&& "name" in error
|
|
297
|
+
&& String(error.name) === "AbortError");
|
|
298
|
+
}
|
|
299
|
+
function unavailableCauseKind(error) {
|
|
300
|
+
const seen = new Set();
|
|
301
|
+
let current = error;
|
|
302
|
+
while (current && typeof current === "object" && !seen.has(current)) {
|
|
303
|
+
seen.add(current);
|
|
304
|
+
const code = "code" in current ? String(current.code) : "";
|
|
305
|
+
if (code === "ENOENT")
|
|
306
|
+
return "permanent";
|
|
307
|
+
if (code === "ECONNREFUSED" || code === "ENOTFOUND")
|
|
308
|
+
return "transient";
|
|
309
|
+
current = "cause" in current ? current.cause : undefined;
|
|
310
|
+
}
|
|
311
|
+
return undefined;
|
|
312
|
+
}
|
|
313
|
+
function displayProvider(provider) {
|
|
314
|
+
switch (provider) {
|
|
315
|
+
case "codex": return "Codex";
|
|
316
|
+
case "claude": return "Claude";
|
|
317
|
+
case "opencode": return "OpenCode";
|
|
318
|
+
case "pi": return "Pi";
|
|
319
|
+
case "cursor": return "Cursor";
|
|
320
|
+
case "copilot": return "Copilot";
|
|
321
|
+
case "grok": return "Grok";
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function targetErrorPayload(error) {
|
|
325
|
+
return {
|
|
326
|
+
code: error.code,
|
|
327
|
+
message: error.message,
|
|
328
|
+
retryable: error.retryable,
|
|
329
|
+
target: error.target,
|
|
330
|
+
...(error.provider ? { provider: error.provider } : {}),
|
|
331
|
+
...(error.operation ? { operation: error.operation } : {}),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
function conflictErrorPayload(error) {
|
|
335
|
+
return {
|
|
336
|
+
code: error.code,
|
|
337
|
+
message: error.message,
|
|
338
|
+
retryable: error.retryable,
|
|
339
|
+
operation: error.operation,
|
|
340
|
+
...(error.agentId ? { agentId: error.agentId } : {}),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
function scopeErrorPayload(error) {
|
|
344
|
+
return {
|
|
345
|
+
code: error.code,
|
|
346
|
+
message: error.message,
|
|
347
|
+
retryable: error.retryable,
|
|
348
|
+
operation: error.operation,
|
|
349
|
+
...(error.agentId ? { agentId: error.agentId } : {}),
|
|
350
|
+
...(error.workspaceId ? { workspaceId: error.workspaceId } : {}),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
function providerErrorPayload(error) {
|
|
354
|
+
return {
|
|
355
|
+
code: error.code,
|
|
356
|
+
message: error.message,
|
|
357
|
+
retryable: error.retryable,
|
|
358
|
+
provider: error.provider,
|
|
359
|
+
operation: error.operation,
|
|
360
|
+
...(error.agentId ? { agentId: error.agentId } : {}),
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
function daemonErrorPayload(error) {
|
|
364
|
+
return {
|
|
365
|
+
code: error.code,
|
|
366
|
+
message: error.message,
|
|
367
|
+
retryable: error.retryable,
|
|
368
|
+
operation: error.operation,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
function storeErrorPayload(error) {
|
|
372
|
+
return {
|
|
373
|
+
code: error.code,
|
|
374
|
+
message: error.message,
|
|
375
|
+
retryable: error.retryable,
|
|
376
|
+
operation: error.operation,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { AgentProviderProtocolError } from "./local-agent-errors.js";
|
|
2
|
+
export const GROK_DEFAULT_MODEL = "grok-build";
|
|
3
|
+
export const GROK_REASONING_EFFORTS = [
|
|
4
|
+
"none",
|
|
5
|
+
"minimal",
|
|
6
|
+
"low",
|
|
7
|
+
"medium",
|
|
8
|
+
"high",
|
|
9
|
+
"xhigh",
|
|
10
|
+
];
|
|
11
|
+
const COMPLETED_PROMPT_ID_LIMIT = 128;
|
|
12
|
+
/**
|
|
13
|
+
* Owns the one ordering-sensitive xAI completion bridge. Grok may resolve the
|
|
14
|
+
* standard session/prompt request or emit its private completion notification;
|
|
15
|
+
* whichever arrives first settles the turn, while duplicate and stale events
|
|
16
|
+
* are bounded and ignored.
|
|
17
|
+
*/
|
|
18
|
+
export class GrokPromptCompletionRegistry {
|
|
19
|
+
pending = new Map();
|
|
20
|
+
completedPromptIds = [];
|
|
21
|
+
wait(sessionId, promptId, timeoutMs, onTimeout) {
|
|
22
|
+
const key = promptKey(sessionId, promptId);
|
|
23
|
+
if (this.pending.has(key)) {
|
|
24
|
+
throw new Error(`Grok prompt completion is already pending: ${promptId}`);
|
|
25
|
+
}
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
const timer = setTimeout(() => {
|
|
28
|
+
this.pending.delete(key);
|
|
29
|
+
reject(onTimeout());
|
|
30
|
+
}, timeoutMs);
|
|
31
|
+
timer.unref();
|
|
32
|
+
this.pending.set(key, { sessionId, promptId, resolve, reject, timer });
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
resolve(completion) {
|
|
36
|
+
if (completion.promptId && this.completedPromptIds.includes(completion.promptId))
|
|
37
|
+
return;
|
|
38
|
+
const pending = completion.promptId
|
|
39
|
+
? this.pending.get(promptKey(completion.sessionId, completion.promptId))
|
|
40
|
+
: findPendingForSession(this.pending, completion.sessionId);
|
|
41
|
+
if (!pending)
|
|
42
|
+
return;
|
|
43
|
+
this.pending.delete(promptKey(pending.sessionId, pending.promptId));
|
|
44
|
+
clearTimeout(pending.timer);
|
|
45
|
+
this.rememberCompletedPromptId(completion.promptId ?? pending.promptId);
|
|
46
|
+
pending.resolve({ ...completion, promptId: completion.promptId ?? pending.promptId });
|
|
47
|
+
}
|
|
48
|
+
remove(sessionId, promptId) {
|
|
49
|
+
const key = promptKey(sessionId, promptId);
|
|
50
|
+
const pending = this.pending.get(key);
|
|
51
|
+
if (!pending)
|
|
52
|
+
return;
|
|
53
|
+
this.pending.delete(key);
|
|
54
|
+
clearTimeout(pending.timer);
|
|
55
|
+
}
|
|
56
|
+
rejectAll(error) {
|
|
57
|
+
const pending = Array.from(this.pending.values());
|
|
58
|
+
this.pending.clear();
|
|
59
|
+
for (const entry of pending) {
|
|
60
|
+
clearTimeout(entry.timer);
|
|
61
|
+
entry.reject(error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
markCompleted(sessionId, promptId) {
|
|
65
|
+
const key = promptKey(sessionId, promptId);
|
|
66
|
+
const pending = this.pending.get(key);
|
|
67
|
+
if (pending) {
|
|
68
|
+
this.pending.delete(key);
|
|
69
|
+
clearTimeout(pending.timer);
|
|
70
|
+
}
|
|
71
|
+
this.rememberCompletedPromptId(promptId);
|
|
72
|
+
}
|
|
73
|
+
get size() {
|
|
74
|
+
return this.pending.size;
|
|
75
|
+
}
|
|
76
|
+
rememberCompletedPromptId(promptId) {
|
|
77
|
+
if (this.completedPromptIds.includes(promptId))
|
|
78
|
+
return;
|
|
79
|
+
this.completedPromptIds.push(promptId);
|
|
80
|
+
if (this.completedPromptIds.length > COMPLETED_PROMPT_ID_LIMIT) {
|
|
81
|
+
this.completedPromptIds.splice(0, this.completedPromptIds.length - COMPLETED_PROMPT_ID_LIMIT);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export function parseGrokPromptCompletion(input) {
|
|
86
|
+
const record = asRecord(input);
|
|
87
|
+
const sessionId = directString(record?.sessionId);
|
|
88
|
+
if (!sessionId)
|
|
89
|
+
return undefined;
|
|
90
|
+
const update = asRecord(record?.update);
|
|
91
|
+
const sessionUpdate = directString(update?.sessionUpdate);
|
|
92
|
+
if (update && sessionUpdate !== "turn_completed")
|
|
93
|
+
return undefined;
|
|
94
|
+
const promptId = firstString(record?.promptId, record?.requestId, update?.promptId, update?.requestId, asRecord(record?._meta)?.promptId, asRecord(update?._meta)?.promptId);
|
|
95
|
+
if (promptId && isBackgroundPromptId(promptId))
|
|
96
|
+
return undefined;
|
|
97
|
+
return {
|
|
98
|
+
sessionId,
|
|
99
|
+
...(promptId ? { promptId } : {}),
|
|
100
|
+
...((firstString(record?.stopReason, update?.stopReason))
|
|
101
|
+
? { stopReason: firstString(record?.stopReason, update?.stopReason) }
|
|
102
|
+
: {}),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export function readGrokSessionState(value) {
|
|
106
|
+
const record = asRecord(value);
|
|
107
|
+
const response = asRecord(record?.newSessionResponse) ?? record;
|
|
108
|
+
const models = asRecord(response?.models)
|
|
109
|
+
?? asRecord(asRecord(response?._meta)?.modelState);
|
|
110
|
+
if (!models)
|
|
111
|
+
return undefined;
|
|
112
|
+
const availableModels = (readArray(models.availableModels) ?? [])
|
|
113
|
+
.map(readGrokModelInfo)
|
|
114
|
+
.filter((model) => model !== undefined);
|
|
115
|
+
return {
|
|
116
|
+
currentModelId: directString(models.currentModelId),
|
|
117
|
+
availableModels,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export function normalizeGrokModelId(value) {
|
|
121
|
+
const trimmed = value?.trim();
|
|
122
|
+
if (!trimmed)
|
|
123
|
+
return undefined;
|
|
124
|
+
return trimmed.replace(/^(?:grok|xai)\//i, "");
|
|
125
|
+
}
|
|
126
|
+
export function resolveGrokModelId(requested, state) {
|
|
127
|
+
const modelId = normalizeGrokModelId(requested);
|
|
128
|
+
if (!modelId)
|
|
129
|
+
throw grokConfigurationError("Grok model must not be empty.");
|
|
130
|
+
const available = state?.availableModels ?? [];
|
|
131
|
+
if (available.length > 0 && !available.some((model) => model.id === modelId)) {
|
|
132
|
+
throw grokConfigurationError(`Grok does not support '${modelId}'. Available models: ${available.map((model) => model.id).join(", ")}.`);
|
|
133
|
+
}
|
|
134
|
+
return modelId;
|
|
135
|
+
}
|
|
136
|
+
export function resolveGrokEffort(effort, state, modelId) {
|
|
137
|
+
const normalized = effort.trim().toLowerCase();
|
|
138
|
+
if (!isGrokReasoningEffort(normalized)) {
|
|
139
|
+
throw grokConfigurationError(`Grok reasoning effort must be one of: ${GROK_REASONING_EFFORTS.join(", ")}.`);
|
|
140
|
+
}
|
|
141
|
+
const selectedModel = state?.availableModels.find((model) => model.id === modelId);
|
|
142
|
+
const availableEfforts = selectedModel?.reasoningEfforts ?? [];
|
|
143
|
+
if (availableEfforts.length > 0 && !availableEfforts.includes(normalized)) {
|
|
144
|
+
throw grokConfigurationError(`Grok model '${modelId ?? GROK_DEFAULT_MODEL}' does not support effort '${normalized}'. Available efforts: ${availableEfforts.join(", ")}.`);
|
|
145
|
+
}
|
|
146
|
+
return normalized;
|
|
147
|
+
}
|
|
148
|
+
function grokConfigurationError(message) {
|
|
149
|
+
return new AgentProviderProtocolError({
|
|
150
|
+
code: "PROVIDER_PROTOCOL_ERROR",
|
|
151
|
+
provider: "grok",
|
|
152
|
+
operation: "configure_session",
|
|
153
|
+
retryable: false,
|
|
154
|
+
message,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
export function isGrokReasoningEffort(value) {
|
|
158
|
+
return GROK_REASONING_EFFORTS.includes(value);
|
|
159
|
+
}
|
|
160
|
+
function readGrokModelInfo(value) {
|
|
161
|
+
const record = asRecord(value);
|
|
162
|
+
const id = directString(record?.modelId) ?? directString(record?.id);
|
|
163
|
+
if (!id)
|
|
164
|
+
return undefined;
|
|
165
|
+
const modelMeta = asRecord(record?._meta);
|
|
166
|
+
const reasoningEfforts = (readArray(modelMeta?.reasoningEfforts) ?? [])
|
|
167
|
+
.flatMap((entry) => {
|
|
168
|
+
const effort = asRecord(entry);
|
|
169
|
+
return [directString(effort?.id), directString(effort?.value)].filter((value) => value !== undefined);
|
|
170
|
+
})
|
|
171
|
+
.filter((effort, index, values) => values.indexOf(effort) === index);
|
|
172
|
+
return { id, reasoningEfforts };
|
|
173
|
+
}
|
|
174
|
+
function findPendingForSession(pending, sessionId) {
|
|
175
|
+
return Array.from(pending.values()).find((entry) => entry.sessionId === sessionId);
|
|
176
|
+
}
|
|
177
|
+
function promptKey(sessionId, promptId) {
|
|
178
|
+
return `${sessionId}\u0000${promptId}`;
|
|
179
|
+
}
|
|
180
|
+
function isBackgroundPromptId(promptId) {
|
|
181
|
+
return /^(?:task|subagent|background)(?:-|_)/i.test(promptId)
|
|
182
|
+
|| /^task-completed-/i.test(promptId);
|
|
183
|
+
}
|
|
184
|
+
function firstString(...values) {
|
|
185
|
+
for (const value of values) {
|
|
186
|
+
const result = directString(value);
|
|
187
|
+
if (result)
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
function readArray(value) {
|
|
193
|
+
return Array.isArray(value) ? value : undefined;
|
|
194
|
+
}
|
|
195
|
+
function directString(value) {
|
|
196
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
197
|
+
}
|
|
198
|
+
function asRecord(value) {
|
|
199
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
200
|
+
? value
|
|
201
|
+
: undefined;
|
|
202
|
+
}
|