@agent-spaces/server 0.1.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/dist/adapters/agent-runtime-types.js +7 -0
- package/dist/adapters/agent-runtime.js +23 -0
- package/dist/adapters/claude-code-runtime/adapter-pool.js +62 -0
- package/dist/adapters/claude-code-runtime/anthropic-bridge.js +209 -0
- package/dist/adapters/claude-code-runtime/index.js +195 -0
- package/dist/adapters/claude-code-runtime/message-format.js +241 -0
- package/dist/adapters/claude-code-runtime/protocol-converter.js +332 -0
- package/dist/adapters/claude-code-runtime/sdk-config.js +178 -0
- package/dist/adapters/claude-code-runtime/types.js +11 -0
- package/dist/adapters/codex-runtime.js +514 -0
- package/dist/adapters/git.js +335 -0
- package/dist/adapters/open-agent-sdk-runtime.js +87 -0
- package/dist/agents/agent-context.js +6 -0
- package/dist/agents/agent-message-parts.js +513 -0
- package/dist/agents/commit-agent.js +214 -0
- package/dist/agents/issue-agent-progress.js +112 -0
- package/dist/agents/issue-agent-runner.js +38 -0
- package/dist/agents/issue-task-controller.js +494 -0
- package/dist/agents/planner-agent.js +154 -0
- package/dist/agents/reviewer-agent.js +169 -0
- package/dist/agents/scheduler-agent.js +52 -0
- package/dist/app.js +133 -0
- package/dist/hooks/agent-hooks.js +19 -0
- package/dist/install.sh +84 -0
- package/dist/middleware/auth.js +19 -0
- package/dist/package.json +47 -0
- package/dist/routes/agent.js +87 -0
- package/dist/routes/auth.js +30 -0
- package/dist/routes/channel.js +131 -0
- package/dist/routes/file.js +110 -0
- package/dist/routes/folder.js +101 -0
- package/dist/routes/git.js +153 -0
- package/dist/routes/issue.js +208 -0
- package/dist/routes/llm.js +113 -0
- package/dist/routes/task.js +110 -0
- package/dist/routes/workspace.js +196 -0
- package/dist/services/agent.js +638 -0
- package/dist/services/auth-store.js +22 -0
- package/dist/services/builtin-tools.js +184 -0
- package/dist/services/channel.js +90 -0
- package/dist/services/file.js +89 -0
- package/dist/services/issue-comment.js +54 -0
- package/dist/services/issue-retry.js +59 -0
- package/dist/services/issue.js +197 -0
- package/dist/services/llm-model-config.js +16 -0
- package/dist/services/message.js +70 -0
- package/dist/services/notification-hub/bot-agent.js +87 -0
- package/dist/services/notification-hub/bot-commands.js +360 -0
- package/dist/services/notification-hub/events.js +96 -0
- package/dist/services/notification-hub/format.js +34 -0
- package/dist/services/notification-hub/helpers.js +72 -0
- package/dist/services/notification-hub/index.js +7 -0
- package/dist/services/notification-hub/lark-adapter.js +110 -0
- package/dist/services/notification-hub/lark-api.js +40 -0
- package/dist/services/notification-hub/service.js +80 -0
- package/dist/services/notification-hub/types.js +31 -0
- package/dist/services/notification-hub/wechat-adapter.js +126 -0
- package/dist/services/notification-hub/wechat-api.js +212 -0
- package/dist/services/pty.js +52 -0
- package/dist/services/task.js +131 -0
- package/dist/services/tool-detail.js +19 -0
- package/dist/services/workspace-prompt.js +25 -0
- package/dist/services/workspace.js +74 -0
- package/dist/storage/agent-store.js +326 -0
- package/dist/storage/issue-store.js +39 -0
- package/dist/storage/json-store.js +24 -0
- package/dist/storage/llm-store.js +79 -0
- package/dist/storage/task-store.js +38 -0
- package/dist/storage/usage.js +28 -0
- package/dist/storage/workspace-store.js +35 -0
- package/dist/web/404.html +1 -0
- package/dist/web/__next.__PAGE__.txt +9 -0
- package/dist/web/__next._full.txt +28 -0
- package/dist/web/__next._head.txt +6 -0
- package/dist/web/__next._index.txt +10 -0
- package/dist/web/__next._tree.txt +8 -0
- package/dist/web/_next/static/chunks/0-oog4zg4_m~m.css +5 -0
- package/dist/web/_next/static/chunks/0202ia13sijwb.js +1 -0
- package/dist/web/_next/static/chunks/031c~uxc3ie87.js +1 -0
- package/dist/web/_next/static/chunks/038whpa0zpnas.js +1 -0
- package/dist/web/_next/static/chunks/03~yq9q893hmn.js +1 -0
- package/dist/web/_next/static/chunks/06q5go~xoz5a3.js +1 -0
- package/dist/web/_next/static/chunks/095.wizobwtyg.js +2 -0
- package/dist/web/_next/static/chunks/0bfg.w~u-83h5.js +1 -0
- package/dist/web/_next/static/chunks/0ce7i6~sb20rv.js +113 -0
- package/dist/web/_next/static/chunks/0d4~pcva1uk-a.js +1 -0
- package/dist/web/_next/static/chunks/0iq70n_u75nyu.js +1 -0
- package/dist/web/_next/static/chunks/0memz-8zsbxpu.js +1 -0
- package/dist/web/_next/static/chunks/0nw~w.3~twebx.js +2 -0
- package/dist/web/_next/static/chunks/0pyytgz~5vt0f.js +31 -0
- package/dist/web/_next/static/chunks/0ujjcrz~1nq.q.css +1 -0
- package/dist/web/_next/static/chunks/0vdnx9n41dyjl.js +1 -0
- package/dist/web/_next/static/chunks/0yl4mqmxtll6g.js +1 -0
- package/dist/web/_next/static/chunks/0zcbfka5tcle3.js +1 -0
- package/dist/web/_next/static/chunks/0~eo58u99i.fr.js +8 -0
- package/dist/web/_next/static/chunks/13_2vxyccsv84.js +4 -0
- package/dist/web/_next/static/chunks/13wfs~urgxu0w.js +1 -0
- package/dist/web/_next/static/chunks/157~3c6wqkt83.js +1 -0
- package/dist/web/_next/static/chunks/15jvow_z4uq-..js +1 -0
- package/dist/web/_next/static/chunks/15v697nf~r-cy.js +2 -0
- package/dist/web/_next/static/chunks/168ojsxhm7ypc.js +1 -0
- package/dist/web/_next/static/chunks/17oc2l.ekcs8b.css +1 -0
- package/dist/web/_next/static/chunks/turbopack-164~7ulq9o9yc.js +1 -0
- package/dist/web/_next/static/media/0a7740363b4d4863-s.1110aazvokzp..woff2 +0 -0
- package/dist/web/_next/static/media/0da9c7f357bd9d4d-s.0ek5sshv8wk3m.woff2 +0 -0
- package/dist/web/_next/static/media/1b99372b3eaef0c8-s.p.0gx2haw2tmll8.woff2 +0 -0
- package/dist/web/_next/static/media/41e95f694c5c4549-s.0r1jrq7neqdsq.woff2 +0 -0
- package/dist/web/_next/static/media/5c285b27cdda1fe8-s.p.0yo6-5yoeeudq.woff2 +0 -0
- package/dist/web/_next/static/media/5f9d24ebef5d5292-s.0esuu2f5si~v8.woff2 +0 -0
- package/dist/web/_next/static/media/6c55a692938ebbbc-s.0g6rbszwfgn9y.woff2 +0 -0
- package/dist/web/_next/static/media/8e6fa89aa22d24ec-s.p.0uvzar8hswo3p.woff2 +0 -0
- package/dist/web/_next/static/media/a218039a3287bcfd-s.p.17-1enzs_j91b.woff2 +0 -0
- package/dist/web/_next/static/media/b2ea385cb5ae8625-s.0kjod.kaq1k69.woff2 +0 -0
- package/dist/web/_next/static/media/bdc7e24a509eb931-s.0apt5mko2.qn3.woff2 +0 -0
- package/dist/web/_next/static/media/c3cb240f9c892514-s.163v2i5cux7-c.woff2 +0 -0
- package/dist/web/_next/static/media/e2334d715941921e-s.p.12skym0rqknxy.woff2 +0 -0
- package/dist/web/_next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
- package/dist/web/_next/static/owMnKmxATbtXK_J_k_uHh/_buildManifest.js +21 -0
- package/dist/web/_next/static/owMnKmxATbtXK_J_k_uHh/_clientMiddlewareManifest.js +6 -0
- package/dist/web/_next/static/owMnKmxATbtXK_J_k_uHh/_ssgManifest.js +1 -0
- package/dist/web/_not-found/__next._full.txt +21 -0
- package/dist/web/_not-found/__next._head.txt +6 -0
- package/dist/web/_not-found/__next._index.txt +10 -0
- package/dist/web/_not-found/__next._not-found.__PAGE__.txt +5 -0
- package/dist/web/_not-found/__next._not-found.txt +5 -0
- package/dist/web/_not-found/__next._tree.txt +3 -0
- package/dist/web/_not-found.html +1 -0
- package/dist/web/_not-found.txt +21 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/file.svg +1 -0
- package/dist/web/globe.svg +1 -0
- package/dist/web/icons/default_file.svg +1 -0
- package/dist/web/icons/default_folder.svg +1 -0
- package/dist/web/icons/default_folder_opened.svg +1 -0
- package/dist/web/icons/default_root_folder.svg +1 -0
- package/dist/web/icons/default_root_folder_opened.svg +1 -0
- package/dist/web/icons/file_type_access.svg +1 -0
- package/dist/web/icons/file_type_access2.svg +1 -0
- package/dist/web/icons/file_type_actionscript.svg +1 -0
- package/dist/web/icons/file_type_actionscript2.svg +1 -0
- package/dist/web/icons/file_type_ada.svg +1 -0
- package/dist/web/icons/file_type_advpl.svg +1 -0
- package/dist/web/icons/file_type_affectscript.svg +1 -0
- package/dist/web/icons/file_type_affinitydesigner.svg +1 -0
- package/dist/web/icons/file_type_affinityphoto.svg +1 -0
- package/dist/web/icons/file_type_affinitypublisher.svg +1 -0
- package/dist/web/icons/file_type_ai.svg +1 -0
- package/dist/web/icons/file_type_ai2.svg +1 -0
- package/dist/web/icons/file_type_al.svg +1 -0
- package/dist/web/icons/file_type_angular.svg +1 -0
- package/dist/web/icons/file_type_ansible.svg +1 -0
- package/dist/web/icons/file_type_antlr.svg +1 -0
- package/dist/web/icons/file_type_anyscript.svg +1 -0
- package/dist/web/icons/file_type_apache.svg +1 -0
- package/dist/web/icons/file_type_apex.svg +1 -0
- package/dist/web/icons/file_type_api_extractor.svg +1 -0
- package/dist/web/icons/file_type_apib.svg +1 -0
- package/dist/web/icons/file_type_apib2.svg +1 -0
- package/dist/web/icons/file_type_apl.svg +1 -0
- package/dist/web/icons/file_type_applescript.svg +1 -0
- package/dist/web/icons/file_type_appsemble.svg +1 -0
- package/dist/web/icons/file_type_appveyor.svg +1 -0
- package/dist/web/icons/file_type_arduino.svg +1 -0
- package/dist/web/icons/file_type_asciidoc.svg +1 -0
- package/dist/web/icons/file_type_asp.svg +1 -0
- package/dist/web/icons/file_type_aspx.svg +1 -0
- package/dist/web/icons/file_type_assembly.svg +1 -0
- package/dist/web/icons/file_type_astro.svg +1 -0
- package/dist/web/icons/file_type_astroconfig.svg +1 -0
- package/dist/web/icons/file_type_ats.svg +1 -0
- package/dist/web/icons/file_type_audio.svg +1 -0
- package/dist/web/icons/file_type_aurelia.svg +1 -0
- package/dist/web/icons/file_type_autohotkey.svg +1 -0
- package/dist/web/icons/file_type_autoit.svg +1 -0
- package/dist/web/icons/file_type_avif.svg +1 -0
- package/dist/web/icons/file_type_avro.svg +1 -0
- package/dist/web/icons/file_type_awk.svg +1 -0
- package/dist/web/icons/file_type_aws.svg +1 -0
- package/dist/web/icons/file_type_azure.svg +1 -0
- package/dist/web/icons/file_type_azurepipelines.svg +1 -0
- package/dist/web/icons/file_type_babel.svg +1 -0
- package/dist/web/icons/file_type_babel2.svg +1 -0
- package/dist/web/icons/file_type_ballerina.svg +1 -0
- package/dist/web/icons/file_type_bat.svg +1 -0
- package/dist/web/icons/file_type_bats.svg +1 -0
- package/dist/web/icons/file_type_bazaar.svg +1 -0
- package/dist/web/icons/file_type_bazel.svg +1 -0
- package/dist/web/icons/file_type_befunge.svg +1 -0
- package/dist/web/icons/file_type_bicep.svg +1 -0
- package/dist/web/icons/file_type_biml.svg +1 -0
- package/dist/web/icons/file_type_binary.svg +1 -0
- package/dist/web/icons/file_type_bitbucketpipeline.svg +1 -0
- package/dist/web/icons/file_type_bithound.svg +1 -0
- package/dist/web/icons/file_type_blade.svg +1 -0
- package/dist/web/icons/file_type_blitzbasic.svg +1 -0
- package/dist/web/icons/file_type_bolt.svg +1 -0
- package/dist/web/icons/file_type_bosque.svg +1 -0
- package/dist/web/icons/file_type_bower.svg +1 -0
- package/dist/web/icons/file_type_bower2.svg +1 -0
- package/dist/web/icons/file_type_browserslist.svg +1 -0
- package/dist/web/icons/file_type_buckbuild.svg +1 -0
- package/dist/web/icons/file_type_bundler.svg +1 -0
- package/dist/web/icons/file_type_c.svg +1 -0
- package/dist/web/icons/file_type_c2.svg +1 -0
- package/dist/web/icons/file_type_c3.svg +1 -0
- package/dist/web/icons/file_type_c_al.svg +1 -0
- package/dist/web/icons/file_type_cabal.svg +1 -0
- package/dist/web/icons/file_type_caddy.svg +1 -0
- package/dist/web/icons/file_type_cake.svg +1 -0
- package/dist/web/icons/file_type_cakephp.svg +1 -0
- package/dist/web/icons/file_type_capacitor.svg +1 -0
- package/dist/web/icons/file_type_cargo.svg +1 -0
- package/dist/web/icons/file_type_casc.svg +1 -0
- package/dist/web/icons/file_type_cddl.svg +1 -0
- package/dist/web/icons/file_type_cert.svg +1 -0
- package/dist/web/icons/file_type_ceylon.svg +1 -0
- package/dist/web/icons/file_type_cf.svg +1 -0
- package/dist/web/icons/file_type_cf2.svg +1 -0
- package/dist/web/icons/file_type_cfc.svg +1 -0
- package/dist/web/icons/file_type_cfc2.svg +1 -0
- package/dist/web/icons/file_type_cfm.svg +1 -0
- package/dist/web/icons/file_type_cfm2.svg +1 -0
- package/dist/web/icons/file_type_cheader.svg +1 -0
- package/dist/web/icons/file_type_chef.svg +1 -0
- package/dist/web/icons/file_type_chef_cookbook.svg +1 -0
- package/dist/web/icons/file_type_circleci.svg +1 -0
- package/dist/web/icons/file_type_class.svg +1 -0
- package/dist/web/icons/file_type_clojure.svg +1 -0
- package/dist/web/icons/file_type_clojurescript.svg +1 -0
- package/dist/web/icons/file_type_cloudfoundry.svg +1 -0
- package/dist/web/icons/file_type_cmake.svg +1 -0
- package/dist/web/icons/file_type_cobol.svg +1 -0
- package/dist/web/icons/file_type_codacy.svg +1 -0
- package/dist/web/icons/file_type_codeclimate.svg +1 -0
- package/dist/web/icons/file_type_codecov.svg +1 -0
- package/dist/web/icons/file_type_codekit.svg +1 -0
- package/dist/web/icons/file_type_codeql.svg +1 -0
- package/dist/web/icons/file_type_coffeelint.svg +1 -0
- package/dist/web/icons/file_type_coffeescript.svg +1 -0
- package/dist/web/icons/file_type_commitlint.svg +1 -0
- package/dist/web/icons/file_type_compass.svg +1 -0
- package/dist/web/icons/file_type_composer.svg +1 -0
- package/dist/web/icons/file_type_conan.svg +1 -0
- package/dist/web/icons/file_type_conda.svg +1 -0
- package/dist/web/icons/file_type_config.svg +1 -0
- package/dist/web/icons/file_type_confluence.svg +1 -0
- package/dist/web/icons/file_type_coveralls.svg +1 -0
- package/dist/web/icons/file_type_cpp.svg +1 -0
- package/dist/web/icons/file_type_cpp2.svg +1 -0
- package/dist/web/icons/file_type_cpp3.svg +1 -0
- package/dist/web/icons/file_type_cppheader.svg +1 -0
- package/dist/web/icons/file_type_crowdin.svg +1 -0
- package/dist/web/icons/file_type_crystal.svg +1 -0
- package/dist/web/icons/file_type_csharp.svg +1 -0
- package/dist/web/icons/file_type_csharp2.svg +1 -0
- package/dist/web/icons/file_type_csproj.svg +1 -0
- package/dist/web/icons/file_type_css.svg +1 -0
- package/dist/web/icons/file_type_csscomb.svg +1 -0
- package/dist/web/icons/file_type_csslint.svg +1 -0
- package/dist/web/icons/file_type_cssmap.svg +1 -0
- package/dist/web/icons/file_type_cucumber.svg +1 -0
- package/dist/web/icons/file_type_cuda.svg +1 -0
- package/dist/web/icons/file_type_cvs.svg +1 -0
- package/dist/web/icons/file_type_cypress.svg +1 -0
- package/dist/web/icons/file_type_cython.svg +1 -0
- package/dist/web/icons/file_type_dal.svg +1 -0
- package/dist/web/icons/file_type_darcs.svg +1 -0
- package/dist/web/icons/file_type_dartlang.svg +1 -0
- package/dist/web/icons/file_type_db.svg +1 -0
- package/dist/web/icons/file_type_delphi.svg +1 -0
- package/dist/web/icons/file_type_dependabot.svg +1 -0
- package/dist/web/icons/file_type_dependencies.svg +1 -0
- package/dist/web/icons/file_type_devcontainer.svg +1 -0
- package/dist/web/icons/file_type_diff.svg +1 -0
- package/dist/web/icons/file_type_django.svg +1 -0
- package/dist/web/icons/file_type_dlang.svg +1 -0
- package/dist/web/icons/file_type_docker.svg +1 -0
- package/dist/web/icons/file_type_docker2.svg +1 -0
- package/dist/web/icons/file_type_dockertest.svg +1 -0
- package/dist/web/icons/file_type_dockertest2.svg +1 -0
- package/dist/web/icons/file_type_docpad.svg +1 -0
- package/dist/web/icons/file_type_docz.svg +1 -0
- package/dist/web/icons/file_type_dojo.svg +1 -0
- package/dist/web/icons/file_type_dotjs.svg +1 -0
- package/dist/web/icons/file_type_doxygen.svg +1 -0
- package/dist/web/icons/file_type_drawio.svg +1 -0
- package/dist/web/icons/file_type_drone.svg +1 -0
- package/dist/web/icons/file_type_drools.svg +1 -0
- package/dist/web/icons/file_type_dustjs.svg +1 -0
- package/dist/web/icons/file_type_dvc.svg +1 -0
- package/dist/web/icons/file_type_dylan.svg +1 -0
- package/dist/web/icons/file_type_edge.svg +1 -0
- package/dist/web/icons/file_type_edge2.svg +1 -0
- package/dist/web/icons/file_type_editorconfig.svg +1 -0
- package/dist/web/icons/file_type_eex.svg +1 -0
- package/dist/web/icons/file_type_ejs.svg +1 -0
- package/dist/web/icons/file_type_elastic.svg +1 -0
- package/dist/web/icons/file_type_elasticbeanstalk.svg +1 -0
- package/dist/web/icons/file_type_elixir.svg +1 -0
- package/dist/web/icons/file_type_elm.svg +1 -0
- package/dist/web/icons/file_type_elm2.svg +1 -0
- package/dist/web/icons/file_type_emacs.svg +1 -0
- package/dist/web/icons/file_type_ember.svg +1 -0
- package/dist/web/icons/file_type_ensime.svg +1 -0
- package/dist/web/icons/file_type_eps.svg +1 -0
- package/dist/web/icons/file_type_erb.svg +1 -0
- package/dist/web/icons/file_type_erlang.svg +1 -0
- package/dist/web/icons/file_type_erlang2.svg +1 -0
- package/dist/web/icons/file_type_eslint.svg +1 -0
- package/dist/web/icons/file_type_eslint2.svg +1 -0
- package/dist/web/icons/file_type_excel.svg +1 -0
- package/dist/web/icons/file_type_excel2.svg +1 -0
- package/dist/web/icons/file_type_expo.svg +1 -0
- package/dist/web/icons/file_type_falcon.svg +1 -0
- package/dist/web/icons/file_type_fauna.svg +1 -0
- package/dist/web/icons/file_type_favicon.svg +1 -0
- package/dist/web/icons/file_type_fbx.svg +1 -0
- package/dist/web/icons/file_type_firebase.svg +1 -0
- package/dist/web/icons/file_type_firebasehosting.svg +1 -0
- package/dist/web/icons/file_type_firestore.svg +1 -0
- package/dist/web/icons/file_type_fla.svg +1 -0
- package/dist/web/icons/file_type_flash.svg +1 -0
- package/dist/web/icons/file_type_floobits.svg +1 -0
- package/dist/web/icons/file_type_flow.svg +1 -0
- package/dist/web/icons/file_type_flutter.svg +1 -0
- package/dist/web/icons/file_type_flutter_package.svg +1 -0
- package/dist/web/icons/file_type_font.svg +1 -0
- package/dist/web/icons/file_type_fortran.svg +1 -0
- package/dist/web/icons/file_type_fossa.svg +1 -0
- package/dist/web/icons/file_type_fossil.svg +1 -0
- package/dist/web/icons/file_type_freemarker.svg +1 -0
- package/dist/web/icons/file_type_fsharp.svg +1 -0
- package/dist/web/icons/file_type_fsharp2.svg +1 -0
- package/dist/web/icons/file_type_fsproj.svg +1 -0
- package/dist/web/icons/file_type_fthtml.svg +1 -0
- package/dist/web/icons/file_type_fusebox.svg +1 -0
- package/dist/web/icons/file_type_galen.svg +1 -0
- package/dist/web/icons/file_type_galen2.svg +1 -0
- package/dist/web/icons/file_type_gamemaker.svg +1 -0
- package/dist/web/icons/file_type_gamemaker2.svg +1 -0
- package/dist/web/icons/file_type_gamemaker81.svg +1 -0
- package/dist/web/icons/file_type_gatsby.svg +1 -0
- package/dist/web/icons/file_type_gcode.svg +1 -0
- package/dist/web/icons/file_type_genstat.svg +1 -0
- package/dist/web/icons/file_type_git.svg +1 -0
- package/dist/web/icons/file_type_git2.svg +1 -0
- package/dist/web/icons/file_type_gitlab.svg +1 -0
- package/dist/web/icons/file_type_gitpod.svg +1 -0
- package/dist/web/icons/file_type_glide.svg +1 -0
- package/dist/web/icons/file_type_glitter.svg +1 -0
- package/dist/web/icons/file_type_glsl.svg +1 -0
- package/dist/web/icons/file_type_glyphs.svg +1 -0
- package/dist/web/icons/file_type_gnuplot.svg +1 -0
- package/dist/web/icons/file_type_go.svg +1 -0
- package/dist/web/icons/file_type_go_aqua.svg +1 -0
- package/dist/web/icons/file_type_go_black.svg +1 -0
- package/dist/web/icons/file_type_go_fuchsia.svg +1 -0
- package/dist/web/icons/file_type_go_gopher.svg +1 -0
- package/dist/web/icons/file_type_go_lightblue.svg +1 -0
- package/dist/web/icons/file_type_go_package.svg +1 -0
- package/dist/web/icons/file_type_go_white.svg +1 -0
- package/dist/web/icons/file_type_go_yellow.svg +1 -0
- package/dist/web/icons/file_type_godot.svg +1 -0
- package/dist/web/icons/file_type_gradle.svg +1 -0
- package/dist/web/icons/file_type_gradle2.svg +1 -0
- package/dist/web/icons/file_type_graphql.svg +1 -0
- package/dist/web/icons/file_type_graphql_config.svg +1 -0
- package/dist/web/icons/file_type_graphviz.svg +1 -0
- package/dist/web/icons/file_type_greenkeeper.svg +1 -0
- package/dist/web/icons/file_type_gridsome.svg +1 -0
- package/dist/web/icons/file_type_groovy.svg +1 -0
- package/dist/web/icons/file_type_groovy2.svg +1 -0
- package/dist/web/icons/file_type_grunt.svg +1 -0
- package/dist/web/icons/file_type_gulp.svg +1 -0
- package/dist/web/icons/file_type_haml.svg +1 -0
- package/dist/web/icons/file_type_handlebars.svg +1 -0
- package/dist/web/icons/file_type_handlebars2.svg +1 -0
- package/dist/web/icons/file_type_harbour.svg +1 -0
- package/dist/web/icons/file_type_haskell.svg +1 -0
- package/dist/web/icons/file_type_haskell2.svg +1 -0
- package/dist/web/icons/file_type_haxe.svg +1 -0
- package/dist/web/icons/file_type_haxecheckstyle.svg +1 -0
- package/dist/web/icons/file_type_haxedevelop.svg +1 -0
- package/dist/web/icons/file_type_helix.svg +1 -0
- package/dist/web/icons/file_type_helm.svg +1 -0
- package/dist/web/icons/file_type_hjson.svg +1 -0
- package/dist/web/icons/file_type_hlsl.svg +1 -0
- package/dist/web/icons/file_type_homeassistant.svg +1 -0
- package/dist/web/icons/file_type_horusec.svg +1 -0
- package/dist/web/icons/file_type_host.svg +1 -0
- package/dist/web/icons/file_type_html.svg +1 -0
- package/dist/web/icons/file_type_htmlhint.svg +1 -0
- package/dist/web/icons/file_type_http.svg +1 -0
- package/dist/web/icons/file_type_hunspell.svg +1 -0
- package/dist/web/icons/file_type_husky.svg +1 -0
- package/dist/web/icons/file_type_hy.svg +1 -0
- package/dist/web/icons/file_type_hygen.svg +1 -0
- package/dist/web/icons/file_type_hypr.svg +1 -0
- package/dist/web/icons/file_type_icl.svg +1 -0
- package/dist/web/icons/file_type_idris.svg +1 -0
- package/dist/web/icons/file_type_idrisbin.svg +1 -0
- package/dist/web/icons/file_type_idrispkg.svg +1 -0
- package/dist/web/icons/file_type_image.svg +1 -0
- package/dist/web/icons/file_type_imba.svg +1 -0
- package/dist/web/icons/file_type_inc.svg +1 -0
- package/dist/web/icons/file_type_infopath.svg +1 -0
- package/dist/web/icons/file_type_informix.svg +1 -0
- package/dist/web/icons/file_type_ini.svg +1 -0
- package/dist/web/icons/file_type_ink.svg +1 -0
- package/dist/web/icons/file_type_innosetup.svg +1 -0
- package/dist/web/icons/file_type_io.svg +1 -0
- package/dist/web/icons/file_type_iodine.svg +1 -0
- package/dist/web/icons/file_type_ionic.svg +1 -0
- package/dist/web/icons/file_type_jake.svg +1 -0
- package/dist/web/icons/file_type_janet.svg +1 -0
- package/dist/web/icons/file_type_jar.svg +1 -0
- package/dist/web/icons/file_type_jasmine.svg +1 -0
- package/dist/web/icons/file_type_java.svg +1 -0
- package/dist/web/icons/file_type_jbuilder.svg +1 -0
- package/dist/web/icons/file_type_jekyll.svg +1 -0
- package/dist/web/icons/file_type_jenkins.svg +1 -0
- package/dist/web/icons/file_type_jest.svg +1 -0
- package/dist/web/icons/file_type_jest_snapshot.svg +1 -0
- package/dist/web/icons/file_type_jinja.svg +1 -0
- package/dist/web/icons/file_type_jpm.svg +1 -0
- package/dist/web/icons/file_type_js.svg +1 -0
- package/dist/web/icons/file_type_js_official.svg +1 -0
- package/dist/web/icons/file_type_jsbeautify.svg +1 -0
- package/dist/web/icons/file_type_jsconfig.svg +1 -0
- package/dist/web/icons/file_type_jscpd.svg +1 -0
- package/dist/web/icons/file_type_jshint.svg +1 -0
- package/dist/web/icons/file_type_jsmap.svg +1 -0
- package/dist/web/icons/file_type_json.svg +1 -0
- package/dist/web/icons/file_type_json2.svg +1 -0
- package/dist/web/icons/file_type_json5.svg +1 -0
- package/dist/web/icons/file_type_json_official.svg +1 -0
- package/dist/web/icons/file_type_jsonld.svg +1 -0
- package/dist/web/icons/file_type_jsonnet.svg +1 -0
- package/dist/web/icons/file_type_jsp.svg +1 -0
- package/dist/web/icons/file_type_jss.svg +1 -0
- package/dist/web/icons/file_type_julia.svg +1 -0
- package/dist/web/icons/file_type_julia2.svg +1 -0
- package/dist/web/icons/file_type_jupyter.svg +1 -0
- package/dist/web/icons/file_type_karma.svg +1 -0
- package/dist/web/icons/file_type_key.svg +1 -0
- package/dist/web/icons/file_type_kitchenci.svg +1 -0
- package/dist/web/icons/file_type_kite.svg +1 -0
- package/dist/web/icons/file_type_kivy.svg +1 -0
- package/dist/web/icons/file_type_kos.svg +1 -0
- package/dist/web/icons/file_type_kotlin.svg +1 -0
- package/dist/web/icons/file_type_kusto.svg +1 -0
- package/dist/web/icons/file_type_latino.svg +1 -0
- package/dist/web/icons/file_type_layout.svg +1 -0
- package/dist/web/icons/file_type_lerna.svg +1 -0
- package/dist/web/icons/file_type_less.svg +1 -0
- package/dist/web/icons/file_type_lex.svg +1 -0
- package/dist/web/icons/file_type_license.svg +1 -0
- package/dist/web/icons/file_type_licensebat.svg +1 -0
- package/dist/web/icons/file_type_light_actionscript2.svg +1 -0
- package/dist/web/icons/file_type_light_ada.svg +1 -0
- package/dist/web/icons/file_type_light_apl.svg +1 -0
- package/dist/web/icons/file_type_light_babel.svg +1 -0
- package/dist/web/icons/file_type_light_babel2.svg +1 -0
- package/dist/web/icons/file_type_light_cabal.svg +1 -0
- package/dist/web/icons/file_type_light_circleci.svg +1 -0
- package/dist/web/icons/file_type_light_cloudfoundry.svg +1 -0
- package/dist/web/icons/file_type_light_codacy.svg +1 -0
- package/dist/web/icons/file_type_light_codeclimate.svg +1 -0
- package/dist/web/icons/file_type_light_config.svg +1 -0
- package/dist/web/icons/file_type_light_crystal.svg +1 -0
- package/dist/web/icons/file_type_light_db.svg +1 -0
- package/dist/web/icons/file_type_light_docpad.svg +1 -0
- package/dist/web/icons/file_type_light_drone.svg +1 -0
- package/dist/web/icons/file_type_light_expo.svg +1 -0
- package/dist/web/icons/file_type_light_firebasehosting.svg +1 -0
- package/dist/web/icons/file_type_light_fla.svg +1 -0
- package/dist/web/icons/file_type_light_font.svg +1 -0
- package/dist/web/icons/file_type_light_gamemaker2.svg +1 -0
- package/dist/web/icons/file_type_light_gradle.svg +1 -0
- package/dist/web/icons/file_type_light_hjson.svg +1 -0
- package/dist/web/icons/file_type_light_ini.svg +1 -0
- package/dist/web/icons/file_type_light_io.svg +1 -0
- package/dist/web/icons/file_type_light_js.svg +1 -0
- package/dist/web/icons/file_type_light_jsconfig.svg +1 -0
- package/dist/web/icons/file_type_light_jsmap.svg +1 -0
- package/dist/web/icons/file_type_light_json.svg +1 -0
- package/dist/web/icons/file_type_light_json5.svg +1 -0
- package/dist/web/icons/file_type_light_jsonld.svg +1 -0
- package/dist/web/icons/file_type_light_kite.svg +1 -0
- package/dist/web/icons/file_type_light_lerna.svg +1 -0
- package/dist/web/icons/file_type_light_mdx.svg +1 -0
- package/dist/web/icons/file_type_light_mlang.svg +1 -0
- package/dist/web/icons/file_type_light_mustache.svg +1 -0
- package/dist/web/icons/file_type_light_next.svg +1 -0
- package/dist/web/icons/file_type_light_nim.svg +1 -0
- package/dist/web/icons/file_type_light_openHAB.svg +1 -0
- package/dist/web/icons/file_type_light_pcl.svg +1 -0
- package/dist/web/icons/file_type_light_pnpm.svg +1 -0
- package/dist/web/icons/file_type_light_prettier.svg +1 -0
- package/dist/web/icons/file_type_light_prisma.svg +1 -0
- package/dist/web/icons/file_type_light_purescript.svg +1 -0
- package/dist/web/icons/file_type_light_razzle.svg +1 -0
- package/dist/web/icons/file_type_light_rehype.svg +1 -0
- package/dist/web/icons/file_type_light_remark.svg +1 -0
- package/dist/web/icons/file_type_light_retext.svg +1 -0
- package/dist/web/icons/file_type_light_rubocop.svg +1 -0
- package/dist/web/icons/file_type_light_rust.svg +1 -0
- package/dist/web/icons/file_type_light_rust_toolchain.svg +1 -0
- package/dist/web/icons/file_type_light_shaderlab.svg +1 -0
- package/dist/web/icons/file_type_light_solidity.svg +1 -0
- package/dist/web/icons/file_type_light_stylelint.svg +1 -0
- package/dist/web/icons/file_type_light_stylus.svg +1 -0
- package/dist/web/icons/file_type_light_symfony.svg +1 -0
- package/dist/web/icons/file_type_light_systemd.svg +1 -0
- package/dist/web/icons/file_type_light_systemverilog.svg +1 -0
- package/dist/web/icons/file_type_light_testcafe.svg +1 -0
- package/dist/web/icons/file_type_light_testjs.svg +1 -0
- package/dist/web/icons/file_type_light_tex.svg +1 -0
- package/dist/web/icons/file_type_light_todo.svg +1 -0
- package/dist/web/icons/file_type_light_toml.svg +1 -0
- package/dist/web/icons/file_type_light_unibeautify.svg +1 -0
- package/dist/web/icons/file_type_light_vash.svg +1 -0
- package/dist/web/icons/file_type_light_vsix.svg +1 -0
- package/dist/web/icons/file_type_light_vsixmanifest.svg +1 -0
- package/dist/web/icons/file_type_light_xfl.svg +1 -0
- package/dist/web/icons/file_type_light_yaml.svg +1 -0
- package/dist/web/icons/file_type_light_zeit.svg +1 -0
- package/dist/web/icons/file_type_lighthouse.svg +1 -0
- package/dist/web/icons/file_type_lime.svg +1 -0
- package/dist/web/icons/file_type_lintstagedrc.svg +1 -0
- package/dist/web/icons/file_type_liquid.svg +1 -0
- package/dist/web/icons/file_type_lisp.svg +1 -0
- package/dist/web/icons/file_type_livescript.svg +1 -0
- package/dist/web/icons/file_type_lnk.svg +1 -0
- package/dist/web/icons/file_type_locale.svg +1 -0
- package/dist/web/icons/file_type_log.svg +1 -0
- package/dist/web/icons/file_type_lolcode.svg +1 -0
- package/dist/web/icons/file_type_lsl.svg +1 -0
- package/dist/web/icons/file_type_lua.svg +1 -0
- package/dist/web/icons/file_type_lync.svg +1 -0
- package/dist/web/icons/file_type_makefile.svg +1 -0
- package/dist/web/icons/file_type_manifest.svg +1 -0
- package/dist/web/icons/file_type_manifest_bak.svg +1 -0
- package/dist/web/icons/file_type_manifest_skip.svg +1 -0
- package/dist/web/icons/file_type_map.svg +1 -0
- package/dist/web/icons/file_type_mariadb.svg +1 -0
- package/dist/web/icons/file_type_markdown.svg +1 -0
- package/dist/web/icons/file_type_markdownlint.svg +1 -0
- package/dist/web/icons/file_type_marko.svg +1 -0
- package/dist/web/icons/file_type_markojs.svg +1 -0
- package/dist/web/icons/file_type_matlab.png +0 -0
- package/dist/web/icons/file_type_matlab.svg +1 -0
- package/dist/web/icons/file_type_maven.svg +1 -0
- package/dist/web/icons/file_type_maxscript.svg +1 -0
- package/dist/web/icons/file_type_maya.svg +1 -0
- package/dist/web/icons/file_type_mdx.svg +1 -0
- package/dist/web/icons/file_type_mediawiki.svg +1 -0
- package/dist/web/icons/file_type_mercurial.svg +1 -0
- package/dist/web/icons/file_type_meson.svg +1 -0
- package/dist/web/icons/file_type_meteor.svg +1 -0
- package/dist/web/icons/file_type_mjml.svg +1 -0
- package/dist/web/icons/file_type_mlang.svg +1 -0
- package/dist/web/icons/file_type_mocha.svg +1 -0
- package/dist/web/icons/file_type_modernizr.svg +1 -0
- package/dist/web/icons/file_type_mojolicious.svg +1 -0
- package/dist/web/icons/file_type_moleculer.svg +1 -0
- package/dist/web/icons/file_type_mongo.svg +1 -0
- package/dist/web/icons/file_type_monotone.svg +1 -0
- package/dist/web/icons/file_type_mson.svg +1 -0
- package/dist/web/icons/file_type_mustache.svg +1 -0
- package/dist/web/icons/file_type_mysql.svg +1 -0
- package/dist/web/icons/file_type_nearly.svg +1 -0
- package/dist/web/icons/file_type_nest_adapter_js.svg +1 -0
- package/dist/web/icons/file_type_nest_adapter_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_controller_js.svg +1 -0
- package/dist/web/icons/file_type_nest_controller_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_decorator_js.svg +1 -0
- package/dist/web/icons/file_type_nest_decorator_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_filter_js.svg +1 -0
- package/dist/web/icons/file_type_nest_filter_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_gateway_js.svg +1 -0
- package/dist/web/icons/file_type_nest_gateway_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_guard_js.svg +1 -0
- package/dist/web/icons/file_type_nest_guard_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_interceptor_js.svg +1 -0
- package/dist/web/icons/file_type_nest_interceptor_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_middleware_js.svg +1 -0
- package/dist/web/icons/file_type_nest_middleware_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_module_js.svg +1 -0
- package/dist/web/icons/file_type_nest_module_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_pipe_js.svg +1 -0
- package/dist/web/icons/file_type_nest_pipe_ts.svg +1 -0
- package/dist/web/icons/file_type_nest_service_js.svg +1 -0
- package/dist/web/icons/file_type_nest_service_ts.svg +1 -0
- package/dist/web/icons/file_type_nestjs.svg +1 -0
- package/dist/web/icons/file_type_netlify.svg +1 -0
- package/dist/web/icons/file_type_next.svg +1 -0
- package/dist/web/icons/file_type_ng_component_css.svg +1 -0
- package/dist/web/icons/file_type_ng_component_dart.svg +1 -0
- package/dist/web/icons/file_type_ng_component_html.svg +1 -0
- package/dist/web/icons/file_type_ng_component_js.svg +1 -0
- package/dist/web/icons/file_type_ng_component_js2.svg +1 -0
- package/dist/web/icons/file_type_ng_component_less.svg +1 -0
- package/dist/web/icons/file_type_ng_component_sass.svg +1 -0
- package/dist/web/icons/file_type_ng_component_scss.svg +1 -0
- package/dist/web/icons/file_type_ng_component_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_component_ts2.svg +1 -0
- package/dist/web/icons/file_type_ng_controller_js.svg +1 -0
- package/dist/web/icons/file_type_ng_controller_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_directive_dart.svg +1 -0
- package/dist/web/icons/file_type_ng_directive_js.svg +1 -0
- package/dist/web/icons/file_type_ng_directive_js2.svg +1 -0
- package/dist/web/icons/file_type_ng_directive_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_directive_ts2.svg +1 -0
- package/dist/web/icons/file_type_ng_guard_dart.svg +1 -0
- package/dist/web/icons/file_type_ng_guard_js.svg +1 -0
- package/dist/web/icons/file_type_ng_guard_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_interceptor_dart.svg +1 -0
- package/dist/web/icons/file_type_ng_interceptor_js.svg +1 -0
- package/dist/web/icons/file_type_ng_interceptor_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_module_dart.svg +1 -0
- package/dist/web/icons/file_type_ng_module_js.svg +1 -0
- package/dist/web/icons/file_type_ng_module_js2.svg +1 -0
- package/dist/web/icons/file_type_ng_module_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_module_ts2.svg +1 -0
- package/dist/web/icons/file_type_ng_pipe_dart.svg +1 -0
- package/dist/web/icons/file_type_ng_pipe_js.svg +1 -0
- package/dist/web/icons/file_type_ng_pipe_js2.svg +1 -0
- package/dist/web/icons/file_type_ng_pipe_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_pipe_ts2.svg +1 -0
- package/dist/web/icons/file_type_ng_routing_dart.svg +1 -0
- package/dist/web/icons/file_type_ng_routing_js.svg +1 -0
- package/dist/web/icons/file_type_ng_routing_js2.svg +1 -0
- package/dist/web/icons/file_type_ng_routing_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_routing_ts2.svg +1 -0
- package/dist/web/icons/file_type_ng_service_dart.svg +1 -0
- package/dist/web/icons/file_type_ng_service_js.svg +1 -0
- package/dist/web/icons/file_type_ng_service_js2.svg +1 -0
- package/dist/web/icons/file_type_ng_service_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_service_ts2.svg +1 -0
- package/dist/web/icons/file_type_ng_smart_component_dart.svg +1 -0
- package/dist/web/icons/file_type_ng_smart_component_js.svg +1 -0
- package/dist/web/icons/file_type_ng_smart_component_js2.svg +1 -0
- package/dist/web/icons/file_type_ng_smart_component_ts.svg +1 -0
- package/dist/web/icons/file_type_ng_smart_component_ts2.svg +1 -0
- package/dist/web/icons/file_type_ng_tailwind.svg +1 -0
- package/dist/web/icons/file_type_nginx.svg +1 -0
- package/dist/web/icons/file_type_nim.svg +1 -0
- package/dist/web/icons/file_type_nimble.svg +1 -0
- package/dist/web/icons/file_type_ninja.svg +1 -0
- package/dist/web/icons/file_type_nix.svg +1 -0
- package/dist/web/icons/file_type_njsproj.svg +1 -0
- package/dist/web/icons/file_type_node.svg +1 -0
- package/dist/web/icons/file_type_node2.svg +1 -0
- package/dist/web/icons/file_type_nodemon.svg +1 -0
- package/dist/web/icons/file_type_npm.svg +1 -0
- package/dist/web/icons/file_type_nsi.svg +1 -0
- package/dist/web/icons/file_type_nsri-integrity.svg +1 -0
- package/dist/web/icons/file_type_nsri.svg +1 -0
- package/dist/web/icons/file_type_nuget.svg +1 -0
- package/dist/web/icons/file_type_numpy.svg +1 -0
- package/dist/web/icons/file_type_nunjucks.svg +1 -0
- package/dist/web/icons/file_type_nuxt.svg +1 -0
- package/dist/web/icons/file_type_nyc.svg +1 -0
- package/dist/web/icons/file_type_objectivec.svg +1 -0
- package/dist/web/icons/file_type_objectivecpp.svg +1 -0
- package/dist/web/icons/file_type_ocaml.svg +1 -0
- package/dist/web/icons/file_type_ogone.svg +1 -0
- package/dist/web/icons/file_type_onenote.svg +1 -0
- package/dist/web/icons/file_type_openHAB.svg +1 -0
- package/dist/web/icons/file_type_opencl.svg +1 -0
- package/dist/web/icons/file_type_openscad.svg +1 -0
- package/dist/web/icons/file_type_org.svg +1 -0
- package/dist/web/icons/file_type_outlook.svg +1 -0
- package/dist/web/icons/file_type_ovpn.svg +1 -0
- package/dist/web/icons/file_type_package.svg +1 -0
- package/dist/web/icons/file_type_paket.svg +1 -0
- package/dist/web/icons/file_type_patch.svg +1 -0
- package/dist/web/icons/file_type_pcl.svg +1 -0
- package/dist/web/icons/file_type_pddl.svg +1 -0
- package/dist/web/icons/file_type_pddl_happenings.svg +1 -0
- package/dist/web/icons/file_type_pddl_plan.svg +1 -0
- package/dist/web/icons/file_type_pdf.svg +1 -0
- package/dist/web/icons/file_type_pdf2.svg +1 -0
- package/dist/web/icons/file_type_perl.svg +1 -0
- package/dist/web/icons/file_type_perl2.svg +1 -0
- package/dist/web/icons/file_type_perl6.svg +1 -0
- package/dist/web/icons/file_type_pgsql.svg +1 -0
- package/dist/web/icons/file_type_photoshop.svg +1 -0
- package/dist/web/icons/file_type_photoshop2.svg +1 -0
- package/dist/web/icons/file_type_php.svg +1 -0
- package/dist/web/icons/file_type_php2.svg +1 -0
- package/dist/web/icons/file_type_php3.svg +1 -0
- package/dist/web/icons/file_type_phpcsfixer.svg +1 -0
- package/dist/web/icons/file_type_phpunit.svg +1 -0
- package/dist/web/icons/file_type_phraseapp.svg +1 -0
- package/dist/web/icons/file_type_pine.svg +1 -0
- package/dist/web/icons/file_type_pip.svg +1 -0
- package/dist/web/icons/file_type_pipeline.svg +3 -0
- package/dist/web/icons/file_type_plantuml.svg +1 -0
- package/dist/web/icons/file_type_platformio.svg +1 -0
- package/dist/web/icons/file_type_plsql.svg +1 -0
- package/dist/web/icons/file_type_plsql_package.svg +1 -0
- package/dist/web/icons/file_type_plsql_package_body.svg +1 -0
- package/dist/web/icons/file_type_plsql_package_header.svg +1 -0
- package/dist/web/icons/file_type_plsql_package_spec.svg +1 -0
- package/dist/web/icons/file_type_pnpm.svg +1 -0
- package/dist/web/icons/file_type_poedit.svg +1 -0
- package/dist/web/icons/file_type_polymer.svg +1 -0
- package/dist/web/icons/file_type_pony.svg +1 -0
- package/dist/web/icons/file_type_postcss.svg +1 -0
- package/dist/web/icons/file_type_postcssconfig.svg +1 -0
- package/dist/web/icons/file_type_powerpoint.svg +1 -0
- package/dist/web/icons/file_type_powerpoint2.svg +1 -0
- package/dist/web/icons/file_type_powershell.svg +1 -0
- package/dist/web/icons/file_type_powershell2.svg +1 -0
- package/dist/web/icons/file_type_powershell_format.svg +1 -0
- package/dist/web/icons/file_type_powershell_psd.svg +1 -0
- package/dist/web/icons/file_type_powershell_psd2.svg +1 -0
- package/dist/web/icons/file_type_powershell_psm.svg +1 -0
- package/dist/web/icons/file_type_powershell_psm2.svg +1 -0
- package/dist/web/icons/file_type_powershell_types.svg +1 -0
- package/dist/web/icons/file_type_preact.svg +1 -0
- package/dist/web/icons/file_type_precommit.svg +1 -0
- package/dist/web/icons/file_type_prettier.svg +1 -0
- package/dist/web/icons/file_type_prisma.svg +1 -0
- package/dist/web/icons/file_type_processinglang.svg +1 -0
- package/dist/web/icons/file_type_procfile.svg +1 -0
- package/dist/web/icons/file_type_progress.svg +1 -0
- package/dist/web/icons/file_type_prolog.svg +1 -0
- package/dist/web/icons/file_type_prometheus.svg +1 -0
- package/dist/web/icons/file_type_protobuf.svg +1 -0
- package/dist/web/icons/file_type_protractor.svg +1 -0
- package/dist/web/icons/file_type_publisher.svg +1 -0
- package/dist/web/icons/file_type_pug.svg +1 -0
- package/dist/web/icons/file_type_puppet.svg +1 -0
- package/dist/web/icons/file_type_purescript.svg +1 -0
- package/dist/web/icons/file_type_pyret.svg +1 -0
- package/dist/web/icons/file_type_python.svg +1 -0
- package/dist/web/icons/file_type_pytyped.svg +1 -0
- package/dist/web/icons/file_type_pyup.svg +1 -0
- package/dist/web/icons/file_type_q.svg +1 -0
- package/dist/web/icons/file_type_qbs.svg +1 -0
- package/dist/web/icons/file_type_qlikview.svg +1 -0
- package/dist/web/icons/file_type_qml.svg +1 -0
- package/dist/web/icons/file_type_qmldir.svg +1 -0
- package/dist/web/icons/file_type_qsharp.svg +1 -0
- package/dist/web/icons/file_type_quasar.svg +1 -0
- package/dist/web/icons/file_type_r.svg +1 -0
- package/dist/web/icons/file_type_racket.svg +1 -0
- package/dist/web/icons/file_type_rails.svg +1 -0
- package/dist/web/icons/file_type_rake.svg +1 -0
- package/dist/web/icons/file_type_raml.svg +1 -0
- package/dist/web/icons/file_type_razor.svg +1 -0
- package/dist/web/icons/file_type_razzle.svg +1 -0
- package/dist/web/icons/file_type_reactjs.svg +1 -0
- package/dist/web/icons/file_type_reacttemplate.svg +1 -0
- package/dist/web/icons/file_type_reactts.svg +1 -0
- package/dist/web/icons/file_type_reason.svg +1 -0
- package/dist/web/icons/file_type_red.svg +1 -0
- package/dist/web/icons/file_type_registry.svg +1 -0
- package/dist/web/icons/file_type_rego.svg +1 -0
- package/dist/web/icons/file_type_rehype.svg +1 -0
- package/dist/web/icons/file_type_remark.svg +1 -0
- package/dist/web/icons/file_type_renovate.svg +1 -0
- package/dist/web/icons/file_type_rescript.svg +1 -0
- package/dist/web/icons/file_type_rest.svg +1 -0
- package/dist/web/icons/file_type_retext.svg +1 -0
- package/dist/web/icons/file_type_rexx.svg +1 -0
- package/dist/web/icons/file_type_riot.svg +1 -0
- package/dist/web/icons/file_type_rmd.svg +1 -0
- package/dist/web/icons/file_type_robotframework.svg +1 -0
- package/dist/web/icons/file_type_robots.svg +1 -0
- package/dist/web/icons/file_type_rollup.svg +1 -0
- package/dist/web/icons/file_type_rproj.svg +1 -0
- package/dist/web/icons/file_type_rspec.svg +1 -0
- package/dist/web/icons/file_type_rubocop.svg +1 -0
- package/dist/web/icons/file_type_ruby.svg +1 -0
- package/dist/web/icons/file_type_rust.svg +1 -0
- package/dist/web/icons/file_type_rust_toolchain.svg +1 -0
- package/dist/web/icons/file_type_sails.svg +1 -0
- package/dist/web/icons/file_type_saltstack.svg +1 -0
- package/dist/web/icons/file_type_san.svg +1 -0
- package/dist/web/icons/file_type_sas.svg +1 -0
- package/dist/web/icons/file_type_sass.svg +1 -0
- package/dist/web/icons/file_type_sbt.svg +1 -0
- package/dist/web/icons/file_type_scala.svg +1 -0
- package/dist/web/icons/file_type_scilab.svg +1 -0
- package/dist/web/icons/file_type_script.svg +1 -0
- package/dist/web/icons/file_type_scss.svg +1 -0
- package/dist/web/icons/file_type_scss2.svg +1 -0
- package/dist/web/icons/file_type_sdlang.svg +1 -0
- package/dist/web/icons/file_type_sentry.svg +1 -0
- package/dist/web/icons/file_type_sequelize.svg +1 -0
- package/dist/web/icons/file_type_serverless.svg +1 -0
- package/dist/web/icons/file_type_shaderlab.svg +1 -0
- package/dist/web/icons/file_type_shell.svg +1 -0
- package/dist/web/icons/file_type_silverstripe.svg +1 -0
- package/dist/web/icons/file_type_sketch.svg +1 -0
- package/dist/web/icons/file_type_skipper.svg +1 -0
- package/dist/web/icons/file_type_slang.svg +1 -0
- package/dist/web/icons/file_type_slice.svg +1 -0
- package/dist/web/icons/file_type_slim.svg +1 -0
- package/dist/web/icons/file_type_sln.svg +1 -0
- package/dist/web/icons/file_type_sln2.svg +1 -0
- package/dist/web/icons/file_type_smarty.svg +1 -0
- package/dist/web/icons/file_type_snapcraft.svg +1 -0
- package/dist/web/icons/file_type_snort.svg +1 -0
- package/dist/web/icons/file_type_snyk.svg +1 -0
- package/dist/web/icons/file_type_solidarity.svg +1 -0
- package/dist/web/icons/file_type_solidity.svg +1 -0
- package/dist/web/icons/file_type_source.svg +1 -0
- package/dist/web/icons/file_type_spacengine.svg +1 -0
- package/dist/web/icons/file_type_sparql.svg +1 -0
- package/dist/web/icons/file_type_sqf.svg +1 -0
- package/dist/web/icons/file_type_sql.svg +1 -0
- package/dist/web/icons/file_type_sqlite.svg +1 -0
- package/dist/web/icons/file_type_squirrel.svg +1 -0
- package/dist/web/icons/file_type_sss.svg +1 -0
- package/dist/web/icons/file_type_stan.svg +1 -0
- package/dist/web/icons/file_type_stata.svg +1 -0
- package/dist/web/icons/file_type_stencil.svg +1 -0
- package/dist/web/icons/file_type_storyboard.svg +1 -0
- package/dist/web/icons/file_type_storybook.svg +1 -0
- package/dist/web/icons/file_type_stylable.svg +1 -0
- package/dist/web/icons/file_type_style.svg +1 -0
- package/dist/web/icons/file_type_styled.svg +1 -0
- package/dist/web/icons/file_type_stylelint.svg +1 -0
- package/dist/web/icons/file_type_stylish_haskell.svg +1 -0
- package/dist/web/icons/file_type_stylus.svg +1 -0
- package/dist/web/icons/file_type_subversion.svg +1 -0
- package/dist/web/icons/file_type_svelte.svg +1 -0
- package/dist/web/icons/file_type_svg.svg +1 -0
- package/dist/web/icons/file_type_swagger.svg +1 -0
- package/dist/web/icons/file_type_swift.svg +1 -0
- package/dist/web/icons/file_type_swig.svg +1 -0
- package/dist/web/icons/file_type_symfony.svg +1 -0
- package/dist/web/icons/file_type_systemd.svg +1 -0
- package/dist/web/icons/file_type_systemverilog.svg +1 -0
- package/dist/web/icons/file_type_t4tt.svg +1 -0
- package/dist/web/icons/file_type_tailwind.svg +1 -0
- package/dist/web/icons/file_type_tcl.svg +1 -0
- package/dist/web/icons/file_type_teal.svg +1 -0
- package/dist/web/icons/file_type_tera.svg +1 -0
- package/dist/web/icons/file_type_terraform.svg +1 -0
- package/dist/web/icons/file_type_test.svg +1 -0
- package/dist/web/icons/file_type_testcafe.svg +1 -0
- package/dist/web/icons/file_type_testjs.svg +1 -0
- package/dist/web/icons/file_type_testts.svg +1 -0
- package/dist/web/icons/file_type_tex.svg +1 -0
- package/dist/web/icons/file_type_text.svg +1 -0
- package/dist/web/icons/file_type_textile.svg +1 -0
- package/dist/web/icons/file_type_tfs.svg +1 -0
- package/dist/web/icons/file_type_tiltfile.svg +1 -0
- package/dist/web/icons/file_type_todo.svg +1 -0
- package/dist/web/icons/file_type_toml.svg +1 -0
- package/dist/web/icons/file_type_tox.svg +1 -0
- package/dist/web/icons/file_type_travis.svg +1 -0
- package/dist/web/icons/file_type_tsconfig.svg +1 -0
- package/dist/web/icons/file_type_tsconfig_official.svg +1 -0
- package/dist/web/icons/file_type_tslint.svg +1 -0
- package/dist/web/icons/file_type_tt.svg +1 -0
- package/dist/web/icons/file_type_ttcn.svg +1 -0
- package/dist/web/icons/file_type_tuc.svg +1 -0
- package/dist/web/icons/file_type_twig.svg +1 -0
- package/dist/web/icons/file_type_typedoc.svg +1 -0
- package/dist/web/icons/file_type_typescript.svg +1 -0
- package/dist/web/icons/file_type_typescript_official.svg +1 -0
- package/dist/web/icons/file_type_typescriptdef.svg +1 -0
- package/dist/web/icons/file_type_typescriptdef_official.svg +1 -0
- package/dist/web/icons/file_type_typo3.svg +1 -0
- package/dist/web/icons/file_type_unibeautify.svg +1 -0
- package/dist/web/icons/file_type_unlicense.svg +1 -0
- package/dist/web/icons/file_type_vagrant.svg +1 -0
- package/dist/web/icons/file_type_vala.svg +1 -0
- package/dist/web/icons/file_type_vapi.svg +1 -0
- package/dist/web/icons/file_type_vapor.svg +1 -0
- package/dist/web/icons/file_type_vash.svg +1 -0
- package/dist/web/icons/file_type_vb.svg +1 -0
- package/dist/web/icons/file_type_vba.svg +1 -0
- package/dist/web/icons/file_type_vbhtml.svg +1 -0
- package/dist/web/icons/file_type_vbproj.svg +1 -0
- package/dist/web/icons/file_type_vcxproj.svg +1 -0
- package/dist/web/icons/file_type_velocity.svg +1 -0
- package/dist/web/icons/file_type_verilog.svg +1 -0
- package/dist/web/icons/file_type_vhdl.svg +1 -0
- package/dist/web/icons/file_type_video.svg +1 -0
- package/dist/web/icons/file_type_view.svg +1 -0
- package/dist/web/icons/file_type_vim.svg +1 -0
- package/dist/web/icons/file_type_vite.svg +1 -0
- package/dist/web/icons/file_type_vlang.svg +1 -0
- package/dist/web/icons/file_type_volt.svg +1 -0
- package/dist/web/icons/file_type_vscode-insiders.svg +1 -0
- package/dist/web/icons/file_type_vscode.svg +1 -0
- package/dist/web/icons/file_type_vscode2.svg +1 -0
- package/dist/web/icons/file_type_vscode3.svg +1 -0
- package/dist/web/icons/file_type_vsix.svg +1 -0
- package/dist/web/icons/file_type_vsixmanifest.svg +1 -0
- package/dist/web/icons/file_type_vue.svg +1 -0
- package/dist/web/icons/file_type_vueconfig.svg +1 -0
- package/dist/web/icons/file_type_wallaby.svg +1 -0
- package/dist/web/icons/file_type_wasm.svg +1 -0
- package/dist/web/icons/file_type_watchmanconfig.svg +1 -0
- package/dist/web/icons/file_type_webp.svg +1 -0
- package/dist/web/icons/file_type_webpack.svg +1 -0
- package/dist/web/icons/file_type_wenyan.svg +1 -0
- package/dist/web/icons/file_type_wercker.svg +1 -0
- package/dist/web/icons/file_type_wolfram.svg +1 -0
- package/dist/web/icons/file_type_word.svg +1 -0
- package/dist/web/icons/file_type_word2.svg +1 -0
- package/dist/web/icons/file_type_wpml.svg +1 -0
- package/dist/web/icons/file_type_wurst.svg +1 -0
- package/dist/web/icons/file_type_wxml.svg +1 -0
- package/dist/web/icons/file_type_wxss.svg +1 -0
- package/dist/web/icons/file_type_xcode.svg +1 -0
- package/dist/web/icons/file_type_xfl.svg +1 -0
- package/dist/web/icons/file_type_xib.svg +1 -0
- package/dist/web/icons/file_type_xliff.svg +1 -0
- package/dist/web/icons/file_type_xmake.svg +1 -0
- package/dist/web/icons/file_type_xml.svg +1 -0
- package/dist/web/icons/file_type_xquery.svg +1 -0
- package/dist/web/icons/file_type_xsl.svg +1 -0
- package/dist/web/icons/file_type_yacc.svg +1 -0
- package/dist/web/icons/file_type_yaml.svg +1 -0
- package/dist/web/icons/file_type_yamllint.svg +1 -0
- package/dist/web/icons/file_type_yandex.svg +1 -0
- package/dist/web/icons/file_type_yang.svg +1 -0
- package/dist/web/icons/file_type_yarn.svg +1 -0
- package/dist/web/icons/file_type_yeoman.svg +1 -0
- package/dist/web/icons/file_type_zeit.svg +1 -0
- package/dist/web/icons/file_type_zig.svg +1 -0
- package/dist/web/icons/file_type_zip.svg +1 -0
- package/dist/web/icons/file_type_zip2.svg +1 -0
- package/dist/web/icons/folder_type_android.svg +1 -0
- package/dist/web/icons/folder_type_android_opened.svg +1 -0
- package/dist/web/icons/folder_type_api.svg +1 -0
- package/dist/web/icons/folder_type_api_opened.svg +1 -0
- package/dist/web/icons/folder_type_app.svg +1 -0
- package/dist/web/icons/folder_type_app_opened.svg +1 -0
- package/dist/web/icons/folder_type_arangodb.svg +1 -0
- package/dist/web/icons/folder_type_arangodb_opened.svg +1 -0
- package/dist/web/icons/folder_type_asset.svg +1 -0
- package/dist/web/icons/folder_type_asset_opened.svg +1 -0
- package/dist/web/icons/folder_type_audio.svg +1 -0
- package/dist/web/icons/folder_type_audio_opened.svg +1 -0
- package/dist/web/icons/folder_type_aurelia.svg +1 -0
- package/dist/web/icons/folder_type_aurelia_opened.svg +1 -0
- package/dist/web/icons/folder_type_aws.svg +1 -0
- package/dist/web/icons/folder_type_aws_opened.svg +1 -0
- package/dist/web/icons/folder_type_azure.svg +1 -0
- package/dist/web/icons/folder_type_azure_opened.svg +1 -0
- package/dist/web/icons/folder_type_azurepipelines.svg +1 -0
- package/dist/web/icons/folder_type_azurepipelines_opened.svg +1 -0
- package/dist/web/icons/folder_type_binary.svg +1 -0
- package/dist/web/icons/folder_type_binary_opened.svg +1 -0
- package/dist/web/icons/folder_type_bloc.svg +1 -0
- package/dist/web/icons/folder_type_bloc_opened.svg +1 -0
- package/dist/web/icons/folder_type_blueprint.svg +1 -0
- package/dist/web/icons/folder_type_blueprint_opened.svg +1 -0
- package/dist/web/icons/folder_type_bower.svg +1 -0
- package/dist/web/icons/folder_type_bower_opened.svg +1 -0
- package/dist/web/icons/folder_type_buildkite.svg +1 -0
- package/dist/web/icons/folder_type_buildkite_opened.svg +1 -0
- package/dist/web/icons/folder_type_cake.svg +1 -0
- package/dist/web/icons/folder_type_cake_opened.svg +1 -0
- package/dist/web/icons/folder_type_certificate.svg +1 -0
- package/dist/web/icons/folder_type_certificate_opened.svg +1 -0
- package/dist/web/icons/folder_type_chef.svg +1 -0
- package/dist/web/icons/folder_type_chef_opened.svg +1 -0
- package/dist/web/icons/folder_type_circleci.svg +1 -0
- package/dist/web/icons/folder_type_circleci_opened.svg +1 -0
- package/dist/web/icons/folder_type_cli.svg +1 -0
- package/dist/web/icons/folder_type_cli_opened.svg +1 -0
- package/dist/web/icons/folder_type_client.svg +1 -0
- package/dist/web/icons/folder_type_client_opened.svg +1 -0
- package/dist/web/icons/folder_type_cmake.svg +1 -0
- package/dist/web/icons/folder_type_cmake_opened.svg +1 -0
- package/dist/web/icons/folder_type_component.svg +1 -0
- package/dist/web/icons/folder_type_component_opened.svg +1 -0
- package/dist/web/icons/folder_type_composer.svg +1 -0
- package/dist/web/icons/folder_type_composer_opened.svg +1 -0
- package/dist/web/icons/folder_type_config.svg +1 -0
- package/dist/web/icons/folder_type_config_opened.svg +1 -0
- package/dist/web/icons/folder_type_controller.svg +1 -0
- package/dist/web/icons/folder_type_controller_opened.svg +1 -0
- package/dist/web/icons/folder_type_coverage.svg +1 -0
- package/dist/web/icons/folder_type_coverage_opened.svg +1 -0
- package/dist/web/icons/folder_type_css.svg +1 -0
- package/dist/web/icons/folder_type_css_opened.svg +1 -0
- package/dist/web/icons/folder_type_cubit.svg +1 -0
- package/dist/web/icons/folder_type_cubit_opened.svg +1 -0
- package/dist/web/icons/folder_type_cypress.svg +1 -0
- package/dist/web/icons/folder_type_cypress_opened.svg +1 -0
- package/dist/web/icons/folder_type_dapr.svg +1 -0
- package/dist/web/icons/folder_type_dapr_opened.svg +1 -0
- package/dist/web/icons/folder_type_db.svg +1 -0
- package/dist/web/icons/folder_type_db_opened.svg +1 -0
- package/dist/web/icons/folder_type_debian.svg +1 -0
- package/dist/web/icons/folder_type_debian_opened.svg +1 -0
- package/dist/web/icons/folder_type_dependabot.svg +1 -0
- package/dist/web/icons/folder_type_dependabot_opened.svg +1 -0
- package/dist/web/icons/folder_type_devcontainer.svg +1 -0
- package/dist/web/icons/folder_type_devcontainer_opened.svg +1 -0
- package/dist/web/icons/folder_type_dist.svg +1 -0
- package/dist/web/icons/folder_type_dist_opened.svg +1 -0
- package/dist/web/icons/folder_type_docker.svg +1 -0
- package/dist/web/icons/folder_type_docker_opened.svg +1 -0
- package/dist/web/icons/folder_type_docs.svg +1 -0
- package/dist/web/icons/folder_type_docs_opened.svg +1 -0
- package/dist/web/icons/folder_type_e2e.svg +1 -0
- package/dist/web/icons/folder_type_e2e_opened.svg +1 -0
- package/dist/web/icons/folder_type_elasticbeanstalk.svg +1 -0
- package/dist/web/icons/folder_type_elasticbeanstalk_opened.svg +1 -0
- package/dist/web/icons/folder_type_electron.svg +1 -0
- package/dist/web/icons/folder_type_electron_opened.svg +1 -0
- package/dist/web/icons/folder_type_expo.svg +1 -0
- package/dist/web/icons/folder_type_expo_opened.svg +1 -0
- package/dist/web/icons/folder_type_favicon.svg +1 -0
- package/dist/web/icons/folder_type_favicon_opened.svg +1 -0
- package/dist/web/icons/folder_type_flow.svg +1 -0
- package/dist/web/icons/folder_type_flow_opened.svg +1 -0
- package/dist/web/icons/folder_type_fonts.svg +1 -0
- package/dist/web/icons/folder_type_fonts_opened.svg +1 -0
- package/dist/web/icons/folder_type_gcp.svg +1 -0
- package/dist/web/icons/folder_type_gcp_opened.svg +1 -0
- package/dist/web/icons/folder_type_git.svg +1 -0
- package/dist/web/icons/folder_type_git_opened.svg +1 -0
- package/dist/web/icons/folder_type_github.svg +1 -0
- package/dist/web/icons/folder_type_github_opened.svg +1 -0
- package/dist/web/icons/folder_type_gitlab.svg +1 -0
- package/dist/web/icons/folder_type_gitlab_opened.svg +1 -0
- package/dist/web/icons/folder_type_gradle.svg +1 -0
- package/dist/web/icons/folder_type_gradle_opened.svg +1 -0
- package/dist/web/icons/folder_type_graphql.svg +1 -0
- package/dist/web/icons/folder_type_graphql_opened.svg +1 -0
- package/dist/web/icons/folder_type_grunt.svg +1 -0
- package/dist/web/icons/folder_type_grunt_opened.svg +1 -0
- package/dist/web/icons/folder_type_gulp.svg +1 -0
- package/dist/web/icons/folder_type_gulp_opened.svg +1 -0
- package/dist/web/icons/folder_type_haxelib.svg +1 -0
- package/dist/web/icons/folder_type_haxelib_opened.svg +1 -0
- package/dist/web/icons/folder_type_helper.svg +1 -0
- package/dist/web/icons/folder_type_helper_opened.svg +1 -0
- package/dist/web/icons/folder_type_hook.svg +1 -0
- package/dist/web/icons/folder_type_hook_opened.svg +1 -0
- package/dist/web/icons/folder_type_husky.svg +1 -0
- package/dist/web/icons/folder_type_husky_opened.svg +1 -0
- package/dist/web/icons/folder_type_idea.svg +1 -0
- package/dist/web/icons/folder_type_idea_opened.svg +1 -0
- package/dist/web/icons/folder_type_images.svg +1 -0
- package/dist/web/icons/folder_type_images_opened.svg +1 -0
- package/dist/web/icons/folder_type_include.svg +1 -0
- package/dist/web/icons/folder_type_include_opened.svg +1 -0
- package/dist/web/icons/folder_type_interfaces.svg +1 -0
- package/dist/web/icons/folder_type_interfaces_opened.svg +1 -0
- package/dist/web/icons/folder_type_ios.svg +1 -0
- package/dist/web/icons/folder_type_ios_opened.svg +1 -0
- package/dist/web/icons/folder_type_js.svg +1 -0
- package/dist/web/icons/folder_type_js_opened.svg +1 -0
- package/dist/web/icons/folder_type_json.svg +1 -0
- package/dist/web/icons/folder_type_json_official.svg +1 -0
- package/dist/web/icons/folder_type_json_official_opened.svg +1 -0
- package/dist/web/icons/folder_type_json_opened.svg +1 -0
- package/dist/web/icons/folder_type_kubernetes.svg +1 -0
- package/dist/web/icons/folder_type_kubernetes_opened.svg +1 -0
- package/dist/web/icons/folder_type_less.svg +1 -0
- package/dist/web/icons/folder_type_less_opened.svg +1 -0
- package/dist/web/icons/folder_type_library.svg +1 -0
- package/dist/web/icons/folder_type_library_opened.svg +1 -0
- package/dist/web/icons/folder_type_light_electron.svg +1 -0
- package/dist/web/icons/folder_type_light_electron_opened.svg +1 -0
- package/dist/web/icons/folder_type_light_expo.svg +1 -0
- package/dist/web/icons/folder_type_light_expo_opened.svg +1 -0
- package/dist/web/icons/folder_type_light_fonts.svg +1 -0
- package/dist/web/icons/folder_type_light_fonts_opened.svg +1 -0
- package/dist/web/icons/folder_type_light_gradle.svg +1 -0
- package/dist/web/icons/folder_type_light_gradle_opened.svg +1 -0
- package/dist/web/icons/folder_type_light_meteor.svg +1 -0
- package/dist/web/icons/folder_type_light_meteor_opened.svg +1 -0
- package/dist/web/icons/folder_type_light_mysql.svg +1 -0
- package/dist/web/icons/folder_type_light_mysql_opened.svg +1 -0
- package/dist/web/icons/folder_type_light_node.svg +1 -0
- package/dist/web/icons/folder_type_light_node_opened.svg +1 -0
- package/dist/web/icons/folder_type_light_redux.svg +1 -0
- package/dist/web/icons/folder_type_light_redux_opened.svg +1 -0
- package/dist/web/icons/folder_type_light_sass.svg +1 -0
- package/dist/web/icons/folder_type_light_sass_opened.svg +1 -0
- package/dist/web/icons/folder_type_linux.svg +1 -0
- package/dist/web/icons/folder_type_linux_opened.svg +1 -0
- package/dist/web/icons/folder_type_locale.svg +1 -0
- package/dist/web/icons/folder_type_locale_opened.svg +1 -0
- package/dist/web/icons/folder_type_log.svg +1 -0
- package/dist/web/icons/folder_type_log_opened.svg +1 -0
- package/dist/web/icons/folder_type_macos.svg +1 -0
- package/dist/web/icons/folder_type_macos_opened.svg +1 -0
- package/dist/web/icons/folder_type_mariadb.svg +1 -0
- package/dist/web/icons/folder_type_mariadb_opened.svg +1 -0
- package/dist/web/icons/folder_type_maven.svg +1 -0
- package/dist/web/icons/folder_type_maven_opened.svg +1 -0
- package/dist/web/icons/folder_type_memcached.svg +1 -0
- package/dist/web/icons/folder_type_memcached_opened.svg +1 -0
- package/dist/web/icons/folder_type_meteor.svg +1 -0
- package/dist/web/icons/folder_type_meteor_opened.svg +1 -0
- package/dist/web/icons/folder_type_middleware.svg +1 -0
- package/dist/web/icons/folder_type_middleware_opened.svg +1 -0
- package/dist/web/icons/folder_type_minikube.svg +1 -0
- package/dist/web/icons/folder_type_minikube_opened.svg +1 -0
- package/dist/web/icons/folder_type_mjml.svg +1 -0
- package/dist/web/icons/folder_type_mjml_opened.svg +1 -0
- package/dist/web/icons/folder_type_mock.svg +1 -0
- package/dist/web/icons/folder_type_mock_opened.svg +1 -0
- package/dist/web/icons/folder_type_model.svg +1 -0
- package/dist/web/icons/folder_type_model_opened.svg +1 -0
- package/dist/web/icons/folder_type_module.svg +1 -0
- package/dist/web/icons/folder_type_module_opened.svg +1 -0
- package/dist/web/icons/folder_type_mongodb.svg +1 -0
- package/dist/web/icons/folder_type_mongodb_opened.svg +1 -0
- package/dist/web/icons/folder_type_mysql.svg +1 -0
- package/dist/web/icons/folder_type_mysql_opened.svg +1 -0
- package/dist/web/icons/folder_type_next.svg +1 -0
- package/dist/web/icons/folder_type_next_opened.svg +1 -0
- package/dist/web/icons/folder_type_nginx.svg +1 -0
- package/dist/web/icons/folder_type_nginx_opened.svg +1 -0
- package/dist/web/icons/folder_type_node.svg +1 -0
- package/dist/web/icons/folder_type_node_opened.svg +1 -0
- package/dist/web/icons/folder_type_notification.svg +1 -0
- package/dist/web/icons/folder_type_notification_opened.svg +1 -0
- package/dist/web/icons/folder_type_nuget.svg +1 -0
- package/dist/web/icons/folder_type_nuget_opened.svg +1 -0
- package/dist/web/icons/folder_type_nuxt.svg +1 -0
- package/dist/web/icons/folder_type_nuxt_opened.svg +1 -0
- package/dist/web/icons/folder_type_package.svg +1 -0
- package/dist/web/icons/folder_type_package_opened.svg +1 -0
- package/dist/web/icons/folder_type_paket.svg +1 -0
- package/dist/web/icons/folder_type_paket_opened.svg +1 -0
- package/dist/web/icons/folder_type_php.svg +1 -0
- package/dist/web/icons/folder_type_php_opened.svg +1 -0
- package/dist/web/icons/folder_type_platformio.svg +1 -0
- package/dist/web/icons/folder_type_platformio_opened.svg +1 -0
- package/dist/web/icons/folder_type_plugin.svg +1 -0
- package/dist/web/icons/folder_type_plugin_opened.svg +1 -0
- package/dist/web/icons/folder_type_private.svg +1 -0
- package/dist/web/icons/folder_type_private_opened.svg +1 -0
- package/dist/web/icons/folder_type_public.svg +1 -0
- package/dist/web/icons/folder_type_public_opened.svg +1 -0
- package/dist/web/icons/folder_type_python.svg +1 -0
- package/dist/web/icons/folder_type_python_opened.svg +1 -0
- package/dist/web/icons/folder_type_ravendb.svg +1 -0
- package/dist/web/icons/folder_type_ravendb_opened.svg +1 -0
- package/dist/web/icons/folder_type_redis.svg +1 -0
- package/dist/web/icons/folder_type_redis_opened.svg +1 -0
- package/dist/web/icons/folder_type_redux.svg +1 -0
- package/dist/web/icons/folder_type_redux_opened.svg +1 -0
- package/dist/web/icons/folder_type_route.svg +1 -0
- package/dist/web/icons/folder_type_route_opened.svg +1 -0
- package/dist/web/icons/folder_type_sass.svg +1 -0
- package/dist/web/icons/folder_type_sass_opened.svg +1 -0
- package/dist/web/icons/folder_type_script.svg +1 -0
- package/dist/web/icons/folder_type_script_opened.svg +1 -0
- package/dist/web/icons/folder_type_server.svg +1 -0
- package/dist/web/icons/folder_type_server_opened.svg +1 -0
- package/dist/web/icons/folder_type_services.svg +1 -0
- package/dist/web/icons/folder_type_services_opened.svg +1 -0
- package/dist/web/icons/folder_type_src.svg +1 -0
- package/dist/web/icons/folder_type_src_opened.svg +1 -0
- package/dist/web/icons/folder_type_sso.svg +1 -0
- package/dist/web/icons/folder_type_sso_opened.svg +1 -0
- package/dist/web/icons/folder_type_story.svg +1 -0
- package/dist/web/icons/folder_type_story_opened.svg +1 -0
- package/dist/web/icons/folder_type_style.svg +1 -0
- package/dist/web/icons/folder_type_style_opened.svg +1 -0
- package/dist/web/icons/folder_type_temp.svg +1 -0
- package/dist/web/icons/folder_type_temp_opened.svg +1 -0
- package/dist/web/icons/folder_type_template.svg +1 -0
- package/dist/web/icons/folder_type_template_opened.svg +1 -0
- package/dist/web/icons/folder_type_test.svg +1 -0
- package/dist/web/icons/folder_type_test_opened.svg +1 -0
- package/dist/web/icons/folder_type_theme.svg +1 -0
- package/dist/web/icons/folder_type_theme_opened.svg +1 -0
- package/dist/web/icons/folder_type_tools.svg +1 -0
- package/dist/web/icons/folder_type_tools_opened.svg +1 -0
- package/dist/web/icons/folder_type_travis.svg +1 -0
- package/dist/web/icons/folder_type_travis_opened.svg +1 -0
- package/dist/web/icons/folder_type_typescript.svg +1 -0
- package/dist/web/icons/folder_type_typescript_opened.svg +1 -0
- package/dist/web/icons/folder_type_typings.svg +1 -0
- package/dist/web/icons/folder_type_typings2.svg +1 -0
- package/dist/web/icons/folder_type_typings2_opened.svg +1 -0
- package/dist/web/icons/folder_type_typings_opened.svg +1 -0
- package/dist/web/icons/folder_type_vagrant.svg +1 -0
- package/dist/web/icons/folder_type_vagrant_opened.svg +1 -0
- package/dist/web/icons/folder_type_video.svg +1 -0
- package/dist/web/icons/folder_type_video_opened.svg +1 -0
- package/dist/web/icons/folder_type_view.svg +1 -0
- package/dist/web/icons/folder_type_view_opened.svg +1 -0
- package/dist/web/icons/folder_type_vs.svg +1 -0
- package/dist/web/icons/folder_type_vs2.svg +1 -0
- package/dist/web/icons/folder_type_vs2_opened.svg +1 -0
- package/dist/web/icons/folder_type_vs_opened.svg +1 -0
- package/dist/web/icons/folder_type_vscode.svg +1 -0
- package/dist/web/icons/folder_type_vscode2.svg +1 -0
- package/dist/web/icons/folder_type_vscode2_opened.svg +1 -0
- package/dist/web/icons/folder_type_vscode3.svg +1 -0
- package/dist/web/icons/folder_type_vscode3_opened.svg +1 -0
- package/dist/web/icons/folder_type_vscode_opened.svg +1 -0
- package/dist/web/icons/folder_type_vscode_test.svg +1 -0
- package/dist/web/icons/folder_type_vscode_test2.svg +1 -0
- package/dist/web/icons/folder_type_vscode_test2_opened.svg +1 -0
- package/dist/web/icons/folder_type_vscode_test3.svg +1 -0
- package/dist/web/icons/folder_type_vscode_test3_opened.svg +1 -0
- package/dist/web/icons/folder_type_vscode_test_opened.svg +1 -0
- package/dist/web/icons/folder_type_webpack.svg +1 -0
- package/dist/web/icons/folder_type_webpack_opened.svg +1 -0
- package/dist/web/icons/folder_type_windows.svg +1 -0
- package/dist/web/icons/folder_type_windows_opened.svg +1 -0
- package/dist/web/icons/folder_type_www.svg +1 -0
- package/dist/web/icons/folder_type_www_opened.svg +1 -0
- package/dist/web/index.html +1 -0
- package/dist/web/index.txt +28 -0
- package/dist/web/login/__next._full.txt +30 -0
- package/dist/web/login/__next._head.txt +6 -0
- package/dist/web/login/__next._index.txt +10 -0
- package/dist/web/login/__next._tree.txt +8 -0
- package/dist/web/login/__next.login.__PAGE__.txt +9 -0
- package/dist/web/login/__next.login.txt +5 -0
- package/dist/web/login.html +1 -0
- package/dist/web/login.txt +30 -0
- package/dist/web/monaco/vs/_commonjsHelpers-CT9FvmAN.js +1 -0
- package/dist/web/monaco/vs/abap-D-t0cyap.js +1 -0
- package/dist/web/monaco/vs/apex-CcIm7xu6.js +1 -0
- package/dist/web/monaco/vs/assets/css.worker-HnVq6Ewq.js +93 -0
- package/dist/web/monaco/vs/assets/editor.worker-Be8ye1pW.js +26 -0
- package/dist/web/monaco/vs/assets/html.worker-B51mlPHg.js +470 -0
- package/dist/web/monaco/vs/assets/json.worker-DKiEKt88.js +58 -0
- package/dist/web/monaco/vs/assets/ts.worker-CMbG-7ft.js +67731 -0
- package/dist/web/monaco/vs/azcli-BA0tQDCg.js +1 -0
- package/dist/web/monaco/vs/basic-languages/monaco.contribution.js +1 -0
- package/dist/web/monaco/vs/bat-C397hTD6.js +1 -0
- package/dist/web/monaco/vs/bicep-DF5aW17k.js +2 -0
- package/dist/web/monaco/vs/cameligo-plsz8qhj.js +1 -0
- package/dist/web/monaco/vs/clojure-Y2auQMzK.js +1 -0
- package/dist/web/monaco/vs/coffee-Bu45yuWE.js +1 -0
- package/dist/web/monaco/vs/cpp-CkKPQIni.js +1 -0
- package/dist/web/monaco/vs/csharp-CX28MZyh.js +1 -0
- package/dist/web/monaco/vs/csp-D8uWnyxW.js +1 -0
- package/dist/web/monaco/vs/css-CaeNmE3S.js +3 -0
- package/dist/web/monaco/vs/cssMode-CjiAH6dQ.js +1 -0
- package/dist/web/monaco/vs/cypher-DVThT8BS.js +1 -0
- package/dist/web/monaco/vs/dart-CmGfCvrO.js +1 -0
- package/dist/web/monaco/vs/dockerfile-CZqqYdch.js +1 -0
- package/dist/web/monaco/vs/ecl-30fUercY.js +1 -0
- package/dist/web/monaco/vs/editor/editor.main.css +1 -0
- package/dist/web/monaco/vs/editor/editor.main.js +5 -0
- package/dist/web/monaco/vs/editor.api-CalNCsUg.js +903 -0
- package/dist/web/monaco/vs/elixir-xjPaIfzF.js +1 -0
- package/dist/web/monaco/vs/flow9-DqtmStfK.js +1 -0
- package/dist/web/monaco/vs/freemarker2-Cz_sV6Md.js +3 -0
- package/dist/web/monaco/vs/fsharp-BOMdg4U1.js +1 -0
- package/dist/web/monaco/vs/go-D_hbi-Jt.js +1 -0
- package/dist/web/monaco/vs/graphql-CKUU4kLG.js +1 -0
- package/dist/web/monaco/vs/handlebars-OwglfO-1.js +1 -0
- package/dist/web/monaco/vs/hcl-DTaboeZW.js +1 -0
- package/dist/web/monaco/vs/html-Pa1xEWsY.js +1 -0
- package/dist/web/monaco/vs/htmlMode-Bz67EXwp.js +1 -0
- package/dist/web/monaco/vs/ini-CsNwO04R.js +1 -0
- package/dist/web/monaco/vs/java-CI4ZMsH9.js +1 -0
- package/dist/web/monaco/vs/javascript-PczUCGdz.js +1 -0
- package/dist/web/monaco/vs/jsonMode-DULH5oaX.js +7 -0
- package/dist/web/monaco/vs/julia-BwzEvaQw.js +1 -0
- package/dist/web/monaco/vs/kotlin-IUYPiTV8.js +1 -0
- package/dist/web/monaco/vs/language/css/monaco.contribution.js +1 -0
- package/dist/web/monaco/vs/language/html/monaco.contribution.js +1 -0
- package/dist/web/monaco/vs/language/json/monaco.contribution.js +1 -0
- package/dist/web/monaco/vs/language/typescript/monaco.contribution.js +1 -0
- package/dist/web/monaco/vs/less-C0eDYdqa.js +2 -0
- package/dist/web/monaco/vs/lexon-iON-Kj97.js +1 -0
- package/dist/web/monaco/vs/liquid-DqKjdPGy.js +1 -0
- package/dist/web/monaco/vs/loader.js +1368 -0
- package/dist/web/monaco/vs/lspLanguageFeatures-kM9O9rjY.js +4 -0
- package/dist/web/monaco/vs/lua-DtygF91M.js +1 -0
- package/dist/web/monaco/vs/m3-CsR4AuFi.js +1 -0
- package/dist/web/monaco/vs/markdown-C_rD0bIw.js +1 -0
- package/dist/web/monaco/vs/mdx-DEWtB1K5.js +1 -0
- package/dist/web/monaco/vs/mips-CiYP61RB.js +1 -0
- package/dist/web/monaco/vs/monaco.contribution-D2OdxNBt.js +1 -0
- package/dist/web/monaco/vs/monaco.contribution-DO3azKX8.js +1 -0
- package/dist/web/monaco/vs/monaco.contribution-EcChJV6a.js +1 -0
- package/dist/web/monaco/vs/monaco.contribution-qLAYrEOP.js +1 -0
- package/dist/web/monaco/vs/msdax-C38-sJlp.js +1 -0
- package/dist/web/monaco/vs/mysql-CdtbpvbG.js +1 -0
- package/dist/web/monaco/vs/nls.messages-loader.js +1 -0
- package/dist/web/monaco/vs/nls.messages.cs.js.js +17 -0
- package/dist/web/monaco/vs/nls.messages.de.js.js +17 -0
- package/dist/web/monaco/vs/nls.messages.es.js.js +17 -0
- package/dist/web/monaco/vs/nls.messages.fr.js.js +15 -0
- package/dist/web/monaco/vs/nls.messages.it.js.js +15 -0
- package/dist/web/monaco/vs/nls.messages.ja.js.js +17 -0
- package/dist/web/monaco/vs/nls.messages.js.js +10 -0
- package/dist/web/monaco/vs/nls.messages.ko.js.js +25 -0
- package/dist/web/monaco/vs/nls.messages.pl.js.js +17 -0
- package/dist/web/monaco/vs/nls.messages.pt-br.js.js +6 -0
- package/dist/web/monaco/vs/nls.messages.ru.js.js +17 -0
- package/dist/web/monaco/vs/nls.messages.tr.js.js +15 -0
- package/dist/web/monaco/vs/nls.messages.zh-cn.js.js +17 -0
- package/dist/web/monaco/vs/nls.messages.zh-tw.js.js +15 -0
- package/dist/web/monaco/vs/objective-c-CntZFaHX.js +1 -0
- package/dist/web/monaco/vs/pascal-r6kuqfl_.js +1 -0
- package/dist/web/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
- package/dist/web/monaco/vs/perl-DABw_TcH.js +1 -0
- package/dist/web/monaco/vs/pgsql-me_jFXeX.js +1 -0
- package/dist/web/monaco/vs/php-D_kh-9LK.js +1 -0
- package/dist/web/monaco/vs/pla-VfZjczW0.js +1 -0
- package/dist/web/monaco/vs/postiats-BBSzz8Pk.js +1 -0
- package/dist/web/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
- package/dist/web/monaco/vs/powershell-B-7ap1zc.js +1 -0
- package/dist/web/monaco/vs/protobuf-BmtuEB1A.js +2 -0
- package/dist/web/monaco/vs/pug-BRpRNeEb.js +1 -0
- package/dist/web/monaco/vs/python-Cr0UkIbn.js +1 -0
- package/dist/web/monaco/vs/qsharp-BzsFaUU9.js +1 -0
- package/dist/web/monaco/vs/r-f8dDdrp4.js +1 -0
- package/dist/web/monaco/vs/razor-BYAHOTkz.js +1 -0
- package/dist/web/monaco/vs/redis-fvZQY4PI.js +1 -0
- package/dist/web/monaco/vs/redshift-45Et0LQi.js +1 -0
- package/dist/web/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
- package/dist/web/monaco/vs/ruby-CZO8zYTz.js +1 -0
- package/dist/web/monaco/vs/rust-Bfetafyc.js +1 -0
- package/dist/web/monaco/vs/sb-3GYllVck.js +1 -0
- package/dist/web/monaco/vs/scala-foMgrKo1.js +1 -0
- package/dist/web/monaco/vs/scheme-CHdMtr7p.js +1 -0
- package/dist/web/monaco/vs/scss-C1cmLt9V.js +3 -0
- package/dist/web/monaco/vs/shell-ClXCKCEW.js +1 -0
- package/dist/web/monaco/vs/solidity-MZ6ExpPy.js +1 -0
- package/dist/web/monaco/vs/sophia-DWkuSsPQ.js +1 -0
- package/dist/web/monaco/vs/sparql-AUGFYSyk.js +1 -0
- package/dist/web/monaco/vs/sql-32GpJSV2.js +1 -0
- package/dist/web/monaco/vs/st-CuDFIVZ_.js +1 -0
- package/dist/web/monaco/vs/swift-n-2HociN.js +3 -0
- package/dist/web/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
- package/dist/web/monaco/vs/tcl-D74tq1nH.js +1 -0
- package/dist/web/monaco/vs/tsMode-CZz1Umrk.js +11 -0
- package/dist/web/monaco/vs/twig-C6taOxMV.js +1 -0
- package/dist/web/monaco/vs/typescript-DfOrAzoV.js +1 -0
- package/dist/web/monaco/vs/typespec-D-PIh9Xw.js +1 -0
- package/dist/web/monaco/vs/vb-Dyb2648j.js +1 -0
- package/dist/web/monaco/vs/wgsl-BhLXMOR0.js +298 -0
- package/dist/web/monaco/vs/workers-DcJshg-q.js +1 -0
- package/dist/web/monaco/vs/xml-CdsdnY8S.js +1 -0
- package/dist/web/monaco/vs/yaml-DYGvmE88.js +1 -0
- package/dist/web/next.svg +1 -0
- package/dist/web/vercel.svg +1 -0
- package/dist/web/window.svg +1 -0
- package/dist/web/workspace/_/__next._full.txt +28 -0
- package/dist/web/workspace/_/__next._head.txt +6 -0
- package/dist/web/workspace/_/__next._index.txt +10 -0
- package/dist/web/workspace/_/__next._tree.txt +9 -0
- package/dist/web/workspace/_/__next.workspace.$d$id.__PAGE__.txt +7 -0
- package/dist/web/workspace/_/__next.workspace.$d$id.txt +5 -0
- package/dist/web/workspace/_/__next.workspace.txt +5 -0
- package/dist/web/workspace/_.html +1 -0
- package/dist/web/workspace/_.txt +28 -0
- package/dist/web/workspaces/__next._full.txt +30 -0
- package/dist/web/workspaces/__next._head.txt +6 -0
- package/dist/web/workspaces/__next._index.txt +10 -0
- package/dist/web/workspaces/__next._tree.txt +8 -0
- package/dist/web/workspaces/__next.workspaces.__PAGE__.txt +9 -0
- package/dist/web/workspaces/__next.workspaces.txt +5 -0
- package/dist/web/workspaces.html +1 -0
- package/dist/web/workspaces.txt +30 -0
- package/dist/ws/connection-manager.js +34 -0
- package/dist/ws/handler.js +1285 -0
- package/dist/ws/terminal-handler.js +33 -0
- package/package.json +47 -0
- package/public/avatars/1777813826407-bea0ja-minimax.svg +1 -0
- package/public/avatars/1777813967088-3xlvd0-minimax.svg +1 -0
- package/public/avatars/1777814041714-yp0qeq-minimax.svg +1 -0
- package/public/avatars/1777815865622-08wp9m-user.jpg +0 -0
- package/public/avatars/1777904986095-rg26je-icon.png +0 -0
- package/public/provider-icons/aicodemirror.svg +19 -0
- package/public/provider-icons/aicoding.svg +20 -0
- package/public/provider-icons/aihubmix-color.svg +1 -0
- package/public/provider-icons/algocode.svg +51 -0
- package/public/provider-icons/alibaba.svg +1 -0
- package/public/provider-icons/anthropic.svg +1 -0
- package/public/provider-icons/aws.svg +1 -0
- package/public/provider-icons/azure.svg +1 -0
- package/public/provider-icons/baidu.svg +1 -0
- package/public/provider-icons/bailian.svg +1 -0
- package/public/provider-icons/bytedance.svg +1 -0
- package/public/provider-icons/catcoder.svg +1 -0
- package/public/provider-icons/chatglm.svg +1 -0
- package/public/provider-icons/claude.svg +1 -0
- package/public/provider-icons/claw.svg +22 -0
- package/public/provider-icons/cloudflare.svg +1 -0
- package/public/provider-icons/cohere.svg +1 -0
- package/public/provider-icons/copilot.svg +1 -0
- package/public/provider-icons/crazyrouter.svg +1 -0
- package/public/provider-icons/ctok.svg +21 -0
- package/public/provider-icons/cubence.svg +9 -0
- package/public/provider-icons/dds.svg +2225 -0
- package/public/provider-icons/deepseek.svg +1 -0
- package/public/provider-icons/doubao.svg +1 -0
- package/public/provider-icons/eflowcode.png +0 -0
- package/public/provider-icons/gemini.svg +1 -0
- package/public/provider-icons/gemma.svg +1 -0
- package/public/provider-icons/github.svg +1 -0
- package/public/provider-icons/githubcopilot.svg +1 -0
- package/public/provider-icons/google.svg +1 -0
- package/public/provider-icons/googlecloud.svg +1 -0
- package/public/provider-icons/grok.svg +1 -0
- package/public/provider-icons/hermes.png +0 -0
- package/public/provider-icons/huawei.svg +1 -0
- package/public/provider-icons/huggingface.svg +1 -0
- package/public/provider-icons/hunyuan.svg +1 -0
- package/public/provider-icons/index.ts +114 -0
- package/public/provider-icons/kimi.svg +1 -0
- package/public/provider-icons/lemondata.png +0 -0
- package/public/provider-icons/lioncc.svg +6 -0
- package/public/provider-icons/longcat-color.svg +1 -0
- package/public/provider-icons/mcp.svg +1 -0
- package/public/provider-icons/meta.svg +1 -0
- package/public/provider-icons/metadata.ts +469 -0
- package/public/provider-icons/micu.svg +23 -0
- package/public/provider-icons/midjourney.svg +1 -0
- package/public/provider-icons/minimax.svg +1 -0
- package/public/provider-icons/mistral.svg +1 -0
- package/public/provider-icons/modelscope-color.svg +1 -0
- package/public/provider-icons/newapi.svg +1 -0
- package/public/provider-icons/notion.svg +1 -0
- package/public/provider-icons/novita.svg +11 -0
- package/public/provider-icons/nvidia.svg +1 -0
- package/public/provider-icons/ollama.svg +1 -0
- package/public/provider-icons/openai.svg +1 -0
- package/public/provider-icons/opencode-logo-light.svg +1 -0
- package/public/provider-icons/openrouter.svg +1 -0
- package/public/provider-icons/packycode.svg +1 -0
- package/public/provider-icons/palm.svg +1 -0
- package/public/provider-icons/perplexity.svg +1 -0
- package/public/provider-icons/pipellm.png +0 -0
- package/public/provider-icons/qwen.svg +1 -0
- package/public/provider-icons/rc.svg +1 -0
- package/public/provider-icons/shengsuanyun.svg +4 -0
- package/public/provider-icons/siliconflow.svg +1 -0
- package/public/provider-icons/sssaicode.svg +73 -0
- package/public/provider-icons/stability.svg +1 -0
- package/public/provider-icons/stepfun.svg +10 -0
- package/public/provider-icons/tencent.svg +1 -0
- package/public/provider-icons/ucloud.svg +1 -0
- package/public/provider-icons/vercel.svg +1 -0
- package/public/provider-icons/wenxin.svg +1 -0
- package/public/provider-icons/xai.svg +1 -0
- package/public/provider-icons/xiaomimimo.svg +1 -0
- package/public/provider-icons/yi.svg +1 -0
- package/public/provider-icons/zeroone.svg +1 -0
- package/public/provider-icons/zhipu.svg +1 -0
|
@@ -0,0 +1,1285 @@
|
|
|
1
|
+
import { addConnection, broadcastToWorkspace } from './connection-manager.js';
|
|
2
|
+
import { handleTerminalEvent } from './terminal-handler.js';
|
|
3
|
+
import { createMessage, updateMessage, listMessages } from '../services/message.js';
|
|
4
|
+
import { getChannel, updateChannel } from '../services/channel.js';
|
|
5
|
+
import * as issueService from '../services/issue.js';
|
|
6
|
+
import { createIssueFunctionTools } from '../services/builtin-tools.js';
|
|
7
|
+
import { startScheduler } from '../agents/scheduler-agent.js';
|
|
8
|
+
import * as agentService from '../services/agent.js';
|
|
9
|
+
import * as wsService from '../services/workspace.js';
|
|
10
|
+
import { runPlanner } from '../agents/planner-agent.js';
|
|
11
|
+
import { createAgentRuntime } from '../adapters/agent-runtime.js';
|
|
12
|
+
import { saveToolDetails } from '../services/tool-detail.js';
|
|
13
|
+
import { readWorkspacePrompt } from '../services/workspace-prompt.js';
|
|
14
|
+
import { getThinkingRuntimeConfig } from '../services/llm-model-config.js';
|
|
15
|
+
const handlers = new Map();
|
|
16
|
+
// Track which workspaces have schedulers running
|
|
17
|
+
const activeSchedulers = new Set();
|
|
18
|
+
const activeChannelRuns = new Map();
|
|
19
|
+
const pendingQuestionRuns = new Map();
|
|
20
|
+
function ensureScheduler(workspaceId, ctx) {
|
|
21
|
+
if (!activeSchedulers.has(workspaceId)) {
|
|
22
|
+
activeSchedulers.add(workspaceId);
|
|
23
|
+
setTimeout(() => {
|
|
24
|
+
startScheduler(workspaceId, ctx);
|
|
25
|
+
console.log(`[ws] scheduler started for workspace ${workspaceId}`);
|
|
26
|
+
}, 10_000);
|
|
27
|
+
console.log(`[ws] scheduler scheduled for workspace ${workspaceId} in 10000ms`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function makeContext(workspaceId) {
|
|
31
|
+
return {
|
|
32
|
+
workspaceId,
|
|
33
|
+
broadcast: (event, data) => broadcastToWorkspace(workspaceId, event, data),
|
|
34
|
+
getSession: (sessionId) => agentService.getById(workspaceId, sessionId),
|
|
35
|
+
updateSessionStatus: (sessionId, status, extra) => agentService.updateStatus(workspaceId, sessionId, status, extra),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function getRuntimeBaseURL(provider, apiBase) {
|
|
39
|
+
if (provider === 'openai-responses-to-anthropic-messages'
|
|
40
|
+
|| provider === 'openai-chat-completions-to-anthropic-messages')
|
|
41
|
+
return undefined;
|
|
42
|
+
return apiBase;
|
|
43
|
+
}
|
|
44
|
+
export function registerHandler(event, handler) {
|
|
45
|
+
handlers.set(event, handler);
|
|
46
|
+
}
|
|
47
|
+
export function handleConnection(ws, workspaceId) {
|
|
48
|
+
addConnection(ws, workspaceId);
|
|
49
|
+
const ctx = makeContext(workspaceId);
|
|
50
|
+
ensureScheduler(workspaceId, ctx);
|
|
51
|
+
ws.send(JSON.stringify({
|
|
52
|
+
event: 'connected',
|
|
53
|
+
workspaceId,
|
|
54
|
+
timestamp: new Date().toISOString(),
|
|
55
|
+
data: { workspaceId },
|
|
56
|
+
}));
|
|
57
|
+
ws.on('message', (raw) => {
|
|
58
|
+
try {
|
|
59
|
+
const msg = JSON.parse(raw.toString());
|
|
60
|
+
const handler = handlers.get(msg.event);
|
|
61
|
+
if (handler) {
|
|
62
|
+
handler(ws, workspaceId, msg.data);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.warn(`[WS] unhandled event: ${msg.event}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error('[WS] invalid message:', err instanceof Error ? err.message : String(err));
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Register terminal handlers
|
|
74
|
+
const terminalEvents = [
|
|
75
|
+
'terminal.create',
|
|
76
|
+
'terminal.input',
|
|
77
|
+
'terminal.resize',
|
|
78
|
+
'terminal.close',
|
|
79
|
+
];
|
|
80
|
+
for (const evt of terminalEvents) {
|
|
81
|
+
registerHandler(evt, (ws, workspaceId, data) => {
|
|
82
|
+
handleTerminalEvent(ws, workspaceId, evt, data);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Register channel handler
|
|
86
|
+
registerHandler('channel.message', (_ws, workspaceId, data) => {
|
|
87
|
+
const { channelId, content, type, mentions, attachments } = data;
|
|
88
|
+
if (!channelId || (!content && !attachments?.length))
|
|
89
|
+
return;
|
|
90
|
+
if (!getChannel(workspaceId, channelId))
|
|
91
|
+
return;
|
|
92
|
+
const message = createMessage(workspaceId, channelId, {
|
|
93
|
+
senderId: 'user',
|
|
94
|
+
content,
|
|
95
|
+
type: attachments?.length ? 'attachment' : type,
|
|
96
|
+
attachments,
|
|
97
|
+
});
|
|
98
|
+
broadcastToWorkspace(workspaceId, 'channel.message', message);
|
|
99
|
+
const agentIds = [...new Set([...(mentions || []), ...extractMentionIds(content)].filter(Boolean))];
|
|
100
|
+
for (const agentId of agentIds) {
|
|
101
|
+
void runMentionedAgent(workspaceId, channelId, agentId, stripHtml(content));
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
registerHandler('channel.stop', (_ws, workspaceId, data) => {
|
|
105
|
+
const { channelId } = data;
|
|
106
|
+
if (!channelId)
|
|
107
|
+
return;
|
|
108
|
+
stopChannelRuns(workspaceId, channelId);
|
|
109
|
+
});
|
|
110
|
+
registerHandler('channel.answer_question', (_ws, workspaceId, data) => {
|
|
111
|
+
const { channelId, messageId, questionId, answer } = data;
|
|
112
|
+
const trimmed = answer?.trim();
|
|
113
|
+
if (!channelId || !messageId || !questionId || !trimmed)
|
|
114
|
+
return;
|
|
115
|
+
const message = listMessages(workspaceId, channelId).find((item) => item.id === messageId);
|
|
116
|
+
if (!message)
|
|
117
|
+
return;
|
|
118
|
+
const updatedParts = message.parts?.map((part) => {
|
|
119
|
+
if (part.type !== 'ask_user_question' || part.id !== questionId)
|
|
120
|
+
return part;
|
|
121
|
+
return { ...part, status: 'answered', answer: trimmed };
|
|
122
|
+
});
|
|
123
|
+
const updated = updateMessage(workspaceId, channelId, messageId, {
|
|
124
|
+
status: 'streaming',
|
|
125
|
+
parts: updatedParts,
|
|
126
|
+
});
|
|
127
|
+
if (updated)
|
|
128
|
+
broadcastToWorkspace(workspaceId, 'channel.message.updated', updated);
|
|
129
|
+
const key = questionRunKey(workspaceId, channelId, messageId, questionId);
|
|
130
|
+
const pending = pendingQuestionRuns.get(key);
|
|
131
|
+
pendingQuestionRuns.delete(key);
|
|
132
|
+
if (!pending)
|
|
133
|
+
return;
|
|
134
|
+
const seedQuestion = questionFromAnsweredPart(updatedParts, questionId);
|
|
135
|
+
void runMentionedAgent(workspaceId, channelId, pending.agentConfigId, [
|
|
136
|
+
'The user answered your previous question.',
|
|
137
|
+
`Question: ${pending.question}`,
|
|
138
|
+
`Answer: ${trimmed}`,
|
|
139
|
+
'Continue from this answer and complete the original task.',
|
|
140
|
+
].join('\n'), {
|
|
141
|
+
messageId,
|
|
142
|
+
seedOutput: normalizeOutputLines([message.content]),
|
|
143
|
+
seedQuestions: seedQuestion ? [seedQuestion] : [],
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
async function runMentionedAgent(workspaceId, channelId, agentConfigId, prompt, options = {}) {
|
|
147
|
+
const preset = agentService.listPresets(workspaceId)?.find((agent) => agent.id === agentConfigId);
|
|
148
|
+
if (!preset || preset.enabled === false)
|
|
149
|
+
return;
|
|
150
|
+
const session = agentService.create(workspaceId, preset.role, preset.id);
|
|
151
|
+
broadcastToWorkspace(workspaceId, 'agent.started', session);
|
|
152
|
+
agentService.updateStatus(workspaceId, session.id, 'active');
|
|
153
|
+
broadcastToWorkspace(workspaceId, 'agent.status_changed', {
|
|
154
|
+
agentId: session.id,
|
|
155
|
+
from: 'idle',
|
|
156
|
+
to: 'active',
|
|
157
|
+
});
|
|
158
|
+
const configDir = agentService.getAgentConfigDir(workspaceId, preset);
|
|
159
|
+
const mcpServers = agentService.getMcpServers(preset.mcps);
|
|
160
|
+
const skills = agentService.getAvailableSkillNames(configDir, preset.skills);
|
|
161
|
+
const workspace = wsService.getById(workspaceId);
|
|
162
|
+
const { channel, issue } = resolveIssueChannelContext(workspaceId, channelId);
|
|
163
|
+
const functionTools = createIssueFunctionTools(workspaceId, channel, {
|
|
164
|
+
senderId: preset.id,
|
|
165
|
+
senderRole: preset.role,
|
|
166
|
+
}, preset.tools);
|
|
167
|
+
const startTime = Date.now();
|
|
168
|
+
const existingMessage = options.messageId
|
|
169
|
+
? listMessages(workspaceId, channelId).find((message) => message.id === options.messageId)
|
|
170
|
+
: undefined;
|
|
171
|
+
const pending = existingMessage
|
|
172
|
+
? updateMessage(workspaceId, channelId, existingMessage.id, {
|
|
173
|
+
status: 'streaming',
|
|
174
|
+
metadata: {
|
|
175
|
+
...existingMessage.metadata,
|
|
176
|
+
agentSessionId: session.id,
|
|
177
|
+
runtime: preset.runtimeKind,
|
|
178
|
+
model: preset.modelId,
|
|
179
|
+
duration: 0,
|
|
180
|
+
},
|
|
181
|
+
}) ?? existingMessage
|
|
182
|
+
: createMessage(workspaceId, channelId, {
|
|
183
|
+
senderId: preset.id,
|
|
184
|
+
senderRole: preset.role,
|
|
185
|
+
content: 'Agent is processing...',
|
|
186
|
+
type: 'text',
|
|
187
|
+
status: 'streaming',
|
|
188
|
+
metadata: {
|
|
189
|
+
agentSessionId: session.id,
|
|
190
|
+
runtime: preset.runtimeKind,
|
|
191
|
+
model: preset.modelId,
|
|
192
|
+
duration: 0,
|
|
193
|
+
},
|
|
194
|
+
parts: [
|
|
195
|
+
{
|
|
196
|
+
id: `reasoning-${session.id}`,
|
|
197
|
+
type: 'reasoning',
|
|
198
|
+
text: 'Preparing agent runtime and loading conversation context...',
|
|
199
|
+
status: 'streaming',
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
});
|
|
203
|
+
broadcastToWorkspace(workspaceId, existingMessage ? 'channel.message.updated' : 'channel.message', pending);
|
|
204
|
+
let activeRun;
|
|
205
|
+
const liveReasoning = [];
|
|
206
|
+
try {
|
|
207
|
+
const runtime = createAgentRuntime({
|
|
208
|
+
kind: preset.runtimeKind,
|
|
209
|
+
provider: preset.modelProvider,
|
|
210
|
+
model: preset.modelId,
|
|
211
|
+
apiKey: preset.apiKey,
|
|
212
|
+
baseURL: getRuntimeBaseURL(preset.modelProvider, preset.apiBase),
|
|
213
|
+
adapterBaseURL: preset.apiBase,
|
|
214
|
+
...getThinkingRuntimeConfig(preset),
|
|
215
|
+
});
|
|
216
|
+
activeRun = {
|
|
217
|
+
agentId: session.id,
|
|
218
|
+
agentConfigId,
|
|
219
|
+
messageId: pending.id,
|
|
220
|
+
runtime,
|
|
221
|
+
};
|
|
222
|
+
trackChannelRun(workspaceId, channelId, activeRun);
|
|
223
|
+
const history = listMessages(workspaceId, channelId, { limit: 20 });
|
|
224
|
+
const liveOutput = [...(options.seedOutput ?? [])];
|
|
225
|
+
const askUserQuestions = [...(options.seedQuestions ?? [])];
|
|
226
|
+
const toolDetails = new Map();
|
|
227
|
+
const toolUseDetailIds = new Map();
|
|
228
|
+
let lastLiveUpdate = 0;
|
|
229
|
+
const broadcastLiveParts = (force = false) => {
|
|
230
|
+
const now = Date.now();
|
|
231
|
+
if (!force && now - lastLiveUpdate < 120)
|
|
232
|
+
return;
|
|
233
|
+
lastLiveUpdate = now;
|
|
234
|
+
const parts = buildAgentMessageParts({
|
|
235
|
+
sessionId: session.id,
|
|
236
|
+
workspaceRoot: workspace?.boundDirs?.[0],
|
|
237
|
+
presetName: preset.name || preset.role,
|
|
238
|
+
role: preset.role,
|
|
239
|
+
model: preset.modelId,
|
|
240
|
+
systemPrompt: preset.systemPrompt,
|
|
241
|
+
mcpServers: Object.keys(mcpServers ?? {}),
|
|
242
|
+
skills,
|
|
243
|
+
builtInTools: buildBuiltInTools(functionTools, channel, issue),
|
|
244
|
+
output: liveOutput,
|
|
245
|
+
reasoning: liveReasoning,
|
|
246
|
+
toolDetails,
|
|
247
|
+
askUserQuestions,
|
|
248
|
+
success: true,
|
|
249
|
+
});
|
|
250
|
+
if (parts.length === 0)
|
|
251
|
+
return;
|
|
252
|
+
const status = askUserQuestions.some((question) => !question.answer) ? 'waiting_for_user' : 'streaming';
|
|
253
|
+
const live = updateMessage(workspaceId, channelId, pending.id, {
|
|
254
|
+
content: liveOutput.join('\n') || pending.content,
|
|
255
|
+
status,
|
|
256
|
+
parts,
|
|
257
|
+
metadata: {
|
|
258
|
+
...pending.metadata,
|
|
259
|
+
duration: Date.now() - startTime,
|
|
260
|
+
},
|
|
261
|
+
});
|
|
262
|
+
if (live)
|
|
263
|
+
broadcastToWorkspace(workspaceId, 'channel.message.updated', live);
|
|
264
|
+
};
|
|
265
|
+
const result = await runtime.execute(buildAgentPrompt(workspaceId, preset.systemPrompt, prompt, history, {
|
|
266
|
+
mcpServers: Object.keys(mcpServers ?? {}),
|
|
267
|
+
skills,
|
|
268
|
+
boundDirs: workspace?.boundDirs,
|
|
269
|
+
builtInTools: buildBuiltInTools(functionTools, channel, issue),
|
|
270
|
+
}), agentService.resolveWorkingDir(workspaceId, preset), {
|
|
271
|
+
maxTurns: 100,
|
|
272
|
+
functionTools,
|
|
273
|
+
mcpServers,
|
|
274
|
+
skills,
|
|
275
|
+
configDir,
|
|
276
|
+
sandboxDirs: preset.sandboxDirs,
|
|
277
|
+
onEvent: (event) => {
|
|
278
|
+
if (event.type === 'reasoning') {
|
|
279
|
+
liveReasoning.push({ text: event.text, status: event.status });
|
|
280
|
+
broadcastToWorkspace(workspaceId, 'agent.output', { agentId: session.id, data: event.text });
|
|
281
|
+
broadcastLiveParts();
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (event.type === 'tool_use') {
|
|
285
|
+
if (event.name === 'AskUserQuestion') {
|
|
286
|
+
const question = parseAskUserQuestion(event.id, event.input);
|
|
287
|
+
askUserQuestions.push(question);
|
|
288
|
+
pendingQuestionRuns.set(questionRunKey(workspaceId, channelId, pending.id, question.id), {
|
|
289
|
+
agentConfigId,
|
|
290
|
+
question: question.question,
|
|
291
|
+
});
|
|
292
|
+
broadcastLiveParts(true);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
// Intercept TodoWrite to persist todos to channel
|
|
296
|
+
if (event.name === 'TodoWrite' && event.input && typeof event.input === 'object') {
|
|
297
|
+
const input = event.input;
|
|
298
|
+
if (Array.isArray(input.todos)) {
|
|
299
|
+
const todos = input.todos.map((t, index) => ({
|
|
300
|
+
id: String(t.id ?? t.activeForm ?? t.subject ?? t.title ?? t.content ?? index),
|
|
301
|
+
subject: String(t.subject ?? t.title ?? t.activeForm ?? t.content ?? ''),
|
|
302
|
+
description: t.description || t.content ? String(t.description ?? t.content) : undefined,
|
|
303
|
+
status: (['pending', 'in_progress', 'completed'].includes(t.status) ? t.status : 'pending'),
|
|
304
|
+
activeForm: t.activeForm ? String(t.activeForm) : undefined,
|
|
305
|
+
}));
|
|
306
|
+
const updated = updateChannel(workspaceId, channelId, { todos });
|
|
307
|
+
if (updated)
|
|
308
|
+
broadcastToWorkspace(workspaceId, 'channel.updated', updated);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
const detailId = buildToolDetailId(event.id, event.line);
|
|
312
|
+
toolUseDetailIds.set(event.id, detailId);
|
|
313
|
+
toolDetails.set(detailId, {
|
|
314
|
+
id: detailId,
|
|
315
|
+
workspaceId,
|
|
316
|
+
channelId,
|
|
317
|
+
messageId: pending.id,
|
|
318
|
+
title: summarizeToolLine(event.line, workspace?.boundDirs?.[0]).title,
|
|
319
|
+
raw: event.line,
|
|
320
|
+
input: event.input,
|
|
321
|
+
createdAt: new Date().toISOString(),
|
|
322
|
+
});
|
|
323
|
+
saveToolDetails(workspaceId, channelId, Array.from(toolDetails.values()));
|
|
324
|
+
liveOutput.push(event.line);
|
|
325
|
+
broadcastToWorkspace(workspaceId, 'agent.output', { agentId: session.id, data: event.line });
|
|
326
|
+
broadcastLiveParts();
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
if (event.type === 'tool_result') {
|
|
330
|
+
const askedQuestion = event.toolUseId
|
|
331
|
+
? askUserQuestions.find((question) => question.toolUseId === event.toolUseId)
|
|
332
|
+
: undefined;
|
|
333
|
+
if (askedQuestion)
|
|
334
|
+
return;
|
|
335
|
+
const detail = findToolDetailForResult(event.toolUseId, event.result, toolUseDetailIds, toolDetails, workspace?.boundDirs?.[0]);
|
|
336
|
+
if (detail && isAgentSpacesIssueTool(detail.raw || detail.title)) {
|
|
337
|
+
const updatedChannel = getChannel(workspaceId, channelId);
|
|
338
|
+
if (updatedChannel)
|
|
339
|
+
broadcastToWorkspace(workspaceId, 'channel.updated', updatedChannel);
|
|
340
|
+
const updatedIssue = updatedChannel?.issueId ? issueService.getById(workspaceId, updatedChannel.issueId) : null;
|
|
341
|
+
if (updatedIssue) {
|
|
342
|
+
broadcastToWorkspace(workspaceId, isCreateCurrentChannelIssueTool(detail.raw || detail.title) ? 'issue.created' : 'issue.updated', updatedIssue);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (detail) {
|
|
346
|
+
detail.output = event.result;
|
|
347
|
+
detail.updatedAt = new Date().toISOString();
|
|
348
|
+
saveToolDetails(workspaceId, channelId, [detail]);
|
|
349
|
+
}
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
if (event.type !== 'output')
|
|
353
|
+
return;
|
|
354
|
+
liveOutput.push(event.line);
|
|
355
|
+
broadcastToWorkspace(workspaceId, 'agent.output', { agentId: session.id, data: event.line });
|
|
356
|
+
broadcastLiveParts();
|
|
357
|
+
},
|
|
358
|
+
});
|
|
359
|
+
broadcastLiveParts(true);
|
|
360
|
+
if (activeRun.stopped)
|
|
361
|
+
return;
|
|
362
|
+
const displayOutput = mergeRuntimeOutput(liveOutput, result.output);
|
|
363
|
+
if (shouldWaitForUserAnswer(askUserQuestions, result.summary, result.error, displayOutput)) {
|
|
364
|
+
const waitingOutput = stripAskUserQuestionErrorLines(liveOutput);
|
|
365
|
+
const waiting = updateMessage(workspaceId, channelId, pending.id, {
|
|
366
|
+
content: waitingOutput.join('\n') || pending.content,
|
|
367
|
+
type: 'text',
|
|
368
|
+
status: 'waiting_for_user',
|
|
369
|
+
metadata: {
|
|
370
|
+
agentSessionId: session.id,
|
|
371
|
+
runtime: preset.runtimeKind,
|
|
372
|
+
model: preset.modelId,
|
|
373
|
+
summary: 'Waiting for user answer',
|
|
374
|
+
duration: Date.now() - startTime,
|
|
375
|
+
},
|
|
376
|
+
parts: buildAgentMessageParts({
|
|
377
|
+
sessionId: session.id,
|
|
378
|
+
workspaceRoot: workspace?.boundDirs?.[0],
|
|
379
|
+
presetName: preset.name || preset.role,
|
|
380
|
+
role: preset.role,
|
|
381
|
+
model: preset.modelId,
|
|
382
|
+
systemPrompt: preset.systemPrompt,
|
|
383
|
+
mcpServers: Object.keys(mcpServers ?? {}),
|
|
384
|
+
skills,
|
|
385
|
+
output: waitingOutput,
|
|
386
|
+
reasoning: liveReasoning,
|
|
387
|
+
toolDetails,
|
|
388
|
+
askUserQuestions,
|
|
389
|
+
success: true,
|
|
390
|
+
}),
|
|
391
|
+
});
|
|
392
|
+
if (waiting)
|
|
393
|
+
broadcastToWorkspace(workspaceId, 'channel.message.updated', waiting);
|
|
394
|
+
agentService.updateStatus(workspaceId, session.id, 'blocked');
|
|
395
|
+
broadcastToWorkspace(workspaceId, 'agent.status_changed', {
|
|
396
|
+
agentId: session.id,
|
|
397
|
+
from: 'active',
|
|
398
|
+
to: 'blocked',
|
|
399
|
+
});
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
if (liveOutput.length === 0) {
|
|
403
|
+
for (const line of result.output) {
|
|
404
|
+
broadcastToWorkspace(workspaceId, 'agent.output', { agentId: session.id, data: line });
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
agentService.complete(workspaceId, session.id, result.success ? undefined : result.error, {
|
|
408
|
+
runtime: preset.runtimeKind,
|
|
409
|
+
model: preset.modelId,
|
|
410
|
+
summary: result.summary,
|
|
411
|
+
output: displayOutput,
|
|
412
|
+
durationMs: Date.now() - startTime,
|
|
413
|
+
usage: result.usage,
|
|
414
|
+
costUsd: result.costUsd,
|
|
415
|
+
});
|
|
416
|
+
broadcastToWorkspace(workspaceId, 'agent.completed', {
|
|
417
|
+
agentId: session.id,
|
|
418
|
+
result: {
|
|
419
|
+
success: result.success,
|
|
420
|
+
summary: result.summary,
|
|
421
|
+
artifacts: result.artifacts,
|
|
422
|
+
error: result.error,
|
|
423
|
+
},
|
|
424
|
+
error: result.error,
|
|
425
|
+
});
|
|
426
|
+
const reply = updateMessage(workspaceId, channelId, pending.id, {
|
|
427
|
+
content: result.success ? displayOutput.join('\n') : result.error || displayOutput.join('\n'),
|
|
428
|
+
type: 'text',
|
|
429
|
+
status: result.success ? 'completed' : 'error',
|
|
430
|
+
metadata: {
|
|
431
|
+
agentSessionId: session.id,
|
|
432
|
+
runtime: preset.runtimeKind,
|
|
433
|
+
model: preset.modelId,
|
|
434
|
+
summary: result.summary,
|
|
435
|
+
duration: Date.now() - startTime,
|
|
436
|
+
},
|
|
437
|
+
parts: buildAgentMessageParts({
|
|
438
|
+
sessionId: session.id,
|
|
439
|
+
workspaceRoot: workspace?.boundDirs?.[0],
|
|
440
|
+
presetName: preset.name || preset.role,
|
|
441
|
+
role: preset.role,
|
|
442
|
+
model: preset.modelId,
|
|
443
|
+
usage: result.usage,
|
|
444
|
+
systemPrompt: preset.systemPrompt,
|
|
445
|
+
mcpServers: Object.keys(mcpServers ?? {}),
|
|
446
|
+
skills,
|
|
447
|
+
builtInTools: buildBuiltInTools(functionTools, channel, issue),
|
|
448
|
+
output: displayOutput,
|
|
449
|
+
reasoning: liveReasoning,
|
|
450
|
+
toolDetails,
|
|
451
|
+
askUserQuestions,
|
|
452
|
+
success: result.success,
|
|
453
|
+
error: result.error,
|
|
454
|
+
}),
|
|
455
|
+
});
|
|
456
|
+
if (reply)
|
|
457
|
+
broadcastToWorkspace(workspaceId, 'channel.message.updated', reply);
|
|
458
|
+
}
|
|
459
|
+
catch (err) {
|
|
460
|
+
if (activeRun?.stopped)
|
|
461
|
+
return;
|
|
462
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
463
|
+
agentService.complete(workspaceId, session.id, error, {
|
|
464
|
+
runtime: preset.runtimeKind,
|
|
465
|
+
model: preset.modelId,
|
|
466
|
+
summary: error,
|
|
467
|
+
output: [error],
|
|
468
|
+
durationMs: Date.now() - startTime,
|
|
469
|
+
});
|
|
470
|
+
broadcastToWorkspace(workspaceId, 'agent.error', { agentId: session.id, error });
|
|
471
|
+
const reply = updateMessage(workspaceId, channelId, pending.id, {
|
|
472
|
+
content: error,
|
|
473
|
+
type: 'text',
|
|
474
|
+
status: 'error',
|
|
475
|
+
metadata: {
|
|
476
|
+
agentSessionId: session.id,
|
|
477
|
+
runtime: preset.runtimeKind,
|
|
478
|
+
model: preset.modelId,
|
|
479
|
+
duration: Date.now() - startTime,
|
|
480
|
+
},
|
|
481
|
+
parts: buildAgentMessageParts({
|
|
482
|
+
sessionId: session.id,
|
|
483
|
+
workspaceRoot: workspace?.boundDirs?.[0],
|
|
484
|
+
presetName: preset.name || preset.role,
|
|
485
|
+
role: preset.role,
|
|
486
|
+
model: preset.modelId,
|
|
487
|
+
systemPrompt: preset.systemPrompt,
|
|
488
|
+
mcpServers: Object.keys(mcpServers ?? {}),
|
|
489
|
+
skills,
|
|
490
|
+
builtInTools: buildBuiltInTools(functionTools, channel, issue),
|
|
491
|
+
output: [error],
|
|
492
|
+
reasoning: liveReasoning,
|
|
493
|
+
toolDetails: new Map(),
|
|
494
|
+
askUserQuestions: [],
|
|
495
|
+
success: false,
|
|
496
|
+
error,
|
|
497
|
+
}),
|
|
498
|
+
});
|
|
499
|
+
if (reply)
|
|
500
|
+
broadcastToWorkspace(workspaceId, 'channel.message.updated', reply);
|
|
501
|
+
}
|
|
502
|
+
finally {
|
|
503
|
+
untrackChannelRun(workspaceId, channelId, session.id);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
function resolveIssueChannelContext(workspaceId, channelId) {
|
|
507
|
+
let channel = getChannel(workspaceId, channelId);
|
|
508
|
+
let issue = channel?.issueId ? issueService.getById(workspaceId, channel.issueId) : null;
|
|
509
|
+
if (issue || channel?.type !== 'issue')
|
|
510
|
+
return { channel, issue };
|
|
511
|
+
issue = issueService.list(workspaceId).find((item) => item.channelId === channelId) ?? null;
|
|
512
|
+
channel = getChannel(workspaceId, channelId);
|
|
513
|
+
return { channel, issue };
|
|
514
|
+
}
|
|
515
|
+
function isAgentSpacesIssueTool(name) {
|
|
516
|
+
return Boolean(name && /(?:agent-spaces\.)?(?:CreateCurrentChannelIssue|ViewCurrentChannelIssue|AddCurrentChannelComment)/.test(name));
|
|
517
|
+
}
|
|
518
|
+
function isCreateCurrentChannelIssueTool(name) {
|
|
519
|
+
return Boolean(name && /(?:agent-spaces\.)?CreateCurrentChannelIssue/.test(name));
|
|
520
|
+
}
|
|
521
|
+
function channelRunKey(workspaceId, channelId) {
|
|
522
|
+
return `${workspaceId}:${channelId}`;
|
|
523
|
+
}
|
|
524
|
+
function trackChannelRun(workspaceId, channelId, run) {
|
|
525
|
+
const key = channelRunKey(workspaceId, channelId);
|
|
526
|
+
const runs = activeChannelRuns.get(key) ?? new Map();
|
|
527
|
+
runs.set(run.agentId, run);
|
|
528
|
+
activeChannelRuns.set(key, runs);
|
|
529
|
+
}
|
|
530
|
+
function untrackChannelRun(workspaceId, channelId, agentId) {
|
|
531
|
+
const key = channelRunKey(workspaceId, channelId);
|
|
532
|
+
const runs = activeChannelRuns.get(key);
|
|
533
|
+
if (!runs)
|
|
534
|
+
return;
|
|
535
|
+
runs.delete(agentId);
|
|
536
|
+
if (runs.size === 0)
|
|
537
|
+
activeChannelRuns.delete(key);
|
|
538
|
+
}
|
|
539
|
+
function stopChannelRuns(workspaceId, channelId) {
|
|
540
|
+
const runs = activeChannelRuns.get(channelRunKey(workspaceId, channelId));
|
|
541
|
+
if (!runs || runs.size === 0) {
|
|
542
|
+
markInactiveChannelRunsStopped(workspaceId, channelId);
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
for (const run of runs.values()) {
|
|
546
|
+
run.stopped = true;
|
|
547
|
+
run.runtime.stop();
|
|
548
|
+
agentService.complete(workspaceId, run.agentId, 'Stopped by user');
|
|
549
|
+
broadcastToWorkspace(workspaceId, 'agent.status_changed', {
|
|
550
|
+
agentId: run.agentId,
|
|
551
|
+
from: 'active',
|
|
552
|
+
to: 'crashed',
|
|
553
|
+
});
|
|
554
|
+
broadcastToWorkspace(workspaceId, 'agent.error', {
|
|
555
|
+
agentId: run.agentId,
|
|
556
|
+
error: 'Stopped by user',
|
|
557
|
+
});
|
|
558
|
+
const message = updateMessage(workspaceId, channelId, run.messageId, {
|
|
559
|
+
content: 'Stopped by user',
|
|
560
|
+
status: 'error',
|
|
561
|
+
parts: [
|
|
562
|
+
{
|
|
563
|
+
id: `terminal-stopped-${run.agentId}`,
|
|
564
|
+
type: 'terminal',
|
|
565
|
+
output: 'Stopped by user',
|
|
566
|
+
status: 'error',
|
|
567
|
+
},
|
|
568
|
+
],
|
|
569
|
+
});
|
|
570
|
+
if (message)
|
|
571
|
+
broadcastToWorkspace(workspaceId, 'channel.message.updated', message);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
export function hasActiveChannelRuns(workspaceId, channelId) {
|
|
575
|
+
return Boolean(activeChannelRuns.get(channelRunKey(workspaceId, channelId))?.size);
|
|
576
|
+
}
|
|
577
|
+
export function markInactiveChannelRunsStopped(workspaceId, channelId) {
|
|
578
|
+
if (hasActiveChannelRuns(workspaceId, channelId))
|
|
579
|
+
return [];
|
|
580
|
+
const stopped = [];
|
|
581
|
+
for (const message of listMessages(workspaceId, channelId)) {
|
|
582
|
+
if (message.status !== 'pending' && message.status !== 'streaming')
|
|
583
|
+
continue;
|
|
584
|
+
const updated = updateMessage(workspaceId, channelId, message.id, {
|
|
585
|
+
content: message.content || 'Stopped by user',
|
|
586
|
+
status: 'error',
|
|
587
|
+
parts: message.parts?.map((part) => {
|
|
588
|
+
if ('status' in part && part.status === 'streaming') {
|
|
589
|
+
return { ...part, status: 'completed' };
|
|
590
|
+
}
|
|
591
|
+
return part;
|
|
592
|
+
}),
|
|
593
|
+
});
|
|
594
|
+
if (updated) {
|
|
595
|
+
stopped.push(updated);
|
|
596
|
+
broadcastToWorkspace(workspaceId, 'channel.message.updated', updated);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
return stopped;
|
|
600
|
+
}
|
|
601
|
+
function buildAgentMessageParts(input) {
|
|
602
|
+
const lines = normalizeOutputLines(input.output);
|
|
603
|
+
const finalTextRange = findFinalTextRange(lines);
|
|
604
|
+
const finalText = finalTextRange
|
|
605
|
+
? collapseRepeatedTextBlock(lines.slice(finalTextRange.start, finalTextRange.end + 1)).join('\n').trim()
|
|
606
|
+
: '';
|
|
607
|
+
const usage = input.usage ?? extractUsage(lines);
|
|
608
|
+
const parts = [];
|
|
609
|
+
const chainItems = buildChainItems(lines, finalTextRange, finalText, input.workspaceRoot, input.toolDetails);
|
|
610
|
+
const reasoningText = normalizeReasoningText(input.reasoning);
|
|
611
|
+
if (reasoningText) {
|
|
612
|
+
parts.push({
|
|
613
|
+
id: `reasoning-${input.sessionId}`,
|
|
614
|
+
type: 'reasoning',
|
|
615
|
+
text: reasoningText,
|
|
616
|
+
status: input.success ? 'completed' : 'streaming',
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
if (chainItems.length > 0) {
|
|
620
|
+
parts.push({
|
|
621
|
+
id: `chain-${input.sessionId}`,
|
|
622
|
+
type: 'chain',
|
|
623
|
+
chains: chainItems,
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
for (const subagent of extractSubagentBlocks(lines, input.sessionId, input.toolDetails)) {
|
|
627
|
+
parts.push(subagent);
|
|
628
|
+
}
|
|
629
|
+
for (const question of input.askUserQuestions ?? []) {
|
|
630
|
+
parts.push({
|
|
631
|
+
id: question.id,
|
|
632
|
+
type: 'ask_user_question',
|
|
633
|
+
question: question.question,
|
|
634
|
+
choices: question.choices,
|
|
635
|
+
status: question.answer ? 'answered' : 'requested',
|
|
636
|
+
answer: question.answer,
|
|
637
|
+
toolUseId: question.toolUseId,
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
if (hasTokenUsage(usage)) {
|
|
641
|
+
parts.push({
|
|
642
|
+
id: `context-${input.sessionId}`,
|
|
643
|
+
type: 'context',
|
|
644
|
+
usedTokens: getTotalTokens(usage),
|
|
645
|
+
maxTokens: 128_000,
|
|
646
|
+
modelId: input.model,
|
|
647
|
+
usage,
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
if (input.error) {
|
|
651
|
+
parts.push({
|
|
652
|
+
id: `terminal-error-${input.sessionId}`,
|
|
653
|
+
type: 'terminal',
|
|
654
|
+
output: input.error,
|
|
655
|
+
status: 'error',
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
if (finalText && finalText !== input.error) {
|
|
659
|
+
parts.push({
|
|
660
|
+
id: `text-${input.sessionId}`,
|
|
661
|
+
type: 'text',
|
|
662
|
+
text: finalText,
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
return parts;
|
|
666
|
+
}
|
|
667
|
+
function normalizeReasoningText(reasoning) {
|
|
668
|
+
if (!reasoning?.length)
|
|
669
|
+
return '';
|
|
670
|
+
return collapseRepeatedTextBlock(reasoning
|
|
671
|
+
.map((item) => item.text.trim())
|
|
672
|
+
.filter(Boolean)).join('\n\n').trim();
|
|
673
|
+
}
|
|
674
|
+
function hasTokenUsage(usage) {
|
|
675
|
+
return Boolean(usage.totalTokens || usage.inputTokens || usage.outputTokens || usage.cachedInputTokens || usage.reasoningTokens);
|
|
676
|
+
}
|
|
677
|
+
function getTotalTokens(usage) {
|
|
678
|
+
return usage.totalTokens ?? (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) + (usage.cachedInputTokens ?? 0) + (usage.reasoningTokens ?? 0);
|
|
679
|
+
}
|
|
680
|
+
function normalizeOutputLines(output) {
|
|
681
|
+
const lines = output
|
|
682
|
+
.flatMap((line) => line.split(/\r?\n/))
|
|
683
|
+
.map((line) => line.trimEnd())
|
|
684
|
+
.filter((line) => line.trim());
|
|
685
|
+
const seenInitLines = new Set();
|
|
686
|
+
return lines.filter((line) => {
|
|
687
|
+
if (!/^Claude Code initialized\b/i.test(line))
|
|
688
|
+
return true;
|
|
689
|
+
if (seenInitLines.has(line))
|
|
690
|
+
return false;
|
|
691
|
+
seenInitLines.add(line);
|
|
692
|
+
return true;
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
function mergeRuntimeOutput(liveOutput, resultOutput) {
|
|
696
|
+
if (liveOutput.length === 0)
|
|
697
|
+
return resultOutput;
|
|
698
|
+
const finalResult = resultOutput.at(-1)?.trim();
|
|
699
|
+
if (!finalResult)
|
|
700
|
+
return liveOutput;
|
|
701
|
+
if (liveOutput.some((line) => normalizeMessageText(line) === normalizeMessageText(finalResult))) {
|
|
702
|
+
return liveOutput;
|
|
703
|
+
}
|
|
704
|
+
return [...liveOutput, finalResult];
|
|
705
|
+
}
|
|
706
|
+
function collapseRepeatedTextBlock(lines) {
|
|
707
|
+
let next = [...lines];
|
|
708
|
+
while (next.length > 1 && next.length % 2 === 0) {
|
|
709
|
+
const middle = next.length / 2;
|
|
710
|
+
const first = next.slice(0, middle);
|
|
711
|
+
const second = next.slice(middle);
|
|
712
|
+
if (!sameTextBlock(first, second))
|
|
713
|
+
break;
|
|
714
|
+
next = first;
|
|
715
|
+
}
|
|
716
|
+
return next;
|
|
717
|
+
}
|
|
718
|
+
function sameTextBlock(left, right) {
|
|
719
|
+
if (left.length !== right.length)
|
|
720
|
+
return false;
|
|
721
|
+
return normalizeMessageText(left.join('\n')) === normalizeMessageText(right.join('\n'));
|
|
722
|
+
}
|
|
723
|
+
function findFinalTextRange(lines) {
|
|
724
|
+
let end = -1;
|
|
725
|
+
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
726
|
+
if (isFinalAnswerLine(lines[index])) {
|
|
727
|
+
end = index;
|
|
728
|
+
break;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
if (end < 0)
|
|
732
|
+
return null;
|
|
733
|
+
let start = end;
|
|
734
|
+
for (let index = end - 1; index >= 0; index -= 1) {
|
|
735
|
+
if (!isFinalAnswerLine(lines[index]))
|
|
736
|
+
break;
|
|
737
|
+
start = index;
|
|
738
|
+
}
|
|
739
|
+
return { start, end };
|
|
740
|
+
}
|
|
741
|
+
function buildChainItems(lines, finalTextRange, finalText, workspaceRoot, toolDetails) {
|
|
742
|
+
let toolIndex = 0;
|
|
743
|
+
let messageIndex = 0;
|
|
744
|
+
const items = [];
|
|
745
|
+
const toolDetailMatchCounts = new Map();
|
|
746
|
+
let messageBuffer = [];
|
|
747
|
+
const flushMessageBuffer = () => {
|
|
748
|
+
if (messageBuffer.length === 0)
|
|
749
|
+
return;
|
|
750
|
+
const text = messageBuffer.join('\n').trim();
|
|
751
|
+
if (text) {
|
|
752
|
+
items.push({
|
|
753
|
+
id: `message-${messageIndex}`,
|
|
754
|
+
title: summarizeMessageTitle(text),
|
|
755
|
+
text,
|
|
756
|
+
kind: 'message',
|
|
757
|
+
status: 'completed',
|
|
758
|
+
});
|
|
759
|
+
messageIndex += 1;
|
|
760
|
+
}
|
|
761
|
+
messageBuffer = [];
|
|
762
|
+
};
|
|
763
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
764
|
+
if (finalTextRange && index >= finalTextRange.start && index <= finalTextRange.end)
|
|
765
|
+
continue;
|
|
766
|
+
const line = lines[index];
|
|
767
|
+
if (finalText && isSameMessageText(line, finalText))
|
|
768
|
+
continue;
|
|
769
|
+
if (isSubagentToolLine(line))
|
|
770
|
+
continue;
|
|
771
|
+
if (isToolLikeLine(line)) {
|
|
772
|
+
flushMessageBuffer();
|
|
773
|
+
items.push(buildToolTodo(line, toolIndex, workspaceRoot, toolDetails, toolDetailMatchCounts));
|
|
774
|
+
toolIndex += 1;
|
|
775
|
+
continue;
|
|
776
|
+
}
|
|
777
|
+
if (isFinalAnswerLine(line)) {
|
|
778
|
+
messageBuffer.push(line);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
flushMessageBuffer();
|
|
782
|
+
return items.slice(0, 40);
|
|
783
|
+
}
|
|
784
|
+
function isSameMessageText(left, right) {
|
|
785
|
+
return normalizeMessageText(left) === normalizeMessageText(right);
|
|
786
|
+
}
|
|
787
|
+
function normalizeMessageText(text) {
|
|
788
|
+
return text.trim().replace(/\s+/g, ' ');
|
|
789
|
+
}
|
|
790
|
+
function summarizeMessageTitle(text) {
|
|
791
|
+
const normalized = text.trim().replace(/\s+/g, ' ');
|
|
792
|
+
if (!normalized)
|
|
793
|
+
return 'AI message';
|
|
794
|
+
return normalized.length > 80 ? `${normalized.slice(0, 77)}...` : normalized;
|
|
795
|
+
}
|
|
796
|
+
function isToolLikeLine(line) {
|
|
797
|
+
return /^(Using|Tool:|Read|Write|Edit|MultiEdit|Bash|Search|Grep|Glob|Todo|Task|Web|Fetch|Claude Code initialized|Codex initialized|.+ running \(\d+s\))/i.test(line.trim());
|
|
798
|
+
}
|
|
799
|
+
function isFinalAnswerLine(line) {
|
|
800
|
+
return !isToolLikeLine(line) && !/^(\[.*\]|Agent runtime configuration:|Conversation history:)/.test(line.trim());
|
|
801
|
+
}
|
|
802
|
+
function isSubagentToolLine(line) {
|
|
803
|
+
return /^Tool:\s*Task\b/i.test(line.trim());
|
|
804
|
+
}
|
|
805
|
+
function buildToolTodo(line, index, workspaceRoot, toolDetails, toolDetailMatchCounts) {
|
|
806
|
+
const summary = summarizeToolLine(line, workspaceRoot);
|
|
807
|
+
const detailId = findToolDetailId(line, toolDetails, toolDetailMatchCounts);
|
|
808
|
+
return {
|
|
809
|
+
id: `tool-${index}`,
|
|
810
|
+
title: summary.title,
|
|
811
|
+
description: summary.description,
|
|
812
|
+
status: 'completed',
|
|
813
|
+
toolName: summary.toolName,
|
|
814
|
+
filePath: summary.filePath,
|
|
815
|
+
command: summary.command,
|
|
816
|
+
detailId,
|
|
817
|
+
};
|
|
818
|
+
}
|
|
819
|
+
function summarizeToolLine(line, workspaceRoot) {
|
|
820
|
+
const trimmed = line.trim();
|
|
821
|
+
const toolName = extractToolName(trimmed);
|
|
822
|
+
const inputDescription = extractQuotedField(trimmed, 'description');
|
|
823
|
+
const filePath = toWorkspaceRelativePath(extractQuotedField(trimmed, 'file_path') ?? extractQuotedField(trimmed, 'path'), workspaceRoot);
|
|
824
|
+
const command = extractQuotedField(trimmed, 'command') ?? extractCommand(trimmed, toolName);
|
|
825
|
+
const baseName = filePath?.split(/[\\/]/).filter(Boolean).at(-1);
|
|
826
|
+
if (toolName) {
|
|
827
|
+
if (filePath) {
|
|
828
|
+
return {
|
|
829
|
+
title: `${humanizeToolName(toolName)} ${baseName ?? filePath}`,
|
|
830
|
+
description: inputDescription ?? filePath,
|
|
831
|
+
toolName,
|
|
832
|
+
filePath,
|
|
833
|
+
};
|
|
834
|
+
}
|
|
835
|
+
if (command) {
|
|
836
|
+
return {
|
|
837
|
+
title: `${humanizeToolName(toolName)} command`,
|
|
838
|
+
description: inputDescription,
|
|
839
|
+
toolName,
|
|
840
|
+
command,
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
// Glob/Grep/Search: extract path + pattern + glob for header
|
|
844
|
+
const searchSummary = extractSearchParams(trimmed, toolName, workspaceRoot);
|
|
845
|
+
if (searchSummary) {
|
|
846
|
+
return { ...searchSummary, toolName };
|
|
847
|
+
}
|
|
848
|
+
const todoCount = extractTodoCount(trimmed);
|
|
849
|
+
if (todoCount !== undefined) {
|
|
850
|
+
return {
|
|
851
|
+
title: `Update ${todoCount} ${todoCount === 1 ? 'todo' : 'todos'}`,
|
|
852
|
+
toolName,
|
|
853
|
+
};
|
|
854
|
+
}
|
|
855
|
+
return {
|
|
856
|
+
title: humanizeToolName(toolName),
|
|
857
|
+
toolName,
|
|
858
|
+
};
|
|
859
|
+
}
|
|
860
|
+
return { title: trimmed };
|
|
861
|
+
}
|
|
862
|
+
function extractSearchParams(line, toolName, workspaceRoot) {
|
|
863
|
+
if (!/^(Glob|Grep|Search|SemanticSearch|WebSearch|WebFetch|Fetch)$/i.test(toolName))
|
|
864
|
+
return null;
|
|
865
|
+
const pattern = extractQuotedField(line, 'pattern') ?? extractQuotedField(line, 'query');
|
|
866
|
+
const glob = extractQuotedField(line, 'glob');
|
|
867
|
+
const searchPath = toWorkspaceRelativePath(extractQuotedField(line, 'path'), workspaceRoot);
|
|
868
|
+
const url = extractQuotedField(line, 'url');
|
|
869
|
+
const label = humanizeToolName(toolName);
|
|
870
|
+
// WebSearch/WebFetch/Fetch: show url or query
|
|
871
|
+
if (/^(WebSearch|WebFetch|Fetch)$/i.test(toolName)) {
|
|
872
|
+
if (url)
|
|
873
|
+
return { title: `${label} ${truncate(url, 60)}` };
|
|
874
|
+
if (pattern)
|
|
875
|
+
return { title: `${label} ${truncate(pattern, 60)}` };
|
|
876
|
+
return { title: label };
|
|
877
|
+
}
|
|
878
|
+
// Glob: "Find files **/*.ts in src/components"
|
|
879
|
+
if (/^Glob$/i.test(toolName)) {
|
|
880
|
+
const parts = [];
|
|
881
|
+
if (pattern)
|
|
882
|
+
parts.push(truncate(pattern, 50));
|
|
883
|
+
else if (glob)
|
|
884
|
+
parts.push(truncate(glob, 50));
|
|
885
|
+
const title = parts.length ? `${label} ${parts.join(' ')}` : label;
|
|
886
|
+
const descParts = [];
|
|
887
|
+
if (pattern && glob)
|
|
888
|
+
descParts.push(`glob: ${glob}`);
|
|
889
|
+
if (searchPath)
|
|
890
|
+
descParts.push(`in ${searchPath}`);
|
|
891
|
+
return { title, description: descParts.length ? descParts.join(', ') : undefined };
|
|
892
|
+
}
|
|
893
|
+
// Grep/Search/SemanticSearch: "Search pomodoro|timer in src/"
|
|
894
|
+
const parts = [];
|
|
895
|
+
if (pattern)
|
|
896
|
+
parts.push(truncate(pattern, 40));
|
|
897
|
+
const title = parts.length ? `${label} ${parts.join(' ')}` : label;
|
|
898
|
+
const descParts = [];
|
|
899
|
+
if (glob)
|
|
900
|
+
descParts.push(`glob: ${glob}`);
|
|
901
|
+
if (searchPath)
|
|
902
|
+
descParts.push(`in ${searchPath}`);
|
|
903
|
+
return { title, description: descParts.length ? descParts.join(', ') : undefined };
|
|
904
|
+
}
|
|
905
|
+
function truncate(str, max) {
|
|
906
|
+
return str.length > max ? `${str.slice(0, max - 3)}...` : str;
|
|
907
|
+
}
|
|
908
|
+
function extractToolName(line) {
|
|
909
|
+
return line.match(/^Tool:\s*([A-Za-z][\w-]*)\b/)?.[1]
|
|
910
|
+
?? line.match(/^([A-Za-z][\w-]*)\s+running\s+\(\d+s\)/)?.[1]
|
|
911
|
+
?? line.match(/^([A-Za-z][\w-]*):?\s+/)?.[1];
|
|
912
|
+
}
|
|
913
|
+
function humanizeToolName(toolName) {
|
|
914
|
+
const labels = {
|
|
915
|
+
Read: 'Read',
|
|
916
|
+
Write: 'Write',
|
|
917
|
+
Edit: 'Edit',
|
|
918
|
+
MultiEdit: 'Edit',
|
|
919
|
+
Bash: 'Run',
|
|
920
|
+
TodoWrite: 'Update todos',
|
|
921
|
+
Grep: 'Search',
|
|
922
|
+
Glob: 'Find files',
|
|
923
|
+
Search: 'Search',
|
|
924
|
+
SemanticSearch: 'Semantic search',
|
|
925
|
+
WebSearch: 'Web search',
|
|
926
|
+
WebFetch: 'Fetch',
|
|
927
|
+
Fetch: 'Fetch',
|
|
928
|
+
Task: 'Run subagent',
|
|
929
|
+
};
|
|
930
|
+
return labels[toolName] ?? toolName.replace(/([a-z])([A-Z])/g, '$1 $2');
|
|
931
|
+
}
|
|
932
|
+
function extractQuotedField(line, key) {
|
|
933
|
+
const quoted = line.match(new RegExp(`\\b${key}=([\"'])(.*?)\\1`))?.[2];
|
|
934
|
+
if (quoted)
|
|
935
|
+
return quoted;
|
|
936
|
+
const json = line.match(new RegExp(`"${key}"\\s*:\\s*"([^"]+)"`))?.[1];
|
|
937
|
+
return json;
|
|
938
|
+
}
|
|
939
|
+
function extractCommand(line, toolName) {
|
|
940
|
+
if (!toolName || !/^(Bash|Shell|Command)$/i.test(toolName))
|
|
941
|
+
return undefined;
|
|
942
|
+
const command = line.replace(/^Tool:\s*/i, '').replace(new RegExp(`^${toolName}:?\\s*`, 'i'), '').trim();
|
|
943
|
+
return command || undefined;
|
|
944
|
+
}
|
|
945
|
+
function extractTodoCount(line) {
|
|
946
|
+
const matches = line.match(/"content"\s*:/g);
|
|
947
|
+
return matches?.length;
|
|
948
|
+
}
|
|
949
|
+
function toWorkspaceRelativePath(path, workspaceRoot) {
|
|
950
|
+
if (!path)
|
|
951
|
+
return undefined;
|
|
952
|
+
if (!workspaceRoot || !path.startsWith(workspaceRoot))
|
|
953
|
+
return path;
|
|
954
|
+
return path.slice(workspaceRoot.length).replace(/^[/\\]/, '');
|
|
955
|
+
}
|
|
956
|
+
function findToolDetailId(line, toolDetails, matchCounts) {
|
|
957
|
+
if (!toolDetails)
|
|
958
|
+
return undefined;
|
|
959
|
+
const targetMatchIndex = matchCounts?.get(line) ?? 0;
|
|
960
|
+
let matchIndex = 0;
|
|
961
|
+
for (const [id, detail] of toolDetails) {
|
|
962
|
+
if (detail.raw !== line)
|
|
963
|
+
continue;
|
|
964
|
+
if (matchIndex === targetMatchIndex) {
|
|
965
|
+
matchCounts?.set(line, targetMatchIndex + 1);
|
|
966
|
+
return id;
|
|
967
|
+
}
|
|
968
|
+
matchIndex += 1;
|
|
969
|
+
}
|
|
970
|
+
return undefined;
|
|
971
|
+
}
|
|
972
|
+
function findToolDetailForResult(toolUseId, result, toolUseDetailIds, toolDetails, workspaceRoot) {
|
|
973
|
+
const detailId = toolUseId ? toolUseDetailIds.get(toolUseId) : undefined;
|
|
974
|
+
const byId = detailId ? toolDetails.get(detailId) : undefined;
|
|
975
|
+
if (byId)
|
|
976
|
+
return byId;
|
|
977
|
+
const resultFilePath = extractResultFilePath(result, workspaceRoot);
|
|
978
|
+
if (resultFilePath) {
|
|
979
|
+
const details = Array.from(toolDetails.values()).reverse();
|
|
980
|
+
for (const detail of details) {
|
|
981
|
+
if (detail.output !== undefined)
|
|
982
|
+
continue;
|
|
983
|
+
const inputFilePath = extractInputFilePath(detail.input, workspaceRoot);
|
|
984
|
+
if (inputFilePath === resultFilePath)
|
|
985
|
+
return detail;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
if (isSubagentToolResult(result)) {
|
|
989
|
+
const detail = Array.from(toolDetails.values()).reverse().find((candidate) => {
|
|
990
|
+
return candidate.output === undefined && /^Tool:\s*Task\b/i.test(candidate.raw);
|
|
991
|
+
});
|
|
992
|
+
if (detail)
|
|
993
|
+
return detail;
|
|
994
|
+
}
|
|
995
|
+
return Array.from(toolDetails.values()).reverse().find((detail) => detail.output === undefined);
|
|
996
|
+
}
|
|
997
|
+
function isSubagentToolResult(result) {
|
|
998
|
+
if (!result || typeof result !== 'object' || Array.isArray(result))
|
|
999
|
+
return false;
|
|
1000
|
+
const record = result;
|
|
1001
|
+
return (typeof record.agentId === 'string'
|
|
1002
|
+
|| typeof record.agentType === 'string'
|
|
1003
|
+
|| (record.status === 'completed' && Array.isArray(record.content)));
|
|
1004
|
+
}
|
|
1005
|
+
function extractResultFilePath(result, workspaceRoot) {
|
|
1006
|
+
if (!result || typeof result !== 'object')
|
|
1007
|
+
return undefined;
|
|
1008
|
+
const record = result;
|
|
1009
|
+
const file = record.file;
|
|
1010
|
+
if (file && typeof file === 'object') {
|
|
1011
|
+
const filePath = file.filePath;
|
|
1012
|
+
if (typeof filePath === 'string')
|
|
1013
|
+
return toWorkspaceRelativePath(filePath, workspaceRoot);
|
|
1014
|
+
}
|
|
1015
|
+
const filePath = record.filePath;
|
|
1016
|
+
if (typeof filePath === 'string')
|
|
1017
|
+
return toWorkspaceRelativePath(filePath, workspaceRoot);
|
|
1018
|
+
return undefined;
|
|
1019
|
+
}
|
|
1020
|
+
function extractInputFilePath(input, workspaceRoot) {
|
|
1021
|
+
if (!input || typeof input !== 'object')
|
|
1022
|
+
return undefined;
|
|
1023
|
+
const record = input;
|
|
1024
|
+
const filePath = record.file_path ?? record.path;
|
|
1025
|
+
return typeof filePath === 'string' ? toWorkspaceRelativePath(filePath, workspaceRoot) : undefined;
|
|
1026
|
+
}
|
|
1027
|
+
function buildToolDetailId(id, line) {
|
|
1028
|
+
const key = `${id}:${line}`;
|
|
1029
|
+
let hash = 0;
|
|
1030
|
+
for (let index = 0; index < key.length; index += 1) {
|
|
1031
|
+
hash = ((hash << 5) - hash + key.charCodeAt(index)) | 0;
|
|
1032
|
+
}
|
|
1033
|
+
return `tool-${Math.abs(hash).toString(36)}`;
|
|
1034
|
+
}
|
|
1035
|
+
function questionRunKey(workspaceId, channelId, messageId, questionId) {
|
|
1036
|
+
return `${workspaceId}:${channelId}:${messageId}:${questionId}`;
|
|
1037
|
+
}
|
|
1038
|
+
function parseAskUserQuestion(toolUseId, input) {
|
|
1039
|
+
const record = input && typeof input === 'object' ? input : {};
|
|
1040
|
+
const rawQuestions = Array.isArray(record.questions) ? record.questions : [];
|
|
1041
|
+
const first = rawQuestions.find((item) => item && typeof item === 'object');
|
|
1042
|
+
const question = typeof first?.question === 'string' && first.question.trim()
|
|
1043
|
+
? first.question.trim()
|
|
1044
|
+
: '请选择一个选项:';
|
|
1045
|
+
const options = Array.isArray(first?.options) ? first.options : [];
|
|
1046
|
+
const choices = options
|
|
1047
|
+
.map((option) => {
|
|
1048
|
+
if (typeof option === 'string')
|
|
1049
|
+
return option;
|
|
1050
|
+
if (!option || typeof option !== 'object')
|
|
1051
|
+
return '';
|
|
1052
|
+
const value = option;
|
|
1053
|
+
return typeof value.label === 'string' ? value.label : '';
|
|
1054
|
+
})
|
|
1055
|
+
.filter(Boolean);
|
|
1056
|
+
return {
|
|
1057
|
+
id: `ask-user-${toolUseId}`,
|
|
1058
|
+
toolUseId,
|
|
1059
|
+
question,
|
|
1060
|
+
choices,
|
|
1061
|
+
};
|
|
1062
|
+
}
|
|
1063
|
+
function questionFromAnsweredPart(parts, questionId) {
|
|
1064
|
+
const part = parts?.find((item) => item.type === 'ask_user_question' && item.id === questionId);
|
|
1065
|
+
if (!part || part.type !== 'ask_user_question')
|
|
1066
|
+
return undefined;
|
|
1067
|
+
return {
|
|
1068
|
+
id: part.id,
|
|
1069
|
+
toolUseId: part.toolUseId,
|
|
1070
|
+
question: part.question,
|
|
1071
|
+
choices: part.choices ?? [],
|
|
1072
|
+
answer: part.answer,
|
|
1073
|
+
};
|
|
1074
|
+
}
|
|
1075
|
+
function shouldWaitForUserAnswer(questions, summary, error, output) {
|
|
1076
|
+
if (!questions.some((question) => !question.answer))
|
|
1077
|
+
return false;
|
|
1078
|
+
if (summary === 'Waiting for user answer')
|
|
1079
|
+
return true;
|
|
1080
|
+
const text = [error ?? '', ...output].join('\n');
|
|
1081
|
+
return !text.trim() || isAskUserQuestionError(text);
|
|
1082
|
+
}
|
|
1083
|
+
function stripAskUserQuestionErrorLines(output) {
|
|
1084
|
+
return output.filter((line) => !isAskUserQuestionError(line));
|
|
1085
|
+
}
|
|
1086
|
+
function isAskUserQuestionError(error) {
|
|
1087
|
+
return /Answer questions\?/i.test(error);
|
|
1088
|
+
}
|
|
1089
|
+
function extractUsage(lines) {
|
|
1090
|
+
const usage = {};
|
|
1091
|
+
for (const line of lines) {
|
|
1092
|
+
const lower = line.toLowerCase();
|
|
1093
|
+
if (!lower.includes('token'))
|
|
1094
|
+
continue;
|
|
1095
|
+
const input = line.match(/\bin(?:put)?[=:\s]+([\d,]+)/i)?.[1];
|
|
1096
|
+
const output = line.match(/\bout(?:put)?[=:\s]+([\d,]+)/i)?.[1];
|
|
1097
|
+
const total = line.match(/\btokens?[=:\s]+([\d,]+)/i)?.[1];
|
|
1098
|
+
if (input)
|
|
1099
|
+
usage.inputTokens = Number(input.replace(/,/g, ''));
|
|
1100
|
+
if (output)
|
|
1101
|
+
usage.outputTokens = Number(output.replace(/,/g, ''));
|
|
1102
|
+
if (total)
|
|
1103
|
+
usage.totalTokens = Number(total.replace(/,/g, ''));
|
|
1104
|
+
}
|
|
1105
|
+
return usage;
|
|
1106
|
+
}
|
|
1107
|
+
function extractSubagentBlocks(lines, sessionId, toolDetails) {
|
|
1108
|
+
const matchCounts = new Map();
|
|
1109
|
+
return lines
|
|
1110
|
+
.map((line, index) => {
|
|
1111
|
+
const match = line.match(/^Tool:\s*Task\b\s*(.*)$/i);
|
|
1112
|
+
if (!match)
|
|
1113
|
+
return null;
|
|
1114
|
+
const name = line.match(/\bdescription=(["'])(.*?)\1/i)?.[2] || `Subagent ${index + 1}`;
|
|
1115
|
+
const prompt = line.match(/\bprompt=(["'])(.*?)\1/i)?.[2];
|
|
1116
|
+
const detailId = findToolDetailId(line, toolDetails, matchCounts);
|
|
1117
|
+
const detail = detailId ? toolDetails?.get(detailId) : undefined;
|
|
1118
|
+
const output = stringifySubagentOutput(detail?.output);
|
|
1119
|
+
return {
|
|
1120
|
+
id: `subagent-${sessionId}-${index}`,
|
|
1121
|
+
type: 'subagent',
|
|
1122
|
+
name,
|
|
1123
|
+
instructions: prompt,
|
|
1124
|
+
output,
|
|
1125
|
+
};
|
|
1126
|
+
})
|
|
1127
|
+
.filter((part) => Boolean(part));
|
|
1128
|
+
}
|
|
1129
|
+
function stringifySubagentOutput(output) {
|
|
1130
|
+
if (output === undefined || output === null)
|
|
1131
|
+
return undefined;
|
|
1132
|
+
if (typeof output === 'string')
|
|
1133
|
+
return output.trim() || undefined;
|
|
1134
|
+
if (Array.isArray(output)) {
|
|
1135
|
+
const text = output.flatMap((item) => {
|
|
1136
|
+
if (typeof item === 'string')
|
|
1137
|
+
return [item];
|
|
1138
|
+
if (!item || typeof item !== 'object')
|
|
1139
|
+
return [];
|
|
1140
|
+
const record = item;
|
|
1141
|
+
return typeof record.text === 'string' ? [record.text] : [];
|
|
1142
|
+
}).join('\n').trim();
|
|
1143
|
+
return text || undefined;
|
|
1144
|
+
}
|
|
1145
|
+
if (typeof output === 'object') {
|
|
1146
|
+
const record = output;
|
|
1147
|
+
if (typeof record.result === 'string' && record.result.trim())
|
|
1148
|
+
return record.result.trim();
|
|
1149
|
+
if (typeof record.summary === 'string' && record.summary.trim())
|
|
1150
|
+
return record.summary.trim();
|
|
1151
|
+
if (Array.isArray(record.content))
|
|
1152
|
+
return stringifySubagentOutput(record.content);
|
|
1153
|
+
}
|
|
1154
|
+
return undefined;
|
|
1155
|
+
}
|
|
1156
|
+
function buildAgentPrompt(workspaceId, systemPrompt, userPrompt, history = [], runtimeConfig) {
|
|
1157
|
+
const parts = [];
|
|
1158
|
+
const trimmedSystemPrompt = systemPrompt?.trim();
|
|
1159
|
+
if (trimmedSystemPrompt)
|
|
1160
|
+
parts.push(trimmedSystemPrompt);
|
|
1161
|
+
if (runtimeConfig) {
|
|
1162
|
+
const configLines = [
|
|
1163
|
+
'Agent runtime configuration:',
|
|
1164
|
+
`- MCP servers configured for this agent: ${runtimeConfig.mcpServers.length ? runtimeConfig.mcpServers.join(', ') : 'none'}`,
|
|
1165
|
+
`- Skills configured for this agent: ${runtimeConfig.skills.length ? runtimeConfig.skills.join(', ') : 'none'}`,
|
|
1166
|
+
'- Runtime tools available through Claude Code: Read, Write, Edit, MultiEdit, Bash, Grep, Glob, Task, TodoWrite, WebFetch, WebSearch',
|
|
1167
|
+
`- Agent Spaces channel tools configured for this channel: ${runtimeConfig.builtInTools?.length ? runtimeConfig.builtInTools.map((tool) => tool.name).join(', ') : 'none'}`,
|
|
1168
|
+
];
|
|
1169
|
+
if (runtimeConfig.boundDirs?.length) {
|
|
1170
|
+
configLines.push(`- Code directories (boundDirs): ${runtimeConfig.boundDirs.join(', ')}`);
|
|
1171
|
+
}
|
|
1172
|
+
configLines.push('- For Bash commands that create or modify files under the current working directory, use relative paths such as `mkdir -p css js` instead of absolute paths.');
|
|
1173
|
+
if (runtimeConfig.builtInTools?.length) {
|
|
1174
|
+
configLines.push(...formatBuiltInToolContext(runtimeConfig.builtInTools));
|
|
1175
|
+
}
|
|
1176
|
+
if (isIssueContextLookup(userPrompt)) {
|
|
1177
|
+
configLines.push('Current issue lookup rule:', '- The user is asking for the current channel issue.', '- If Agent Spaces channel tools include ViewCurrentChannelIssue, call that function tool first and answer from the tool result.', '- Do not use Bash, Glob, Grep, or project files to infer the current channel issue.', '- If ViewCurrentChannelIssue is not configured but CreateCurrentChannelIssue is configured, say this channel is not bound to an issue yet.', '- If no Agent Spaces channel issue tool is configured, say the issue tool is unavailable.');
|
|
1178
|
+
}
|
|
1179
|
+
configLines.push('When asked what MCP servers, skills, runtime tools, or Agent Spaces channel tools you have, answer from this configuration only. Do not infer availability from provider-side function names or hidden runtime internals.');
|
|
1180
|
+
parts.push(configLines.join('\n'));
|
|
1181
|
+
}
|
|
1182
|
+
if (history.length > 0) {
|
|
1183
|
+
parts.push('Conversation history:');
|
|
1184
|
+
for (const msg of history) {
|
|
1185
|
+
const role = msg.senderId === 'user' ? 'User' : (msg.senderRole || 'Agent');
|
|
1186
|
+
parts.push(`[${role}]: ${stripHtml(msg.content)}`);
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
parts.push(`User message:\n${userPrompt}`);
|
|
1190
|
+
return prependWorkspacePrompt(workspaceId, parts.join('\n\n'));
|
|
1191
|
+
}
|
|
1192
|
+
function prependWorkspacePrompt(workspaceId, prompt) {
|
|
1193
|
+
const workspacePrompt = readWorkspacePrompt(workspaceId).trim();
|
|
1194
|
+
if (!workspacePrompt)
|
|
1195
|
+
return prompt;
|
|
1196
|
+
return `${workspacePrompt}\n\n${prompt}`;
|
|
1197
|
+
}
|
|
1198
|
+
function isIssueContextLookup(userPrompt) {
|
|
1199
|
+
const text = stripHtml(userPrompt).toLowerCase();
|
|
1200
|
+
return /当前频道.*议题|议题内容|current channel.*issue|issue.*current channel/.test(text);
|
|
1201
|
+
}
|
|
1202
|
+
function buildBuiltInTools(functionTools, channel, issue) {
|
|
1203
|
+
if (!functionTools.length || !channel)
|
|
1204
|
+
return [];
|
|
1205
|
+
const issueTitle = issue?.title ?? channel.name;
|
|
1206
|
+
return functionTools.map((functionTool) => ({
|
|
1207
|
+
name: functionTool.name,
|
|
1208
|
+
description: functionTool.description,
|
|
1209
|
+
channelId: channel.id,
|
|
1210
|
+
issueId: channel.issueId,
|
|
1211
|
+
issueTitle,
|
|
1212
|
+
}));
|
|
1213
|
+
}
|
|
1214
|
+
function formatBuiltInToolContext(tools) {
|
|
1215
|
+
const firstTool = tools[0];
|
|
1216
|
+
const firstIssueTool = tools.find((tool) => tool.issueId);
|
|
1217
|
+
const lines = [
|
|
1218
|
+
'Built-in issue tool rules:',
|
|
1219
|
+
'- These are real function-call tools exposed through the agent-spaces MCP server.',
|
|
1220
|
+
'- Tool calls must use the current channel id.',
|
|
1221
|
+
];
|
|
1222
|
+
if (firstTool?.channelId)
|
|
1223
|
+
lines.push(`- Current channel id: ${firstTool.channelId}`);
|
|
1224
|
+
if (firstIssueTool?.issueId) {
|
|
1225
|
+
lines.push(`- Current channel issue id: ${firstIssueTool.issueId}`);
|
|
1226
|
+
lines.push(`- Current channel issue title: ${firstIssueTool.issueTitle || 'Untitled issue'}`);
|
|
1227
|
+
}
|
|
1228
|
+
else {
|
|
1229
|
+
lines.push('- Current channel is not bound to an issue yet. Use CreateCurrentChannelIssue before viewing or commenting.');
|
|
1230
|
+
}
|
|
1231
|
+
for (const tool of tools) {
|
|
1232
|
+
lines.push(`- ${tool.name}: ${tool.description}`);
|
|
1233
|
+
}
|
|
1234
|
+
return lines;
|
|
1235
|
+
}
|
|
1236
|
+
function stripHtml(content) {
|
|
1237
|
+
return content
|
|
1238
|
+
.replace(/<span[^>]*data-type=["']mention["'][^>]*data-label=["']([^"']+)["'][^>]*><\/span>/gi, '@$1')
|
|
1239
|
+
.replace(/<[^>]+>/g, ' ')
|
|
1240
|
+
.replace(/ /g, ' ')
|
|
1241
|
+
.replace(/&/g, '&')
|
|
1242
|
+
.replace(/</g, '<')
|
|
1243
|
+
.replace(/>/g, '>')
|
|
1244
|
+
.replace(/\s+/g, ' ')
|
|
1245
|
+
.trim();
|
|
1246
|
+
}
|
|
1247
|
+
function extractMentionIds(content) {
|
|
1248
|
+
const ids = new Set();
|
|
1249
|
+
const mentionPattern = /<span[^>]*data-type=["']mention["'][^>]*>/gi;
|
|
1250
|
+
for (const match of content.matchAll(mentionPattern)) {
|
|
1251
|
+
const id = match[0].match(/\sdata-id=["']([^"']+)["']/i)?.[1];
|
|
1252
|
+
if (id)
|
|
1253
|
+
ids.add(decodeHtml(id));
|
|
1254
|
+
}
|
|
1255
|
+
return [...ids];
|
|
1256
|
+
}
|
|
1257
|
+
function decodeHtml(value) {
|
|
1258
|
+
return value
|
|
1259
|
+
.replace(/"/g, '"')
|
|
1260
|
+
.replace(/'/g, "'")
|
|
1261
|
+
.replace(/&/g, '&')
|
|
1262
|
+
.replace(/</g, '<')
|
|
1263
|
+
.replace(/>/g, '>');
|
|
1264
|
+
}
|
|
1265
|
+
// Register agent handlers
|
|
1266
|
+
registerHandler('agent.start', (_ws, workspaceId, data) => {
|
|
1267
|
+
const { role, issueId } = data;
|
|
1268
|
+
const ctx = makeContext(workspaceId);
|
|
1269
|
+
if (role === 'planner' && issueId) {
|
|
1270
|
+
runPlanner(workspaceId, issueId, ctx).catch((err) => {
|
|
1271
|
+
console.error(`[ws] planner error:`, err);
|
|
1272
|
+
});
|
|
1273
|
+
}
|
|
1274
|
+
});
|
|
1275
|
+
registerHandler('agent.stop', (_ws, workspaceId, data) => {
|
|
1276
|
+
const { agentId } = data;
|
|
1277
|
+
agentService.complete(workspaceId, agentId);
|
|
1278
|
+
broadcastToWorkspace(workspaceId, 'agent.status_changed', {
|
|
1279
|
+
agentId,
|
|
1280
|
+
from: 'active',
|
|
1281
|
+
to: 'completed',
|
|
1282
|
+
});
|
|
1283
|
+
});
|
|
1284
|
+
export { broadcastToWorkspace };
|
|
1285
|
+
//# sourceMappingURL=handler.js.map
|