server@0.91.0
Minor Changes
- 6b474d3: Add assistant skill attachments to the management API and assistant read model. Skill distribution mutations now target exactly one plugin or assistant, with plugin and assistant target fields optional on mutation responses; plugin-only distribution lists retain required plugin fields. Assistants expose resolved skill references, and skill detail responses report active assistant usage.
- 5c3f00a: Capture observed coding-agent skills and request unknown manifest content through the hooks API.
- ce5571d: Rename and edit captured skills, preserve immutable version lineage, and expose curation controls in the dashboard.
- 6ea128d: feat: surface issuer setup documentation when creating clients.
remote_session_issuerrecords now expose aclient_setup_documentation_url, settable on create and update across the project-scoped, org-admin, and platform-admin (global) issuer surfaces. The dashboard edits it on the issuer Settings tab and shows it on the Overview tab alongside the discovered RFC 8414service_documentation. Both are linked from the New Client sheet — as Client Setup Documentation and Service Documentation — so customers can set up an OAuth client with the provider themselves, owning its credentials, access, and rate limits rather than sharing a Gram-owned client.client_setup_documentation_urlmust be an absolutehttp(s)URL (validated withurls.IsAbsoluteHTTP, since it is rendered as a link); an empty string clears it. - e5800a5: Flag inactive MCP servers on the Distribute MCP listing. A new
telemetry.getMcpServerActivityendpoint reports per-server tool-call activity, and each card/row now shows a subtle indicator when a server has never received a tool call and a warning when it has had no tool calls in the last two weeks. - 27dbfcf: Warn organization billing contacts before their managed OpenRouter credits run out. The periodic credit-usage poll now emails the billing alert contact when usage of either platform-managed key — the chat key (playground, elements, assistants, completions proxy) or the internal key (risk-policy judges, prompt-injection detection, titles, resolutions, memory) — crosses 50%, 75%, 90%, and 100% of its monthly cap. Each key type has its own email template and thresholds dedup independently per key with monthly re-arming. Chat-key warnings are suppressed for organizations with a chat-serving BYOK key; internal-key warnings always apply since that usage is platform-billed. Organizations without a billing alert email are skipped.
- d9f2bf0: Add a
tokenExchangeservice for device-agent enrollment (DNO-383).tokenExchange.exchangetrades an org-scopedagentAPI key plus a vouched user email for a long-lived, per-user API key carrying the narroweragent_userscope: the email is verified to belong to a real member of the authenticated org, each enrollment mints its own uniquely-named key (no singleton rotation, so a user's other enrolled devices keep working), and the raw key is returned exactly once. Hooks do not route through the device agent, so the minted key carries nohooksscope. A newagent_userscope is the per-user data credential;agentimpliesagent_user(one-way), so an existing orgagentkey keeps working on the data endpoints with no re-provisioning, while a mintedagent_userkey cannot re-enter the mint endpoint.agent.getPluginsnow requiresagent_userand resolves the enrolled user by credential type: for a per-user key the enrolled user is the key owner (the vouchedemailparam is ignored); for an org installagentkey — the MDM zero-touch path, whose owner is an admin rather than the developer — the vouchedemailparam supplies attribution and is required. The plugin set is still resolved by organization.
Patch Changes
-
a1750eb: Give the project's managed assistant (Project Assistant) a new
platform_get_changelogtool that reads the public Speakeasy changelog feed, so it can answer questions about what recently shipped on the platform and dashboard. -
eacabda: Make the cost explorer's breakdown machinery treat the "(unset)" bucket as a first-class group everywhere, fixing the hidden Account Type breakdown on drilled slices that mix classified and unclassified spend (DNO-425).
Server: telemetry.query's dimension_values now keeps the '' bucket for every groupable dimension — it is the "(unset)" row a breakdown by that dimension renders, so consumers can count it. Only dimensions where '' means "not applicable" (the Claude attribution cuts and query_source, flagged in the dimension registry) still drop it. Empty role/group arrays likewise surface as the "(unset)" bucket.
Dashboard: the breakdown axis is resolved against the slice's actual group counts by one shared resolver, at drill time (using the clicked row's dimension values) and on load — a division whose spend all sits in one department lands directly on its users with no Department selector, while a division splitting into a named department plus department-less spend keeps the Department cut (previously hidden). The entity/detail query no longer depends on the axis (removing an internal resolution cycle), grouped queries wait for the resolved axis instead of fetching twice, a
?by=naming a pinned or un-splittable dimension falls back to the level's default, and the URL is rewritten in place whenever the rendered axis diverges from?by=so links always reflect the view. -
1dc6d5e: feat: add prompt scanner pubsub handlers
-
78a7ba8: Add a
hook_hostnamesort-key dimension toattribute_metrics_summaries(non-destructive ALTER + atomic MV MODIFY QUERY). The device hostname the Go hooks report rides into the aggregate so the user breakdown can fall back to the device for sessions that carry no email. Historic buckets read empty for the new column; live ingestion populates it fromgram.hook.hostname. -
1a04494: Fall back to the device hostname on the user cost breakdown when a session carries no email. The Go hooks report the machine's hostname on every event; it now rides the session cache onto Claude OTEL cost rows, and the
emailtelemetry dimension groups identity-less spend per device instead of pooling it all into one bucket. Only sessions with neither email nor hostname remain under "Team-wide API Usage". -
72855da: Normalize provider names and product-surface labels across reporting, agent sessions, tool logs, and cost views. Anthropic compliance imports now persist canonical Claude desktop/web source slugs, while historical source aliases remain filterable.
-
7d27a96: Expose recommended risk detection scopes through the management API, with per-policy per-category detection scope overrides.