on main help sign in
chore: fix tool calls
commit9c04ddaa4df13877a6d7a4c16e1aa16843693fa3 authorkujtimiihoxha <kujtimii.h@gmail.com> dateThu 2 Oct 2025, 14:47 (1 year ago) parentfa7fe6b
24 files changed+3988−121
go.mod+5−34 go.sum+3−75 internal/agent/.env.sample+1 internal/agent/agent.go+11 internal/agent/agent_test.go+1 internal/agent/common_test.go+21 internal/agent/coordinator.go+1 internal/agent/testdata/TestCoderAgent/zai-glm4.6/bash_tool.yaml+247 internal/agent/testdata/TestCoderAgent/zai-glm4.6/download_tool.yaml+410 internal/agent/testdata/TestCoderAgent/zai-glm4.6/fetch_tool.yaml+278 internal/agent/testdata/TestCoderAgent/zai-glm4.6/glob_tool.yaml+314 internal/agent/testdata/TestCoderAgent/zai-glm4.6/grep_tool.yaml+224 internal/agent/testdata/TestCoderAgent/zai-glm4.6/ls_tool.yaml+214 internal/agent/testdata/TestCoderAgent/zai-glm4.6/multiedit_tool.yaml+253 internal/agent/testdata/TestCoderAgent/zai-glm4.6/parallel_tool_calls.yaml+396 internal/agent/testdata/TestCoderAgent/zai-glm4.6/read_a_file.yaml+238 internal/agent/testdata/TestCoderAgent/zai-glm4.6/simple_test.yaml+179 internal/agent/testdata/TestCoderAgent/zai-glm4.6/sourcegraph_tool.yaml+574 internal/agent/testdata/TestCoderAgent/zai-glm4.6/update_a_file.yaml+402 internal/agent/testdata/TestCoderAgent/zai-glm4.6/write_tool.yaml+204 internal/config/provider.go+3−3 internal/config/provider_empty_test.go+1−1 internal/config/provider_test.go+1−1 internal/message/content.go+7−7
go.mod+5−34
@@ -13,7 +13,7 @@ require (
1313 github.com/charlievieth/fastwalk v1.0.14
1414 github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
1515 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e
16− github.com/charmbracelet/catwalk v0.6.1
16+ github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5
1717 github.com/charmbracelet/fang v0.4.2
1818 github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018
1919 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea
@@ -30,7 +30,6 @@ require (
3030 github.com/ncruces/go-sqlite3 v0.29.0
3131 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
3232 github.com/nxadm/tail v1.4.11
33− github.com/openai/openai-go v1.12.0
3433 github.com/pressly/goose/v3 v3.25.0
3534 github.com/qjebbs/go-jsons v1.0.0-alpha.4
3635 github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06
@@ -42,7 +41,6 @@ require (
4241 github.com/tidwall/sjson v1.2.5
4342 github.com/zeebo/xxh3 v1.0.2
4443 go.yaml.in/yaml/v4 v4.0.0-rc.2
45− google.golang.org/genai v1.26.0
4644 gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20250923044825-7b4892dd3117
4745 gopkg.in/natefinch/lumberjack.v2 v2.2.1
4846 mvdan.cc/sh/v3 v3.12.1-0.20250902163504-3cf4fd5717a5
@@ -51,28 +49,8 @@ require (
5149require (
5250 cloud.google.com/go v0.116.0 // indirect
5351 cloud.google.com/go/auth v0.9.3 // indirect
54− cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
5552 cloud.google.com/go/compute/metadata v0.5.0 // indirect
56− github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
57− github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
58− github.com/aws/aws-sdk-go-v2 v1.30.3 // indirect
59− github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect
60− github.com/aws/aws-sdk-go-v2/config v1.27.27 // indirect
61− github.com/aws/aws-sdk-go-v2/credentials v1.17.27 // indirect
62− github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 // indirect
63− github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect
64− github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect
65− github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
66− github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect
67− github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 // indirect
68− github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 // indirect
69− github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 // indirect
70− github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 // indirect
71− github.com/aws/smithy-go v1.20.3 // indirect
7253 github.com/charmbracelet/x/json v0.2.0 // indirect
73− github.com/felixge/httpsnoop v1.0.4 // indirect
74− github.com/go-logr/logr v1.4.3 // indirect
75− github.com/go-logr/stdr v1.2.2 // indirect
7654 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
7755 github.com/google/go-cmp v0.7.0 // indirect
7856 github.com/google/s2a-go v0.1.8 // indirect
@@ -80,23 +58,16 @@ require (
8058 github.com/gorilla/websocket v1.5.3 // indirect
8159 github.com/openai/openai-go/v2 v2.3.0 // indirect
8260 go.opencensus.io v0.24.0 // indirect
83− go.opentelemetry.io/auto/sdk v1.1.0 // indirect
84− go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect
85− go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
86− go.opentelemetry.io/otel v1.37.0 // indirect
87− go.opentelemetry.io/otel/metric v1.37.0 // indirect
88− go.opentelemetry.io/otel/trace v1.37.0 // indirect
8961 golang.org/x/crypto v0.41.0 // indirect
90− golang.org/x/oauth2 v0.30.0 // indirect
91− golang.org/x/time v0.6.0 // indirect
92− google.golang.org/api v0.197.0 // indirect
62+ google.golang.org/genai v1.26.0 // indirect
9363 google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
9464 google.golang.org/grpc v1.66.2 // indirect
9565 google.golang.org/protobuf v1.36.8 // indirect
66+ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
9667)
9768
9869require (
99− github.com/anthropics/anthropic-sdk-go v1.12.0
70+ github.com/anthropics/anthropic-sdk-go v1.12.0 // indirect
10071 github.com/charmbracelet/fantasy v0.0.0-20251002051643-c96822199d77
10172 github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
10273)
@@ -107,7 +78,7 @@ require (
10778 github.com/aymerick/douceur v0.2.0 // indirect
10879 github.com/bahlo/generic-list-go v0.2.0 // indirect
10980 github.com/buger/jsonparser v1.1.1 // indirect
110− github.com/charmbracelet/colorprofile v0.3.2 // indirect
81+ github.com/charmbracelet/colorprofile v0.3.2
11182 github.com/charmbracelet/ultraviolet v0.0.0-20250915111650-81d4262876ef
11283 github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect
11384 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5
go.sum+3−75
@@ -3,18 +3,8 @@ cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE=
33cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
44cloud.google.com/go/auth v0.9.3 h1:VOEUIAADkkLtyfr3BLa3R8Ed/j6w1jTBmARx+wb5w5U=
55cloud.google.com/go/auth v0.9.3/go.mod h1:7z6VY+7h3KUdRov5F1i8NDP5ZzWKYmEPO842BgCsmTk=
6−cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
7−cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
86cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
97cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
10−github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ=
11−github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ=
12−github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
13−github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
14−github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
15−github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
16−github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
17−github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
188github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
199github.com/JohannesKaufmann/html-to-markdown v1.6.0 h1:04VXMiE50YYfCfLboJCLcgqF5x+rHJnb1ssNmqpLH/k=
2010github.com/JohannesKaufmann/html-to-markdown v1.6.0/go.mod h1:NUI78lGg/a7vpEJTz/0uOcYMaibytE4BUOQS8k78yPQ=
@@ -36,34 +26,6 @@ github.com/anthropics/anthropic-sdk-go v1.12.0 h1:xPqlGnq7rWrTiHazIvCiumA0u7mGQn
3626github.com/anthropics/anthropic-sdk-go v1.12.0/go.mod h1:WTz31rIUHUHqai2UslPpw5CwXrQP3geYBioRV4WOLvE=
3727github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
3828github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
39−github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY=
40−github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc=
41−github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg=
42−github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM=
43−github.com/aws/aws-sdk-go-v2/config v1.27.27 h1:HdqgGt1OAP0HkEDDShEl0oSYa9ZZBSOmKpdpsDMdO90=
44−github.com/aws/aws-sdk-go-v2/config v1.27.27/go.mod h1:MVYamCg76dFNINkZFu4n4RjDixhVr51HLj4ErWzrVwg=
45−github.com/aws/aws-sdk-go-v2/credentials v1.17.27 h1:2raNba6gr2IfA0eqqiP2XiQ0UVOpGPgDSi0I9iAP+UI=
46−github.com/aws/aws-sdk-go-v2/credentials v1.17.27/go.mod h1:gniiwbGahQByxan6YjQUMcW4Aov6bLC3m+evgcoN4r4=
47−github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 h1:KreluoV8FZDEtI6Co2xuNk/UqI9iwMrOx/87PBNIKqw=
48−github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11/go.mod h1:SeSUYBLsMYFoRvHE0Tjvn7kbxaUhl75CJi1sbfhMxkU=
49−github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU=
50−github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8=
51−github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI=
52−github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM=
53−github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
54−github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
55−github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8=
56−github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI=
57−github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE=
58−github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII=
59−github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 h1:BXx0ZIxvrJdSgSvKTZ+yRBeSqqgPM89VPlulEcl37tM=
60−github.com/aws/aws-sdk-go-v2/service/sso v1.22.4/go.mod h1:ooyCOXjvJEsUw7x+ZDHeISPMhtwI3ZCB7ggFMcFfWLU=
61−github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 h1:yiwVzJW2ZxZTurVbYWA7QOrAaCYQR72t0wrSBfoesUE=
62−github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4/go.mod h1:0oxfLkpz3rQ/CHlx5hB7H69YUpFiI1tql6Q6Ne+1bCw=
63−github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudrvuKpDKgMVRlepGE=
64−github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ=
65−github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE=
66−github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
6729github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
6830github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
6931github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY=
@@ -83,14 +45,12 @@ github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
8345github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2/go.mod h1:6HamsBKWqEC/FVHuQMHgQL+knPyvHH55HwJDHl/adMw=
8446github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e h1:4BBnKWFwJ5FLyhw/ijFxKE04i9rubr8WIPR1kjO57iA=
8547github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e/go.mod h1:F7AfLKYQqpM3NNBVs7ctW417tavhvoh9SBjsgtwpzbY=
86−github.com/charmbracelet/catwalk v0.6.1 h1:2rRqUlwo+fdyIty8jEvUufRTgqBl0aea21LV6YQPqb0=
87−github.com/charmbracelet/catwalk v0.6.1/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
48+github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5 h1:d/Gs0/fQoe4fJ7wnu7C1oA72C5KkTmacbXLN86EeqqE=
49+github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
8850github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
8951github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
9052github.com/charmbracelet/fang v0.4.2 h1:nWr7Tb82/TTNNGMGG35aTZ1X68loAOQmpb0qxkKXjas=
9153github.com/charmbracelet/fang v0.4.2/go.mod h1:wHJKQYO5ReYsxx+yZl+skDtrlKO/4LLEQ6EXsdHhRhg=
92−github.com/charmbracelet/fantasy v0.0.0-20250930080945-d8adb55feb9a h1:pD/ATiDbIRm8i5cKf8k1NR/0HhmSdAejY2kbIpmBiis=
93−github.com/charmbracelet/fantasy v0.0.0-20250930080945-d8adb55feb9a/go.mod h1:RZotHpq44tKZDe6Vf0kk1iDqnUgH7Scx+K/7uJ9Qwnw=
9454github.com/charmbracelet/fantasy v0.0.0-20251002051643-c96822199d77 h1:YHuUqaojkeu00YtQeXPqM/1RNJH/jqGNaQYFwa7JQTk=
9555github.com/charmbracelet/fantasy v0.0.0-20251002051643-c96822199d77/go.mod h1:RZotHpq44tKZDe6Vf0kk1iDqnUgH7Scx+K/7uJ9Qwnw=
9656github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018 h1:PU4Zvpagsk5sgaDxn5W4sxHuLp9QRMBZB3bFSk40A4w=
@@ -143,8 +103,6 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
143103github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
144104github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
145105github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
146−github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
147−github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
148106github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
149107github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
150108github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
@@ -152,17 +110,10 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S
152110github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
153111github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
154112github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
155−github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
156−github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
157−github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
158−github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
159−github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
160113github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI=
161114github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow=
162115github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
163116github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
164−github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
165−github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
166117github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
167118github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
168119github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
@@ -177,8 +128,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
177128github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
178129github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
179130github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
180−github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
181−github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
182131github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
183132github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
184133github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -218,6 +167,7 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
218167github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU=
219168github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
220169github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
170+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
221171github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
222172github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
223173github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -264,14 +214,10 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6
264214github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
265215github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
266216github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
267−github.com/openai/openai-go v1.12.0 h1:NBQCnXzqOTv5wsgNC36PrFEiskGfO5wccfCWDo9S1U0=
268−github.com/openai/openai-go v1.12.0/go.mod h1:g461MYGXEXBVdV5SaR/5tNzNbSfwTBBefwc+LlDCK0Y=
269217github.com/openai/openai-go/v2 v2.3.0 h1:y9U+V1tlHjvvb/5XIswuySqnG5EnKBFAbMxgBvTHXvg=
270218github.com/openai/openai-go/v2 v2.3.0/go.mod h1:sIUkR+Cu/PMUVkSKhkk742PRURkQOCFhiwJ7eRSBqmk=
271219github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
272220github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
273−github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
274−github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
275221github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
276222github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
277223github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -359,18 +305,6 @@ github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
359305github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
360306go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
361307go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
362−go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
363−go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
364−go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc=
365−go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
366−go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
367−go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
368−go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
369−go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
370−go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
371−go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
372−go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
373−go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
374308go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
375309go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
376310go.yaml.in/yaml/v4 v4.0.0-rc.2 h1:/FrI8D64VSr4HtGIlUtlFMGsm7H7pWTbj6vOLVZcA6s=
@@ -418,8 +352,6 @@ golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
418352golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
419353golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
420354golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
421−golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
422−golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
423355golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
424356golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
425357golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -475,8 +407,6 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
475407golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
476408golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
477409golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
478−golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
479−golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
480410golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
481411golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
482412golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -489,8 +419,6 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58
489419golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
490420golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
491421golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
492−google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ=
493−google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw=
494422google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
495423google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
496424google.golang.org/genai v1.26.0 h1:r4HGL54kFv/WCRMTAbZg05Ct+vXfhAbTRlXhFyBkEQo=
internal/agent/.env.sample+1
@@ -1,3 +1,4 @@
11CRUSH_ANTHROPIC_API_KEY=
22CRUSH_OPENAI_API_KEY=
33CRUSH_OPENROUTER_API_KEY=
4+CRUSH_ZAI_API_KEY=
internal/agent/agent.go+11
@@ -250,6 +250,17 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*ai.Agen
250250 OnRetry: func(err *ai.APICallError, delay time.Duration) {
251251 // TODO: implement
252252 },
253+ OnToolCall: func(tc ai.ToolCallContent) error {
254+ toolCall := message.ToolCall{
255+ ID: tc.ToolCallID,
256+ Name: tc.ToolName,
257+ Input: tc.Input,
258+ ProviderExecuted: false,
259+ Finished: true,
260+ }
261+ currentAssistant.AddToolCall(toolCall)
262+ return a.messages.Update(genCtx, *currentAssistant)
263+ },
253264 OnToolResult: func(result ai.ToolResultContent) error {
254265 var resultContent string
255266 isError := false
internal/agent/agent_test.go+1
@@ -21,6 +21,7 @@ var modelPairs = []modelPair{
2121 {"anthropic-sonnet", anthropicBuilder("claude-sonnet-4-5-20250929"), anthropicBuilder("claude-3-5-haiku-20241022")},
2222 {"openai-gpt-5", openaiBuilder("gpt-5"), openaiBuilder("gpt-4o")},
2323 {"openrouter-kimi-k2", openRouterBuilder("moonshotai/kimi-k2-0905"), openRouterBuilder("qwen/qwen3-next-80b-a3b-instruct")},
24+ {"zai-glm4.6", zAIBuilder("glm-4.6"), zAIBuilder("glm-4.5-air")},
2425}
2526
2627func getModels(t *testing.T, r *recorder.Recorder, pair modelPair) (ai.LanguageModel, ai.LanguageModel) {
internal/agent/common_test.go+21
@@ -22,6 +22,7 @@ import (
2222 "github.com/charmbracelet/fantasy/ai"
2323 "github.com/charmbracelet/fantasy/anthropic"
2424 "github.com/charmbracelet/fantasy/openai"
25+ "github.com/charmbracelet/fantasy/openaicompat"
2526 "github.com/charmbracelet/fantasy/openrouter"
2627 "github.com/stretchr/testify/require"
2728 "gopkg.in/dnaeon/go-vcr.v4/pkg/recorder"
@@ -85,6 +86,26 @@ func openRouterBuilder(model string) builderFunc {
8586 }
8687}
8788
89+func zAIBuilder(model string) builderFunc {
90+ return func(t *testing.T, r *recorder.Recorder) (ai.LanguageModel, error) {
91+ tf := func() func() string {
92+ id := 0
93+ return func() string {
94+ id += 1
95+ return fmt.Sprintf("%s-%d", t.Name(), id)
96+ }
97+ }
98+ provider := openaicompat.New(
99+ "https://api.z.ai/api/coding/paas/v4",
100+ openaicompat.WithAPIKey(os.Getenv("CRUSH_ZAI_API_KEY")),
101+ openaicompat.WithHTTPClient(&http.Client{Transport: r}),
102+ openaicompat.WithLanguageUniqueToolCallIds(),
103+ openaicompat.WithLanguageModelGenerateIDFunc(tf()),
104+ )
105+ return provider.LanguageModel(model)
106+ }
107+}
108+
88109func testEnv(t *testing.T) env {
89110 testDir := filepath.Join("/tmp/crush-test/", t.Name())
90111 os.RemoveAll(testDir)
internal/agent/coordinator.go+1
@@ -371,6 +371,7 @@ func (c *coordinator) buildOpenrouterProvider(_, apiKey string, headers map[stri
371371func (c *coordinator) buildOpenaiCompatProvider(baseURL, apiKey string, headers map[string]string) ai.Provider {
372372 opts := []openaicompat.Option{
373373 openaicompat.WithAPIKey(apiKey),
374+ openaicompat.WithLanguageUniqueToolCallIds(),
374375 }
375376 if c.cfg.Options.Debug {
376377 httpClient := log.NewHTTPClient()
internal/agent/testdata/TestCoderAgent/zai-glm4.6/bash_tool.yamlnew file+247
@@ -0,0 +1,247 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 676
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse bash to create a file named test.txt with content ''hello bash''","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
30+
31+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
32+
33+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
34+
35+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
36+
37+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
38+
39+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
40+
41+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
42+
43+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
44+
45+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
46+
47+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
48+
49+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
50+
51+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
52+
53+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
54+
55+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
56+
57+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Generate"}}]}
58+
59+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
60+
61+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
62+
63+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
64+
65+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
66+
67+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
68+
69+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" following"}}]}
70+
71+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
72+
73+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
74+
75+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" use"}}]}
76+
77+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" bash"}}]}
78+
79+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
80+
81+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" create"}}]}
82+
83+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
84+
85+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
86+
87+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" named"}}]}
88+
89+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" test"}}]}
90+
91+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".txt"}}]}
92+
93+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
94+
95+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
96+
97+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" '"}}]}
98+
99+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"hello"}}]}
100+
101+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" bash"}}]}
102+
103+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'"}}]}
104+
105+ data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":120,"completion_tokens":40,"total_tokens":160,"prompt_tokens_details":{"cached_tokens":104}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 836.495834ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30643
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/bash_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use bash to create a file named test.txt with content 'hello bash'\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"20251002201333359b9a4178224cfa","created":1759407213,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"20251002201333359b9a4178224cfa","created":1759407213,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
141+
142+ data: {"id":"20251002201333359b9a4178224cfa","created":1759407213,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_b28f85c94206461388ab4fae","index":0,"type":"function","function":{"name":"bash","arguments":"{\"command\":\"echo 'hello bash' > test.txt\",\"description\":\"Create test.txt with content 'hello bash'\"}"}}]}}]}
143+
144+ data: {"id":"20251002201333359b9a4178224cfa","created":1759407213,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7313,"completion_tokens":40,"total_tokens":7353,"prompt_tokens_details":{"cached_tokens":45}}}
145+
146+ data: [DONE]
147+
148+ headers:
149+ Content-Type:
150+ - text/event-stream;charset=UTF-8
151+ status: 200 OK
152+ code: 200
153+ duration: 2.250555375s
154+- id: 2
155+ request:
156+ proto: HTTP/1.1
157+ proto_major: 1
158+ proto_minor: 1
159+ content_length: 31004
160+ host: ""
161+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/bash_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use bash to create a file named test.txt with content 'hello bash'\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/bash_tool-1\",\"function\":{\"arguments\":\"{\\\"command\\\":\\\"echo 'hello bash' > test.txt\\\",\\\"description\\\":\\\"Create test.txt with content 'hello bash'\\\"}\",\"name\":\"bash\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"no output\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/bash_tool-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
162+ headers:
163+ Accept:
164+ - application/json
165+ Content-Type:
166+ - application/json
167+ User-Agent:
168+ - OpenAI/Go 2.3.0
169+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
170+ method: POST
171+ response:
172+ proto: HTTP/2.0
173+ proto_major: 2
174+ proto_minor: 0
175+ content_length: -1
176+ body: |+
177+ data: {"id":"2025100220133505ecc6fb6c6b463e","created":1759407215,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
178+
179+ data: {"id":"2025100220133505ecc6fb6c6b463e","created":1759407215,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
180+
181+ data: {"id":"2025100220133505ecc6fb6c6b463e","created":1759407215,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_b473294f94a24a0299d57b01","index":0,"type":"function","function":{"name":"bash","arguments":"{\"command\":\"ls -la test.txt\",\"description\":\"Verify test.txt was created\"}"}}]}}]}
182+
183+ data: {"id":"2025100220133505ecc6fb6c6b463e","created":1759407215,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7361,"completion_tokens":33,"total_tokens":7394,"prompt_tokens_details":{"cached_tokens":45}}}
184+
185+ data: [DONE]
186+
187+ headers:
188+ Content-Type:
189+ - text/event-stream;charset=UTF-8
190+ status: 200 OK
191+ code: 200
192+ duration: 1.583408958s
193+- id: 3
194+ request:
195+ proto: HTTP/1.1
196+ proto_major: 1
197+ proto_minor: 1
198+ content_length: 31450
199+ host: ""
200+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/bash_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use bash to create a file named test.txt with content 'hello bash'\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/bash_tool-1\",\"function\":{\"arguments\":\"{\\\"command\\\":\\\"echo 'hello bash' > test.txt\\\",\\\"description\\\":\\\"Create test.txt with content 'hello bash'\\\"}\",\"name\":\"bash\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"no output\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/bash_tool-1\",\"role\":\"tool\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/bash_tool-2\",\"function\":{\"arguments\":\"{\\\"command\\\":\\\"ls -la test.txt\\\",\\\"description\\\":\\\"Verify test.txt was created\\\"}\",\"name\":\"bash\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"-rw-r--r-- kujtimhoxha wheel 11 Oct 2 14:13 test.txt\\n\\n\\n<cwd>/tmp/crush-test/TestCoderAgent/zai-glm4.6/bash_tool</cwd>\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/bash_tool-2\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
201+ headers:
202+ Accept:
203+ - application/json
204+ Content-Type:
205+ - application/json
206+ User-Agent:
207+ - OpenAI/Go 2.3.0
208+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
209+ method: POST
210+ response:
211+ proto: HTTP/2.0
212+ proto_major: 2
213+ proto_minor: 0
214+ content_length: -1
215+ body: |+
216+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
217+
218+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
219+
220+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Created"}}]}
221+
222+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" test"}}]}
223+
224+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".txt"}}]}
225+
226+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
227+
228+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" content"}}]}
229+
230+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" '"}}]}
231+
232+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"hello"}}]}
233+
234+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" bash"}}]}
235+
236+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"'"}}]}
237+
238+ data: {"id":"202510022013381d1503cff9484f53","created":1759407218,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7447,"completion_tokens":14,"total_tokens":7461,"prompt_tokens_details":{"cached_tokens":7352}}}
239+
240+ data: [DONE]
241+
242+ headers:
243+ Content-Type:
244+ - text/event-stream;charset=UTF-8
245+ status: 200 OK
246+ code: 200
247+ duration: 1.377829417s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/download_tool.yamlnew file+410
@@ -0,0 +1,410 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 689
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\ndownload the file from https://httpbin.org/robots.txt and save it as robots.txt","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
30+
31+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
32+
33+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
34+
35+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
36+
37+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
38+
39+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
40+
41+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
42+
43+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
44+
45+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
46+
47+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
48+
49+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
50+
51+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" request"}}]}
52+
53+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
54+
55+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
56+
57+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
58+
59+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
60+
61+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
62+
63+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
64+
65+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
66+
67+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
68+
69+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
70+
71+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
72+
73+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
74+
75+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
76+
77+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" which"}}]}
78+
79+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
80+
81+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
82+
83+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" downloading"}}]}
84+
85+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
86+
87+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
88+
89+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" from"}}]}
90+
91+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
92+
93+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" specific"}}]}
94+
95+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" URL"}}]}
96+
97+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" and"}}]}
98+
99+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" saving"}}]}
100+
101+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" it"}}]}
102+
103+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
104+
105+ data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":123,"completion_tokens":40,"total_tokens":163,"prompt_tokens_details":{"cached_tokens":4}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 608.569667ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30660
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/download_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"download the file from https://httpbin.org/robots.txt and save it as robots.txt\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
141+
142+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
143+
144+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
145+
146+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
147+
148+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
149+
150+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" download"}}]}
151+
152+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
153+
154+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
155+
156+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" from"}}]}
157+
158+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
159+
160+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" URL"}}]}
161+
162+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" and"}}]}
163+
164+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" save"}}]}
165+
166+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" it"}}]}
167+
168+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" locally"}}]}
169+
170+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
171+
172+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" I"}}]}
173+
174+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" can"}}]}
175+
176+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" see"}}]}
177+
178+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" that"}}]}
179+
180+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
181+
182+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" download"}}]}
183+
184+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
185+
186+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
187+
188+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" available"}}]}
189+
190+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
191+
192+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" this"}}]}
193+
194+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" purpose"}}]}
195+
196+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
197+
198+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Let"}}]}
199+
200+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
201+
202+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" check"}}]}
203+
204+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
205+
206+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" parameters"}}]}
207+
208+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
209+
210+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"-"}}]}
211+
212+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" url"}}]}
213+
214+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
215+
216+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
217+
218+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"https"}}]}
219+
220+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"://"}}]}
221+
222+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"http"}}]}
223+
224+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"bin"}}]}
225+
226+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".org"}}]}
227+
228+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"/"}}]}
229+
230+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"robots"}}]}
231+
232+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".txt"}}]}
233+
234+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
235+
236+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ("}}]}
237+
238+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"provided"}}]}
239+
240+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" by"}}]}
241+
242+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
243+
244+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":")\n"}}]}
245+
246+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"-"}}]}
247+
248+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
249+
250+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"_path"}}]}
251+
252+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
253+
254+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
255+
256+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"robots"}}]}
257+
258+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".txt"}}]}
259+
260+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
261+
262+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ("}}]}
263+
264+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"provided"}}]}
265+
266+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" by"}}]}
267+
268+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
269+
270+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":")\n"}}]}
271+
272+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"-"}}]}
273+
274+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" timeout"}}]}
275+
276+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
277+
278+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" optional"}}]}
279+
280+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ("}}]}
281+
282+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"not"}}]}
283+
284+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" specified"}}]}
285+
286+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" by"}}]}
287+
288+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
289+
290+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":")\n\n"}}]}
291+
292+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
293+
294+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" have"}}]}
295+
296+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" all"}}]}
297+
298+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
299+
300+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" required"}}]}
301+
302+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" parameters"}}]}
303+
304+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":","}}]}
305+
306+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" so"}}]}
307+
308+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" I"}}]}
309+
310+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" can"}}]}
311+
312+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" proceed"}}]}
313+
314+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
315+
316+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
317+
318+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" download"}}]}
319+
320+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
321+
322+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
323+
324+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_834eee72c08d4dd4b427ddeb","index":0,"type":"function","function":{"name":"download","arguments":"{\"url\":\"https://httpbin.org/robots.txt\",\"file_path\":\"robots.txt\"}"}}]}}]}
325+
326+ data: {"id":"20251002201340e22ba751df544c89","created":1759407220,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7316,"completion_tokens":125,"total_tokens":7441,"prompt_tokens_details":{"cached_tokens":7255}}}
327+
328+ data: [DONE]
329+
330+ headers:
331+ Content-Type:
332+ - text/event-stream;charset=UTF-8
333+ status: 200 OK
334+ code: 200
335+ duration: 2.021052833s
336+- id: 2
337+ request:
338+ proto: HTTP/1.1
339+ proto_major: 1
340+ proto_minor: 1
341+ content_length: 0
342+ host: httpbin.org
343+ headers:
344+ User-Agent:
345+ - crush/1.0
346+ url: https://httpbin.org/robots.txt
347+ method: GET
348+ response:
349+ proto: HTTP/2.0
350+ proto_major: 2
351+ proto_minor: 0
352+ content_length: 30
353+ body: |
354+ User-agent: *
355+ Disallow: /deny
356+ headers:
357+ Content-Type:
358+ - text/plain
359+ status: 200 OK
360+ code: 200
361+ duration: 18.750530416s
362+- id: 3
363+ request:
364+ proto: HTTP/1.1
365+ proto_major: 1
366+ proto_minor: 1
367+ content_length: 31118
368+ host: ""
369+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/download_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"download the file from https://httpbin.org/robots.txt and save it as robots.txt\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/download_tool-1\",\"function\":{\"arguments\":\"{\\\"url\\\":\\\"https://httpbin.org/robots.txt\\\",\\\"file_path\\\":\\\"robots.txt\\\"}\",\"name\":\"download\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"Successfully downloaded 30 bytes to /tmp/crush-test/TestCoderAgent/zai-glm4.6/download_tool/robots.txt (Content-Type: text/plain)\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/download_tool-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
370+ headers:
371+ Accept:
372+ - application/json
373+ Content-Type:
374+ - application/json
375+ User-Agent:
376+ - OpenAI/Go 2.3.0
377+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
378+ method: POST
379+ response:
380+ proto: HTTP/2.0
381+ proto_major: 2
382+ proto_minor: 0
383+ content_length: -1
384+ body: |+
385+ data: {"id":"20251002201403f59972115c794d61","created":1759407243,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
386+
387+ data: {"id":"20251002201403f59972115c794d61","created":1759407243,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
388+
389+ data: {"id":"20251002201403f59972115c794d61","created":1759407243,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Download"}}]}
390+
391+ data: {"id":"20251002201403f59972115c794d61","created":1759407243,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"ed"}}]}
392+
393+ data: {"id":"20251002201403f59972115c794d61","created":1759407243,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" successfully"}}]}
394+
395+ data: {"id":"20251002201403f59972115c794d61","created":1759407243,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" to"}}]}
396+
397+ data: {"id":"20251002201403f59972115c794d61","created":1759407243,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" robots"}}]}
398+
399+ data: {"id":"20251002201403f59972115c794d61","created":1759407243,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".txt"}}]}
400+
401+ data: {"id":"20251002201403f59972115c794d61","created":1759407243,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7388,"completion_tokens":11,"total_tokens":7399,"prompt_tokens_details":{"cached_tokens":7255}}}
402+
403+ data: [DONE]
404+
405+ headers:
406+ Content-Type:
407+ - text/event-stream;charset=UTF-8
408+ status: 200 OK
409+ code: 200
410+ duration: 1.149684875s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/fetch_tool.yamlnew file+278
@@ -0,0 +1,278 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 702
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nfetch the content from https://httpbin.org/html and tell me if it contains the word ''Herman''","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
30+
31+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
32+
33+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
34+
35+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" create"}}]}
36+
37+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
38+
39+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" short"}}]}
40+
41+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
42+
43+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
44+
45+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
46+
47+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
48+
49+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
50+
51+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" request"}}]}
52+
53+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
54+
55+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
56+
57+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
58+
59+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
60+
61+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
62+
63+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
64+
65+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n"}}]}
66+
67+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
68+
69+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
70+
71+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Fetch"}}]}
72+
73+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
74+
75+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" from"}}]}
76+
77+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" https"}}]}
78+
79+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"://"}}]}
80+
81+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"http"}}]}
82+
83+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"bin"}}]}
84+
85+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".org"}}]}
86+
87+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"/html"}}]}
88+
89+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
90+
91+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"2"}}]}
92+
93+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
94+
95+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Check"}}]}
96+
97+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" if"}}]}
98+
99+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" it"}}]}
100+
101+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" contains"}}]}
102+
103+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
104+
105+ data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":127,"completion_tokens":40,"total_tokens":167,"prompt_tokens_details":{"cached_tokens":104}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 776.999875ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30670
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/fetch_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"fetch the content from https://httpbin.org/html and tell me if it contains the word 'Herman'\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"20251002201405bac757877817442c","created":1759407245,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"20251002201405bac757877817442c","created":1759407245,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
141+
142+ data: {"id":"20251002201405bac757877817442c","created":1759407245,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_4eb7c025f0f64d4aa3f7eaef","index":0,"type":"function","function":{"name":"fetch","arguments":"{\"format\":\"text\",\"url\":\"https://httpbin.org/html\"}"}}]}}]}
143+
144+ data: {"id":"20251002201405bac757877817442c","created":1759407245,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7321,"completion_tokens":30,"total_tokens":7351,"prompt_tokens_details":{"cached_tokens":7255}}}
145+
146+ data: [DONE]
147+
148+ headers:
149+ Content-Type:
150+ - text/event-stream;charset=UTF-8
151+ status: 200 OK
152+ code: 200
153+ duration: 848.639292ms
154+- id: 2
155+ request:
156+ proto: HTTP/1.1
157+ proto_major: 1
158+ proto_minor: 1
159+ content_length: 0
160+ host: httpbin.org
161+ headers:
162+ User-Agent:
163+ - crush/1.0
164+ url: https://httpbin.org/html
165+ method: GET
166+ response:
167+ proto: HTTP/2.0
168+ proto_major: 2
169+ proto_minor: 0
170+ content_length: 3741
171+ body: |-
172+ <!DOCTYPE html>
173+ <html>
174+ <head>
175+ </head>
176+ <body>
177+ <h1>Herman Melville - Moby-Dick</h1>
178+
179+ <div>
180+ <p>
181+ Availing himself of the mild, summer-cool weather that now reigned in these latitudes, and in preparation for the peculiarly active pursuits shortly to be anticipated, Perth, the begrimed, blistered old blacksmith, had not removed his portable forge to the hold again, after concluding his contributory work for Ahab's leg, but still retained it on deck, fast lashed to ringbolts by the foremast; being now almost incessantly invoked by the headsmen, and harpooneers, and bowsmen to do some little job for them; altering, or repairing, or new shaping their various weapons and boat furniture. Often he would be surrounded by an eager circle, all waiting to be served; holding boat-spades, pike-heads, harpoons, and lances, and jealously watching his every sooty movement, as he toiled. Nevertheless, this old man's was a patient hammer wielded by a patient arm. No murmur, no impatience, no petulance did come from him. Silent, slow, and solemn; bowing over still further his chronically broken back, he toiled away, as if toil were life itself, and the heavy beating of his hammer the heavy beating of his heart. And so it was.—Most miserable! A peculiar walk in this old man, a certain slight but painful appearing yawing in his gait, had at an early period of the voyage excited the curiosity of the mariners. And to the importunity of their persisted questionings he had finally given in; and so it came to pass that every one now knew the shameful story of his wretched fate. Belated, and not innocently, one bitter winter's midnight, on the road running between two country towns, the blacksmith half-stupidly felt the deadly numbness stealing over him, and sought refuge in a leaning, dilapidated barn. The issue was, the loss of the extremities of both feet. Out of this revelation, part by part, at last came out the four acts of the gladness, and the one long, and as yet uncatastrophied fifth act of the grief of his life's drama. He was an old man, who, at the age of nearly sixty, had postponedly encountered that thing in sorrow's technicals called ruin. He had been an artisan of famed excellence, and with plenty to do; owned a house and garden; embraced a youthful, daughter-like, loving wife, and three blithe, ruddy children; every Sunday went to a cheerful-looking church, planted in a grove. But one night, under cover of darkness, and further concealed in a most cunning disguisement, a desperate burglar slid into his happy home, and robbed them all of everything. And darker yet to tell, the blacksmith himself did ignorantly conduct this burglar into his family's heart. It was the Bottle Conjuror! Upon the opening of that fatal cork, forth flew the fiend, and shrivelled up his home. Now, for prudent, most wise, and economic reasons, the blacksmith's shop was in the basement of his dwelling, but with a separate entrance to it; so that always had the young and loving healthy wife listened with no unhappy nervousness, but with vigorous pleasure, to the stout ringing of her young-armed old husband's hammer; whose reverberations, muffled by passing through the floors and walls, came up to her, not unsweetly, in her nursery; and so, to stout Labor's iron lullaby, the blacksmith's infants were rocked to slumber. Oh, woe on woe! Oh, Death, why canst thou not sometimes be timely? Hadst thou taken this old blacksmith to thyself ere his full ruin came upon him, then had the young widow had a delicious grief, and her orphans a truly venerable, legendary sire to dream of in their after years; and all of them a care-killing competency.
182+ </p>
183+ </div>
184+ </body>
185+ </html>
186+ headers:
187+ Content-Type:
188+ - text/html; charset=utf-8
189+ status: 200 OK
190+ code: 200
191+ duration: 8.150293583s
192+- id: 3
193+ request:
194+ proto: HTTP/1.1
195+ proto_major: 1
196+ proto_minor: 1
197+ content_length: 34571
198+ host: ""
199+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/fetch_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"fetch the content from https://httpbin.org/html and tell me if it contains the word 'Herman'\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/fetch_tool-1\",\"function\":{\"arguments\":\"{\\\"format\\\":\\\"text\\\",\\\"url\\\":\\\"https://httpbin.org/html\\\"}\",\"name\":\"fetch\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"Herman Melville - Moby-Dick Availing himself of the mild, summer-cool weather that now reigned in these latitudes, and in preparation for the peculiarly active pursuits shortly to be anticipated, Perth, the begrimed, blistered old blacksmith, had not removed his portable forge to the hold again, after concluding his contributory work for Ahab's leg, but still retained it on deck, fast lashed to ringbolts by the foremast; being now almost incessantly invoked by the headsmen, and harpooneers, and bowsmen to do some little job for them; altering, or repairing, or new shaping their various weapons and boat furniture. Often he would be surrounded by an eager circle, all waiting to be served; holding boat-spades, pike-heads, harpoons, and lances, and jealously watching his every sooty movement, as he toiled. Nevertheless, this old man's was a patient hammer wielded by a patient arm. No murmur, no impatience, no petulance did come from him. Silent, slow, and solemn; bowing over still further his chronically broken back, he toiled away, as if toil were life itself, and the heavy beating of his hammer the heavy beating of his heart. And so it was.—Most miserable! A peculiar walk in this old man, a certain slight but painful appearing yawing in his gait, had at an early period of the voyage excited the curiosity of the mariners. And to the importunity of their persisted questionings he had finally given in; and so it came to pass that every one now knew the shameful story of his wretched fate. Belated, and not innocently, one bitter winter's midnight, on the road running between two country towns, the blacksmith half-stupidly felt the deadly numbness stealing over him, and sought refuge in a leaning, dilapidated barn. The issue was, the loss of the extremities of both feet. Out of this revelation, part by part, at last came out the four acts of the gladness, and the one long, and as yet uncatastrophied fifth act of the grief of his life's drama. He was an old man, who, at the age of nearly sixty, had postponedly encountered that thing in sorrow's technicals called ruin. He had been an artisan of famed excellence, and with plenty to do; owned a house and garden; embraced a youthful, daughter-like, loving wife, and three blithe, ruddy children; every Sunday went to a cheerful-looking church, planted in a grove. But one night, under cover of darkness, and further concealed in a most cunning disguisement, a desperate burglar slid into his happy home, and robbed them all of everything. And darker yet to tell, the blacksmith himself did ignorantly conduct this burglar into his family's heart. It was the Bottle Conjuror! Upon the opening of that fatal cork, forth flew the fiend, and shrivelled up his home. Now, for prudent, most wise, and economic reasons, the blacksmith's shop was in the basement of his dwelling, but with a separate entrance to it; so that always had the young and loving healthy wife listened with no unhappy nervousness, but with vigorous pleasure, to the stout ringing of her young-armed old husband's hammer; whose reverberations, muffled by passing through the floors and walls, came up to her, not unsweetly, in her nursery; and so, to stout Labor's iron lullaby, the blacksmith's infants were rocked to slumber. Oh, woe on woe! Oh, Death, why canst thou not sometimes be timely? Hadst thou taken this old blacksmith to thyself ere his full ruin came upon him, then had the young widow had a delicious grief, and her orphans a truly venerable, legendary sire to dream of in their after years; and all of them a care-killing competency.\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/fetch_tool-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
200+ headers:
201+ Accept:
202+ - application/json
203+ Content-Type:
204+ - application/json
205+ User-Agent:
206+ - OpenAI/Go 2.3.0
207+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
208+ method: POST
209+ response:
210+ proto: HTTP/2.0
211+ proto_major: 2
212+ proto_minor: 0
213+ content_length: -1
214+ body: |+
215+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
216+
217+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
218+
219+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Yes"}}]}
220+
221+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":","}}]}
222+
223+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" the"}}]}
224+
225+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" content"}}]}
226+
227+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" contains"}}]}
228+
229+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" the"}}]}
230+
231+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" word"}}]}
232+
233+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" \""}}]}
234+
235+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"H"}}]}
236+
237+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"erman"}}]}
238+
239+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\""}}]}
240+
241+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" ("}}]}
242+
243+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"appe"}}]}
244+
245+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"ars"}}]}
246+
247+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" as"}}]}
248+
249+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" \""}}]}
250+
251+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"H"}}]}
252+
253+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"erman"}}]}
254+
255+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" Mel"}}]}
256+
257+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"ville"}}]}
258+
259+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\""}}]}
260+
261+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" at"}}]}
262+
263+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" the"}}]}
264+
265+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" beginning"}}]}
266+
267+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":")."}}]}
268+
269+ data: {"id":"20251002201414b63239ae7ce34830","created":1759407254,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":8191,"completion_tokens":30,"total_tokens":8221,"prompt_tokens_details":{"cached_tokens":45}}}
270+
271+ data: [DONE]
272+
273+ headers:
274+ Content-Type:
275+ - text/event-stream;charset=UTF-8
276+ status: 200 OK
277+ code: 200
278+ duration: 969.233834ms
internal/agent/testdata/TestCoderAgent/zai-glm4.6/glob_tool.yamlnew file+314
@@ -0,0 +1,314 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 665
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
30+
31+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
32+
33+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
34+
35+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" create"}}]}
36+
37+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
38+
39+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" short"}}]}
40+
41+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
42+
43+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ("}}]}
44+
45+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"under"}}]}
46+
47+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":" "}}]}
48+
49+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"50"}}]}
50+
51+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" characters"}}]}
52+
53+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":")"}}]}
54+
55+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" that"}}]}
56+
57+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" summarizes"}}]}
58+
59+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
60+
61+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
62+
63+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
64+
65+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
66+
67+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
68+
69+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
70+
71+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
72+
73+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
74+
75+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asking"}}]}
76+
77+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
78+
79+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" using"}}]}
80+
81+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" glob"}}]}
82+
83+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
84+
85+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" find"}}]}
86+
87+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" all"}}]}
88+
89+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ."}}]}
90+
91+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
92+
93+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
94+
95+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
96+
97+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
98+
99+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" current"}}]}
100+
101+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" directory"}}]}
102+
103+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".\n\n"}}]}
104+
105+ data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":117,"completion_tokens":40,"total_tokens":157,"prompt_tokens_details":{"cached_tokens":105}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 691.002625ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30632
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/glob_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use glob to find all .go files in the current directory\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
141+
142+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
143+
144+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
145+
146+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
147+
148+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
149+
150+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" use"}}]}
151+
152+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
153+
154+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" glob"}}]}
155+
156+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
157+
158+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
159+
160+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" find"}}]}
161+
162+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" all"}}]}
163+
164+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ."}}]}
165+
166+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
167+
168+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
169+
170+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
171+
172+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
173+
174+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" current"}}]}
175+
176+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" directory"}}]}
177+
178+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
179+
180+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" I"}}]}
181+
182+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
183+
184+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
185+
186+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" use"}}]}
187+
188+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
189+
190+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" glob"}}]}
191+
192+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" function"}}]}
193+
194+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
195+
196+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
197+
198+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" pattern"}}]}
199+
200+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \"*."}}]}
201+
202+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
203+
204+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
205+
206+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
207+
208+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" match"}}]}
209+
210+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Go"}}]}
211+
212+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
213+
214+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
215+
216+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
217+
218+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" current"}}]}
219+
220+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" working"}}]}
221+
222+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" directory"}}]}
223+
224+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
225+
226+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
227+
228+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_efd483d9c5844047a0d0b9c4","index":0,"type":"function","function":{"name":"glob","arguments":"{\"pattern\":\"*.go\"}"}}]}}]}
229+
230+ data: {"id":"202510022014169943cfc1185e4291","created":1759407256,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7311,"completion_tokens":61,"total_tokens":7372,"prompt_tokens_details":{"cached_tokens":7255}}}
231+
232+ data: [DONE]
233+
234+ headers:
235+ Content-Type:
236+ - text/event-stream;charset=UTF-8
237+ status: 200 OK
238+ code: 200
239+ duration: 790.36275ms
240+- id: 2
241+ request:
242+ proto: HTTP/1.1
243+ proto_major: 1
244+ proto_minor: 1
245+ content_length: 30957
246+ host: ""
247+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/glob_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use glob to find all .go files in the current directory\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/glob_tool-1\",\"function\":{\"arguments\":\"{\\\"pattern\\\":\\\"*.go\\\"}\",\"name\":\"glob\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/glob_tool/main.go\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/glob_tool-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
248+ headers:
249+ Accept:
250+ - application/json
251+ Content-Type:
252+ - application/json
253+ User-Agent:
254+ - OpenAI/Go 2.3.0
255+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
256+ method: POST
257+ response:
258+ proto: HTTP/2.0
259+ proto_major: 2
260+ proto_minor: 0
261+ content_length: -1
262+ body: |+
263+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
264+
265+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
266+
267+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"/tmp"}}]}
268+
269+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"/c"}}]}
270+
271+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"rush"}}]}
272+
273+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"-test"}}]}
274+
275+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"/Test"}}]}
276+
277+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Coder"}}]}
278+
279+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Agent"}}]}
280+
281+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"/z"}}]}
282+
283+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"ai"}}]}
284+
285+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"-g"}}]}
286+
287+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"lm"}}]}
288+
289+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"4"}}]}
290+
291+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
292+
293+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"6"}}]}
294+
295+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"/g"}}]}
296+
297+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"lob"}}]}
298+
299+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"_tool"}}]}
300+
301+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"/main"}}]}
302+
303+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".go"}}]}
304+
305+ data: {"id":"202510022014190c432eb5c8c945b3","created":1759407259,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7354,"completion_tokens":24,"total_tokens":7378,"prompt_tokens_details":{"cached_tokens":43}}}
306+
307+ data: [DONE]
308+
309+ headers:
310+ Content-Type:
311+ - text/event-stream;charset=UTF-8
312+ status: 200 OK
313+ code: 200
314+ duration: 3.642033333s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/grep_tool.yamlnew file+224
@@ -0,0 +1,224 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 663
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Let"}}]}
30+
31+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
32+
33+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
34+
35+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" this"}}]}
36+
37+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" request"}}]}
38+
39+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
40+
41+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
42+
43+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
44+
45+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
46+
47+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
48+
49+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
50+
51+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
52+
53+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
54+
55+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
56+
57+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
58+
59+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
60+
61+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
62+
63+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
64+
65+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
66+
67+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" using"}}]}
68+
69+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" grep"}}]}
70+
71+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
72+
73+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" search"}}]}
74+
75+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
76+
77+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
78+
79+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" word"}}]}
80+
81+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" '"}}]}
82+
83+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"package"}}]}
84+
85+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'"}}]}
86+
87+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
88+
89+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Go"}}]}
90+
91+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
92+
93+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".\n\n"}}]}
94+
95+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
96+
97+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" key"}}]}
98+
99+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" elements here"}}]}
100+
101+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" are"}}]}
102+
103+ data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":118,"completion_tokens":40,"total_tokens":158,"prompt_tokens_details":{"cached_tokens":105}}}
104+
105+ data: [DONE]
106+
107+ headers:
108+ Content-Type:
109+ - text/event-stream;charset=UTF-8
110+ status: 200 OK
111+ code: 200
112+ duration: 693.52975ms
113+- id: 1
114+ request:
115+ proto: HTTP/1.1
116+ proto_major: 1
117+ proto_minor: 1
118+ content_length: 30630
119+ host: ""
120+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/grep_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use grep to search for the word 'package' in go files\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
121+ headers:
122+ Accept:
123+ - application/json
124+ Content-Type:
125+ - application/json
126+ User-Agent:
127+ - OpenAI/Go 2.3.0
128+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
129+ method: POST
130+ response:
131+ proto: HTTP/2.0
132+ proto_major: 2
133+ proto_minor: 0
134+ content_length: -1
135+ body: |+
136+ data: {"id":"20251002201426c8040d7db8694ee1","created":1759407267,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
137+
138+ data: {"id":"20251002201426c8040d7db8694ee1","created":1759407267,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"20251002201426c8040d7db8694ee1","created":1759407267,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_2e517a35aaed4f358bb80570","index":0,"type":"function","function":{"name":"grep","arguments":"{\"include\":\"*.go\",\"pattern\":\"package\"}"}}]}}]}
141+
142+ data: {"id":"20251002201426c8040d7db8694ee1","created":1759407267,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7312,"completion_tokens":26,"total_tokens":7338,"prompt_tokens_details":{"cached_tokens":45}}}
143+
144+ data: [DONE]
145+
146+ headers:
147+ Content-Type:
148+ - text/event-stream;charset=UTF-8
149+ status: 200 OK
150+ code: 200
151+ duration: 2.154150166s
152+- id: 2
153+ request:
154+ proto: HTTP/1.1
155+ proto_major: 1
156+ proto_minor: 1
157+ content_length: 31021
158+ host: ""
159+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/grep_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use grep to search for the word 'package' in go files\",\"role\":\"user\"},{\"content\":\"\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/grep_tool-1\",\"function\":{\"arguments\":\"{\\\"include\\\":\\\"*.go\\\",\\\"pattern\\\":\\\"package\\\"}\",\"name\":\"grep\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"Found 1 matches\\n/tmp/crush-test/TestCoderAgent/zai-glm4.6/grep_tool/main.go:\\n Line 1: package main\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/grep_tool-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
160+ headers:
161+ Accept:
162+ - application/json
163+ Content-Type:
164+ - application/json
165+ User-Agent:
166+ - OpenAI/Go 2.3.0
167+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
168+ method: POST
169+ response:
170+ proto: HTTP/2.0
171+ proto_major: 2
172+ proto_minor: 0
173+ content_length: -1
174+ body: |+
175+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
176+
177+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
178+
179+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Found"}}]}
180+
181+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" "}}]}
182+
183+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"1"}}]}
184+
185+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" match"}}]}
186+
187+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" in"}}]}
188+
189+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" `"}}]}
190+
191+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"main"}}]}
192+
193+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".go"}}]}
194+
195+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"`"}}]}
196+
197+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" at"}}]}
198+
199+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" line"}}]}
200+
201+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" "}}]}
202+
203+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"1"}}]}
204+
205+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":":"}}]}
206+
207+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" `"}}]}
208+
209+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"package"}}]}
210+
211+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
212+
213+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"`"}}]}
214+
215+ data: {"id":"202510022014433e02cc946c744e1e","created":1759407283,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7376,"completion_tokens":23,"total_tokens":7399,"prompt_tokens_details":{"cached_tokens":43}}}
216+
217+ data: [DONE]
218+
219+ headers:
220+ Content-Type:
221+ - text/event-stream;charset=UTF-8
222+ status: 200 OK
223+ code: 200
224+ duration: 1.578826083s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/ls_tool.yamlnew file+214
@@ -0,0 +1,214 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 659
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
30+
31+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
32+
33+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
34+
35+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
36+
37+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
38+
39+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" short"}}]}
40+
41+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
42+
43+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" based"}}]}
44+
45+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" on"}}]}
46+
47+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
48+
49+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
50+
51+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
52+
53+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
54+
55+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
56+
57+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
58+
59+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
60+
61+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
62+
63+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
64+
65+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
66+
67+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Generate"}}]}
68+
69+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
70+
71+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
72+
73+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
74+
75+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
76+
77+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
78+
79+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" following"}}]}
80+
81+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
82+
83+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
84+
85+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"use"}}]}
86+
87+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ls"}}]}
88+
89+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
90+
91+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" list"}}]}
92+
93+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
94+
95+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
96+
97+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
98+
99+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
100+
101+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" current"}}]}
102+
103+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" directory"}}]}
104+
105+ data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":115,"completion_tokens":40,"total_tokens":155,"prompt_tokens_details":{"cached_tokens":104}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 623.935583ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30624
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/ls_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use ls to list the files in the current directory\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"20251002201446be1fa066cda34515","created":1759407287,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"20251002201446be1fa066cda34515","created":1759407287,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
141+
142+ data: {"id":"20251002201446be1fa066cda34515","created":1759407287,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_622afb2f26604de6aef19c6f","index":0,"type":"function","function":{"name":"ls","arguments":"{\"path\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/ls_tool\"}"}}]}}]}
143+
144+ data: {"id":"20251002201446be1fa066cda34515","created":1759407287,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7309,"completion_tokens":33,"total_tokens":7342,"prompt_tokens_details":{"cached_tokens":7255}}}
145+
146+ data: [DONE]
147+
148+ headers:
149+ Content-Type:
150+ - text/event-stream;charset=UTF-8
151+ status: 200 OK
152+ code: 200
153+ duration: 1.918849584s
154+- id: 2
155+ request:
156+ proto: HTTP/1.1
157+ proto_major: 1
158+ proto_minor: 1
159+ content_length: 31007
160+ host: ""
161+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/ls_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use ls to list the files in the current directory\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/ls_tool-1\",\"function\":{\"arguments\":\"{\\\"path\\\":\\\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/ls_tool\\\"}\",\"name\":\"ls\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"\\n- /tmp/crush-test/TestCoderAgent/zai-glm4.6/ls_tool/\\n - go.mod\\n - main.go\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/ls_tool-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
162+ headers:
163+ Accept:
164+ - application/json
165+ Content-Type:
166+ - application/json
167+ User-Agent:
168+ - OpenAI/Go 2.3.0
169+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
170+ method: POST
171+ response:
172+ proto: HTTP/2.0
173+ proto_major: 2
174+ proto_minor: 0
175+ content_length: -1
176+ body: |+
177+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
178+
179+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
180+
181+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"The"}}]}
182+
183+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" current"}}]}
184+
185+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" directory"}}]}
186+
187+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" contains"}}]}
188+
189+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":":\n"}}]}
190+
191+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"-"}}]}
192+
193+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" go"}}]}
194+
195+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".mod"}}]}
196+
197+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
198+
199+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"-"}}]}
200+
201+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
202+
203+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".go"}}]}
204+
205+ data: {"id":"20251002201449fb81d75c82344347","created":1759407289,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7377,"completion_tokens":17,"total_tokens":7394,"prompt_tokens_details":{"cached_tokens":7341}}}
206+
207+ data: [DONE]
208+
209+ headers:
210+ Content-Type:
211+ - text/event-stream;charset=UTF-8
212+ status: 200 OK
213+ code: 200
214+ duration: 1.768857709s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/multiedit_tool.yamlnew file+253
@@ -0,0 +1,253 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 738
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse multiedit to change ''Hello, World!'' to ''Hello, Crush!'' and add a comment ''// Greeting'' above the fmt.Println line in main.go","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
30+
31+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
32+
33+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
34+
35+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
36+
37+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
38+
39+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
40+
41+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
42+
43+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" based"}}]}
44+
45+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" on"}}]}
46+
47+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
48+
49+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
50+
51+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
52+
53+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
54+
55+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
56+
57+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" using"}}]}
58+
59+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" mult"}}]}
60+
61+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"ied"}}]}
62+
63+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"it"}}]}
64+
65+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
66+
67+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" make"}}]}
68+
69+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" changes"}}]}
70+
71+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
72+
73+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" code"}}]}
74+
75+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
76+
77+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
78+
79+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
80+
81+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" describes"}}]}
82+
83+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" making"}}]}
84+
85+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" two"}}]}
86+
87+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" changes"}}]}
88+
89+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
90+
91+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
92+
93+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Go"}}]}
94+
95+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
96+
97+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n"}}]}
98+
99+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
100+
101+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
102+
103+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Change"}}]}
104+
105+ data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":138,"completion_tokens":40,"total_tokens":178,"prompt_tokens_details":{"cached_tokens":105}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 617.733916ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30710
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/multiedit_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use multiedit to change 'Hello, World!' to 'Hello, Crush!' and add a comment '// Greeting' above the fmt.Println line in main.go\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"2025100220145035f5556e58874000","created":1759407290,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"2025100220145035f5556e58874000","created":1759407290,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
141+
142+ data: {"id":"2025100220145035f5556e58874000","created":1759407290,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_78adcda1349e475297717834","index":0,"type":"function","function":{"name":"view","arguments":"{\"file_path\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/multiedit_tool/main.go\"}"}}]}}]}
143+
144+ data: {"id":"2025100220145035f5556e58874000","created":1759407290,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7334,"completion_tokens":38,"total_tokens":7372,"prompt_tokens_details":{"cached_tokens":7255}}}
145+
146+ data: [DONE]
147+
148+ headers:
149+ Content-Type:
150+ - text/event-stream;charset=UTF-8
151+ status: 200 OK
152+ code: 200
153+ duration: 780.4005ms
154+- id: 2
155+ request:
156+ proto: HTTP/1.1
157+ proto_major: 1
158+ proto_minor: 1
159+ content_length: 31200
160+ host: ""
161+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/multiedit_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use multiedit to change 'Hello, World!' to 'Hello, Crush!' and add a comment '// Greeting' above the fmt.Println line in main.go\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/multiedit_tool-1\",\"function\":{\"arguments\":\"{\\\"file_path\\\":\\\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/multiedit_tool/main.go\\\"}\",\"name\":\"view\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"<file>\\n 1|package main\\n 2|\\n 3|import \\\"fmt\\\"\\n 4|\\n 5|func main() {\\n 6|\\tfmt.Println(\\\"Hello, World!\\\")\\n 7|}\\n</file>\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/multiedit_tool-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
162+ headers:
163+ Accept:
164+ - application/json
165+ Content-Type:
166+ - application/json
167+ User-Agent:
168+ - OpenAI/Go 2.3.0
169+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
170+ method: POST
171+ response:
172+ proto: HTTP/2.0
173+ proto_major: 2
174+ proto_minor: 0
175+ content_length: -1
176+ body: |+
177+ data: {"id":"20251002201452cccfcd134fe54ab3","created":1759407292,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
178+
179+ data: {"id":"20251002201452cccfcd134fe54ab3","created":1759407292,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
180+
181+ data: {"id":"20251002201452cccfcd134fe54ab3","created":1759407292,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_1d0e874f9da046e789a861c2","index":0,"type":"function","function":{"name":"multiedit","arguments":"{\"file_path\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/multiedit_tool/main.go\",\"edits\":[{\"old_string\": \"\\tfmt.Println(\\\"Hello, World!\\\")\", \"new_string\": \"\\t// Greeting\\n\\tfmt.Println(\\\"Hello, Crush!\\\")\"}]}"}}]}}]}
182+
183+ data: {"id":"20251002201452cccfcd134fe54ab3","created":1759407292,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7429,"completion_tokens":85,"total_tokens":7514,"prompt_tokens_details":{"cached_tokens":7371}}}
184+
185+ data: [DONE]
186+
187+ headers:
188+ Content-Type:
189+ - text/event-stream;charset=UTF-8
190+ status: 200 OK
191+ code: 200
192+ duration: 690.509667ms
193+- id: 3
194+ request:
195+ proto: HTTP/1.1
196+ proto_major: 1
197+ proto_minor: 1
198+ content_length: 31803
199+ host: ""
200+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/multiedit_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use multiedit to change 'Hello, World!' to 'Hello, Crush!' and add a comment '// Greeting' above the fmt.Println line in main.go\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/multiedit_tool-1\",\"function\":{\"arguments\":\"{\\\"file_path\\\":\\\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/multiedit_tool/main.go\\\"}\",\"name\":\"view\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"<file>\\n 1|package main\\n 2|\\n 3|import \\\"fmt\\\"\\n 4|\\n 5|func main() {\\n 6|\\tfmt.Println(\\\"Hello, World!\\\")\\n 7|}\\n</file>\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/multiedit_tool-1\",\"role\":\"tool\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/multiedit_tool-2\",\"function\":{\"arguments\":\"{\\\"file_path\\\":\\\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/multiedit_tool/main.go\\\",\\\"edits\\\":[{\\\"old_string\\\": \\\"\\\\tfmt.Println(\\\\\\\"Hello, World!\\\\\\\")\\\", \\\"new_string\\\": \\\"\\\\t// Greeting\\\\n\\\\tfmt.Println(\\\\\\\"Hello, Crush!\\\\\\\")\\\"}]}\",\"name\":\"multiedit\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"<result>\\nApplied 1 edits to file: /tmp/crush-test/TestCoderAgent/zai-glm4.6/multiedit_tool/main.go\\n</result>\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/multiedit_tool-2\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
201+ headers:
202+ Accept:
203+ - application/json
204+ Content-Type:
205+ - application/json
206+ User-Agent:
207+ - OpenAI/Go 2.3.0
208+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
209+ method: POST
210+ response:
211+ proto: HTTP/2.0
212+ proto_major: 2
213+ proto_minor: 0
214+ content_length: -1
215+ body: |+
216+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
217+
218+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
219+
220+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Done"}}]}
221+
222+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
223+
224+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" The"}}]}
225+
226+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
227+
228+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" now"}}]}
229+
230+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" contains"}}]}
231+
232+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" the"}}]}
233+
234+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" comment"}}]}
235+
236+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" and"}}]}
237+
238+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" updated"}}]}
239+
240+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" text"}}]}
241+
242+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
243+
244+ data: {"id":"2025100220145446fb27b96faf4f84","created":1759407294,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7555,"completion_tokens":17,"total_tokens":7572,"prompt_tokens_details":{"cached_tokens":7513}}}
245+
246+ data: [DONE]
247+
248+ headers:
249+ Content-Type:
250+ - text/event-stream;charset=UTF-8
251+ status: 200 OK
252+ code: 200
253+ duration: 3.091960042s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/parallel_tool_calls.yamlnew file+396
@@ -0,0 +1,396 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 744
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Let"}}]}
30+
31+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
32+
33+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
34+
35+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
36+
37+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
38+
39+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
40+
41+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
42+
43+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
44+
45+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
46+
47+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
48+
49+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
50+
51+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
52+
53+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".\n\n"}}]}
54+
55+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
56+
57+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
58+
59+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
60+
61+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asking"}}]}
62+
63+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
64+
65+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
66+
67+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n"}}]}
68+
69+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
70+
71+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
72+
73+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Use"}}]}
74+
75+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" glob"}}]}
76+
77+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
78+
79+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" find"}}]}
80+
81+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" all"}}]}
82+
83+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ."}}]}
84+
85+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
86+
87+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
88+
89+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
90+
91+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"2"}}]}
92+
93+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
94+
95+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Use"}}]}
96+
97+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ls"}}]}
98+
99+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
100+
101+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" list"}}]}
102+
103+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
104+
105+ data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":134,"completion_tokens":40,"total_tokens":174,"prompt_tokens_details":{"cached_tokens":112}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 715.508583ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30721
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/parallel_tool_calls\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
141+
142+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
143+
144+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
145+
146+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
147+
148+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
149+
150+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n"}}]}
151+
152+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
153+
154+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
155+
156+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Use"}}]}
157+
158+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" glob"}}]}
159+
160+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
161+
162+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" find"}}]}
163+
164+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" all"}}]}
165+
166+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ."}}]}
167+
168+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
169+
170+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
171+
172+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":" \n"}}]}
173+
174+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"2"}}]}
175+
176+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
177+
178+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Use"}}]}
179+
180+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ls"}}]}
181+
182+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
183+
184+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" list"}}]}
185+
186+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
187+
188+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" current"}}]}
189+
190+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" directory"}}]}
191+
192+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
193+
194+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"3"}}]}
195+
196+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
197+
198+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Run"}}]}
199+
200+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" both"}}]}
201+
202+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
203+
204+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" calls"}}]}
205+
206+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
207+
208+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" parallel"}}]}
209+
210+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n\n"}}]}
211+
212+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"This"}}]}
213+
214+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
215+
216+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" straightforward"}}]}
217+
218+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" -"}}]}
219+
220+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" I"}}]}
221+
222+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
223+
224+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
225+
226+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" use"}}]}
227+
228+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
229+
230+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" glob"}}]}
231+
232+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
233+
234+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
235+
236+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" pattern"}}]}
237+
238+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \"*."}}]}
239+
240+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
241+
242+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
243+
244+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" and"}}]}
245+
246+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
247+
248+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ls"}}]}
249+
250+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
251+
252+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
253+
254+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" no"}}]}
255+
256+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" path"}}]}
257+
258+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" specified ("}}]}
259+
260+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"defaults to"}}]}
261+
262+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" current"}}]}
263+
264+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" working"}}]}
265+
266+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" directory"}}]}
267+
268+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":")."}}]}
269+
270+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Since"}}]}
271+
272+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" they"}}]}
273+
274+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" want"}}]}
275+
276+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" them"}}]}
277+
278+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" run"}}]}
279+
280+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
281+
282+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" parallel"}}]}
283+
284+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":","}}]}
285+
286+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" I"}}]}
287+
288+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" should"}}]}
289+
290+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" make"}}]}
291+
292+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" both"}}]}
293+
294+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
295+
296+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" calls"}}]}
297+
298+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
299+
300+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
301+
302+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" single"}}]}
303+
304+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
305+
306+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
307+
308+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
309+
310+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_1de79badb80f48c7b870def6","index":0,"type":"function","function":{"name":"glob","arguments":"{\"pattern\":\"*.go\"}"}}]}}]}
311+
312+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_3072d9f2c8ea480a825e49ac","index":1,"type":"function","function":{"name":"ls","arguments":"{\"path\":\".\"}"}}]}}]}
313+
314+ data: {"id":"202510022015248a747ba06d304b95","created":1759407324,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7329,"completion_tokens":117,"total_tokens":7446,"prompt_tokens_details":{"cached_tokens":7255}}}
315+
316+ data: [DONE]
317+
318+ headers:
319+ Content-Type:
320+ - text/event-stream;charset=UTF-8
321+ status: 200 OK
322+ code: 200
323+ duration: 852.094083ms
324+- id: 2
325+ request:
326+ proto: HTTP/1.1
327+ proto_major: 1
328+ proto_minor: 1
329+ content_length: 31394
330+ host: ""
331+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/parallel_tool_calls\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/parallel_tool_calls-1\",\"function\":{\"arguments\":\"{\\\"pattern\\\":\\\"*.go\\\"}\",\"name\":\"glob\"},\"type\":\"function\"},{\"id\":\"TestCoderAgent/zai-glm4.6/parallel_tool_calls-2\",\"function\":{\"arguments\":\"{\\\"path\\\":\\\".\\\"}\",\"name\":\"ls\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/parallel_tool_calls/main.go\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/parallel_tool_calls-1\",\"role\":\"tool\"},{\"content\":\"\\n- /tmp/crush-test/TestCoderAgent/zai-glm4.6/parallel_tool_calls/\\n - go.mod\\n - main.go\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/parallel_tool_calls-2\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
332+ headers:
333+ Accept:
334+ - application/json
335+ Content-Type:
336+ - application/json
337+ User-Agent:
338+ - OpenAI/Go 2.3.0
339+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
340+ method: POST
341+ response:
342+ proto: HTTP/2.0
343+ proto_major: 2
344+ proto_minor: 0
345+ content_length: -1
346+ body: |+
347+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
348+
349+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
350+
351+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Found"}}]}
352+
353+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" "}}]}
354+
355+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"1"}}]}
356+
357+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" ."}}]}
358+
359+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"go"}}]}
360+
361+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
362+
363+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":":"}}]}
364+
365+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
366+
367+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".go"}}]}
368+
369+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
370+
371+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Directory"}}]}
372+
373+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" contains"}}]}
374+
375+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":":"}}]}
376+
377+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" go"}}]}
378+
379+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".mod"}}]}
380+
381+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" and"}}]}
382+
383+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
384+
385+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".go"}}]}
386+
387+ data: {"id":"20251002201531c13810e37c9f4bdf","created":1759407331,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7421,"completion_tokens":23,"total_tokens":7444,"prompt_tokens_details":{"cached_tokens":7331}}}
388+
389+ data: [DONE]
390+
391+ headers:
392+ Content-Type:
393+ - text/event-stream;charset=UTF-8
394+ status: 200 OK
395+ code: 200
396+ duration: 1.756944208s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/read_a_file.yamlnew file+238
@@ -0,0 +1,238 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 625
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nRead the go mod","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"We"}}]}
30+
31+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" are"}}]}
32+
33+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generating"}}]}
34+
35+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
36+
37+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
38+
39+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
40+
41+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
42+
43+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
44+
45+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
46+
47+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
48+
49+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
50+
51+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
52+
53+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Read"}}]}
54+
55+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
56+
57+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" go"}}]}
58+
59+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" mod"}}]}
60+
61+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\"\n"}}]}
62+
63+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
64+
65+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
66+
67+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" should"}}]}
68+
69+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" be"}}]}
70+
71+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
72+
73+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" summary"}}]}
74+
75+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" of"}}]}
76+
77+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
78+
79+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
80+
81+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":","}}]}
82+
83+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" not"}}]}
84+
85+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" more"}}]}
86+
87+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" than"}}]}
88+
89+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":" "}}]}
90+
91+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"50"}}]}
92+
93+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" characters"}}]}
94+
95+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":","}}]}
96+
97+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" one"}}]}
98+
99+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" line"}}]}
100+
101+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" long"}}]}
102+
103+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":","}}]}
104+
105+ data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":109,"completion_tokens":40,"total_tokens":149,"prompt_tokens_details":{"cached_tokens":104}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 620.604541ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30594
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/read_a_file\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"Read the go mod\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"20251002201255726cd39943a04e8c","created":1759407175,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"20251002201255726cd39943a04e8c","created":1759407175,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
141+
142+ data: {"id":"20251002201255726cd39943a04e8c","created":1759407175,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_1440f29adbe1413eba8e2bdb","index":0,"type":"function","function":{"name":"view","arguments":"{\"file_path\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/read_a_file/go.mod\"}"}}]}}]}
143+
144+ data: {"id":"20251002201255726cd39943a04e8c","created":1759407175,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7303,"completion_tokens":36,"total_tokens":7339,"prompt_tokens_details":{"cached_tokens":7302}}}
145+
146+ data: [DONE]
147+
148+ headers:
149+ Content-Type:
150+ - text/event-stream;charset=UTF-8
151+ status: 200 OK
152+ code: 200
153+ duration: 1.034842916s
154+- id: 2
155+ request:
156+ proto: HTTP/1.1
157+ proto_major: 1
158+ proto_minor: 1
159+ content_length: 31003
160+ host: ""
161+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/read_a_file\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"Read the go mod\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/read_a_file-1\",\"function\":{\"arguments\":\"{\\\"file_path\\\":\\\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/read_a_file/go.mod\\\"}\",\"name\":\"view\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"<file>\\n 1|module example.com/testproject\\n 2|\\n 3|go 1.23\\n</file>\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/read_a_file-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
162+ headers:
163+ Accept:
164+ - application/json
165+ Content-Type:
166+ - application/json
167+ User-Agent:
168+ - OpenAI/Go 2.3.0
169+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
170+ method: POST
171+ response:
172+ proto: HTTP/2.0
173+ proto_major: 2
174+ proto_minor: 0
175+ content_length: -1
176+ body: |+
177+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
178+
179+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
180+
181+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"The"}}]}
182+
183+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" go"}}]}
184+
185+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".mod"}}]}
186+
187+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
188+
189+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" shows"}}]}
190+
191+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":":\n"}}]}
192+
193+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"-"}}]}
194+
195+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" Module"}}]}
196+
197+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" name"}}]}
198+
199+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":":"}}]}
200+
201+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" `"}}]}
202+
203+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"example"}}]}
204+
205+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".com"}}]}
206+
207+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"/test"}}]}
208+
209+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"project"}}]}
210+
211+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"`\n"}}]}
212+
213+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"-"}}]}
214+
215+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" Go"}}]}
216+
217+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" version"}}]}
218+
219+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":":"}}]}
220+
221+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" "}}]}
222+
223+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"1"}}]}
224+
225+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
226+
227+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"23"}}]}
228+
229+ data: {"id":"2025100220125880187f2abbc14ad1","created":1759407178,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7374,"completion_tokens":29,"total_tokens":7403,"prompt_tokens_details":{"cached_tokens":43}}}
230+
231+ data: [DONE]
232+
233+ headers:
234+ Content-Type:
235+ - text/event-stream;charset=UTF-8
236+ status: 200 OK
237+ code: 200
238+ duration: 1.9179855s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/simple_test.yamlnew file+179
@@ -0,0 +1,179 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 615
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nHello","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
30+
31+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
32+
33+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" has"}}]}
34+
35+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asked"}}]}
36+
37+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
38+
39+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
40+
41+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
42+
43+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
44+
45+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
46+
47+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
48+
49+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
50+
51+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
52+
53+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
54+
55+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
56+
57+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Hello"}}]}
58+
59+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\"."}}]}
60+
61+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Let"}}]}
62+
63+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
64+
65+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" follow"}}]}
66+
67+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
68+
69+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" instructions"}}]}
70+
71+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
72+
73+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
74+
75+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
76+
77+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
78+
79+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
80+
81+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" should"}}]}
82+
83+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" not"}}]}
84+
85+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" be"}}]}
86+
87+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" more"}}]}
88+
89+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" than"}}]}
90+
91+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":" "}}]}
92+
93+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"50"}}]}
94+
95+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" characters"}}]}
96+
97+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" long"}}]}
98+
99+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
100+
101+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"2"}}]}
102+
103+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
104+
105+ data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":106,"completion_tokens":40,"total_tokens":146,"prompt_tokens_details":{"cached_tokens":104}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 1.8379335s
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30584
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/simple_test\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"Hello\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
141+
142+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Hello"}}]}
143+
144+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"!"}}]}
145+
146+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" How"}}]}
147+
148+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" can"}}]}
149+
150+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" I"}}]}
151+
152+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" help"}}]}
153+
154+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" you"}}]}
155+
156+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
157+
158+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" your"}}]}
159+
160+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" software"}}]}
161+
162+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" engineering"}}]}
163+
164+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" tasks"}}]}
165+
166+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" today"}}]}
167+
168+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"?"}}]}
169+
170+ data: {"id":"20251002201254fc47fbd253714a1f","created":1759407174,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7299,"completion_tokens":19,"total_tokens":7318,"prompt_tokens_details":{"cached_tokens":7298}}}
171+
172+ data: [DONE]
173+
174+ headers:
175+ Content-Type:
176+ - text/event-stream;charset=UTF-8
177+ status: 200 OK
178+ code: 200
179+ duration: 2.193807208s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/sourcegraph_tool.yamlnew file+574
@@ -0,0 +1,574 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 670
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
30+
31+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
32+
33+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
34+
35+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
36+
37+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
38+
39+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
40+
41+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
42+
43+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" based"}}]}
44+
45+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" on"}}]}
46+
47+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
48+
49+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
50+
51+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
52+
53+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
54+
55+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
56+
57+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Let"}}]}
58+
59+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
60+
61+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
62+
63+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" what"}}]}
64+
65+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
66+
67+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
68+
69+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
70+
71+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asking"}}]}
72+
73+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
74+
75+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
76+
77+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
78+
79+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
80+
81+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
82+
83+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
84+
85+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
86+
87+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
88+
89+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
90+
91+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
92+
93+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
94+
95+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
96+
97+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
98+
99+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" using"}}]}
100+
101+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Source"}}]}
102+
103+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"graph"}}]}
104+
105+ data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":118,"completion_tokens":40,"total_tokens":158,"prompt_tokens_details":{"cached_tokens":105}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 625.454292ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30644
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/sourcegraph_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use sourcegraph to search for 'func main' in Go repositories\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
141+
142+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
143+
144+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
145+
146+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
147+
148+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
149+
150+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" use"}}]}
151+
152+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Source"}}]}
153+
154+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"graph"}}]}
155+
156+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
157+
158+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" search"}}]}
159+
160+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
161+
162+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" '"}}]}
163+
164+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"func"}}]}
165+
166+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" main"}}]}
167+
168+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'"}}]}
169+
170+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
171+
172+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Go"}}]}
173+
174+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" repositories"}}]}
175+
176+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
177+
178+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" This"}}]}
179+
180+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
181+
182+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
183+
184+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" straightforward"}}]}
185+
186+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" request"}}]}
187+
188+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
189+
190+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" use"}}]}
191+
192+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
193+
194+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" source"}}]}
195+
196+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"graph"}}]}
197+
198+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
199+
200+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".\n\n"}}]}
201+
202+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Looking"}}]}
203+
204+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" at"}}]}
205+
206+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
207+
208+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" source"}}]}
209+
210+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"graph"}}]}
211+
212+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
213+
214+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" definition"}}]}
215+
216+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":","}}]}
217+
218+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" I"}}]}
219+
220+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
221+
222+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
223+
224+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" provide"}}]}
225+
226+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
227+
228+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" query"}}]}
229+
230+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" parameter"}}]}
231+
232+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
233+
234+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
235+
236+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" query"}}]}
237+
238+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" should"}}]}
239+
240+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" search"}}]}
241+
242+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
243+
244+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" '"}}]}
245+
246+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"func"}}]}
247+
248+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" main"}}]}
249+
250+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'"}}]}
251+
252+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" and"}}]}
253+
254+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" limit"}}]}
255+
256+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" it"}}]}
257+
258+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
259+
260+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Go"}}]}
261+
262+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" repositories"}}]}
263+
264+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
265+
266+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":" \n\n"}}]}
267+
268+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"From"}}]}
269+
270+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
271+
272+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" basic"}}]}
273+
274+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" syntax"}}]}
275+
276+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
277+
278+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
279+
280+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
281+
282+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" description"}}]}
283+
284+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n"}}]}
285+
286+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"-"}}]}
287+
288+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
289+
290+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"func"}}]}
291+
292+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" main"}}]}
293+
294+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
295+
296+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" -"}}]}
297+
298+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" exact"}}]}
299+
300+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" matches"}}]}
301+
302+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
303+
304+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"-"}}]}
305+
306+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
307+
308+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"lang"}}]}
309+
310+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
311+
312+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
313+
314+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
315+
316+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" -"}}]}
317+
318+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" limit"}}]}
319+
320+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
321+
322+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Go"}}]}
323+
324+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" code"}}]}
325+
326+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
327+
328+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"-"}}]}
329+
330+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" I"}}]}
331+
332+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" can"}}]}
333+
334+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" combine"}}]}
335+
336+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" these"}}]}
337+
338+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
339+
340+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
341+
342+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"lang"}}]}
343+
344+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
345+
346+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
347+
348+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" func"}}]}
349+
350+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" main"}}]}
351+
352+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\"\n\n"}}]}
353+
354+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Let"}}]}
355+
356+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
357+
358+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" use"}}]}
359+
360+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
361+
362+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" source"}}]}
363+
364+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"graph"}}]}
365+
366+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" tool"}}]}
367+
368+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
369+
370+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" this"}}]}
371+
372+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" query"}}]}
373+
374+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
375+
376+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
377+
378+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_4b61957d3cfc4d8cad6651c0","index":0,"type":"function","function":{"name":"sourcegraph","arguments":"{\"query\":\"lang:go func main\"}"}}]}}]}
379+
380+ data: {"id":"20251002201458f0eea82a0b064462","created":1759407298,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7312,"completion_tokens":140,"total_tokens":7452,"prompt_tokens_details":{"cached_tokens":7255}}}
381+
382+ data: [DONE]
383+
384+ headers:
385+ Content-Type:
386+ - text/event-stream;charset=UTF-8
387+ status: 200 OK
388+ code: 200
389+ duration: 1.056966125s
390+- id: 2
391+ request:
392+ proto: HTTP/1.1
393+ proto_major: 1
394+ proto_minor: 1
395+ content_length: 424
396+ host: sourcegraph.com
397+ body: '{"query":"query Search($query: String!) { search(query: $query, version: V2, patternType: keyword ) { results { matchCount, limitHit, resultCount, approximateResultCount, missing { name }, timedout { name }, indexUnavailable, results { __typename, ... on FileMatch { repository { name }, file { path, url, content }, lineMatches { preview, lineNumber, offsetAndLengths } } } } } }","variables":{"query":"lang:go func main"}}'
398+ headers:
399+ Content-Type:
400+ - application/json
401+ User-Agent:
402+ - crush/1.0
403+ url: https://sourcegraph.com/.api/graphql
404+ method: POST
405+ response:
406+ proto: HTTP/2.0
407+ proto_major: 2
408+ proto_minor: 0
409+ content_length: -1
410+ uncompressed: true
411+ body: '{"data":{"search":{"results":{"matchCount":30,"limitHit":true,"resultCount":30,"approximateResultCount":"30+","missing":[],"timedout":[],"indexUnavailable":false,"results":[{"__typename":"FileMatch","repository":{"name":"github.com/geektutu/7days-golang"},"file":{"path":"demo-wasm/register-functions/main.go","url":"/github.com/geektutu/7days-golang/-/blob/demo-wasm/register-functions/main.go","content":"// main.go\npackage main\n\nimport \"syscall/js\"\n\nfunc fib(i int) int {\n\tif i == 0 || i == 1 {\n\t\treturn 1\n\t}\n\treturn fib(i-1) + fib(i-2)\n}\n\nfunc fibFunc(this js.Value, args []js.Value) interface{} {\n\treturn js.ValueOf(fib(args[0].Int()))\n}\n\nfunc main() {\n\tdone := make(chan int, 0)\n\tjs.Global().Set(\"fibFunc\", js.FuncOf(fibFunc))\n\t\u003c-done\n}\n"},"lineMatches":[{"preview":"func main() {","lineNumber":16,"offsetAndLengths":[[0,9]]},{"preview":"\tjs.Global().Set(\"fibFunc\", js.FuncOf(fibFunc))","lineNumber":18,"offsetAndLengths":[[21,4],[31,4],[41,4]]},{"preview":"// main.go","lineNumber":0,"offsetAndLengths":[[3,4]]},{"preview":"package main","lineNumber":1,"offsetAndLengths":[[8,4]]},{"preview":"func fibFunc(this js.Value, args []js.Value) interface{} {","lineNumber":12,"offsetAndLengths":[[0,4],[8,4]]},{"preview":"func fib(i int) int {","lineNumber":5,"offsetAndLengths":[[0,4]]}]},{"__typename":"FileMatch","repository":{"name":"github.com/NesoHQ/bgce-archive"},"file":{"path":"docs/interview-qna/class-wise/golang020-init-function/main.go","url":"/github.com/NesoHQ/bgce-archive/-/blob/docs/interview-qna/class-wise/golang020-init-function/main.go","content":"\n/*\n//first example\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"Hello Init Function!\")\n}\n\nfunc init() {\n\tfmt.Println(\"I am the function that is executed first\")\n}\n*/\n\n//Second example\npackage main\n\nimport \"fmt\"\n\nvar a = 10\n\nfunc main() {\n\tfmt.Println(a)\n}\n\nfunc init() {\n\tfmt.Println(a)\n\ta = 20\n}\n\n"},"lineMatches":[{"preview":"func main() {","lineNumber":23,"offsetAndLengths":[[0,9]]},{"preview":"func main() {","lineNumber":7,"offsetAndLengths":[[0,9]]},{"preview":"\tfmt.Println(\"Hello Init Function!\")","lineNumber":8,"offsetAndLengths":[[25,4]]},{"preview":"package main","lineNumber":17,"offsetAndLengths":[[8,4]]},{"preview":"package main","lineNumber":3,"offsetAndLengths":[[8,4]]},{"preview":"func init() {","lineNumber":11,"offsetAndLengths":[[0,4]]},{"preview":"\tfmt.Println(\"I am the function that is executed first\")","lineNumber":12,"offsetAndLengths":[[23,4]]},{"preview":"func init() {","lineNumber":27,"offsetAndLengths":[[0,4]]}]},{"__typename":"FileMatch","repository":{"name":"github.com/jcalabro/uscope"},"file":{"path":"assets/gobacktrace/main.go","url":"/github.com/jcalabro/uscope/-/blob/assets/gobacktrace/main.go","content":"package main\n\nimport \"fmt\"\n\nfunc FuncE() {\n\tfmt.Println(\"FuncE\")\n}\n\nfunc FuncD() {\n\tFuncE()\n\tfmt.Println(\"FuncD\")\n}\n\nfunc FuncC() {\n\tFuncD()\n\tfmt.Println(\"FuncC\")\n}\n\nfunc FuncB() {\n\tFuncC()\n\tfmt.Println(\"FuncB\")\n}\n\nfunc FuncA() {\n\tFuncB()\n\tfmt.Println(\"FuncA\")\n}\n\nfunc FuncF() {\n\tfmt.Println(\"FuncF\")\n\tFuncE()\n}\n\nfunc main() {\n\tFuncA()\n\tFuncB()\n\tFuncC()\n\tFuncD()\n\tFuncE()\n\tFuncF()\n}\n"},"lineMatches":[{"preview":"func main() {","lineNumber":33,"offsetAndLengths":[[0,9]]},{"preview":"\tFuncA()","lineNumber":34,"offsetAndLengths":[[1,4]]},{"preview":"\tFuncB()","lineNumber":35,"offsetAndLengths":[[1,4]]},{"preview":"\tFuncC()","lineNumber":36,"offsetAndLengths":[[1,4]]},{"preview":"\tFuncD()","lineNumber":37,"offsetAndLengths":[[1,4]]},{"preview":"\tFuncE()","lineNumber":38,"offsetAndLengths":[[1,4]]},{"preview":"\tFuncF()","lineNumber":39,"offsetAndLengths":[[1,4]]},{"preview":"func FuncE() {","lineNumber":4,"offsetAndLengths":[[0,4],[5,4]]},{"preview":"\tfmt.Println(\"FuncE\")","lineNumber":5,"offsetAndLengths":[[14,4]]},{"preview":"func FuncD() {","lineNumber":8,"offsetAndLengths":[[0,4],[5,4]]},{"preview":"\tFuncE()","lineNumber":9,"offsetAndLengths":[[1,4]]}]}]}}}}'
412+ headers:
413+ Content-Type:
414+ - application/json
415+ status: 200 OK
416+ code: 200
417+ duration: 1.410290333s
418+- id: 3
419+ request:
420+ proto: HTTP/1.1
421+ proto_major: 1
422+ proto_minor: 1
423+ content_length: 39026
424+ host: ""
425+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/sourcegraph_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use sourcegraph to search for 'func main' in Go repositories\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/sourcegraph_tool-1\",\"function\":{\"arguments\":\"{\\\"query\\\":\\\"lang:go func main\\\"}\",\"name\":\"sourcegraph\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"# Sourcegraph Search Results\\n\\nFound 30 matches across 30 results\\n(Result limit reached, try a more specific query)\\n\\n## Result 1: github.com/geektutu/7days-golang/demo-wasm/register-functions/main.go\\n\\nURL: /github.com/geektutu/7days-golang/-/blob/demo-wasm/register-functions/main.go\\n\\n```\\n6| func fib(i int) int {\\n7| \\tif i == 0 || i == 1 {\\n8| \\t\\treturn 1\\n9| \\t}\\n10| \\treturn fib(i-1) + fib(i-2)\\n11| }\\n12| \\n13| func fibFunc(this js.Value, args []js.Value) interface{} {\\n14| \\treturn js.ValueOf(fib(args[0].Int()))\\n15| }\\n16| func main() {\\n17| func main() {\\n18| \\tdone := make(chan int, 0)\\n19| \\tjs.Global().Set(\\\"fibFunc\\\", js.FuncOf(fibFunc))\\n20| \\t<-done\\n21| }\\n22| \\n```\\n\\n```\\n8| \\t\\treturn 1\\n9| \\t}\\n10| \\treturn fib(i-1) + fib(i-2)\\n11| }\\n12| \\n13| func fibFunc(this js.Value, args []js.Value) interface{} {\\n14| \\treturn js.ValueOf(fib(args[0].Int()))\\n15| }\\n16| \\n17| func main() {\\n18| \\tjs.Global().Set(\\\"fibFunc\\\", js.FuncOf(fibFunc))\\n19| \\tjs.Global().Set(\\\"fibFunc\\\", js.FuncOf(fibFunc))\\n20| \\t<-done\\n21| }\\n22| \\n```\\n\\n```\\n0| // main.go\\n1| // main.go\\n2| package main\\n3| \\n4| import \\\"syscall/js\\\"\\n5| \\n6| func fib(i int) int {\\n7| \\tif i == 0 || i == 1 {\\n8| \\t\\treturn 1\\n9| \\t}\\n10| \\treturn fib(i-1) + fib(i-2)\\n```\\n\\n```\\n1| package main\\n2| package main\\n3| \\n4| import \\\"syscall/js\\\"\\n5| \\n6| func fib(i int) int {\\n7| \\tif i == 0 || i == 1 {\\n8| \\t\\treturn 1\\n9| \\t}\\n10| \\treturn fib(i-1) + fib(i-2)\\n11| }\\n```\\n\\n```\\n2| package main\\n3| \\n4| import \\\"syscall/js\\\"\\n5| \\n6| func fib(i int) int {\\n7| \\tif i == 0 || i == 1 {\\n8| \\t\\treturn 1\\n9| \\t}\\n10| \\treturn fib(i-1) + fib(i-2)\\n11| }\\n12| func fibFunc(this js.Value, args []js.Value) interface{} {\\n13| func fibFunc(this js.Value, args []js.Value) interface{} {\\n14| \\treturn js.ValueOf(fib(args[0].Int()))\\n15| }\\n16| \\n17| func main() {\\n18| \\tdone := make(chan int, 0)\\n19| \\tjs.Global().Set(\\\"fibFunc\\\", js.FuncOf(fibFunc))\\n20| \\t<-done\\n21| }\\n22| \\n```\\n\\n```\\n1| // main.go\\n2| package main\\n3| \\n4| import \\\"syscall/js\\\"\\n5| func fib(i int) int {\\n6| func fib(i int) int {\\n7| \\tif i == 0 || i == 1 {\\n8| \\t\\treturn 1\\n9| \\t}\\n10| \\treturn fib(i-1) + fib(i-2)\\n11| }\\n12| \\n13| func fibFunc(this js.Value, args []js.Value) interface{} {\\n14| \\treturn js.ValueOf(fib(args[0].Int()))\\n15| }\\n```\\n\\n## Result 2: github.com/NesoHQ/bgce-archive/docs/interview-qna/class-wise/golang020-init-function/main.go\\n\\nURL: /github.com/NesoHQ/bgce-archive/-/blob/docs/interview-qna/class-wise/golang020-init-function/main.go\\n\\n```\\n13| \\tfmt.Println(\\\"I am the function that is executed first\\\")\\n14| }\\n15| */\\n16| \\n17| //Second example\\n18| package main\\n19| \\n20| import \\\"fmt\\\"\\n21| \\n22| var a = 10\\n23| func main() {\\n24| func main() {\\n25| \\tfmt.Println(a)\\n26| }\\n27| \\n28| func init() {\\n29| \\tfmt.Println(a)\\n30| \\ta = 20\\n31| }\\n32| \\n33| \\n```\\n\\n```\\n1| \\n2| /*\\n3| //first example\\n4| package main\\n5| \\n6| import \\\"fmt\\\"\\n7| func main() {\\n8| func main() {\\n9| \\tfmt.Println(\\\"Hello Init Function!\\\")\\n10| }\\n11| \\n12| func init() {\\n13| \\tfmt.Println(\\\"I am the function that is executed first\\\")\\n14| }\\n15| */\\n16| \\n17| //Second example\\n```\\n\\n```\\n1| \\n2| /*\\n3| //first example\\n4| package main\\n5| \\n6| import \\\"fmt\\\"\\n7| \\n8| \\tfmt.Println(\\\"Hello Init Function!\\\")\\n9| \\tfmt.Println(\\\"Hello Init Function!\\\")\\n10| }\\n11| \\n12| func init() {\\n13| \\tfmt.Println(\\\"I am the function that is executed first\\\")\\n14| }\\n15| */\\n16| \\n17| //Second example\\n18| package main\\n```\\n\\n```\\n7| \\n8| func main() {\\n9| \\tfmt.Println(\\\"Hello Init Function!\\\")\\n10| }\\n11| \\n12| func init() {\\n13| \\tfmt.Println(\\\"I am the function that is executed first\\\")\\n14| }\\n15| */\\n16| \\n17| package main\\n18| package main\\n19| \\n20| import \\\"fmt\\\"\\n21| \\n22| var a = 10\\n23| \\n24| func main() {\\n25| \\tfmt.Println(a)\\n26| }\\n27| \\n```\\n\\n```\\n1| \\n2| /*\\n3| package main\\n4| package main\\n5| \\n6| import \\\"fmt\\\"\\n7| \\n8| func main() {\\n9| \\tfmt.Println(\\\"Hello Init Function!\\\")\\n10| }\\n11| \\n12| func init() {\\n13| \\tfmt.Println(\\\"I am the function that is executed first\\\")\\n```\\n\\n```\\n1| \\n2| /*\\n3| //first example\\n4| package main\\n5| \\n6| import \\\"fmt\\\"\\n7| \\n8| func main() {\\n9| \\tfmt.Println(\\\"Hello Init Function!\\\")\\n10| }\\n11| func init() {\\n12| func init() {\\n13| \\tfmt.Println(\\\"I am the function that is executed first\\\")\\n14| }\\n15| */\\n16| \\n17| //Second example\\n18| package main\\n19| \\n20| import \\\"fmt\\\"\\n21| \\n```\\n\\n```\\n2| /*\\n3| //first example\\n4| package main\\n5| \\n6| import \\\"fmt\\\"\\n7| \\n8| func main() {\\n9| \\tfmt.Println(\\\"Hello Init Function!\\\")\\n10| }\\n11| \\n12| \\tfmt.Println(\\\"I am the function that is executed first\\\")\\n13| \\tfmt.Println(\\\"I am the function that is executed first\\\")\\n14| }\\n15| */\\n16| \\n17| //Second example\\n18| package main\\n19| \\n20| import \\\"fmt\\\"\\n21| \\n22| var a = 10\\n```\\n\\n```\\n17| //Second example\\n18| package main\\n19| \\n20| import \\\"fmt\\\"\\n21| \\n22| var a = 10\\n23| \\n24| func main() {\\n25| \\tfmt.Println(a)\\n26| }\\n27| func init() {\\n28| func init() {\\n29| \\tfmt.Println(a)\\n30| \\ta = 20\\n31| }\\n32| \\n33| \\n```\\n\\n## Result 3: github.com/jcalabro/uscope/assets/gobacktrace/main.go\\n\\nURL: /github.com/jcalabro/uscope/-/blob/assets/gobacktrace/main.go\\n\\n```\\n23| \\n24| func FuncA() {\\n25| \\tFuncB()\\n26| \\tfmt.Println(\\\"FuncA\\\")\\n27| }\\n28| \\n29| func FuncF() {\\n30| \\tfmt.Println(\\\"FuncF\\\")\\n31| \\tFuncE()\\n32| }\\n33| func main() {\\n34| func main() {\\n35| \\tFuncA()\\n36| \\tFuncB()\\n37| \\tFuncC()\\n38| \\tFuncD()\\n39| \\tFuncE()\\n40| \\tFuncF()\\n41| }\\n42| \\n```\\n\\n```\\n24| func FuncA() {\\n25| \\tFuncB()\\n26| \\tfmt.Println(\\\"FuncA\\\")\\n27| }\\n28| \\n29| func FuncF() {\\n30| \\tfmt.Println(\\\"FuncF\\\")\\n31| \\tFuncE()\\n32| }\\n33| \\n34| \\tFuncA()\\n35| \\tFuncA()\\n36| \\tFuncB()\\n37| \\tFuncC()\\n38| \\tFuncD()\\n39| \\tFuncE()\\n40| \\tFuncF()\\n41| }\\n42| \\n```\\n\\n```\\n25| \\tFuncB()\\n26| \\tfmt.Println(\\\"FuncA\\\")\\n27| }\\n28| \\n29| func FuncF() {\\n30| \\tfmt.Println(\\\"FuncF\\\")\\n31| \\tFuncE()\\n32| }\\n33| \\n34| func main() {\\n35| \\tFuncB()\\n36| \\tFuncB()\\n37| \\tFuncC()\\n38| \\tFuncD()\\n39| \\tFuncE()\\n40| \\tFuncF()\\n41| }\\n42| \\n```\\n\\n```\\n26| \\tfmt.Println(\\\"FuncA\\\")\\n27| }\\n28| \\n29| func FuncF() {\\n30| \\tfmt.Println(\\\"FuncF\\\")\\n31| \\tFuncE()\\n32| }\\n33| \\n34| func main() {\\n35| \\tFuncA()\\n36| \\tFuncC()\\n37| \\tFuncC()\\n38| \\tFuncD()\\n39| \\tFuncE()\\n40| \\tFuncF()\\n41| }\\n42| \\n```\\n\\n```\\n27| }\\n28| \\n29| func FuncF() {\\n30| \\tfmt.Println(\\\"FuncF\\\")\\n31| \\tFuncE()\\n32| }\\n33| \\n34| func main() {\\n35| \\tFuncA()\\n36| \\tFuncB()\\n37| \\tFuncD()\\n38| \\tFuncD()\\n39| \\tFuncE()\\n40| \\tFuncF()\\n41| }\\n42| \\n```\\n\\n```\\n28| \\n29| func FuncF() {\\n30| \\tfmt.Println(\\\"FuncF\\\")\\n31| \\tFuncE()\\n32| }\\n33| \\n34| func main() {\\n35| \\tFuncA()\\n36| \\tFuncB()\\n37| \\tFuncC()\\n38| \\tFuncE()\\n39| \\tFuncE()\\n40| \\tFuncF()\\n41| }\\n42| \\n```\\n\\n```\\n29| func FuncF() {\\n30| \\tfmt.Println(\\\"FuncF\\\")\\n31| \\tFuncE()\\n32| }\\n33| \\n34| func main() {\\n35| \\tFuncA()\\n36| \\tFuncB()\\n37| \\tFuncC()\\n38| \\tFuncD()\\n39| \\tFuncF()\\n40| \\tFuncF()\\n41| }\\n42| \\n```\\n\\n```\\n1| package main\\n2| \\n3| import \\\"fmt\\\"\\n4| func FuncE() {\\n5| func FuncE() {\\n6| \\tfmt.Println(\\\"FuncE\\\")\\n7| }\\n8| \\n9| func FuncD() {\\n10| \\tFuncE()\\n11| \\tfmt.Println(\\\"FuncD\\\")\\n12| }\\n13| \\n14| func FuncC() {\\n```\\n\\n```\\n1| package main\\n2| \\n3| import \\\"fmt\\\"\\n4| \\n5| \\tfmt.Println(\\\"FuncE\\\")\\n6| \\tfmt.Println(\\\"FuncE\\\")\\n7| }\\n8| \\n9| func FuncD() {\\n10| \\tFuncE()\\n11| \\tfmt.Println(\\\"FuncD\\\")\\n12| }\\n13| \\n14| func FuncC() {\\n15| \\tFuncD()\\n```\\n\\n```\\n1| package main\\n2| \\n3| import \\\"fmt\\\"\\n4| \\n5| func FuncE() {\\n6| \\tfmt.Println(\\\"FuncE\\\")\\n7| }\\n8| func FuncD() {\\n9| func FuncD() {\\n10| \\tFuncE()\\n11| \\tfmt.Println(\\\"FuncD\\\")\\n12| }\\n13| \\n14| func FuncC() {\\n15| \\tFuncD()\\n16| \\tfmt.Println(\\\"FuncC\\\")\\n17| }\\n18| \\n```\\n\\n```\\n1| package main\\n2| \\n3| import \\\"fmt\\\"\\n4| \\n5| func FuncE() {\\n6| \\tfmt.Println(\\\"FuncE\\\")\\n7| }\\n8| \\n9| \\tFuncE()\\n10| \\tFuncE()\\n11| \\tfmt.Println(\\\"FuncD\\\")\\n12| }\\n13| \\n14| func FuncC() {\\n15| \\tFuncD()\\n16| \\tfmt.Println(\\\"FuncC\\\")\\n17| }\\n18| \\n19| func FuncB() {\\n```\\n\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/sourcegraph_tool-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
426+ headers:
427+ Accept:
428+ - application/json
429+ Content-Type:
430+ - application/json
431+ User-Agent:
432+ - OpenAI/Go 2.3.0
433+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
434+ method: POST
435+ response:
436+ proto: HTTP/2.0
437+ proto_major: 2
438+ proto_minor: 0
439+ content_length: -1
440+ body: |+
441+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
442+
443+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
444+
445+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Found"}}]}
446+
447+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" "}}]}
448+
449+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"30"}}]}
450+
451+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" matches"}}]}
452+
453+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" for"}}]}
454+
455+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" '"}}]}
456+
457+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"func"}}]}
458+
459+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" main'"}}]}
460+
461+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" in Go"}}]}
462+
463+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" repositories"}}]}
464+
465+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
466+
467+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" Results"}}]}
468+
469+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" include"}}]}
470+
471+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":":\n\n"}}]}
472+
473+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"1"}}]}
474+
475+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
476+
477+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" A"}}]}
478+
479+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" Web"}}]}
480+
481+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Assembly"}}]}
482+
483+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" Go"}}]}
484+
485+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" program"}}]}
486+
487+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
488+
489+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" a"}}]}
490+
491+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" fibonacci"}}]}
492+
493+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" function"}}]}
494+
495+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
496+
497+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"2"}}]}
498+
499+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
500+
501+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" Go"}}]}
502+
503+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" examples"}}]}
504+
505+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" demonstrating"}}]}
506+
507+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" init"}}]}
508+
509+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"()"}}]}
510+
511+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" functions"}}]}
512+
513+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" \n"}}]}
514+
515+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"3"}}]}
516+
517+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
518+
519+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" A"}}]}
520+
521+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" function"}}]}
522+
523+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" call"}}]}
524+
525+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" trace"}}]}
526+
527+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"/"}}]}
528+
529+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"stack"}}]}
530+
531+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" example"}}]}
532+
533+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n\n"}}]}
534+
535+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"All"}}]}
536+
537+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" results"}}]}
538+
539+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" show"}}]}
540+
541+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" typical"}}]}
542+
543+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" Go"}}]}
544+
545+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
546+
547+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" function"}}]}
548+
549+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" patterns"}}]}
550+
551+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
552+
553+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" various"}}]}
554+
555+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" imports"}}]}
556+
557+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" and"}}]}
558+
559+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" function"}}]}
560+
561+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" calls"}}]}
562+
563+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
564+
565+ data: {"id":"20251002201504c4e2866ba8e94540","created":1759407304,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":10196,"completion_tokens":67,"total_tokens":10263,"prompt_tokens_details":{"cached_tokens":43}}}
566+
567+ data: [DONE]
568+
569+ headers:
570+ Content-Type:
571+ - text/event-stream;charset=UTF-8
572+ status: 200 OK
573+ code: 200
574+ duration: 2.2374345s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/update_a_file.yamlnew file+402
@@ -0,0 +1,402 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 679
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nupdate the main.go file by changing the print to say hello from crush","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Let"}}]}
30+
31+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
32+
33+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
34+
35+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
36+
37+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
38+
39+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
40+
41+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
42+
43+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
44+
45+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
46+
47+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Generate"}}]}
48+
49+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
50+
51+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
52+
53+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
54+
55+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
56+
57+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
58+
59+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" following"}}]}
60+
61+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
62+
63+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
64+
65+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"update"}}]}
66+
67+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
68+
69+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" main"}}]}
70+
71+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".go"}}]}
72+
73+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
74+
75+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" by"}}]}
76+
77+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" changing"}}]}
78+
79+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
80+
81+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" print"}}]}
82+
83+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
84+
85+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" say"}}]}
86+
87+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" hello"}}]}
88+
89+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" from"}}]}
90+
91+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" crush"}}]}
92+
93+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\"\n\n"}}]}
94+
95+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
96+
97+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
98+
99+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
100+
101+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asking"}}]}
102+
103+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
104+
105+ data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":119,"completion_tokens":40,"total_tokens":159,"prompt_tokens_details":{"cached_tokens":104}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 684.753833ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30650
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"update the main.go file by changing the print to say hello from crush\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
141+
142+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
143+
144+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
145+
146+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
147+
148+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
149+
150+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" update"}}]}
151+
152+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
153+
154+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" main"}}]}
155+
156+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".go file"}}]}
157+
158+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to change"}}]}
159+
160+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a print"}}]}
161+
162+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" statement to"}}]}
163+
164+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" say \""}}]}
165+
166+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"hello from"}}]}
167+
168+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" crush\"."}}]}
169+
170+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" First,"}}]}
171+
172+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" I"}}]}
173+
174+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
175+
176+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
177+
178+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
179+
180+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
181+
182+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
183+
184+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Find"}}]}
185+
186+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
187+
188+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" main"}}]}
189+
190+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".go"}}]}
191+
192+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
193+
194+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
195+
196+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"2"}}]}
197+
198+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
199+
200+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" View"}}]}
201+
202+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" its"}}]}
203+
204+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" contents"}}]}
205+
206+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
207+
208+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" see"}}]}
209+
210+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" what"}}]}
211+
212+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" needs"}}]}
213+
214+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
215+
216+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" be"}}]}
217+
218+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" changed"}}]}
219+
220+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
221+
222+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"3"}}]}
223+
224+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
225+
226+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Make"}}]}
227+
228+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
229+
230+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" edit"}}]}
231+
232+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n\n"}}]}
233+
234+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Let"}}]}
235+
236+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
237+
238+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" start"}}]}
239+
240+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" by"}}]}
241+
242+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" finding"}}]}
243+
244+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
245+
246+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" main"}}]}
247+
248+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".go"}}]}
249+
250+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
251+
252+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
253+
254+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
255+
256+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_6e9013a67317414086004ae0","index":0,"type":"function","function":{"name":"glob","arguments":"{\"pattern\":\"**/main.go\"}"}}]}}]}
257+
258+ data: {"id":"202510022013000a275fe245904b78","created":1759407180,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7313,"completion_tokens":85,"total_tokens":7398,"prompt_tokens_details":{"cached_tokens":7255}}}
259+
260+ data: [DONE]
261+
262+ headers:
263+ Content-Type:
264+ - text/event-stream;charset=UTF-8
265+ status: 200 OK
266+ code: 200
267+ duration: 1.429535583s
268+- id: 2
269+ request:
270+ proto: HTTP/1.1
271+ proto_major: 1
272+ proto_minor: 1
273+ content_length: 30993
274+ host: ""
275+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"update the main.go file by changing the print to say hello from crush\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/update_a_file-1\",\"function\":{\"arguments\":\"{\\\"pattern\\\":\\\"**/main.go\\\"}\",\"name\":\"glob\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file/main.go\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/update_a_file-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
276+ headers:
277+ Accept:
278+ - application/json
279+ Content-Type:
280+ - application/json
281+ User-Agent:
282+ - OpenAI/Go 2.3.0
283+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
284+ method: POST
285+ response:
286+ proto: HTTP/2.0
287+ proto_major: 2
288+ proto_minor: 0
289+ content_length: -1
290+ body: |+
291+ data: {"id":"20251002201313204f922560f4407f","created":1759407193,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
292+
293+ data: {"id":"20251002201313204f922560f4407f","created":1759407193,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
294+
295+ data: {"id":"20251002201313204f922560f4407f","created":1759407193,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_a3817c4fba074dad9036e444","index":0,"type":"function","function":{"name":"view","arguments":"{\"file_path\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file/main.go\"}"}}]}}]}
296+
297+ data: {"id":"20251002201313204f922560f4407f","created":1759407193,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7358,"completion_tokens":36,"total_tokens":7394,"prompt_tokens_details":{"cached_tokens":7315}}}
298+
299+ data: [DONE]
300+
301+ headers:
302+ Content-Type:
303+ - text/event-stream;charset=UTF-8
304+ status: 200 OK
305+ code: 200
306+ duration: 1.718074791s
307+- id: 3
308+ request:
309+ proto: HTTP/1.1
310+ proto_major: 1
311+ proto_minor: 1
312+ content_length: 31480
313+ host: ""
314+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"update the main.go file by changing the print to say hello from crush\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/update_a_file-1\",\"function\":{\"arguments\":\"{\\\"pattern\\\":\\\"**/main.go\\\"}\",\"name\":\"glob\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file/main.go\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/update_a_file-1\",\"role\":\"tool\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/update_a_file-2\",\"function\":{\"arguments\":\"{\\\"file_path\\\":\\\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file/main.go\\\"}\",\"name\":\"view\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"<file>\\n 1|package main\\n 2|\\n 3|import \\\"fmt\\\"\\n 4|\\n 5|func main() {\\n 6|\\tfmt.Println(\\\"Hello, World!\\\")\\n 7|}\\n</file>\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/update_a_file-2\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
315+ headers:
316+ Accept:
317+ - application/json
318+ Content-Type:
319+ - application/json
320+ User-Agent:
321+ - OpenAI/Go 2.3.0
322+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
323+ method: POST
324+ response:
325+ proto: HTTP/2.0
326+ proto_major: 2
327+ proto_minor: 0
328+ content_length: -1
329+ body: |+
330+ data: {"id":"202510022013164679a662afa942bb","created":1759407196,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
331+
332+ data: {"id":"202510022013164679a662afa942bb","created":1759407196,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
333+
334+ data: {"id":"202510022013164679a662afa942bb","created":1759407196,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_bd8bb24b371b4e4cb1b738ae","index":0,"type":"function","function":{"name":"edit","arguments":"{\"file_path\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file/main.go\",\"old_string\":\"\\tfmt.Println(\\\"Hello, World!\\\")\",\"new_string\":\"\\tfmt.Println(\\\"hello from crush\\\")\"}"}}]}}]}
335+
336+ data: {"id":"202510022013164679a662afa942bb","created":1759407196,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7451,"completion_tokens":66,"total_tokens":7517,"prompt_tokens_details":{"cached_tokens":7393}}}
337+
338+ data: [DONE]
339+
340+ headers:
341+ Content-Type:
342+ - text/event-stream;charset=UTF-8
343+ status: 200 OK
344+ code: 200
345+ duration: 7.160122583s
346+- id: 4
347+ request:
348+ proto: HTTP/1.1
349+ proto_major: 1
350+ proto_minor: 1
351+ content_length: 32044
352+ host: ""
353+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"update the main.go file by changing the print to say hello from crush\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/update_a_file-1\",\"function\":{\"arguments\":\"{\\\"pattern\\\":\\\"**/main.go\\\"}\",\"name\":\"glob\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file/main.go\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/update_a_file-1\",\"role\":\"tool\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/update_a_file-2\",\"function\":{\"arguments\":\"{\\\"file_path\\\":\\\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file/main.go\\\"}\",\"name\":\"view\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"<file>\\n 1|package main\\n 2|\\n 3|import \\\"fmt\\\"\\n 4|\\n 5|func main() {\\n 6|\\tfmt.Println(\\\"Hello, World!\\\")\\n 7|}\\n</file>\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/update_a_file-2\",\"role\":\"tool\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/update_a_file-3\",\"function\":{\"arguments\":\"{\\\"file_path\\\":\\\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file/main.go\\\",\\\"old_string\\\":\\\"\\\\tfmt.Println(\\\\\\\"Hello, World!\\\\\\\")\\\",\\\"new_string\\\":\\\"\\\\tfmt.Println(\\\\\\\"hello from crush\\\\\\\")\\\"}\",\"name\":\"edit\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"<result>\\nContent replaced in file: /tmp/crush-test/TestCoderAgent/zai-glm4.6/update_a_file/main.go\\n</result>\\n\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/update_a_file-3\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
354+ headers:
355+ Accept:
356+ - application/json
357+ Content-Type:
358+ - application/json
359+ User-Agent:
360+ - OpenAI/Go 2.3.0
361+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
362+ method: POST
363+ response:
364+ proto: HTTP/2.0
365+ proto_major: 2
366+ proto_minor: 0
367+ content_length: -1
368+ body: |+
369+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
370+
371+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
372+
373+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Updated"}}]}
374+
375+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
376+
377+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".go"}}]}
378+
379+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" to"}}]}
380+
381+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" print"}}]}
382+
383+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" \""}}]}
384+
385+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"hello"}}]}
386+
387+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" from"}}]}
388+
389+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" crush"}}]}
390+
391+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\""}}]}
392+
393+ data: {"id":"2025100220132560e3c8f5162b42d5","created":1759407205,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7554,"completion_tokens":15,"total_tokens":7569,"prompt_tokens_details":{"cached_tokens":7516}}}
394+
395+ data: [DONE]
396+
397+ headers:
398+ Content-Type:
399+ - text/event-stream;charset=UTF-8
400+ status: 200 OK
401+ code: 200
402+ duration: 7.730559792s
internal/agent/testdata/TestCoderAgent/zai-glm4.6/write_tool.yamlnew file+204
@@ -0,0 +1,204 @@
1+---
2+version: 2
3+interactions:
4+- id: 0
5+ request:
6+ proto: HTTP/1.1
7+ proto_major: 1
8+ proto_minor: 1
9+ content_length: 719
10+ host: ""
11+ body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse write to create a new file called config.json with content ''{\"name\": \"test\", \"version\": \"1.0.0\"}''","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
12+ headers:
13+ Accept:
14+ - application/json
15+ Content-Type:
16+ - application/json
17+ User-Agent:
18+ - OpenAI/Go 2.3.0
19+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
20+ method: POST
21+ response:
22+ proto: HTTP/2.0
23+ proto_major: 2
24+ proto_minor: 0
25+ content_length: -1
26+ body: |+
27+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
28+
29+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
30+
31+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
32+
33+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
34+
35+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
36+
37+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
38+
39+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
40+
41+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
42+
43+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
44+
45+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
46+
47+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
48+
49+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
50+
51+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
52+
53+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
54+
55+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" creating"}}]}
56+
57+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
58+
59+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" config"}}]}
60+
61+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".json"}}]}
62+
63+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
64+
65+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
66+
67+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" specific"}}]}
68+
69+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
70+
71+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
72+
73+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Let"}}]}
74+
75+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
76+
77+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
78+
79+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
80+
81+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
82+
83+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
84+
85+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\"use"}}]}
86+
87+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" write"}}]}
88+
89+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
90+
91+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" create"}}]}
92+
93+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
94+
95+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" new"}}]}
96+
97+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
98+
99+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" called"}}]}
100+
101+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" config"}}]}
102+
103+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".json"}}]}
104+
105+ data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":134,"completion_tokens":40,"total_tokens":174,"prompt_tokens_details":{"cached_tokens":105}}}
106+
107+ data: [DONE]
108+
109+ headers:
110+ Content-Type:
111+ - text/event-stream;charset=UTF-8
112+ status: 200 OK
113+ code: 200
114+ duration: 631.146709ms
115+- id: 1
116+ request:
117+ proto: HTTP/1.1
118+ proto_major: 1
119+ proto_minor: 1
120+ content_length: 30687
121+ host: ""
122+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/write_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use write to create a new file called config.json with content '{\\\"name\\\": \\\"test\\\", \\\"version\\\": \\\"1.0.0\\\"}'\",\"role\":\"user\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
123+ headers:
124+ Accept:
125+ - application/json
126+ Content-Type:
127+ - application/json
128+ User-Agent:
129+ - OpenAI/Go 2.3.0
130+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
131+ method: POST
132+ response:
133+ proto: HTTP/2.0
134+ proto_major: 2
135+ proto_minor: 0
136+ content_length: -1
137+ body: |+
138+ data: {"id":"20251002201514c60a9c113b1948bf","created":1759407314,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
139+
140+ data: {"id":"20251002201514c60a9c113b1948bf","created":1759407314,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
141+
142+ data: {"id":"20251002201514c60a9c113b1948bf","created":1759407314,"model":"glm-4.6","choices":[{"index":0,"delta":{"tool_calls":[{"id":"call_33ad107669e540ed9085d49b","index":0,"type":"function","function":{"name":"write","arguments":"{\"content\":\"{\\\"name\\\": \\\"test\\\", \\\"version\\\": \\\"1.0.0\\\"}\",\"file_path\":\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/write_tool/config.json\"}"}}]}}]}
143+
144+ data: {"id":"20251002201514c60a9c113b1948bf","created":1759407314,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"tool_calls","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7327,"completion_tokens":58,"total_tokens":7385,"prompt_tokens_details":{"cached_tokens":7255}}}
145+
146+ data: [DONE]
147+
148+ headers:
149+ Content-Type:
150+ - text/event-stream;charset=UTF-8
151+ status: 200 OK
152+ code: 200
153+ duration: 8.183004667s
154+- id: 2
155+ request:
156+ proto: HTTP/1.1
157+ proto_major: 1
158+ proto_minor: 1
159+ content_length: 31207
160+ host: ""
161+ body: "{\"messages\":[{\"content\":\"You are Crush, a powerful AI Assistant that runs in the CLI.\\nUse the instructions below and the tools available to you to assist the user.\\n\\n<memory_instructions>\\nIf the current working directory contains a file called CRUSH.md, it will be automatically added to your context.\\n\\nThis file serves multiple purposes:\\n\\n- Storing frequently used bash commands (build, test, lint, etc.) so you can use them without searching each time\\n- Recording the user's code style preferences (naming conventions, preferred libraries, etc.)\\n- Maintaining useful information about the codebase structure and organization\\n\\nWhen you discover important information that could be useful for the future update/add the info to the CRUSH.md.\\n\\nMemory might be added to you during a task if there are nested memory files that relate to the work you are doing.\\n</memory_instructions>\\n<communication_style>\\n- Be concise and direct\\n- Keep responses under 4 lines unless details requested\\n- Answer without preamble/postamble (\\\"Here is...\\\", \\\"The answer is...\\\")\\n- One-word answers preferred when possible\\n- Never use emojis in your responses\\n- You MUST answer concisely with fewer than 4 lines of text (not including tool use or code generation), unless user asks for detail\\n- User markdown formatting for responses when appropriate\\n\\n<example>\\nuser: 2 + 2\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: what is 2+2?\\nassistant: 4\\n</example>\\n\\n<example>\\nuser: is 11 a prime number?\\nassistant: true\\n</example>\\n\\n<example>\\nuser: what command should I run to list files in the current directory?\\nassistant: ls\\n</example>\\n\\n<example>\\nuser: what command should I run to watch files in the current directory?\\nassistant: [use the ls tool to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\\nnpm run dev\\n</example>\\n\\n<example>\\nuser: How many golf balls fit inside a jetta?\\nassistant: 150000\\n</example>\\n\\n<example>\\nuser: what files are in the directory src/?\\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\\nuser: which file contains the implementation of foo?\\nassistant: src/foo.c\\n</example>\\n\\n<example>\\nuser: write tests for new feature\\nassistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]\\n</example>\\n</communication_style>\\n\\n<proactiveness>\\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\\n\\n- Doing the right thing when asked, including taking actions and follow-up actions\\n- Not surprising the user with actions you take without asking\\n - For example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\\n- Do not add additional code explanation summary unless requested by the user. After working on a file, just stop, rather than providing an explanation of what you did.\\n</proactiveness>\\n\\n<following_conversations>\\nWhen making changes to files, first understand the file's code conventions. Mimic code style, use existing libraries and utilities, and follow existing patterns.\\n\\n- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language).\\n- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.\\n- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.\\n- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository.\\n</following_conversations>\\n\\n<code_style>\\n- Follow existing code style and patterns\\n- Do not add any comments to code you write unless asked to do so\\n</code_style>\\n\\n<doing_tasks>\\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\\n\\n- Use the available search tools to understand the codebase and the user's query.\\n- Plan out the implementation\\n- Implement the solution using all tools available to you\\n- Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.\\n- When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to CRUSH.md so that you will know to run it next time.\\n\\nNEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked.\\n</doing_tasks>\\n\\n<tool_use>\\n- When doing file search, prefer to use the Agent tool in order to reduce context usage.\\n- All tools are executed in parallel when multiple tool calls are sent in a single message. Only send multiple tool calls when they are safe to run in parallel (no dependencies between them).\\n- The user does not see the full output of the tool responses, so if you need the output of the tool for the response make sure to summarize it for the user.\\n</tool_use>\\n\\n<env>\\nWorking directory: /tmp/crush-test/TestCoderAgent/zai-glm4.6/write_tool\\nIs directory a git repo: no \\nPlatform: linux\\nToday's date: 1/1/2025\\n</env>\\n<memory>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n</memory>\\n\\n\",\"role\":\"system\"},{\"content\":\"use write to create a new file called config.json with content '{\\\"name\\\": \\\"test\\\", \\\"version\\\": \\\"1.0.0\\\"}'\",\"role\":\"user\"},{\"content\":\"\\n\\n\",\"tool_calls\":[{\"id\":\"TestCoderAgent/zai-glm4.6/write_tool-1\",\"function\":{\"arguments\":\"{\\\"content\\\":\\\"{\\\\\\\"name\\\\\\\": \\\\\\\"test\\\\\\\", \\\\\\\"version\\\\\\\": \\\\\\\"1.0.0\\\\\\\"}\\\",\\\"file_path\\\":\\\"/tmp/crush-test/TestCoderAgent/zai-glm4.6/write_tool/config.json\\\"}\",\"name\":\"write\"},\"type\":\"function\"}],\"role\":\"assistant\"},{\"content\":\"<result>\\nFile successfully written: /tmp/crush-test/TestCoderAgent/zai-glm4.6/write_tool/config.json\\n</result>\",\"tool_call_id\":\"TestCoderAgent/zai-glm4.6/write_tool-1\",\"role\":\"tool\"}],\"model\":\"glm-4.6\",\"max_tokens\":10000,\"stream_options\":{\"include_usage\":true},\"tool_choice\":\"auto\",\"tools\":[{\"function\":{\"name\":\"bash\",\"strict\":false,\"description\":\"Executes bash commands in persistent shell session with timeout and security measures.\\n\\n<cross_platform>\\nUses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).\\nUse forward slashes for paths: \\\"ls C:/foo/bar\\\" not \\\"ls C:\\\\foo\\\\bar\\\".\\nCommon shell builtins and core utils available on Windows.\\n</cross_platform>\\n\\n<execution_steps>\\n1. Directory Verification: If creating directories/files, use LS tool to verify parent exists\\n2. Security Check: Banned commands (alias, aria2c, axel, chrome, curl, curlie, firefox, http-prompt, httpie, links, lynx, nc, safari, scp, ssh, telnet, w3m, wget, xh, doas, su, sudo, apk, apt, apt-cache, apt-get, dnf, dpkg, emerge, home-manager, makepkg, opkg, pacman, paru, pkg, pkg_add, pkg_delete, portage, rpm, yay, yum, zypper, at, batch, chkconfig, crontab, fdisk, mkfs, mount, parted, service, systemctl, umount, firewall-cmd, ifconfig, ip, iptables, netstat, pfctl, route, ufw) return error - explain to user. Safe read-only commands execute without prompts\\n3. Command Execution: Execute with proper quoting, capture output\\n4. Output Processing: Truncate if exceeds 30000 characters\\n5. Return Result: Include errors, metadata with <cwd></cwd> tags\\n</execution_steps>\\n\\n<usage_notes>\\n- Command required, timeout optional (max 600000ms/10min, default 30min if unspecified)\\n- IMPORTANT: Use Grep/Glob/Agent tools instead of 'find'/'grep'. Use View/LS tools instead of 'cat'/'head'/'tail'/'ls'\\n- Chain with ';' or '&&', avoid newlines except in quoted strings\\n- Shell state persists (env vars, virtual envs, cwd, etc.)\\n- Prefer absolute paths over 'cd' (use 'cd' only if user explicitly requests)\\n</usage_notes>\\n\\n<git_commits>\\nWhen user asks to create git commit:\\n\\n1. Single message with three tool_use blocks (IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - git log (recent commit message style)\\n\\n2. Add relevant untracked files to staging. Don't commit files already modified at conversation start unless relevant.\\n\\n3. Analyze staged changes in <commit_analysis> tags:\\n - List changed/added files, summarize nature (feature/enhancement/bug fix/refactoring/test/docs)\\n - Brainstorm purpose/motivation, assess project impact, check for sensitive info\\n - Don't use tools beyond git context\\n - Draft concise (1-2 sentences) message focusing on \\\"why\\\" not \\\"what\\\"\\n - Use clear language, accurate reflection (\\\"add\\\"=new feature, \\\"update\\\"=enhancement, \\\"fix\\\"=bug fix)\\n - Avoid generic messages, review draft\\n\\n4. Create commit with Crush signature using HEREDOC:\\n git commit -m \\\"$(cat &lt;&lt;'EOF'\\n Commit message here.\\n\\n \U0001F498 Generated with Crush\\n\\n\\n Co-Authored-By: Crush <crush@charm.land>\\n\\n EOF\\n )\\\"\\n\\n5. If pre-commit hook fails, retry ONCE. If fails again, hook preventing commit. If succeeds but files modified, MUST amend.\\n\\n6. Run git status to verify.\\n\\nNotes: Use \\\"git commit -am\\\" when possible, don't stage unrelated files, NEVER update config, don't push, no -i flags, no empty commits, return empty response.\\n</git_commits>\\n\\n<pull_requests>\\nUse gh command for ALL GitHub tasks. When user asks to create PR:\\n\\n1. Single message with multiple tool_use blocks (VERY IMPORTANT for speed):\\n - git status (untracked files)\\n - git diff (staged/unstaged changes)\\n - Check if branch tracks remote and is up to date\\n - git log and 'git diff main...HEAD' (full commit history from main divergence)\\n\\n2. Create new branch if needed\\n3. Commit changes if needed\\n4. Push to remote with -u flag if needed\\n\\n5. Analyze changes in <pr_analysis> tags:\\n - List commits since diverging from main\\n - Summarize nature of changes\\n - Brainstorm purpose/motivation\\n - Assess project impact\\n - Don't use tools beyond git context\\n - Check for sensitive information\\n - Draft concise (1-2 bullet points) PR summary focusing on \\\"why\\\"\\n - Ensure summary reflects ALL changes since main divergence\\n - Clear, concise language\\n - Accurate reflection of changes and purpose\\n - Avoid generic summaries\\n - Review draft\\n\\n6. Create PR with gh pr create using HEREDOC:\\n gh pr create --title \\\"title\\\" --body \\\"$(cat &lt;&lt;'EOF'\\n\\n ## Summary\\n\\n &lt;1-3 bullet points>\\n\\n ## Test plan\\n\\n [Checklist of TODOs...]\\n\\n\\n \U0001F498 Generated with Crush\\n\\n\\n EOF\\n )\\\"\\n\\nImportant:\\n\\n- Return empty response - user sees gh output\\n- Never update git config\\n </pull_requests>\\n\\n<examples>\\nGood: pytest /foo/bar/tests\\nBad: cd /foo/bar && pytest tests\\n</examples>\\n\",\"parameters\":{\"properties\":{\"command\":{\"description\":\"The command to execute\",\"type\":\"string\"},\"description\":{\"description\":\"A brief description of what the command does\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in milliseconds (max 600000)\",\"type\":\"integer\"}},\"required\":[\"command\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"download\",\"strict\":false,\"description\":\"Downloads binary data from URL and saves to local file.\\n\\n<usage>\\n- Provide URL to download from\\n- Specify local file path where content should be saved\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Downloads any file type (binary or text)\\n- Auto-creates parent directories if missing\\n- Handles large files efficiently with streaming\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max file size: 100MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n- Will overwrite existing files without warning\\n</limitations>\\n\\n<tips>\\n- Use absolute paths or paths relative to working directory\\n- Set appropriate timeouts for large files or slow connections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The local file path where the downloaded content should be saved\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 600)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to download from\",\"type\":\"string\"}},\"required\":[\"url\",\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"edit\",\"strict\":false,\"description\":\"Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. For new files: Use LS tool to verify parent directory exists\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. old_string: Text to replace (must match exactly including whitespace/indentation)\\n3. new_string: Replacement text\\n4. replace_all: Replace all occurrences (default false)\\n</parameters>\\n\\n<special_cases>\\n\\n- Create file: provide file_path + new_string, leave old_string empty\\n- Delete content: provide file_path + old_string, leave new_string empty\\n </special_cases>\\n\\n<critical_requirements>\\nUNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance\\n\\n- Include 3-5 lines context BEFORE and AFTER change point\\n- Include exact whitespace, indentation, surrounding code\\n\\nSINGLE INSTANCE: Tool changes ONE instance when replace_all=false\\n\\n- For multiple instances: set replace_all=true OR make separate calls with unique context\\n- Plan calls carefully to avoid conflicts\\n\\nVERIFICATION: Before using\\n\\n- Check how many instances of target text exist\\n- Gather sufficient context for unique identification\\n- Plan separate calls or use replace_all\\n </critical_requirements>\\n\\n<warnings>\\nTool fails if:\\n- old_string matches multiple locations and replace_all=false\\n- old_string doesn't match exactly (including whitespace)\\n- Insufficient context causes wrong instance change\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use forward slashes (/) for cross-platform compatibility\\n- Multiple edits to same file: send all in single message with multiple tool calls\\n </best_practices>\\n\\n<windows_notes>\\n\\n- Forward slashes work throughout (C:/path/file)\\n- File permissions handled automatically\\n- Line endings converted automatically (\\\\n ↔ \\\\r\\\\n)\\n </windows_notes>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"},\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false)\",\"type\":\"boolean\"}},\"required\":[\"file_path\",\"old_string\",\"new_string\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"multiedit\",\"strict\":false,\"description\":\"Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.\\n\\n<prerequisites>\\n1. Use View tool to understand file contents and context\\n2. Verify directory path is correct\\n</prerequisites>\\n\\n<parameters>\\n1. file_path: Absolute path to file (required)\\n2. edits: Array of edit operations, each containing:\\n - old_string: Text to replace (must match exactly including whitespace/indentation)\\n - new_string: Replacement text\\n - replace_all: Replace all occurrences (optional, defaults to false)\\n</parameters>\\n\\n<operation>\\n- Edits applied sequentially in provided order\\n- Each edit operates on result of previous edit\\n- All edits must be valid for operation to succeed - if any fails, none applied\\n- Ideal for several changes to different parts of same file\\n</operation>\\n\\n<critical_requirements>\\n\\n1. All edits follow same requirements as single Edit tool\\n2. Edits are atomic - either all succeed or none applied\\n3. Plan edits carefully to avoid conflicts between sequential operations\\n </critical_requirements>\\n\\n<warnings>\\n- Tool fails if old_string doesn't match file contents exactly (including whitespace)\\n- Tool fails if old_string and new_string are identical\\n- Earlier edits may affect text that later edits try to find - plan sequence carefully\\n</warnings>\\n\\n<best_practices>\\n\\n- Ensure all edits result in correct, idiomatic code\\n- Don't leave code in broken state\\n- Use absolute file paths (starting with /)\\n- Use replace_all for renaming variables across file\\n- Avoid adding emojis unless user explicitly requests\\n </best_practices>\\n\\n<new_file_creation>\\n\\n- Provide new file path (including directory if needed)\\n- First edit: empty old_string, new file contents as new_string\\n- Subsequent edits: normal edit operations on created content\\n </new_file_creation>\\n\",\"parameters\":{\"properties\":{\"edits\":{\"description\":\"Array of edit operations to perform sequentially on the file\",\"items\":{\"new_string\":{\"description\":\"The text to replace it with\",\"type\":\"string\"},\"old_string\":{\"description\":\"The text to replace\",\"type\":\"string\"},\"replace_all\":{\"description\":\"Replace all occurrences of old_string (default false).\",\"type\":\"boolean\"}},\"type\":\"array\"},\"file_path\":{\"description\":\"The absolute path to the file to modify\",\"type\":\"string\"}},\"required\":[\"file_path\",\"edits\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"fetch\",\"strict\":false,\"description\":\"Fetches content from URL and returns it in specified format.\\n\\n<usage>\\n- Provide URL to fetch content from\\n- Specify desired output format (text, markdown, or html)\\n- Optional timeout for request\\n</usage>\\n\\n<features>\\n- Supports three output formats: text, markdown, html\\n- Auto-handles HTTP redirects\\n- Sets reasonable timeouts to prevent hanging\\n- Validates input parameters before requests\\n</features>\\n\\n<limitations>\\n- Max response size: 5MB\\n- Only supports HTTP and HTTPS protocols\\n- Cannot handle authentication or cookies\\n- Some websites may block automated requests\\n</limitations>\\n\\n<tips>\\n- Use text format for plain text content or simple API responses\\n- Use markdown format for content that should be rendered with formatting\\n- Use html format when you need raw HTML structure\\n- Set appropriate timeouts for potentially slow websites\\n</tips>\\n\",\"parameters\":{\"properties\":{\"format\":{\"description\":\"The format to return the content in (text, markdown, or html)\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"},\"url\":{\"description\":\"The URL to fetch content from\",\"type\":\"string\"}},\"required\":[\"url\",\"format\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"glob\",\"strict\":false,\"description\":\"Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide glob pattern to match against file paths\\n- Optional starting directory (defaults to current working directory)\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<pattern_syntax>\\n\\n- '\\\\*' matches any sequence of non-separator characters\\n- '\\\\*\\\\*' matches any sequence including separators\\n- '?' matches any single non-separator character\\n- '[...]' matches any character in brackets\\n- '[!...]' matches any character not in brackets\\n </pattern_syntax>\\n\\n<examples>\\n- '*.js' - JavaScript files in current directory\\n- '**/*.js' - JavaScript files in any subdirectory\\n- 'src/**/*.{ts,tsx}' - TypeScript files in src directory\\n- '*.{html,css,js}' - HTML, CSS, and JS files\\n</examples>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Does not search file contents (use Grep for that)\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<cross_platform>\\n\\n- Path separators handled automatically (/ and \\\\ work)\\n- Uses ripgrep (rg) if available, otherwise Go implementation\\n- Patterns should use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Combine with Grep: find files with Glob, search contents with Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine pattern if needed\\n</tips>\\n\",\"parameters\":{\"properties\":{\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The glob pattern to match files against\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"grep\",\"strict\":false,\"description\":\"Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).\\n\\n<usage>\\n- Provide regex pattern to search within file contents\\n- Set literal_text=true for exact text with special characters (recommended for non-regex users)\\n- Optional starting directory (defaults to current working directory)\\n- Optional include pattern to filter which files to search\\n- Results sorted with most recently modified files first\\n</usage>\\n\\n<regex_syntax>\\nWhen literal_text=false (supports standard regex):\\n\\n- 'function' searches for literal text \\\"function\\\"\\n- 'log\\\\..\\\\*Error' finds text starting with \\\"log.\\\" and ending with \\\"Error\\\"\\n- 'import\\\\s+.\\\\*\\\\s+from' finds import statements in JavaScript/TypeScript\\n </regex_syntax>\\n\\n<include_patterns>\\n\\n- '\\\\*.js' - Only search JavaScript files\\n- '\\\\*.{ts,tsx}' - Only search TypeScript files\\n- '\\\\*.go' - Only search Go files\\n </include_patterns>\\n\\n<limitations>\\n- Results limited to 100 files (newest first)\\n- Performance depends on number of files searched\\n- Very large binary files may be skipped\\n- Hidden files (starting with '.') skipped\\n</limitations>\\n\\n<ignore_support>\\n\\n- Respects .gitignore patterns to skip ignored files/directories\\n- Respects .crushignore patterns for additional ignore rules\\n- Both ignore files auto-detected in search root directory\\n </ignore_support>\\n\\n<cross_platform>\\n\\n- Uses ripgrep (rg) if available for better performance\\n- Falls back to Go implementation if ripgrep unavailable\\n- File paths normalized automatically for compatibility\\n </cross_platform>\\n\\n<tips>\\n- For faster searches: use Glob to find relevant files first, then Grep\\n- For iterative exploration requiring multiple searches, consider Agent tool\\n- Check if results truncated and refine search pattern if needed\\n- Use literal_text=true for exact text with special characters (dots, parentheses, etc.)\\n</tips>\\n\",\"parameters\":{\"properties\":{\"include\":{\"description\":\"File pattern to include in the search (e.g. \\\"*.js\\\", \\\"*.{ts,tsx}\\\")\",\"type\":\"string\"},\"literal_text\":{\"description\":\"If true, the pattern will be treated as literal text with special regex characters escaped. Default is false.\",\"type\":\"boolean\"},\"path\":{\"description\":\"The directory to search in. Defaults to the current working directory.\",\"type\":\"string\"},\"pattern\":{\"description\":\"The regex pattern to search for in file contents\",\"type\":\"string\"}},\"required\":[\"pattern\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"ls\",\"strict\":false,\"description\":\"Shows files and subdirectories in tree structure for exploring project organization.\\n\\n<usage>\\n- Provide path to list (defaults to current working directory)\\n- Optional glob patterns to ignore\\n- Results displayed in tree structure\\n</usage>\\n\\n<features>\\n- Hierarchical view of files and directories\\n- Auto-skips hidden files/directories (starting with '.')\\n- Skips common system directories like __pycache__\\n- Can filter files matching specific patterns\\n</features>\\n\\n<limitations>\\n- Results limited to 1000 files\\n- Large directories truncated\\n- No file sizes or permissions shown\\n- Cannot recursively list all directories in large projects\\n</limitations>\\n\\n<cross_platform>\\n\\n- Hidden file detection uses Unix convention (files starting with '.')\\n- Windows hidden files (with hidden attribute) not auto-skipped\\n- Common Windows directories (System32, Program Files) not in default ignore\\n- Path separators handled automatically (/ and \\\\ work)\\n </cross_platform>\\n\\n<tips>\\n- Use Glob for finding files by name patterns instead of browsing\\n- Use Grep for searching file contents\\n- Combine with other tools for effective exploration\\n</tips>\\n\",\"parameters\":{\"properties\":{\"depth\":{\"description\":\"The maximum depth to traverse\",\"type\":\"integer\"},\"ignore\":{\"description\":\"List of glob patterns to ignore\",\"items\":{},\"type\":\"array\"},\"path\":{\"description\":\"The path to the directory to list (defaults to current working directory)\",\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"sourcegraph\",\"strict\":false,\"description\":\"Search code across public repositories using Sourcegraph's GraphQL API.\\n\\n<usage>\\n- Provide search query using Sourcegraph syntax\\n- Optional result count (default: 10, max: 20)\\n- Optional timeout for request\\n</usage>\\n\\n<basic_syntax>\\n\\n- \\\"fmt.Println\\\" - exact matches\\n- \\\"file:.go fmt.Println\\\" - limit to Go files\\n- \\\"repo:^github\\\\.com/golang/go$ fmt.Println\\\" - specific repos\\n- \\\"lang:go fmt.Println\\\" - limit to Go code\\n- \\\"fmt.Println AND log.Fatal\\\" - combined terms\\n- \\\"fmt\\\\.(Print|Printf|Println)\\\" - regex patterns\\n- \\\"\\\\\\\"exact phrase\\\\\\\"\\\" - exact phrase matching\\n- \\\"-file:test\\\" or \\\"-repo:forks\\\" - exclude matches\\n </basic_syntax>\\n\\n<key_filters>\\nRepository: repo:name, repo:^exact$, repo:org/repo@branch, -repo:exclude, fork:yes, archived:yes, visibility:public\\nFile: file:\\\\.js$, file:internal/, -file:test, file:has.content(text)\\nContent: content:\\\"exact\\\", -content:\\\"unwanted\\\", case:yes\\nType: type:symbol, type:file, type:path, type:diff, type:commit\\nTime: after:\\\"1 month ago\\\", before:\\\"2023-01-01\\\", author:name, message:\\\"fix\\\"\\nResult: select:repo, select:file, select:content, count:100, timeout:30s\\n</key_filters>\\n\\n<examples>\\n- \\\"file:.go context.WithTimeout\\\" - Go code using context.WithTimeout\\n- \\\"lang:typescript useState type:symbol\\\" - TypeScript React useState hooks\\n- \\\"repo:^github\\\\.com/kubernetes/kubernetes$ pod list type:file\\\" - Kubernetes pod files\\n- \\\"file:Dockerfile (alpine OR ubuntu) -content:alpine:latest\\\" - Dockerfiles with base images\\n</examples>\\n\\n<boolean_operators>\\n\\n- \\\"term1 AND term2\\\" - both terms\\n- \\\"term1 OR term2\\\" - either term\\n- \\\"term1 NOT term2\\\" - term1 but not term2\\n- \\\"term1 and (term2 or term3)\\\" - grouping with parentheses\\n </boolean_operators>\\n\\n<limitations>\\n- Only searches public repositories\\n- Rate limits may apply\\n- Complex queries take longer\\n- Max 20 results per query\\n</limitations>\\n\\n<tips>\\n- Use specific file extensions to narrow results\\n- Add repo: filters for targeted searches\\n- Use type:symbol for function/method definitions\\n- Use type:file to find relevant files\\n</tips>\\n\",\"parameters\":{\"properties\":{\"context_window\":{\"description\":\"The context around the match to return (default: 10 lines)\",\"type\":\"integer\"},\"count\":{\"description\":\"Optional number of results to return (default: 10, max: 20)\",\"type\":\"integer\"},\"query\":{\"description\":\"The Sourcegraph search query\",\"type\":\"string\"},\"timeout\":{\"description\":\"Optional timeout in seconds (max 120)\",\"type\":\"integer\"}},\"required\":[\"query\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"view\",\"strict\":false,\"description\":\"Reads and displays file contents with line numbers for examining code, logs, or text data.\\n\\n<usage>\\n- Provide file path to read\\n- Optional offset: start reading from specific line (0-based)\\n- Optional limit: control lines read (default 2000)\\n- Don't use for directories (use LS tool instead)\\n</usage>\\n\\n<features>\\n- Displays contents with line numbers\\n- Can read from any file position using offset\\n- Handles large files by limiting lines read\\n- Auto-truncates very long lines for display\\n- Suggests similar filenames when file not found\\n</features>\\n\\n<limitations>\\n- Max file size: 250KB\\n- Default limit: 2000 lines\\n- Lines >2000 chars truncated\\n- Cannot display binary files/images (identifies them)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Handles Windows (CRLF) and Unix (LF) line endings\\n- Works with forward slashes (/) and backslashes (\\\\)\\n- Auto-detects text encoding for common formats\\n </cross_platform>\\n\\n<tips>\\n- Use with Glob to find files first\\n- For code exploration: Grep to find relevant files, then View to examine\\n- For large files: use offset parameter for specific sections\\n</tips>\\n\",\"parameters\":{\"properties\":{\"file_path\":{\"description\":\"The path to the file to read\",\"type\":\"string\"},\"limit\":{\"description\":\"The number of lines to read (defaults to 2000)\",\"type\":\"integer\"},\"offset\":{\"description\":\"The line number to start reading from (0-based)\",\"type\":\"integer\"}},\"required\":[\"file_path\"],\"type\":\"object\"}},\"type\":\"function\"},{\"function\":{\"name\":\"write\",\"strict\":false,\"description\":\"Creates or updates files in filesystem for saving/modifying text content.\\n\\n<usage>\\n- Provide file path to write\\n- Include content to write to file\\n- Tool creates necessary parent directories automatically\\n</usage>\\n\\n<features>\\n- Creates new files or overwrites existing ones\\n- Auto-creates parent directories if missing\\n- Checks if file modified since last read for safety\\n- Avoids unnecessary writes when content unchanged\\n</features>\\n\\n<limitations>\\n- Read file before writing to avoid conflicts\\n- Cannot append (rewrites entire file)\\n</limitations>\\n\\n<cross_platform>\\n\\n- Use forward slashes (/) for compatibility\\n </cross_platform>\\n\\n<tips>\\n- Use View tool first to examine existing files before modifying\\n- Use LS tool to verify location when creating new files\\n- Combine with Glob/Grep to find and modify multiple files\\n- Include descriptive comments when changing existing code\\n</tips>\\n\",\"parameters\":{\"properties\":{\"content\":{\"description\":\"The content to write to the file\",\"type\":\"string\"},\"file_path\":{\"description\":\"The path to the file to write\",\"type\":\"string\"}},\"required\":[\"file_path\",\"content\"],\"type\":\"object\"}},\"type\":\"function\"}],\"stream\":true}"
162+ headers:
163+ Accept:
164+ - application/json
165+ Content-Type:
166+ - application/json
167+ User-Agent:
168+ - OpenAI/Go 2.3.0
169+ url: https://api.z.ai/api/coding/paas/v4/chat/completions
170+ method: POST
171+ response:
172+ proto: HTTP/2.0
173+ proto_major: 2
174+ proto_minor: 0
175+ content_length: -1
176+ body: |+
177+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
178+
179+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
180+
181+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"Created"}}]}
182+
183+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" config"}}]}
184+
185+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":".json"}}]}
186+
187+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
188+
189+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" specified"}}]}
190+
191+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":" content"}}]}
192+
193+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"delta":{"role":"assistant","content":"."}}]}
194+
195+ data: {"id":"2025100220152328cdc7ed1aff458c","created":1759407323,"model":"glm-4.6","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":7420,"completion_tokens":12,"total_tokens":7432,"prompt_tokens_details":{"cached_tokens":7384}}}
196+
197+ data: [DONE]
198+
199+ headers:
200+ Content-Type:
201+ - text/event-stream;charset=UTF-8
202+ status: 200 OK
203+ code: 200
204+ duration: 1.130536583s
internal/config/provider.go+3−3
@@ -18,7 +18,7 @@ import (
1818)
1919
2020type ProviderClient interface {
21− GetProviders() ([]catwalk.Provider, error)
21+ GetProvidersV2() ([]catwalk.Provider, error)
2222}
2323
2424var (
@@ -129,7 +129,7 @@ func loadProviders(autoUpdateDisabled bool, client ProviderClient, path string)
129129 cacheIsStale, cacheExists := isCacheStale(path)
130130
131131 catwalkGetAndSave := func() ([]catwalk.Provider, error) {
132− providers, err := client.GetProviders()
132+ providers, err := client.GetProvidersV2()
133133 if err != nil {
134134 return nil, fmt.Errorf("failed to fetch providers from catwalk: %w", err)
135135 }
@@ -146,7 +146,7 @@ func loadProviders(autoUpdateDisabled bool, client ProviderClient, path string)
146146 go func() {
147147 slog.Info("Updating providers cache in background", "path", path)
148148
149− providers, err := client.GetProviders()
149+ providers, err := client.GetProvidersV2()
150150 if err != nil {
151151 slog.Error("Failed to fetch providers in background from Catwalk", "error", err)
152152 return
internal/config/provider_empty_test.go+1−1
@@ -11,7 +11,7 @@ import (
1111
1212type emptyProviderClient struct{}
1313
14−func (m *emptyProviderClient) GetProviders() ([]catwalk.Provider, error) {
14+func (m *emptyProviderClient) GetProvidersV2() ([]catwalk.Provider, error) {
1515 return []catwalk.Provider{}, nil
1616}
1717
internal/config/provider_test.go+1−1
@@ -14,7 +14,7 @@ type mockProviderClient struct {
1414 shouldFail bool
1515}
1616
17−func (m *mockProviderClient) GetProviders() ([]catwalk.Provider, error) {
17+func (m *mockProviderClient) GetProvidersV2() ([]catwalk.Provider, error) {
1818 if m.shouldFail {
1919 return nil, errors.New("failed to load providers")
2020 }
internal/message/content.go+7−7
@@ -4,6 +4,7 @@ import (
44 "encoding/base64"
55 "errors"
66 "slices"
7+ "strings"
78 "time"
89
910 "github.com/charmbracelet/catwalk/pkg/catwalk"
@@ -92,7 +93,6 @@ type ToolCall struct {
9293 Name string `json:"name"`
9394 Input string `json:"input"`
9495 ProviderExecuted bool `json:"provider_executed"`
95− Type string `json:"type"`
9696 Finished bool `json:"finished"`
9797}
9898
@@ -309,7 +309,6 @@ func (m *Message) FinishToolCall(toolCallID string) {
309309 ID: c.ID,
310310 Name: c.Name,
311311 Input: c.Input,
312− Type: c.Type,
313312 Finished: true,
314313 }
315314 return
@@ -326,7 +325,6 @@ func (m *Message) AppendToolCallInput(toolCallID string, inputDelta string) {
326325 ID: c.ID,
327326 Name: c.Name,
328327 Input: c.Input + inputDelta,
329− Type: c.Type,
330328 Finished: c.Finished,
331329 }
332330 return
@@ -396,8 +394,9 @@ func (m *Message) ToAIMessage() []ai.Message {
396394 switch m.Role {
397395 case User:
398396 var parts []ai.MessagePart
399− if m.Content().Text != "" {
400− parts = append(parts, ai.TextPart{Text: m.Content().Text})
397+ text := strings.TrimSpace(m.Content().Text)
398+ if text != "" {
399+ parts = append(parts, ai.TextPart{Text: text})
401400 }
402401 for _, content := range m.BinaryContent() {
403402 parts = append(parts, ai.FilePart{
@@ -412,8 +411,9 @@ func (m *Message) ToAIMessage() []ai.Message {
412411 })
413412 case Assistant:
414413 var parts []ai.MessagePart
415− if m.Content().Text != "" {
416− parts = append(parts, ai.TextPart{Text: m.Content().Text})
414+ text := strings.TrimSpace(m.Content().Text)
415+ if text != "" {
416+ parts = append(parts, ai.TextPart{Text: text})
417417 }
418418 reasoning := m.ReasoningContent()
419419 if reasoning.Thinking != "" {