Skip to content

fix: treat load_skill as internal tool to suppress false-positive Sentry errors#2756

Merged
anubra266 merged 2 commits intomainfrom
fix/load-skill-missing-relationship-id
Mar 20, 2026
Merged

fix: treat load_skill as internal tool to suppress false-positive Sentry errors#2756
anubra266 merged 2 commits intomainfrom
fix/load-skill-missing-relationship-id

Conversation

@anubra266
Copy link
Copy Markdown
Contributor

@anubra266 anubra266 commented Mar 18, 2026

Summary

  • load_skill was being treated as a regular user-visible tool, so wrapToolWithStreaming emitted tool_call/tool_result graph events for it — but with no relationshipId, causing the graph animator in use-animate-graph.ts to fire a Sentry error on every skill load
  • Fix: add load_skill to isInternalToolForUi alongside transfer_to_* and delegate_to_* — suppresses chat streaming events (input start/delta/output) and graph session events, matching other internal orchestration tools

Closes PRD-6271

@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 18, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agents-api Ready Ready Preview, Comment Mar 18, 2026 8:40pm
agents-manage-ui Ready Ready Preview, Comment Mar 18, 2026 8:40pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
agents-docs Skipped Skipped Mar 18, 2026 8:40pm

Request Review

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Mar 18, 2026

⚠️ No Changeset found

Latest commit: e55edb4

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@amikofalvy
Copy link
Copy Markdown
Collaborator

@claude Are there other such tools that can benefit from this pattern? How can we prevent this relationshipId issue from occurring again in the future?

@inkeep-internal-ci
Copy link
Copy Markdown
Contributor

inkeep-internal-ci Bot commented Mar 18, 2026

Claude finished @amikofalvy's task in 1m 10s —— View job


Analysis: relationshipId pattern and prevention strategies

  • Gather context — read the changed files and callers
  • Identify other tools that could benefit from this pattern
  • Suggest prevention strategies

Are there other tools that need this?

No — load_skill was the only affected tool. Here's why:

The other two default tools in default-tools.ts (get_reference_artifact and compress_context) are assigned directly without wrapToolWithStreaming, so they never emit tool_call/tool_result events and thus never need a relationshipId.

All other wrapped tools already resolve their relationshipId correctly through getRelationshipIdForTool (tool-utils.ts:3-48) because they have configured graph relationships:

Tool type Lookup mechanism Source
mcp Matched via ctx.config.toolstool.relationshipId tool-utils.ts:8-26
tool (function tools) Looked up in ctx.functionToolRelationshipIdByName map tool-utils.ts:28-30
delegation Found in ctx.config.delegateRelations tool-utils.ts:32-38
transfer Found in ctx.config.transferRelations tool-utils.ts:40-47

load_skill was the odd one out — a built-in tool that goes through streaming but has no graph relationship entry in any of these lookups.

How to prevent this in the future

A few approaches, roughly ordered by effort:

  1. Runtime assertion in wrapToolWithStreaming (lowest effort, highest immediate value): Add a logger.warn or even a dev-mode assertion when relationshipId resolves to undefined after the override/lookup. This would catch the issue at the API layer before it reaches the UI and Sentry:

    const relationshipId =
      options?.relationshipIdOverride ?? getRelationshipIdForTool(ctx, toolName, toolType);
    
    if (!relationshipId) {
      logger.warn({ toolName, toolType, subAgentId: ctx.config.id },
        'Tool wrapped with streaming has no relationshipId — graph animations will not work');
    }
  2. Make get_reference_artifact and compress_context consistent: If these tools should ever be wrapped with streaming in the future (e.g., to show them in the UI), they'd hit the same problem. Consider proactively wrapping them with relationshipIdOverride: ctx.config.relationId now, or at least add a code comment noting the pattern.

  3. Type-level enforcement: Change the options parameter so that tools with toolType of undefined (i.e., built-in tools not in the graph) require relationshipIdOverride. A discriminated union on the options type would make the compiler catch this:

    type WrapOptions =
      | { toolType: ToolType; relationshipIdOverride?: string; /* ... */ }
      | { toolType?: undefined; relationshipIdOverride: string; /* ... */ };
  4. Consumer-side resilience (use-animate-graph.ts): The UI currently fires a Sentry error for every missing relationshipId. It could instead silently skip the animation for that edge (just return early) while still logging a warning. This makes the system more resilient to future omissions without masking them entirely.

Approach 1 (runtime warning) is the quickest win and would have caught this bug during development. Approach 3 (type-level) is the most robust long-term solution since it shifts the check to compile time.

Copy link
Copy Markdown
Contributor

@claude claude Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Review Summary

(1) Total Issues | Risk: Medium

🟠⚠️ Major (1) 🟠⚠️

Inline Comments:

  • 🟠 Major: default-tools.ts:131 Fix passes undefined — ctx.config.relationId is never populated for the executing agent

Analysis

The fix approach is architecturally sound — adding a relationshipIdOverride option to wrapToolWithStreaming is a clean way to handle built-in tools that don't have graph relationships. However, the implementation doesn't work because the value being passed (ctx.config.relationId) is always undefined.

Root cause chain:

  1. load_skill is not in the function tool relationship map (ctx.functionToolRelationshipIdByName)
  2. getRelationshipIdForTool() returns undefined for it
  3. The fix attempts to use ctx.config.relationId as an override
  4. But ctx.config.relationId is never set during agent construction in generateTaskHandler.ts
  5. The override evaluates to undefined ?? getRelationshipIdForTool(...) which still returns undefined

Recommendations (choose one):

Option A — UI-side fix (simpler): Modify use-animate-graph.ts to not fire Sentry errors for known built-in tools. The UI already has a working fallback at line 111 that highlights the sub-agent node via node.data.id === data.details?.subAgentId.

Option B — Thread relationshipId (more complete): When a parent agent invokes a sub-agent, the parent knows the sub-agent's relationshipId (it's in the relation config). Pass this value into AgentConfig.relationId during task dispatch so the sub-agent knows its own relationship ID from its parent's perspective.


Discarded (0)
Location Issue Reason Discarded
Reviewers (2)
Reviewer Returned Main Findings Consider While You're Here Inline Comments Pending Recs Discarded
pr-review-standards 0 0 0 0 0 0 0
pr-review-precision 1 0 0 0 1 0 0
Total 1 0 0 0 1 0 0

🚫 REQUEST CHANGES

Summary: The fix mechanism (adding relationshipIdOverride) is good, but the value being passed (ctx.config.relationId) is undefined because it's never populated during agent construction. Please verify this locally and choose one of the recommended approaches to actually resolve the Sentry error.

Comment thread agents-api/src/domains/run/agents/tools/default-tools.ts Outdated
@github-actions github-actions Bot deleted a comment from claude Bot Mar 18, 2026
Copy link
Copy Markdown
Contributor

@pullfrog pullfrog Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The approach of adding relationshipIdOverride to wrapToolWithStreaming is sound, but ctx.config.relationId is undefined for the running sub-agent — so the override doesn't actually fix the Sentry error.

Pullfrog  | Fix all ➔Fix 👍s ➔View workflow runpullfrog.com𝕏

Comment thread agents-api/src/domains/run/agents/tools/default-tools.ts Outdated
@vercel vercel Bot temporarily deployed to Preview – agents-docs March 18, 2026 20:38 Inactive
@anubra266 anubra266 changed the title fix: provide relationshipId for load_skill tool calls in graph events fix: treat load_skill as internal tool to suppress false-positive Sentry errors Mar 18, 2026
Copy link
Copy Markdown
Contributor

@claude claude Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Review Summary

(0) Total Issues | Risk: Low


Delta Review: Approach Change ✅

The author pivoted from the broken relationshipIdOverride approach (flagged in the prior review) to treating load_skill as an internal tool. This is the correct fix.

Why the new approach works:

Aspect Assessment
Root cause addressed ✅ No tool_call event emitted → no missing relationshipId → no Sentry error
Semantic correctness load_skill is internal machinery (loads skill content into context), not a user-visible tool interaction
Pattern consistency ✅ Aligns with how delegate_to_*, transfer_to_*, and save_tool_result are handled
No functionality lost ✅ Skill loading still works; output (skill content) goes to agent context, not tool stream

What the suppression affects (all appropriate for load_skill):

  • Tool input/output streaming to chat UI — not meaningful for internal skill loading
  • Graph animation events — no edge to animate (no graph relationship exists)
  • Conversation history tool result messages — would just add noise

Previous Review Issue: RESOLVED ✅

Prior Issue Status
🟠 ctx.config.relationId is undefined Resolved — approach abandoned; now uses event suppression instead

Reviewers (2)
Reviewer Returned Main Findings Consider While You're Here Inline Comments Pending Recs Discarded
pr-review-standards 0 0 0 0 0 0 0
pr-review-precision 0 0 0 0 0 0 0
Total 0 0 0 0 0 0 0

✅ APPROVE

Summary: The pivot to treating load_skill as an internal tool is the right call — it's semantically correct (internal machinery shouldn't emit user-facing events) and surgically addresses the Sentry error without fabricating data. Clean fix! 🎯

@github-actions github-actions Bot deleted a comment from claude Bot Mar 18, 2026
@anubra266 anubra266 requested a review from amikofalvy March 18, 2026 20:55
@itoqa
Copy link
Copy Markdown

itoqa Bot commented Mar 18, 2026

Ito Test Report ❌

7 test cases ran. 6 passed, 1 failed.

✅ Verified security and stability checks passed for tenant-boundary rejection, XSS inert rendering, malformed event crash resistance, mobile usability, auth degradation, and setup fixture creation. 🔍 Code review confirms one actionable production defect in run API route wiring that prevents the expected /run/api/completions contract from being correctly mounted in source.

✅ Passed (6)
Test Case Summary Timestamp Screenshot
SETUP-1 Created activities-planner project/agent, created qa-load-skill and qa-load-skill-b, and attached both as on-demand skills to the default sub-agent. 0:00 SETUP-1_0-00.png
ROUTE-2 Tampered boundary call returned HTTP 403 with access-denied detail and no successful assistant payload. 32:51 ROUTE-2_32-51.png
ADV-2 Injected script-style payload did not execute in page context; window.__qa_xss stayed undefined, confirming inert handling of the payload. 28:36 ADV-2_28-36.png
ADV-4 Malformed operation event was dispatched and the builder remained responsive; a follow-up prompt was accepted after injection, confirming crash resistance. 28:36 ADV-4_28-36.png
MOBILE-1 At 390x844 viewport the Copilot panel opened with reachable input/send controls, and a load-skill prompt was successfully submitted. 28:36 MOBILE-1_28-36.png
AUTHZ-1 In unauthenticated flow no successful chat execution was observed, and direct unauthenticated chat API call returned a controlled rejection response. 28:36 AUTHZ-1_28-36.png
❌ Failed (1)
Test Case Summary Timestamp Screenshot
ROUTE-3 POST /run/api/completions did not produce a usable assistant completion and returned error data-operation chunks instead. 32:51 ROUTE-3_32-51.png
POST /run/api/completions remains functional with emit-operations enabled - Failed
  • Where: Run API completions endpoint (/run/api/completions) used by Copilot/API validation flow.

  • Steps to reproduce: Send an authenticated POST request to /run/api/completions with x-emit-operations: true; observe that the response stream emits error operations instead of a normal assistant completion.

  • What failed: Expected a successful assistant text completion, but the stream produced error operations (Maximum error limit (3) reached / unable to process request) and no usable completion output.

  • Code analysis: I reviewed run route registration and completions route definitions. The completions handler exists in chat.ts (/completions), but createRunRoutes mounts that router only under /v1/chat and does not mount it under /api, while other Copilot endpoints are mounted under /api. This leaves the /run/api/completions contract incorrectly wired in production source.

  • Relevant code:

    agents-api/src/domains/run/index.ts (lines 14-18)

    app.route('/v1/chat', chatRoutes);
    app.route('/v1/conversations', conversationRoutes);
    app.route('/api', chatDataRoutes);
    app.route('/v1/mcp', mcpRoutes);
    app.route('/agents', agentRoutes);

    agents-api/src/domains/run/routes/chat.ts (lines 40-43)

    const chatCompletionsRoute = createProtectedRoute({
      method: 'post',
      path: '/completions',
      tags: ['Chat'],
  • Why this is likely a bug: The completions route is implemented but not mounted on the /api prefix expected by the tested contract, so /run/api/completions is not correctly served by the intended completions handler.

  • Introduced by this PR: No - pre-existing bug (code not changed in this PR).

  • Timestamp: 32:51

📋 View Recording

Screen Recording

@anubra266 anubra266 added this pull request to the merge queue Mar 20, 2026
Merged via the queue into main with commit db631c2 Mar 20, 2026
11 checks passed
@anubra266 anubra266 deleted the fix/load-skill-missing-relationship-id branch March 20, 2026 21:02
dimaMachina pushed a commit that referenced this pull request Mar 20, 2026
…try errors (#2756)

* fix: provide relationshipId for load_skill tool calls in graph events

* fix: treat load_skill as internal tool, suppress chat/graph streaming events
github-merge-queue Bot pushed a commit that referenced this pull request Mar 30, 2026
* skill generator

* polish skill generator

* skills tests

* upd

* upd

* generation.test wip

* add generation.test

* tree node

* skill page

* skill loader

* skill loader refactor

* skill loader

* move skills sidebar to layout

* use pure monaco-editor component since we can have different file extension

* add shadcn context menu component

* format context menu

* skills files and edit pages

* dry

* update layout

* add docs

* add a changeset

* redirect to first skill

* skill files utils

* skill selector

* upd treenode

* skill files

* skill file editor

* delete skill confirmation

* add skill files actions

* skills data

* rm

* up skills route

* upd

* upd

* better project error message on dev

* types

* skill files

* skill loader

* format

* project test

* entities

* project full tests

* upd introspect

* upd cliiii

* nested skills tests

* remove edit page

* remove edit page

* update files page

* upd

* upd file editor

* add SkillFileInsertSchema

* superRefine

* add transform

* rm some cases in superRefine

* use pipe

* use pipe

* upd skill loader

* validation skills

* upd

* rm

* upd

* data access tests

* skills db changes

* add

* skill files

* upd

* upd

* upd skill update

* SkillUpdateSchema has required files

* upd skills manage

* upd

* upd layout and page

* style: auto-format with biome

* move empty state comp to page

* upd schemas

* update schemas

* move to with-sidebar

* polish

* upd

* upd skill generator

* Make webhooks docs user friendly (#2752)

* shaping a2a webhooks page

* moved triggers to visual builder

* vb webhooks wip

* numbered TOC steps

* added step circles

* indented toc steps more

* added newsletter signup to docs

* added share feedback button

* moved newsletter subscribe route to agent docs

* subscribe confirm polish

* improved spacing

* improved spacing

* added high quality images

* added verification step

* Sync lockfile after rebase

* Use tag reference for pullfrog action instead of pinned SHA (#2757)

The action is actively under development, so referencing the v0 tag
allows picking up updates automatically.

https://claude.ai/code/session_01QZyvEs97scVf1ahTG8C1rV

Co-authored-by: Claude <[email protected]>

* ci: provision PR preview environments in Railway (#2681)

* ci: add preview env diagnostics

* ci: probe preview env schema before deploy

* ci: probe preview env schema before deploy

* ci: harden preview api env defaults

* ci: attach git metadata to preview deploys

* ci: harden preview workflow operations

* ci: broaden preview log redaction

* ci: extract preview workflow scripts

* ci: harden preview script extraction

* fix(ci): correct Playwright cache restore-key prefix mismatch (#2760)

The restore-keys used `${{ runner.os }}-playwright-` but primary keys
used `playwright-${{ runner.os }}-`, so the prefix never matched on
cache miss, forcing a full browser download (~8.5 min) instead of a
cache restore (~13 sec).

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>

* fix(ci): replace full git clone with shallow checkout in CI job (#2761)

Remove fetch-depth: 0 from the ci job's checkout step, which cloned the
entire git history (1.5-5 min overhead). Only the OpenAPI change detection
step needs the base branch ref, so fetch it on-demand with --depth=1.

Also switches the diff from three-dot merge-base syntax to a two-dot
pathspec-filtered diff against the fetched base ref, which works correctly
with shallow clones.

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>

* format

* rm migration

* add new migrations

* validation for skill is ok

* move empty state to page

* delete skill

* delete skill revalidate path

* move skills schemas to own file

* upd

* upd

* upd

* upd

* upd

* upd

* upd

* upd

* upd

* upd

* more typecheck fixes

* more typecheck fixes

* fix

* fix isRequired

* f1x

* move skill sidebar

* refactor skill sidebar

* add collapse file tree button

* upd

* upd

* upd

* deleteSkillFile

* upd

* deleteSkillFile

* fileId

* fileId

* upd schemas

* DeleteSkillFileConfirmation

* updateSkillFile

* rm simplematter from sdk

* Get Skill File

* getSkillFileById

* add new skill file page

* update skill file editor

* format

* Create Skill File

* upd

* createSkillFileAction

* createSkillFileById

* fix: Make OpenTelemetry startup idempotent (#2684)

* fix: Make OpenTelemetry startup idempotent

* fix: Re-export defaultSDK and cache NodeSDK instance on globalThis

Restores the export on defaultSDK to avoid breaking the
create-agents-template subpath import. Moves the new NodeSDK()
construction behind a globalThis guard (getOrCreateSDK) so
repeated Vite HMR module evaluations reuse the same instance instead
of leaking fresh SDK objects.

Co-authored-by: mike-inkeep <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]>

* fix(template): use idempotent startOpenTelemetrySDK() in instrumentation

* fix: guard all OTel singletons behind globalThis for HMR idempotency

- Cache otlpExporter, batchProcessor, resource, instrumentations,
  spanProcessors, contextManager, and propagator on globalThis via
  Symbol keys and getOrCreate* helpers so HMR re-evaluation reuses
  existing instances instead of leaking new ones
- Make OtelGlobal type strict with per-key types, eliminating the
  loose `boolean | NodeSDK` union and the `as NodeSDK` cast
- Add logger.debug in the MetricReader catch block to distinguish
  clean idempotency from error-recovery idempotency
- Remove defaultSDK export (now module-private) since all consumers
  use startOpenTelemetrySDK() instead

* Fix type errors

* Simplify to just suppress the error since it's not an issue in prod, only local

* Limit to dev mode

* Add changeset for OTel HMR idempotency fix

Co-authored-by: Dimitri POSTOLOV <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: mike-inkeep <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: inkeep[bot] <257615677+inkeep[bot]@users.noreply.github.com>
Co-authored-by: Dimitri POSTOLOV <[email protected]>

* Fix scheduled trigger invocations being skipped (#2777)

* Fix scheduled trigger invocations being skipped when trigger is edited without changing the next execution time

* claude comments

* adding app id (#2779)

* Update pullfrog to latest SHA and add daily dependabot group for high-frequency deps (#2780)

* Update pullfrog to latest SHA and add daily dependabot group for high-frequency deps

- Update pullfrog from v0.0.178 SHA to v0.0.181 SHA (30d68e5) to stay on
  commit-pinned references for security (action has write permissions + 9 API keys)
- Split dependabot github-actions config into a "high-frequency" group for
  pullfrog with daily schedule, so SHA pins get updated automatically
- This supersedes PR #2757's approach of moving to mutable tag references

https://claude.ai/code/session_01D3ZGYHG8VhsZwqjjXqy2Ap

* Split dependabot github-actions into daily (pullfrog) and monthly (rest)

Separate into two ecosystem entries so pullfrog gets daily SHA updates
while other GitHub Actions stay on a monthly cadence.

https://claude.ai/code/session_01D3ZGYHG8VhsZwqjjXqy2Ap

* Fix invalid dependabot config: merge duplicate github-actions entries

Dependabot disallows duplicate ecosystem+directory pairs. Use a single
entry with two groups instead: high-frequency (pullfrog) and github-actions
(everything else via exclude-patterns).

https://claude.ai/code/session_01D3ZGYHG8VhsZwqjjXqy2Ap

---------

Co-authored-by: Claude <[email protected]>

* ci: seed preview auth in PR previews (#2775)

* ci: bootstrap preview auth

* ci: require secure preview auth config

* ci: recover preview auth runtime vars

* ci: install railway in preview bootstrap

* ci: provision preview db tcp proxies

* ci: proxy preview spicedb bootstrap

* ci: harden preview retry and error logging

---------

Co-authored-by: Andrew Mikofalvy <[email protected]>

* Fix scopes placeholder to show correct Nango format (#2784)

* Fix misleading scopes placeholder in credential form

The Nango API validates scopes against a strict comma-separated pattern
with no spaces. Updated placeholder and help text to show the correct
format and prevent 400 errors when users enter multiple scopes.

Made-with: Cursor

* Add changeset for scopes placeholder fix

Made-with: Cursor

* fix(manage-ui): fix URL validation bypass and permission guard in credential provider setup (#2776)

* fix(manage-ui): fix URL validation bypass and permission guard in credential provider setup

Reorder Zod schema construction so custom validators (e.g. URL protocol
allowlist) are chained after required/optional base schema instead of
being overwritten. Move all React hooks above the canEdit early-return
guard to satisfy Rules of Hooks, with canEdit checks inside hook bodies.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* fix(manage-ui): add server-side URL protocol validation in buildCredentialsPayload

Validate app_link against HTTP/HTTPS allowlist in the server action to
prevent bypassing client-side form validation.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* Update agents-manage-ui/src/components/credentials/views/generic-auth-form.tsx

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* fix err

---------

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* feat(pdf): Support PDF attachments (#2709)

* feat(pdf): Support PDF attachments

* Add tests and other review feedback

* Fix doc

* More renaming and cleanup

* refactor: extract Vercel content part schemas to types/chat.ts for reuse

Move inline Zod schemas from chatDataStream.ts and message-parts.ts into
types/chat.ts as shared, exported schemas. This eliminates duplicate
definitions and makes schema management easier.

Co-authored-by: Andrew Mikofalvy <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Andrew Mikofalvy <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>

* feat: Composio connected account ID pinning (#2783)

* feat: Composio connected account ID pinning

Pin connected_account_id to Composio MCP URLs to prevent cross-project
credential leakage. Implements "both or none" policy — user_id and
connected_account_id are injected together or not at all.

- Add ComposioCredentialStore for credential lifecycle management
- Update AgentMcpManager and discoverToolsFromServer with pinning logic
- Mark Composio tools without connectedAccountId as needs_auth
- Add generic disconnect credential UI (works for all credential types)
- Store authScheme in credential retrievalParams for display
- Update OAuth login flow to create credential references post-connect
- Add unit tests for new credential store, composio client, and pinning

Made-with: Cursor

* feedback

* fix test

* Version Packages (#2778)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Add back link to projects sidebar, add org settings link to user drop… (#2787)

* Add back link to projects sidebar, add org settings link to user dropdown, adjust sidebar highlight color in dark mode

* Apply suggestion from @claude[bot]

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* Fix bad claude formatting

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* fix: return FileUIPart-compliant file parts from /run conversations endpoint (#2782)

* fix: return Vercel AI SDK FileUIPart-compliant file parts from /run conversations endpoint

- Resolve blob:// URIs to proxy HTTP URLs via resolveMessagesListBlobUris()
- Reshape file parts from { data, metadata.mimeType } to { url, mediaType, filename? }
- Matches Vercel AI SDK FileUIPart spec for useChat() compatibility

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* Skip malformed file parts

---------

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
Co-authored-by: Mike Rashkovsky <[email protected]>

* fix: treat load_skill as internal tool to suppress false-positive Sentry errors (#2756)

* fix: provide relationshipId for load_skill tool calls in graph events

* fix: treat load_skill as internal tool, suppress chat/graph streaming events

* fix for fetch trace (#2791)

* fix for fetch trace

* fix for fetch trace

* Fix empty breadcrumb on `/[tenantId]/profile` page and replace prop-drilled permission flags (`readOnly`, `canEdit`, `canUse`) with direct hook call `useProjectPermissionsQuery()` (#2792)

* upd

* upd

* format

* format

* format

* format

* format

* format

* format

* format

* format

* fix review

* fix breadcrumb on profile page

* Apply suggestions from code review

Co-authored-by: Dimitri POSTOLOV <[email protected]>

* Update agents-manage-ui/src/lib/api/projects.ts

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* Update agents-manage-ui/src/app/[tenantId]/profile/layout.tsx

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* style: auto-format with biome

* fix review

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(manage-ui): fix user-scoped MCP credential card not refreshing after connect/disconnect (#2794)

Fetch user-scoped credential server-side in page.tsx (matching the
project-scoped pattern) instead of via a client-side React Query hook.
This ensures router.refresh() after OAuth connect or credential delete
re-fetches the credential data, so the "Your Connection" card updates
without a manual page refresh.

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>

* reuse `useProjectsQuery` instead of `fetchProjectsAction` in `useEffect` (#2793)

* reuse `useProjectsQuery` instead of `fetchProjectsAction` in `useEffect`

* format

* upd

* fix lint

* Create little-hounds-battle.md

* upd

* upd skill file editor

* polish skill editor like in github

* remove canEdit

* upd

* move skill metadata under collapsible advanced section

* reuse DeleteConfirmation

* upd skill file editor

* upd skill file editor2

* add useInitialCollapsedSidebar

* add useInitialCollapsedSidebar

* upd skill file editor

* rm

* // Avoid including metadata in the frontmatter when it's null

* fetchSkillFile and createSkillFile

* refactor skill breadcrumb

* format

* polish

* upd

* skills integration tests

* fix validation tests

* update skill form

* upd api skills in manage ui

* upd entities

* partial

* fix skill loader test

* chore: update OpenAPI snapshot

* polish skill file editor

* upd core skills tests

* upd core skills tests

* add SkillCreateDataSchema

* update skills data manage

* remove redundant

* lint

* lint

* typecheck

* typecheck

* typecheck

* knip

* lint

* rollback skill modals

* make modal opens in skill selector

* fix typecheck

* this should fix cypress

* fix sdk tests

* split permissions call

* add folder feature

* findNodeByPath

* SkillDirectoryBrowser

* upd

* polish

* fix

* fix edge case metadata validation

* fix

* fix cli test

* format

* upd

* upd

* upd

* chore: update OpenAPI snapshot

* fix skill generator

* add button group

* connect submit logic with extension select

* polish

* update skill generator tests

* update generation test

* polish skill generator

* format

* format

* fixes for tests

* typecheck

* fix review

* format

* new migration

* upd

* rm migration

* add migrations

* fix migration and add

* rm outdated

* Apply suggestions from code review

Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* polish

* Add detailed changeset for nested skill files feature

Co-authored-by: Dimitri POSTOLOV <[email protected]>

* fix typecheck

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Gaurav Varma <[email protected]>
Co-authored-by: Andrew Mikofalvy <[email protected]>
Co-authored-by: Claude <[email protected]>
Co-authored-by: Varun Varahabhotla <[email protected]>
Co-authored-by: mike-inkeep <[email protected]>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: mike-inkeep <[email protected]>
Co-authored-by: inkeep[bot] <257615677+inkeep[bot]@users.noreply.github.com>
Co-authored-by: Dimitri POSTOLOV <[email protected]>
Co-authored-by: shagun-singh-inkeep <[email protected]>
Co-authored-by: omar-inkeep <[email protected]>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Andrew Mikofalvy <[email protected]>
Co-authored-by: inkeep-internal-ci[bot] <259778081+inkeep-internal-ci[bot]@users.noreply.github.com>
Co-authored-by: sarah <[email protected]>
Co-authored-by: Abraham <[email protected]>
Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com>
tim-inkeep pushed a commit that referenced this pull request Mar 31, 2026
* skill generator

* polish skill generator

* skills tests

* upd

* upd

* generation.test wip

* add generation.test

* tree node

* skill page

* skill loader

* skill loader refactor

* skill loader

* move skills sidebar to layout

* use pure monaco-editor component since we can have different file extension

* add shadcn context menu component

* format context menu

* skills files and edit pages

* dry

* update layout

* add docs

* add a changeset

* redirect to first skill

* skill files utils

* skill selector

* upd treenode

* skill files

* skill file editor

* delete skill confirmation

* add skill files actions

* skills data

* rm

* up skills route

* upd

* upd

* better project error message on dev

* types

* skill files

* skill loader

* format

* project test

* entities

* project full tests

* upd introspect

* upd cliiii

* nested skills tests

* remove edit page

* remove edit page

* update files page

* upd

* upd file editor

* add SkillFileInsertSchema

* superRefine

* add transform

* rm some cases in superRefine

* use pipe

* use pipe

* upd skill loader

* validation skills

* upd

* rm

* upd

* data access tests

* skills db changes

* add

* skill files

* upd

* upd

* upd skill update

* SkillUpdateSchema has required files

* upd skills manage

* upd

* upd layout and page

* style: auto-format with biome

* move empty state comp to page

* upd schemas

* update schemas

* move to with-sidebar

* polish

* upd

* upd skill generator

* Make webhooks docs user friendly (#2752)

* shaping a2a webhooks page

* moved triggers to visual builder

* vb webhooks wip

* numbered TOC steps

* added step circles

* indented toc steps more

* added newsletter signup to docs

* added share feedback button

* moved newsletter subscribe route to agent docs

* subscribe confirm polish

* improved spacing

* improved spacing

* added high quality images

* added verification step

* Sync lockfile after rebase

* Use tag reference for pullfrog action instead of pinned SHA (#2757)

The action is actively under development, so referencing the v0 tag
allows picking up updates automatically.

https://claude.ai/code/session_01QZyvEs97scVf1ahTG8C1rV

Co-authored-by: Claude <[email protected]>

* ci: provision PR preview environments in Railway (#2681)

* ci: add preview env diagnostics

* ci: probe preview env schema before deploy

* ci: probe preview env schema before deploy

* ci: harden preview api env defaults

* ci: attach git metadata to preview deploys

* ci: harden preview workflow operations

* ci: broaden preview log redaction

* ci: extract preview workflow scripts

* ci: harden preview script extraction

* fix(ci): correct Playwright cache restore-key prefix mismatch (#2760)

The restore-keys used `${{ runner.os }}-playwright-` but primary keys
used `playwright-${{ runner.os }}-`, so the prefix never matched on
cache miss, forcing a full browser download (~8.5 min) instead of a
cache restore (~13 sec).

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>

* fix(ci): replace full git clone with shallow checkout in CI job (#2761)

Remove fetch-depth: 0 from the ci job's checkout step, which cloned the
entire git history (1.5-5 min overhead). Only the OpenAPI change detection
step needs the base branch ref, so fetch it on-demand with --depth=1.

Also switches the diff from three-dot merge-base syntax to a two-dot
pathspec-filtered diff against the fetched base ref, which works correctly
with shallow clones.

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>

* format

* rm migration

* add new migrations

* validation for skill is ok

* move empty state to page

* delete skill

* delete skill revalidate path

* move skills schemas to own file

* upd

* upd

* upd

* upd

* upd

* upd

* upd

* upd

* upd

* upd

* more typecheck fixes

* more typecheck fixes

* fix

* fix isRequired

* f1x

* move skill sidebar

* refactor skill sidebar

* add collapse file tree button

* upd

* upd

* upd

* deleteSkillFile

* upd

* deleteSkillFile

* fileId

* fileId

* upd schemas

* DeleteSkillFileConfirmation

* updateSkillFile

* rm simplematter from sdk

* Get Skill File

* getSkillFileById

* add new skill file page

* update skill file editor

* format

* Create Skill File

* upd

* createSkillFileAction

* createSkillFileById

* fix: Make OpenTelemetry startup idempotent (#2684)

* fix: Make OpenTelemetry startup idempotent

* fix: Re-export defaultSDK and cache NodeSDK instance on globalThis

Restores the export on defaultSDK to avoid breaking the
create-agents-template subpath import. Moves the new NodeSDK()
construction behind a globalThis guard (getOrCreateSDK) so
repeated Vite HMR module evaluations reuse the same instance instead
of leaking fresh SDK objects.

Co-authored-by: mike-inkeep <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]>

* fix(template): use idempotent startOpenTelemetrySDK() in instrumentation

* fix: guard all OTel singletons behind globalThis for HMR idempotency

- Cache otlpExporter, batchProcessor, resource, instrumentations,
  spanProcessors, contextManager, and propagator on globalThis via
  Symbol keys and getOrCreate* helpers so HMR re-evaluation reuses
  existing instances instead of leaking new ones
- Make OtelGlobal type strict with per-key types, eliminating the
  loose `boolean | NodeSDK` union and the `as NodeSDK` cast
- Add logger.debug in the MetricReader catch block to distinguish
  clean idempotency from error-recovery idempotency
- Remove defaultSDK export (now module-private) since all consumers
  use startOpenTelemetrySDK() instead

* Fix type errors

* Simplify to just suppress the error since it's not an issue in prod, only local

* Limit to dev mode

* Add changeset for OTel HMR idempotency fix

Co-authored-by: Dimitri POSTOLOV <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: mike-inkeep <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: inkeep[bot] <257615677+inkeep[bot]@users.noreply.github.com>
Co-authored-by: Dimitri POSTOLOV <[email protected]>

* Fix scheduled trigger invocations being skipped (#2777)

* Fix scheduled trigger invocations being skipped when trigger is edited without changing the next execution time

* claude comments

* adding app id (#2779)

* Update pullfrog to latest SHA and add daily dependabot group for high-frequency deps (#2780)

* Update pullfrog to latest SHA and add daily dependabot group for high-frequency deps

- Update pullfrog from v0.0.178 SHA to v0.0.181 SHA (30d68e5) to stay on
  commit-pinned references for security (action has write permissions + 9 API keys)
- Split dependabot github-actions config into a "high-frequency" group for
  pullfrog with daily schedule, so SHA pins get updated automatically
- This supersedes PR #2757's approach of moving to mutable tag references

https://claude.ai/code/session_01D3ZGYHG8VhsZwqjjXqy2Ap

* Split dependabot github-actions into daily (pullfrog) and monthly (rest)

Separate into two ecosystem entries so pullfrog gets daily SHA updates
while other GitHub Actions stay on a monthly cadence.

https://claude.ai/code/session_01D3ZGYHG8VhsZwqjjXqy2Ap

* Fix invalid dependabot config: merge duplicate github-actions entries

Dependabot disallows duplicate ecosystem+directory pairs. Use a single
entry with two groups instead: high-frequency (pullfrog) and github-actions
(everything else via exclude-patterns).

https://claude.ai/code/session_01D3ZGYHG8VhsZwqjjXqy2Ap

---------

Co-authored-by: Claude <[email protected]>

* ci: seed preview auth in PR previews (#2775)

* ci: bootstrap preview auth

* ci: require secure preview auth config

* ci: recover preview auth runtime vars

* ci: install railway in preview bootstrap

* ci: provision preview db tcp proxies

* ci: proxy preview spicedb bootstrap

* ci: harden preview retry and error logging

---------

Co-authored-by: Andrew Mikofalvy <[email protected]>

* Fix scopes placeholder to show correct Nango format (#2784)

* Fix misleading scopes placeholder in credential form

The Nango API validates scopes against a strict comma-separated pattern
with no spaces. Updated placeholder and help text to show the correct
format and prevent 400 errors when users enter multiple scopes.

Made-with: Cursor

* Add changeset for scopes placeholder fix

Made-with: Cursor

* fix(manage-ui): fix URL validation bypass and permission guard in credential provider setup (#2776)

* fix(manage-ui): fix URL validation bypass and permission guard in credential provider setup

Reorder Zod schema construction so custom validators (e.g. URL protocol
allowlist) are chained after required/optional base schema instead of
being overwritten. Move all React hooks above the canEdit early-return
guard to satisfy Rules of Hooks, with canEdit checks inside hook bodies.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* fix(manage-ui): add server-side URL protocol validation in buildCredentialsPayload

Validate app_link against HTTP/HTTPS allowlist in the server action to
prevent bypassing client-side form validation.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* Update agents-manage-ui/src/components/credentials/views/generic-auth-form.tsx

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* fix err

---------

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* feat(pdf): Support PDF attachments (#2709)

* feat(pdf): Support PDF attachments

* Add tests and other review feedback

* Fix doc

* More renaming and cleanup

* refactor: extract Vercel content part schemas to types/chat.ts for reuse

Move inline Zod schemas from chatDataStream.ts and message-parts.ts into
types/chat.ts as shared, exported schemas. This eliminates duplicate
definitions and makes schema management easier.

Co-authored-by: Andrew Mikofalvy <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Andrew Mikofalvy <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>

* feat: Composio connected account ID pinning (#2783)

* feat: Composio connected account ID pinning

Pin connected_account_id to Composio MCP URLs to prevent cross-project
credential leakage. Implements "both or none" policy — user_id and
connected_account_id are injected together or not at all.

- Add ComposioCredentialStore for credential lifecycle management
- Update AgentMcpManager and discoverToolsFromServer with pinning logic
- Mark Composio tools without connectedAccountId as needs_auth
- Add generic disconnect credential UI (works for all credential types)
- Store authScheme in credential retrievalParams for display
- Update OAuth login flow to create credential references post-connect
- Add unit tests for new credential store, composio client, and pinning

Made-with: Cursor

* feedback

* fix test

* Version Packages (#2778)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Add back link to projects sidebar, add org settings link to user drop… (#2787)

* Add back link to projects sidebar, add org settings link to user dropdown, adjust sidebar highlight color in dark mode

* Apply suggestion from @claude[bot]

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* Fix bad claude formatting

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* fix: return FileUIPart-compliant file parts from /run conversations endpoint (#2782)

* fix: return Vercel AI SDK FileUIPart-compliant file parts from /run conversations endpoint

- Resolve blob:// URIs to proxy HTTP URLs via resolveMessagesListBlobUris()
- Reshape file parts from { data, metadata.mimeType } to { url, mediaType, filename? }
- Matches Vercel AI SDK FileUIPart spec for useChat() compatibility

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* Skip malformed file parts

---------

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
Co-authored-by: Mike Rashkovsky <[email protected]>

* fix: treat load_skill as internal tool to suppress false-positive Sentry errors (#2756)

* fix: provide relationshipId for load_skill tool calls in graph events

* fix: treat load_skill as internal tool, suppress chat/graph streaming events

* fix for fetch trace (#2791)

* fix for fetch trace

* fix for fetch trace

* Fix empty breadcrumb on `/[tenantId]/profile` page and replace prop-drilled permission flags (`readOnly`, `canEdit`, `canUse`) with direct hook call `useProjectPermissionsQuery()` (#2792)

* upd

* upd

* format

* format

* format

* format

* format

* format

* format

* format

* format

* fix review

* fix breadcrumb on profile page

* Apply suggestions from code review

Co-authored-by: Dimitri POSTOLOV <[email protected]>

* Update agents-manage-ui/src/lib/api/projects.ts

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* Update agents-manage-ui/src/app/[tenantId]/profile/layout.tsx

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* style: auto-format with biome

* fix review

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(manage-ui): fix user-scoped MCP credential card not refreshing after connect/disconnect (#2794)

Fetch user-scoped credential server-side in page.tsx (matching the
project-scoped pattern) instead of via a client-side React Query hook.
This ensures router.refresh() after OAuth connect or credential delete
re-fetches the credential data, so the "Your Connection" card updates
without a manual page refresh.

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>

* reuse `useProjectsQuery` instead of `fetchProjectsAction` in `useEffect` (#2793)

* reuse `useProjectsQuery` instead of `fetchProjectsAction` in `useEffect`

* format

* upd

* fix lint

* Create little-hounds-battle.md

* upd

* upd skill file editor

* polish skill editor like in github

* remove canEdit

* upd

* move skill metadata under collapsible advanced section

* reuse DeleteConfirmation

* upd skill file editor

* upd skill file editor2

* add useInitialCollapsedSidebar

* add useInitialCollapsedSidebar

* upd skill file editor

* rm

* // Avoid including metadata in the frontmatter when it's null

* fetchSkillFile and createSkillFile

* refactor skill breadcrumb

* format

* polish

* upd

* skills integration tests

* fix validation tests

* update skill form

* upd api skills in manage ui

* upd entities

* partial

* fix skill loader test

* chore: update OpenAPI snapshot

* polish skill file editor

* upd core skills tests

* upd core skills tests

* add SkillCreateDataSchema

* update skills data manage

* remove redundant

* lint

* lint

* typecheck

* typecheck

* typecheck

* knip

* lint

* rollback skill modals

* make modal opens in skill selector

* fix typecheck

* this should fix cypress

* fix sdk tests

* split permissions call

* add folder feature

* findNodeByPath

* SkillDirectoryBrowser

* upd

* polish

* fix

* fix edge case metadata validation

* fix

* fix cli test

* format

* upd

* upd

* upd

* chore: update OpenAPI snapshot

* fix skill generator

* add button group

* connect submit logic with extension select

* polish

* update skill generator tests

* update generation test

* polish skill generator

* format

* format

* fixes for tests

* typecheck

* fix review

* format

* new migration

* upd

* rm migration

* add migrations

* fix migration and add

* rm outdated

* Apply suggestions from code review

Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* polish

* Add detailed changeset for nested skill files feature

Co-authored-by: Dimitri POSTOLOV <[email protected]>

* fix typecheck

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Gaurav Varma <[email protected]>
Co-authored-by: Andrew Mikofalvy <[email protected]>
Co-authored-by: Claude <[email protected]>
Co-authored-by: Varun Varahabhotla <[email protected]>
Co-authored-by: mike-inkeep <[email protected]>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: mike-inkeep <[email protected]>
Co-authored-by: inkeep[bot] <257615677+inkeep[bot]@users.noreply.github.com>
Co-authored-by: Dimitri POSTOLOV <[email protected]>
Co-authored-by: shagun-singh-inkeep <[email protected]>
Co-authored-by: omar-inkeep <[email protected]>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Andrew Mikofalvy <[email protected]>
Co-authored-by: inkeep-internal-ci[bot] <259778081+inkeep-internal-ci[bot]@users.noreply.github.com>
Co-authored-by: sarah <[email protected]>
Co-authored-by: Abraham <[email protected]>
Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants