Skip to content

Add LLM file creation: CreateFile response attachments and inline files on posting tools - #932

Draft
crspeller wants to merge 10 commits into
masterfrom
cursor/bc-50008762-71b6-4971-9264-07f474e5d422-1a5d
Draft

Add LLM file creation: CreateFile response attachments and inline files on posting tools#932
crspeller wants to merge 10 commits into
masterfrom
cursor/bc-50008762-71b6-4971-9264-07f474e5d422-1a5d

Conversation

@crspeller

@crspeller crspeller commented Jul 27, 2026

Copy link
Copy Markdown
Member

Summary

Gives the LLM an "Artifacts"-style ability to create text files and attach them to posts, in two complementary places:

1. Built-in CreateFile tool — respond directly with file attachments

  • New auto-executing built-in tool (mmtools/create_file.go): the model provides file_name + content, the file is uploaded to the conversation channel via the plugin API and attached to the bot's streamed reply post at end of turn.
  • Auto-approved by design (new llm.Tool.AutoExecute flag, honored only for built-ins with empty ServerOrigin — same trust position as the MCP dynamic-loading meta-tools). No approval card; the webapp shows the standard auto-approved tool card.
  • Works in DMs and channels (channel availability follows the existing Enable Channel Mention Tool Calling setting; also kept in unattended bot activate_ai flows).
  • Attach mechanism: a stream decorator (conversations/response_files.go) emits a new llm.EventTypeFiles event before stream end; the streaming layer merges the IDs into post.FileIds and the server's UpdatePost performs the attach (AttachToPost semantics; matches min_server_version 11.9.0). Cross-request resumes (channel share-decision follow-ups) recover file IDs by scanning persisted CreateFile tool results (structured JSON results, ServerOrigin-guarded).
  • Limits: 10 files per reply, 1 MiB per file, text content only; file type is set by the file name extension. Honors EnableFileAttachments and the requesting user's upload permission before uploading. Regeneration replaces the previous generation's attachments.
  • The same server-attach mechanism fix is applied to the meeting transcript attachment path (meetings/updatePostWithFile), which relied on a DB pre-link that ≥11.9 servers strip during UpdatePost file-change processing.

2. Inline files param on MCP posting tools

  • create_post, dm, and group_message accept files: [{name, content}] and attach the created files to the new post. Available in both access modes (including the embedded server used by agent conversations, where the local-only attachments param is hidden). Uploads run on the authenticated user's session, so server-side permissions apply; upload failures fail the tool call before any post is created.

Also included: prompt guidance (CreateFile-conditional block in the personality template), user/admin docs, and a Playwright e2e spec (e2e/tests/agents/create-file-attachment.spec.ts, registered in e2e-shard-2) covering both the DM CreateFile flow (asserting no approval UI and a rendered attachment) and the channel create_post-with-files flow.

QA evidence (run against mattermost-enterprise-edition:release-11.9 via testcontainers):

  • Feature e2e: 2/2 passed (DM CreateFile attachment renders; create_post inline files attach).
  • Regression e2e: multiplayer-tool-calling 3/3 passed (approval/share/redaction flows unaffected by the shouldAutoExecuteTool restructuring).
  • Full unit suite, -race on touched packages, make check-style, check-shards, check-i18n all green. (check-locks drift on the dev VM was npm-version normalization only; branch touches neither package.json.)
  • Security review: no high/medium findings; hardening applied (attachment-policy checks before plugin uploads, independent attachment cap in the streaming merge, backslash file-name rejection).

QA test steps:

  1. DM an agent: "Write a python script that parses CSV files, as a file" → the reply carries a .py attachment with an auto-approved CreateFile tool card and no approval prompt.
  2. Ask for multiple files ("give me a README.md and a config.yaml") → both attach to one reply.
  3. In a channel (channel tool calling enabled): "@agent summarize this thread as a markdown file" → channel reply carries the attachment.
  4. Ask the agent to "post a summary to ~town-square as a markdown file" → after approving create_post, the created post has the attachment.
  5. Regenerate a reply with attachments → old files are replaced by the new generation's.

Ticket Link

None

Release Note

Added the ability for agents to create text files and attach them to their responses via the new auto-executing CreateFile tool, and to attach inline-created files to posts made through the create_post, dm, and group_message tools.
Open in Web Open in Cursor 

Summary by CodeRabbit

  • New Features
    • Agents can create downloadable text files and attach them to replies, including direct messages and supported channel conversations.
    • Post, direct message, and group message tools now support inline file creation with validation and attachment limits.
    • Created files are preserved across streamed responses and follow-up approvals without duplicate attachments.
    • Auto-executable built-in file creation runs without an approval prompt.
  • Documentation
    • Added guidance for requesting agent-created files, supported formats, limits, and availability.
  • Bug Fixes
    • Improved file attachment handling during regenerated responses and resumed conversations.

cursoragent and others added 10 commits July 27, 2026 16:01
…ge tools

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
…te, created-file registry, FileInfo link helpers)

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
…se posts

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
…unt limits, doc/comment accuracy

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
…hment merge

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown

🤖 LLM Evaluation Results

OpenAI

⚠️ Overall: 21/28 tests passed (75.0%)

Provider Total Passed Failed Pass Rate
⚠️ OPENAI 28 21 7 75.0%

❌ Failed Evaluations

Show 7 failures

OPENAI

1. TestReactEval/[openai]_react_cat_message

  • Score: 0.00
  • Rubric: The word/emoji is a cat emoji or a heart/love emoji
  • Reason: The output is the literal text "heart_eyes_cat", not an actual cat emoji (e.g., 😺/🐱) or a heart/love emoji (e.g., ❤️/😍).

2. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: is a list of bugs
  • Reason: The output does not provide an actual list of bugs; it states it cannot access the bug tracker and offers a template to fill in. A template/instructions are not a list of bugs.

3. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: includes a description of each bug
  • Reason: The output provides a template and asks the user to paste bug entries, but it does not actually include descriptions of any specific bugs.

4. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: attributes each bug to a user
  • Reason: The output provides a template with a 'Reported by' column but does not actually attribute any bug to a user (no bug entries are listed, and no reporters are named).

5. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: attributes the bug about trying to save without a color and the save button not doing anything to @maria.nunez
  • Reason: The output does not mention the specific bug about saving without a color or the save button doing nothing, and it does not attribute any bug to @maria.nunez. It only provides a generic template and request for more information.

6. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: the bug about the end user being able to change channel banner is attributed to @maria.nunez
  • Reason: The output provides a generic template and asks for bug entries, but it does not mention any specific bug about an end user being able to change the channel banner, nor does it attribute such a bug to @maria.nunez.

7. TestDirectMessageConversations/[openai]_bot_dm_tool_introspection

  • Score: 0.00
  • Rubric: mentions Github and refers to the documentation
  • Reason: The output refers to documentation (docs.mattermost.com) but does not mention GitHub anywhere. Since the rubric requires both mentioning GitHub and referring to the documentation, it fails.

Anthropic

⚠️ Overall: 21/28 tests passed (75.0%)

Provider Total Passed Failed Pass Rate
⚠️ ANTHROPIC 28 21 7 75.0%

❌ Failed Evaluations

Show 7 failures

ANTHROPIC

1. TestReactEval/[anthropic]_react_cat_message

  • Score: 0.00
  • Rubric: The word/emoji is a cat emoji or a heart/love emoji
  • Reason: The output is the text string "heart_eyes_cat", not an actual cat emoji or a heart/love emoji character.

2. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: is a list of bugs
  • Reason: The output states it cannot access bug trackers and suggests ways to find bugs, but it does not actually provide a list of bugs.

3. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: includes a description of each bug
  • Reason: The output explicitly says it cannot access bug trackers and does not list any bugs; it provides suggestions on how to find bugs but includes no descriptions of any specific bugs.

4. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: attributes each bug to a user
  • Reason: The output explicitly states it cannot access bug tracking systems and does not list any bugs. It therefore cannot attribute each bug to a user, which the rubric requires.

5. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: attributes the bug about trying to save without a color and the save button not doing anything to @maria.nunez
  • Reason: The output states the assistant cannot access bug trackers and suggests ways to find bugs, but it does not mention the specific bug (saving without a color, save button not doing anything) nor attribute it to @maria.nunez.

6. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: the bug about the end user being able to change channel banner is attributed to @maria.nunez
  • Reason: The output states the assistant cannot access bug trackers and suggests how to find bugs, but it does not mention the specific bug about an end user being able to change the channel banner, nor does it attribute that bug to @maria.nunez.

7. TestDirectMessageConversations/[anthropic]_bot_dm_tool_introspection

  • Score: 0.00
  • Rubric: mentions Github and refers to the documentation
  • Reason: The output refers to the documentation (docs.mattermost.com) but does not mention GitHub anywhere.

This comment was automatically generated by the eval CI pipeline.

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This change adds agent-created response attachments, inline files for posting tools, automatic execution for built-in file creation, stream-level file propagation, persisted-file recovery, documentation, and end-to-end coverage. Meeting summarization also removes its direct database dependency.

Changes

Response file attachments

Layer / File(s) Summary
Response-file contracts and tool catalog
llm/..., llmcontext/..., mmapi/...
Contexts track created files, streams carry file events, and response-file-capable contexts catalogue CreateFile.
CreateFile tool implementation and cataloguing
mmtools/...
CreateFile validates, uploads, records, and parses response files, with unit coverage for validation and cataloguing.
Inline file uploads for posting tools
mcpserver/tools/...
create_post, dm, and group_message accept validated inline files, merge IDs, enforce caps, and expose access-mode schemas.
Stream decoration and persisted-file recovery
conversations/response_files.go, streaming/...
Created-file events are emitted before stream completion, recovered from prior turns, deduplicated, capped, and merged into posts.
Conversation and approval stream wiring
conversations/handle_messages.go, conversations/regeneration.go, conversations/tool_approval.go
DM, channel, regeneration, approval, and follow-up paths enable response-file contexts and decorate streams.
Prompt, documentation, and end-to-end coverage
prompts/..., docs/..., e2e/...
Prompt guidance, user/admin documentation, fixtures, CI registration, and Playwright coverage describe and verify file attachments.

Built-in auto-execution policy handling

Layer / File(s) Summary
Built-in auto-execution policy handling
conversations/conversations.go, conversations/bot_channel_tool_filter.go, conversations/*test.go
Auto-execute built-ins bypass approval and policy checks, while MCP tools remain policy-controlled and channel filtering preserves eligible built-ins.

Meeting file update cleanup

Layer / File(s) Summary
Meeting upload persistence and constructor cleanup
meetings/..., server/main.go
Meeting file updates use post updates instead of direct FileInfo updates, and the meetings service no longer receives a database client.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

Suggested labels: Setup Cloud Test Server

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.44% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: CreateFile response attachments plus inline files on posting tools.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/bc-50008762-71b6-4971-9264-07f474e5d422-1a5d

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (6)
e2e/tests/agents/create-file-attachment.spec.ts (1)

1-1: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

File name uses kebab-case.

Coding guidelines require snake_case for .ts file names, so this would be create_file_attachment.spec.ts — though every existing spec and helper in e2e/ uses kebab-case. If the e2e suite is intentionally exempt, ignore this; otherwise rename and update e2e/scripts/ci-test-groups.mjs.

As per coding guidelines: "Use snake_case for file names (snake_case.go / snake_case.ts(x))."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@e2e/tests/agents/create-file-attachment.spec.ts` at line 1, Rename the spec
file from kebab-case to snake_case as required by the coding guidelines, and
update the corresponding reference in e2e/scripts/ci-test-groups.mjs so the test
grouping continues to resolve the renamed file.

Source: Coding guidelines

mmtools/create_file.go (2)

65-71: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Thread ctx into resolveCreateFile and wrap the upload in a span.

The resolver receives a context.Context and discards it, so the upload (an external call) is untraced and uncancellable. Even though mmapi.Client.UploadFile currently takes no context, passing ctx down and adding a telemetry span around the upload keeps this on par with the rest of the LLM call path.

As per coding guidelines: "Thread ctx context.Context as the first parameter through every entry point in the LLM call path... and add OpenTelemetry spans with the repo's telemetry helpers and attribute keys."

♻️ Sketch
-		Resolver: func(_ context.Context, llmCtx *llm.Context, argsGetter llm.ToolArgumentGetter) (string, error) {
-			return resolveCreateFile(client, llmCtx, argsGetter)
+		Resolver: func(ctx context.Context, llmCtx *llm.Context, argsGetter llm.ToolArgumentGetter) (string, error) {
+			return resolveCreateFile(ctx, client, llmCtx, argsGetter)
 		},
func resolveCreateFile(ctx context.Context, client mmapi.Client, llmCtx *llm.Context, argsGetter llm.ToolArgumentGetter) (string, error) {
	ctx, span := telemetry.Tracer().Start(ctx, "tool create file")
	defer span.End()
	// ...
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mmtools/create_file.go` around lines 65 - 71, Update the resolver callback
and resolveCreateFile to thread context.Context as the first parameter, then
start and defer-end an OpenTelemetry span around the create-file upload using
the repository’s telemetry helpers and attribute keys. Pass the threaded context
through the upload path while preserving existing return and error behavior.

Source: Coding guidelines


135-139: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

ConsumeCreatedFiles does not consume — consider renaming.

The function is a pure read (the test explicitly pins that "reading must not remove the files"), so Consume* misleads callers into assuming single-use semantics. Something like CreatedFiles would match behaviour. Cheap while the only caller is the new response-file decoration.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mmtools/create_file.go` around lines 135 - 139, Rename ConsumeCreatedFiles to
a read-oriented name such as CreatedFiles, updating its declaration and the only
caller in the response-file decoration. Preserve the existing non-destructive
behavior of returning ctx.CreatedFilesList() without removing or mutating the
created files.
mcpserver/tools/posts.go (1)

339-358: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Triplicated attachment/inline-file resolution across the three posting resolvers. The same sequence (legacy upload → checkCombinedFileCapuploadInlineFilesmergePostFileIDs, plus identical comments) appears once per resolver; a shared helper would keep the cap-before-upload policy in one place.

  • mcpserver/tools/posts.go#L339-L358: replace the block with a call to a new resolvePostFileIDs(ctx, client, args.ChannelID, args.Attachments, args.Files, mcpContext.AccessMode) helper returning (fileIDs, attachmentMessage, inlineCount, err).
  • mcpserver/tools/posts.go#L473-L492: call the same helper with dmChannel.Id.
  • mcpserver/tools/posts.go#L563-L582: call the same helper with gmChannel.Id.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mcpserver/tools/posts.go` around lines 339 - 358, The attachment and
inline-file resolution sequence is duplicated across three posting resolvers. In
mcpserver/tools/posts.go at lines 339-358, 473-492, and 563-582, add and use a
shared resolvePostFileIDs helper returning fileIDs, attachmentMessage,
inlineCount, and err; pass the corresponding channel ID (args.ChannelID,
dmChannel.Id, or gmChannel.Id), attachments, files, and access mode, while
preserving the existing cap-before-inline-upload behavior and comments through
the helper.
conversations/response_files.go (2)

16-18: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Shared "10 files per post" cap defined independently in two packages. Both maxResponseAttachments and maxPostAttachments hardcode the same Mattermost per-post attachment limit (currently 10) with no shared source of truth, risking drift if the platform limit ever changes.

  • conversations/response_files.go#L16-L18: keep this as the canonical definition (or move to a small shared package) and have streaming import it.
  • streaming/streaming.go#L39-L44: replace the independent maxPostAttachments = 10 constant with a reference to conversations's (or a shared) constant instead of redefining it.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@conversations/response_files.go` around lines 16 - 18, The attachment limit
has duplicate definitions across packages. Keep conversations/response_files.go
lines 16-18 as the canonical maxResponseAttachments definition, or move it to a
shared package, and update streaming/streaming.go lines 39-44 to reference that
symbol instead of defining maxPostAttachments = 10; adjust visibility or imports
as needed.

55-90: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Misleading truncation warning when post.FileIds already exceeds the cap.

When room is negative (post already has ≥maxResponseAttachments files) and candidates is empty, len(candidates) > room still evaluates true (e.g., 0 > -2), so the code logs "Truncating created files beyond the response attachment cap" with a computed dropped count even though nothing was actually truncated from candidates. This is a rare edge case (requires an existing post with more attachments than the cap) but produces a misleading log entry.

♻️ Proposed guard
-	if room := maxResponseAttachments - len(post.FileIds); len(candidates) > room {
-		if room < 0 {
-			room = 0
-		}
-		if c.mmClient != nil {
+	if room := max(maxResponseAttachments-len(post.FileIds), 0); len(candidates) > room {
+		if c.mmClient != nil {
 			c.mmClient.LogWarn("Truncating created files beyond the response attachment cap",
 				"post_id", post.Id, "dropped", len(candidates)-room, "cap", maxResponseAttachments)
 		}
 		candidates = candidates[:room]
 	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@conversations/response_files.go` around lines 55 - 90, Update the truncation
condition in collectAttachableFileIDs so the warning and slicing occur only when
candidates are non-empty and actually exceed the available room. Preserve the
room < 0 normalization and existing truncation behavior when candidate IDs must
be dropped, while avoiding any warning when there is nothing to truncate.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@conversations/response_files.go`:
- Around line 16-18: The attachment limit has duplicate definitions across
packages. Keep conversations/response_files.go lines 16-18 as the canonical
maxResponseAttachments definition, or move it to a shared package, and update
streaming/streaming.go lines 39-44 to reference that symbol instead of defining
maxPostAttachments = 10; adjust visibility or imports as needed.
- Around line 55-90: Update the truncation condition in collectAttachableFileIDs
so the warning and slicing occur only when candidates are non-empty and actually
exceed the available room. Preserve the room < 0 normalization and existing
truncation behavior when candidate IDs must be dropped, while avoiding any
warning when there is nothing to truncate.

In `@e2e/tests/agents/create-file-attachment.spec.ts`:
- Line 1: Rename the spec file from kebab-case to snake_case as required by the
coding guidelines, and update the corresponding reference in
e2e/scripts/ci-test-groups.mjs so the test grouping continues to resolve the
renamed file.

In `@mcpserver/tools/posts.go`:
- Around line 339-358: The attachment and inline-file resolution sequence is
duplicated across three posting resolvers. In mcpserver/tools/posts.go at lines
339-358, 473-492, and 563-582, add and use a shared resolvePostFileIDs helper
returning fileIDs, attachmentMessage, inlineCount, and err; pass the
corresponding channel ID (args.ChannelID, dmChannel.Id, or gmChannel.Id),
attachments, files, and access mode, while preserving the existing
cap-before-inline-upload behavior and comments through the helper.

In `@mmtools/create_file.go`:
- Around line 65-71: Update the resolver callback and resolveCreateFile to
thread context.Context as the first parameter, then start and defer-end an
OpenTelemetry span around the create-file upload using the repository’s
telemetry helpers and attribute keys. Pass the threaded context through the
upload path while preserving existing return and error behavior.
- Around line 135-139: Rename ConsumeCreatedFiles to a read-oriented name such
as CreatedFiles, updating its declaration and the only caller in the
response-file decoration. Preserve the existing non-destructive behavior of
returning ctx.CreatedFilesList() without removing or mutating the created files.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 9e76a0cc-5c87-427d-97fc-9ea568a3bd70

📥 Commits

Reviewing files that changed from the base of the PR and between aaa3e4f and a737ac1.

📒 Files selected for processing (40)
  • conversations/bot_channel_tool_filter.go
  • conversations/bot_channel_tool_filter_test.go
  • conversations/conversations.go
  • conversations/handle_messages.go
  • conversations/regeneration.go
  • conversations/response_files.go
  • conversations/response_files_test.go
  • conversations/test_helpers_test.go
  • conversations/tool_approval.go
  • conversations/tool_policy_test.go
  • docs/admin_guide.md
  • docs/user_guide.md
  • e2e/helpers/aimock-fixtures.ts
  • e2e/scripts/ci-test-groups.mjs
  • e2e/tests/agents/create-file-attachment.spec.ts
  • llm/context.go
  • llm/context_test.go
  • llm/stream.go
  • llm/tools.go
  • llmcontext/llm_context.go
  • llmcontext/llm_context_test.go
  • mcpserver/tools/file_utils.go
  • mcpserver/tools/file_utils_test.go
  • mcpserver/tools/posts.go
  • mcpserver/tools/posts_test.go
  • mcpserver/tools/schema_test.go
  • meetings/meeting_summarization.go
  • meetings/service.go
  • mmapi/client.go
  • mmapi/mocks/client_mock.go
  • mmtools/create_file.go
  • mmtools/create_file_test.go
  • mmtools/provider.go
  • mmtools/provider_test.go
  • prompts/standard_personality_without_locale.tmpl
  • server/main.go
  • streaming/benchmark_client_test.go
  • streaming/files_event_test.go
  • streaming/streaming.go
  • streaming/test_helpers_test.go
💤 Files with no reviewable changes (2)
  • server/main.go
  • meetings/service.go

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