Skip to content

server@0.91.0

Choose a tag to compare

@gram-bot gram-bot released this 21 Jul 19:33
c6c3f99

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_issuer records now expose a client_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 8414 service_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_url must be an absolute http(s) URL (validated with urls.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.getMcpServerActivity endpoint 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 tokenExchange service for device-agent enrollment (DNO-383). tokenExchange.exchange trades an org-scoped agent API key plus a vouched user email for a long-lived, per-user API key carrying the narrower agent_user scope: 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 no hooks scope. A new agent_user scope is the per-user data credential; agent implies agent_user (one-way), so an existing org agent key keeps working on the data endpoints with no re-provisioning, while a minted agent_user key cannot re-enter the mint endpoint. agent.getPlugins now requires agent_user and resolves the enrolled user by credential type: for a per-user key the enrolled user is the key owner (the vouched email param is ignored); for an org install agent key — the MDM zero-touch path, whose owner is an admin rather than the developer — the vouched email param 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_changelog tool 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_hostname sort-key dimension to attribute_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 from gram.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 email telemetry 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.