diff --git a/.agents/skills/upgrade-maintenance/SKILL.md b/.agents/skills/upgrade-maintenance/SKILL.md index bead71a..d4ba806 100644 --- a/.agents/skills/upgrade-maintenance/SKILL.md +++ b/.agents/skills/upgrade-maintenance/SKILL.md @@ -84,6 +84,53 @@ Two categories of service are present, with different upgrade patterns: minor/patch bumps expected. A major bump could change `mcp.AddTool` signatures, annotation fields, or content types. +### Step 1.2.1 — Update the OTel semconv import version + +`go.opentelemetry.io/otel/semconv` is **not** a separate Go module. The version +in the import path (e.g. `semconv/v1.40.0`) is an OTel semantic-convention spec +version that is a subdirectory **inside** the `go.opentelemetry.io/otel` module. + +**Why this matters**: instrumentation packages (e.g. `otelhttp`) always import +the semconv sub-package they were written against. When that version differs from +the one imported in our own code, the OTel SDK emits a startup error: + +``` +conflicting Schema URL: https://opentelemetry.io/schemas/1.41.0 and +https://opentelemetry.io/schemas/1.40.0 +``` + +**Rule**: after upgrading `go.opentelemetry.io/otel`, always update our semconv +import paths to the **highest-numbered sub-package present** inside the new otel +version. That is deterministically the latest spec version shipped with the +module, and it is the version the upgraded instrumentation packages will register. + +Find it with: + +```bash +OTEL_VER=$(grep 'go.opentelemetry.io/otel v' go.mod | grep -v '//' | awk '{print $2}' | head -1) +ls $(go env GOMODCACHE)/go.opentelemetry.io/otel@${OTEL_VER}/semconv/ \ + | grep '^v[0-9]' | sort -V | tail -1 +# e.g. "v1.41.0" +``` + +Then update every `semconv/v*` import in the codebase to use that version: + +```bash +# Find all semconv imports. +grep -rn 'semconv/v' internal/ cmd/ --include='*.go' +``` + +Update each import path in-place (e.g. `semconv/v1.40.0` → `semconv/v1.41.0`). +The attributes and helper functions are additive across minor spec versions, so +the rename is always safe for a minor/patch upgrade. + +After updating, verify the build and confirm the schema-URL conflict is gone: + +```bash +make build && ./scripts/test_server.sh 2>&1 | grep -i 'conflicting\|schema' +# Should produce no output. +``` + ### Step 1.3 — Verify the build compiles ```bash diff --git a/cmd/lfx-mcp-server/main.go b/cmd/lfx-mcp-server/main.go index 72ce090..9b7f2ef 100644 --- a/cmd/lfx-mcp-server/main.go +++ b/cmd/lfx-mcp-server/main.go @@ -34,7 +34,7 @@ import ( slogotel "github.com/remychantenay/slog-otel" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" - semconv "go.opentelemetry.io/otel/semconv/v1.40.0" + semconv "go.opentelemetry.io/otel/semconv/v1.41.0" "go.opentelemetry.io/otel/trace" ) diff --git a/go.mod b/go.mod index 99dca08..811c21d 100644 --- a/go.mod +++ b/go.mod @@ -2,43 +2,43 @@ // SPDX-License-Identifier: MIT module github.com/linuxfoundation/lfx-mcp -go 1.26.3 +go 1.26.4 require ( github.com/knadh/koanf/providers/basicflag v1.1.0 github.com/knadh/koanf/providers/env/v2 v2.0.0 - github.com/knadh/koanf/v2 v2.3.4 + github.com/knadh/koanf/v2 v2.3.5 github.com/lestrrat-go/jwx/v2 v2.1.6 - github.com/linuxfoundation/lfx-v2-committee-service v0.2.35 - github.com/linuxfoundation/lfx-v2-mailing-list-service v0.4.13 - github.com/linuxfoundation/lfx-v2-member-service v0.8.0 - github.com/linuxfoundation/lfx-v2-project-service v0.6.11 - github.com/linuxfoundation/lfx-v2-query-service v0.4.21 + github.com/linuxfoundation/lfx-v2-committee-service v0.4.0 + github.com/linuxfoundation/lfx-v2-mailing-list-service v0.5.0 + github.com/linuxfoundation/lfx-v2-member-service v0.9.0 + github.com/linuxfoundation/lfx-v2-project-service v0.8.0 + github.com/linuxfoundation/lfx-v2-query-service v0.4.22 github.com/modelcontextprotocol/go-sdk v1.6.1 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/remychantenay/slog-otel v1.3.5 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 - go.opentelemetry.io/contrib/propagators/jaeger v1.43.0 - go.opentelemetry.io/otel v1.43.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 - go.opentelemetry.io/otel/log v0.19.0 - go.opentelemetry.io/otel/sdk v1.43.0 - go.opentelemetry.io/otel/sdk/log v0.19.0 - go.opentelemetry.io/otel/sdk/metric v1.43.0 - go.opentelemetry.io/otel/trace v1.43.0 - goa.design/goa/v3 v3.27.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 + go.opentelemetry.io/contrib/propagators/jaeger v1.44.0 + go.opentelemetry.io/otel v1.44.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.20.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.20.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.44.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.44.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0 + go.opentelemetry.io/otel/log v0.20.0 + go.opentelemetry.io/otel/sdk v1.44.0 + go.opentelemetry.io/otel/sdk/log v0.20.0 + go.opentelemetry.io/otel/sdk/metric v1.44.0 + go.opentelemetry.io/otel/trace v1.44.0 + goa.design/goa/v3 v3.28.0 ) require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-chi/chi/v5 v5.3.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -60,16 +60,16 @@ require ( github.com/segmentio/encoding v0.5.4 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect - golang.org/x/crypto v0.52.0 // indirect - golang.org/x/net v0.55.0 // indirect + golang.org/x/crypto v0.53.0 // indirect + golang.org/x/net v0.56.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/text v0.37.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect + golang.org/x/sys v0.46.0 // indirect + golang.org/x/text v0.38.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/go.sum b/go.sum index c060d28..82debf6 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3hK/4HUq48LQ6Wwqo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= +github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/go-chi/chi/v5 v5.3.0 h1:halUjDxhshgXHMrao5bB8eNBXo/rnzwr8m5m36glehM= github.com/go-chi/chi/v5 v5.3.0/go.mod h1:R+tYY2hNuVUUjxoPtqUdgBqevM9s9njzkTLutVsOCto= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -40,8 +40,8 @@ github.com/knadh/koanf/providers/basicflag v1.1.0 h1:CfNtK0cFuNm3akYZU/0Gs61dNd8 github.com/knadh/koanf/providers/basicflag v1.1.0/go.mod h1:N3YEWwgyt9lYTa4ZHcvgJI9IuI/cMbx6zo/qdkAUq2Y= github.com/knadh/koanf/providers/env/v2 v2.0.0 h1:Ad5H3eun722u+FvchiIcEIJZsZ2M6oxCkgZfWN5B5KY= github.com/knadh/koanf/providers/env/v2 v2.0.0/go.mod h1:1g01PE+Ve1gBfWNNw2wmULRP0tc8RJrjn5p2N/jNCIc= -github.com/knadh/koanf/v2 v2.3.4 h1:fnynNSDlujWE+v83hAp8wKr/cdoxHLO0629SN+U8Urc= -github.com/knadh/koanf/v2 v2.3.4/go.mod h1:gRb40VRAbd4iJMYYD5IxZ6hfuopFcXBpc9bbQpZwo28= +github.com/knadh/koanf/v2 v2.3.5 h1:2dXJUYaKGm4SGYeoAtBviq9+02JZo/pxQ2ssOd60rJg= +github.com/knadh/koanf/v2 v2.3.5/go.mod h1:gRb40VRAbd4iJMYYD5IxZ6hfuopFcXBpc9bbQpZwo28= github.com/lestrrat-go/blackmagic v1.0.4 h1:IwQibdnf8l2KoO+qC3uT4OaTWsW7tuRQXy9TRN9QanA= github.com/lestrrat-go/blackmagic v1.0.4/go.mod h1:6AWFyKNNj0zEXQYfTMPfZrAXUWUfTIZ5ECEUEJaijtw= github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= @@ -54,18 +54,16 @@ github.com/lestrrat-go/jwx/v2 v2.1.6 h1:hxM1gfDILk/l5ylers6BX/Eq1m/pnxe9NBwW6lVf github.com/lestrrat-go/jwx/v2 v2.1.6/go.mod h1:Y722kU5r/8mV7fYDifjug0r8FK8mZdw0K0GpJw/l8pU= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/linuxfoundation/lfx-v2-committee-service v0.2.35 h1:TcFPw1aEwWDu8dVOFcKMI/uuSUXT+Npb96EW5QJ8tsk= -github.com/linuxfoundation/lfx-v2-committee-service v0.2.35/go.mod h1:bUq8j4LphKSbQkdotVEREj5dLOcS+dZGVgmBfF9YD2A= -github.com/linuxfoundation/lfx-v2-mailing-list-service v0.4.13 h1:5nNZI5mr1NquOtqSBe2u/6Omny0RghiPKFH83FJL3go= -github.com/linuxfoundation/lfx-v2-mailing-list-service v0.4.13/go.mod h1:gz5bGYepAar5l7y61j5QV07z8n/jxhZKQBINF3oRFTQ= -github.com/linuxfoundation/lfx-v2-member-service v0.5.3 h1:xotDUAs2oVpioTo6gosEdngGpgCSzncjWul0lFj7a6E= -github.com/linuxfoundation/lfx-v2-member-service v0.5.3/go.mod h1:qMzCkX1KayvzmxZQhVL2+dX1jXHqU3CcRGZ/t41vbgs= -github.com/linuxfoundation/lfx-v2-member-service v0.8.0 h1:b7JSXeRcgC7v5sjZ+n098arG5652tfufLqxcvodEhos= -github.com/linuxfoundation/lfx-v2-member-service v0.8.0/go.mod h1:CTnF8JHXN/1+bFEbxcBMcFOdZj+CXxnKT/kJXbEX94E= -github.com/linuxfoundation/lfx-v2-project-service v0.6.11 h1:ACr/XI/Io3PEWX4vJaHHTvEOhN+na4jp1kx3p4PYLsA= -github.com/linuxfoundation/lfx-v2-project-service v0.6.11/go.mod h1:3ULEcvKwHWcBcMxSW3yeMPGqk5+tnu2X+FjcaAw9Fy4= -github.com/linuxfoundation/lfx-v2-query-service v0.4.21 h1:FDoqt8oeC0Egbl3Z7BeqZ2XKcfm4BujFQ4mBSQd3KEs= -github.com/linuxfoundation/lfx-v2-query-service v0.4.21/go.mod h1:3uHRcBPfibwW3Y95s1ZCc5XHxw8B7nK7nGLPtnAyqUo= +github.com/linuxfoundation/lfx-v2-committee-service v0.4.0 h1:KOqG9brs0XV6Yd71cbVebOjtUV6M6ZfaGaWT0NPpm24= +github.com/linuxfoundation/lfx-v2-committee-service v0.4.0/go.mod h1:QZtzJQpcPOLuVcTo3+3Crcn0agAsj53CSe8Bh9odIlU= +github.com/linuxfoundation/lfx-v2-mailing-list-service v0.5.0 h1:YXPkGBIP7BKLn28UiLZAD9JrmHcs8rGI9yUBEALgypc= +github.com/linuxfoundation/lfx-v2-mailing-list-service v0.5.0/go.mod h1:3Sktz+IJy1oQvqgg4pgvx+/JqjLDKuwL4vJIuM3LID0= +github.com/linuxfoundation/lfx-v2-member-service v0.9.0 h1:+nWe1+vSBGa7taYhfaAwwi0eX0eWIrbJcXFG37egvfg= +github.com/linuxfoundation/lfx-v2-member-service v0.9.0/go.mod h1:Q6VQbl9DjxQMEfjWaoJ+yr4m1BBV50586bvfrVJ2sX8= +github.com/linuxfoundation/lfx-v2-project-service v0.8.0 h1:lGYJ4NqUjykw4V6cvTUFUGrUkliqySI4K/iT9PGTpsc= +github.com/linuxfoundation/lfx-v2-project-service v0.8.0/go.mod h1:C2mCCrIb6+2A8A/eDfzOfyjNfisfTahjX9SWdm+IKwU= +github.com/linuxfoundation/lfx-v2-query-service v0.4.22 h1:ZeARCbrwa1aXBC3hiQl6tDjqazmKogCOKZMAltsNc+I= +github.com/linuxfoundation/lfx-v2-query-service v0.4.22/go.mod h1:AytbVe9uSWffEtkVoCVRBgmw3L7dF/C3+5deVMrRdM0= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -92,64 +90,66 @@ github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zI github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= -go.opentelemetry.io/contrib/propagators/jaeger v1.43.0 h1:peiLMz1+aqJE+3L4mOVtR9wlmv+yh/JVYXCBjqmzJJE= -go.opentelemetry.io/contrib/propagators/jaeger v1.43.0/go.mod h1:Agvif+4A8p/3UtZzJ0MCcDEuQwgtrzM71DueU41DCs8= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 h1:Dn8rkudDzY6KV9dr/D/bTUuWgqDf9xe0rr4G2elrn0Y= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0/go.mod h1:gMk9F0xDgyN9M/3Ed5Y1wKcx/9mlU91NXY2SNq7RQuU= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 h1:HIBTQ3VO5aupLKjC90JgMqpezVXwFuq6Ryjn0/izoag= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0/go.mod h1:ji9vId85hMxqfvICA0Jt8JqEdrXaAkcpkI9HPXya0ro= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 h1:8UQVDcZxOJLtX6gxtDt3vY2WTgvZqMQRzjsqiIHQdkc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0/go.mod h1:2lmweYCiHYpEjQ/lSJBYhj9jP1zvCvQW4BqL9dnT7FQ= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0 h1:w1K+pCJoPpQifuVpsKamUdn9U0zM3xUziVOqsGksUrY= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0/go.mod h1:HBy4BjzgVE8139ieRI75oXm3EcDN+6GhD88JT1Kjvxg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= -go.opentelemetry.io/otel/log v0.19.0 h1:KUZs/GOsw79TBBMfDWsXS+KZ4g2Ckzksd1ymzsIEbo4= -go.opentelemetry.io/otel/log v0.19.0/go.mod h1:5DQYeGmxVIr4n0/BcJvF4upsraHjg6vudJJpnkL6Ipk= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/log v0.19.0 h1:scYVLqT22D2gqXItnWiocLUKGH9yvkkeql5dBDiXyko= -go.opentelemetry.io/otel/sdk/log v0.19.0/go.mod h1:vFBowwXGLlW9AvpuF7bMgnNI95LiW10szrOdvzBHlAg= -go.opentelemetry.io/otel/sdk/log/logtest v0.19.0 h1:BEbF7ZBB6qQloV/Ub1+3NQoOUnVtcGkU3XX4Ws3GQfk= -go.opentelemetry.io/otel/sdk/log/logtest v0.19.0/go.mod h1:Lua81/3yM0wOmoHTokLj9y9ADeA02v1naRrVrkAZuKk= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= +go.opentelemetry.io/contrib/propagators/jaeger v1.44.0 h1:OyzvsAMc/zHt0DRPcfstn0wgfq8ApDkeY0ABMcueweM= +go.opentelemetry.io/contrib/propagators/jaeger v1.44.0/go.mod h1:44kghcGX+BNxy9UTiWtd6VDt8Nd4EypGBkH2+v2Dqrc= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.20.0 h1:rydZ9sxbcFdm/oWrVyfLTjHIygMgv0bEeMd+3B/BvoM= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.20.0/go.mod h1:earQ25dooT0Hhspq59DZ8YCC50jWfOlFEeWoxy/P444= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.20.0 h1:owlhcJ3QO3X0YTDTCcDZ4V+6aVDkWbNmBoQ5NUp7Oww= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.20.0/go.mod h1:MP4eemTiI9zC8fgg+DYynhYDYf3ba72S376TvP+Ye0Q= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.44.0 h1:SUplec5dp06reu1zaXmOXdvqH398taqrDXqUl99jxSc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.44.0/go.mod h1:ho2g4N+ane+swq5I/VBkKWnRDY4kUINH3FuqyZqX/Ug= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.44.0 h1:RuynHbfU8JUEw7DyONgkVYg2SVtsoF28y0LGIr69jgA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.44.0/go.mod h1:qZF+/lBs71APw8mlnEZcqZHMzqrYrsFiJOv83lX1OGo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0 h1:lgh3PiVrRUWMLOVSkQicxzZll5NjF1r+AtsX1XRIHw0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.44.0/go.mod h1:5Cnhth3m/AgOeTgE3ex12pPmiu/gGtZit03kSzx9X7s= +go.opentelemetry.io/otel/log v0.20.0 h1:/5i0vuHxCLWUfChWG41K9wkM0jafruPw9NU1/RCJirs= +go.opentelemetry.io/otel/log v0.20.0/go.mod h1:wOcMcjsZpG8x7Bak7IhSi/lg8wscV2C1VdrKCLPlt0E= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= +go.opentelemetry.io/otel/metric/x v0.66.0/go.mod h1:d1+BDj9t96do0/1LoU1ayfCv79ZgNE41qbhBvnMOBZk= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= +go.opentelemetry.io/otel/sdk/log v0.20.0 h1:vM3xI7TQgKPiSghe6urZtAkyFY7SodrSpC83CffDFuY= +go.opentelemetry.io/otel/sdk/log v0.20.0/go.mod h1:Knej2nmsTUzN79T2eeXdRsjjPcoxoq2pUyUHz9TFyyU= +go.opentelemetry.io/otel/sdk/log/logtest v0.20.0 h1:OqdRZ1guyzamK3M6LlRsmGqRrjkHWw6WZOKKli5ELpg= +go.opentelemetry.io/otel/sdk/log/logtest v0.20.0/go.mod h1:PuMIlm7zAt7c3z8zfOI5ox4iT1Z87We+PF6YoINux/M= +go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= +go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -goa.design/goa/v3 v3.27.0 h1:WSb7INd1AgU1BMHUYJoC+NdUgPj9DxOK+C4qJwuuiYE= -goa.design/goa/v3 v3.27.0/go.mod h1:+KpTEiO/br2yJ5tub4tttTTd0+CSkIqEAAHzDpKKmSM= -golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= -golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +goa.design/goa/v3 v3.28.0 h1:fhLqn0crrmjlDJBlXMKvDMVxScAp6TcEeGTSoFTCZ7o= +goa.design/goa/v3 v3.28.0/go.mod h1:EliUsJT3ObuebAPvYZsZtsl2wzEqf0N3HJRw6MrfDxQ= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= -golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= -google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad h1:3iLyITS/sySRwbUKoC7ogfj2Yr1Cjs0pfaRKj5U5HEw= +google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:KdNqO+rCIWgFumrNBSEDlDNrkrQnpkax7Tv1WxNY8V4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= diff --git a/internal/lfxv2/access_check.go b/internal/lfxv2/access_check.go index 88040b2..60eb94c 100644 --- a/internal/lfxv2/access_check.go +++ b/internal/lfxv2/access_check.go @@ -143,7 +143,7 @@ func (c *AccessCheckClient) CheckProjectAccess(ctx context.Context, token string // // @\t // -// For example: "project:uuid#writer@user:auth0|alice\ttrue" +// For example: "project:uuid#writer@user:alice\ttrue" func parseAccessResult(result string) (request string, allowed bool, err error) { parts := strings.SplitN(result, "\t", 2) if len(parts) != 2 { diff --git a/internal/lfxv2/access_check_test.go b/internal/lfxv2/access_check_test.go index f01f35a..e0be7ee 100644 --- a/internal/lfxv2/access_check_test.go +++ b/internal/lfxv2/access_check_test.go @@ -41,7 +41,7 @@ func TestCheckAccess_Allow(t *testing.T) { w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(accessCheckResponse{ //nolint:errcheck // Test handler write errors are not actionable. - Results: []string{"project:abc-123#writer@user:auth0|testuser\ttrue"}, + Results: []string{"project:abc-123#writer@user:testuser\ttrue"}, }) })) defer server.Close() @@ -64,7 +64,7 @@ func TestCheckAccess_Deny(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(accessCheckResponse{ //nolint:errcheck // Test handler write errors are not actionable. - Results: []string{"project:abc-123#writer@user:auth0|testuser\tfalse"}, + Results: []string{"project:abc-123#writer@user:testuser\tfalse"}, }) })) defer server.Close() @@ -97,9 +97,9 @@ func TestCheckAccess_Batch(t *testing.T) { w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(accessCheckResponse{ //nolint:errcheck // Test handler write errors are not actionable. Results: []string{ - "project:bbb#auditor@user:auth0|testuser\tfalse", - "project:aaa#writer@user:auth0|testuser\ttrue", - "project:ccc#writer@user:auth0|testuser\ttrue", + "project:bbb#auditor@user:testuser\tfalse", + "project:aaa#writer@user:testuser\ttrue", + "project:ccc#writer@user:testuser\ttrue", }, }) })) @@ -140,7 +140,7 @@ func TestCheckAccess_HashSeparator(t *testing.T) { } w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(accessCheckResponse{ //nolint:errcheck // Test handler write errors are not actionable. - Results: []string{"project:my-uuid#writer@user:auth0|testuser\ttrue"}, + Results: []string{"project:my-uuid#writer@user:testuser\ttrue"}, }) })) defer server.Close() @@ -190,7 +190,7 @@ func TestCheckAccess_ResultCountMismatch(t *testing.T) { w.Header().Set("Content-Type", "application/json") // Return 1 result for 2 requests. _ = json.NewEncoder(w).Encode(accessCheckResponse{ //nolint:errcheck // Test handler write errors are not actionable. - Results: []string{"project:a#writer@user:auth0|testuser\ttrue"}, + Results: []string{"project:a#writer@user:testuser\ttrue"}, }) })) defer server.Close() @@ -206,7 +206,7 @@ func TestCheckProjectAccess_Allow(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(accessCheckResponse{ //nolint:errcheck // Test handler write errors are not actionable. - Results: []string{"project:uuid-123#writer@user:auth0|testuser\ttrue"}, + Results: []string{"project:uuid-123#writer@user:testuser\ttrue"}, }) })) defer server.Close() @@ -222,7 +222,7 @@ func TestCheckProjectAccess_Deny(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(accessCheckResponse{ //nolint:errcheck // Test handler write errors are not actionable. - Results: []string{"project:uuid-123#writer@user:auth0|testuser\tfalse"}, + Results: []string{"project:uuid-123#writer@user:testuser\tfalse"}, }) })) defer server.Close() @@ -244,19 +244,19 @@ func TestParseAccessResult(t *testing.T) { }{ { name: "allowed", - input: "project:abc-123#writer@user:auth0|alice\ttrue", + input: "project:abc-123#writer@user:alice\ttrue", wantReq: "project:abc-123#writer", wantOK: true, }, { name: "denied", - input: "project:abc-123#owner@user:auth0|alice\tfalse", + input: "project:abc-123#owner@user:alice\tfalse", wantReq: "project:abc-123#owner", wantOK: false, }, { name: "no tab", - input: "project:abc-123#writer@user:auth0|alice", + input: "project:abc-123#writer@user:alice", wantErr: true, }, { diff --git a/internal/lfxv2/client.go b/internal/lfxv2/client.go index 99aac78..0c2e0d6 100644 --- a/internal/lfxv2/client.go +++ b/internal/lfxv2/client.go @@ -202,6 +202,8 @@ func NewClients(_ context.Context, cfg ClientConfig) (*Clients, error) { committeeHTTPClient.Livez(), committeeHTTPClient.CreateCommitteeMember(), committeeHTTPClient.GetCommitteeMember(), + committeeHTTPClient.GetOrgCommitteeSeats(), + committeeHTTPClient.ReassignOrgCommitteeSeat(), committeeHTTPClient.UpdateCommitteeMember(), committeeHTTPClient.DeleteCommitteeMember(), committeeHTTPClient.GetInvite(), @@ -227,6 +229,8 @@ func NewClients(_ context.Context, cfg ClientConfig) (*Clients, error) { committeeHTTPClient.GetCommitteeDocument(), committeeHTTPClient.DownloadCommitteeDocument(), committeeHTTPClient.DeleteCommitteeDocument(), + committeeHTTPClient.GetCurrentWeeklyBrief(), + committeeHTTPClient.GenerateWeeklyBrief(), ) // Initialize mailing list service client. diff --git a/internal/otel/tracing.go b/internal/otel/tracing.go index ca259ee..c844f7e 100644 --- a/internal/otel/tracing.go +++ b/internal/otel/tracing.go @@ -27,7 +27,7 @@ import ( "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/sdk/trace" - semconv "go.opentelemetry.io/otel/semconv/v1.40.0" + semconv "go.opentelemetry.io/otel/semconv/v1.41.0" ) const ( diff --git a/internal/tools/member.go b/internal/tools/member.go index 85165e2..67e2c7f 100644 --- a/internal/tools/member.go +++ b/internal/tools/member.go @@ -37,14 +37,14 @@ func SetMemberConfig(cfg *MemberConfig) { // SearchMembersArgs defines the input parameters for the search_members tool. type SearchMembersArgs struct { - ProjectUID string `json:"project_uid,omitempty" jsonschema:"Filter by project UUID. At least one of project_uid or b2b_org_uid is strongly recommended."` - B2bOrgUID string `json:"b2b_org_uid,omitempty" jsonschema:"Filter by B2B organization UID. At least one of project_uid or b2b_org_uid is strongly recommended."` - SearchName string `json:"search_name,omitempty" jsonschema:"Search memberships by member company name (typeahead)."` - TierUID string `json:"tier_uid,omitempty" jsonschema:"Filter by exact tier+range UID (each employee-count range has a distinct UID)."` + ProjectUID string `json:"project_uid,omitempty" jsonschema:"Filter by project UUID. At least one of project_uid or b2b_org_uid is strongly recommended."` + B2bOrgUID string `json:"b2b_org_uid,omitempty" jsonschema:"Filter by B2B organization UID. At least one of project_uid or b2b_org_uid is strongly recommended."` + SearchName string `json:"search_name,omitempty" jsonschema:"Search memberships by member company name (typeahead)."` + TierUID string `json:"tier_uid,omitempty" jsonschema:"Filter by exact tier+range UID (each employee-count range has a distinct UID)."` TierName string `json:"tier_name,omitempty" jsonschema:"Filter by exact tier product name, e.g. 'Silver ISV Member'. Must match the full name as stored."` IncludeInactive bool `json:"include_inactive,omitempty" jsonschema:"When true, include memberships with non-Active statuses (e.g. Purchased, Expired, Completed). Defaults to false (Active memberships only)."` PageSize int `json:"page_size,omitempty" jsonschema:"Number of results per page (default 10, max 100)."` - PageToken string `json:"page_token,omitempty" jsonschema:"Opaque pagination token from a previous search response."` + PageToken string `json:"page_token,omitempty" jsonschema:"Opaque pagination token from a previous search response."` } // GetMemberMembershipArgs defines the input parameters for the get_member_membership tool.