Skip to content

feat(platform): document list operation, unified fileId, and output mapping#833

Merged
larryro merged 2 commits into
mainfrom
feat/document-list-and-output-mapping
Mar 22, 2026
Merged

feat(platform): document list operation, unified fileId, and output mapping#833
larryro merged 2 commits into
mainfrom
feat/document-list-and-output-mapping

Conversation

@larryro
Copy link
Copy Markdown
Collaborator

@larryro larryro commented Mar 22, 2026

Summary

  • Unified document identifiers: Replace the dual id/documentId + fileId pattern with a single fileId across all agent-facing APIs (document_find, document_retrieve, docx/pptx templates, workflow document actions). Eliminates agent confusion between Convex document IDs and storage file IDs.
  • Document list operation: Add list operation to the workflow document action, enabling workflows to list documents by folder, extension, and other filters. Includes a new folder-document-analysis example workflow demonstrating folder-wide requirement scanning.
  • Flexible output mapping: Output step now supports dynamic value mapping from step results and variables, not just static values.
  • userId tracking: Thread userId through workflow execution variables for access control in document operations.
  • New find_document_by_file_id query: Add indexed lookup (by_organizationId_and_fileId) for resolving fileId → document records, used by document_retrieve and the workflow update operation.
  • Remove ragInfo.status filter: getAccessibleDocumentIds now returns all documents regardless of indexing status, so agents can discover documents before RAG processing completes.
  • Remove unused trigger_workflow_by_id scheduler helper.

Test plan

  • Unit tests updated for all fileId changes (document_retrieve, document_find, get_accessible_document_ids, list_documents_for_agent)
  • New tests for find_document_by_file_id
  • Output step validation tests updated for dynamic mapping
  • Verify workflows using document_retrieve work end-to-end with fileId
  • Verify folder-document-analysis example workflow runs successfully
  • Confirm schema migration adds by_organizationId_and_fileId index

Summary by CodeRabbit

Release Notes

  • New Features

    • Added "Folder Document Analysis" workflow for batch analyzing documents against requirements.
    • Added document listing capability to workflow operations.
  • Bug Fixes

    • Fixed document accessibility—documents with any indexing status are now available, not only fully indexed ones.
  • Changes

    • Document operations now use fileId for identification instead of documentId.
    • Template management simplified to use single fileId reference.
    • Output step mappings now support JSON values, not just text strings.

larryro added 2 commits March 22, 2026 20:19
… and userId tracking

Add a 'list' operation to the document action for listing files in folders
with optional extension filtering. Widen output node mapping values from
string-only to arbitrary JSON values, enabling richer workflow outputs.
Track userId on workflow executions for audit context. Remove unused
trigger_workflow_by_id helper.
… tools and workflows

Replace the dual id/documentId + fileId pattern with a single fileId identifier
for all agent-facing APIs. This eliminates confusion between Convex document IDs
and storage file IDs by exposing only fileId to agents and workflows.

- Add find_document_by_file_id query with by_organizationId_and_fileId index
- Update document_retrieve tool to accept fileId instead of documentId
- Remove id field from AgentDocumentItem in document_find results
- Update document action (workflow engine) to resolve fileId → document internally
- Remove ragInfo.status filter from getAccessibleDocumentIds
- Update docx/pptx template listing to use fileId instead of documentId/storageId
Copy link
Copy Markdown

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

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

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 22, 2026

📝 Walkthrough

Walkthrough

This PR refactors document identification throughout the agent tooling and workflow systems. It transitions from documentId to fileId as the primary document identifier across document retrieval, finding, and listing operations. Key additions include a new findDocumentByFileId query helper and index, removal of id fields from document response payloads, and updates to the document action to support fileId-based update and new list operations. The PR extends workflow execution tracking to include userId, updates output step mapping validation to accept non-string JSON values, removes the legacy triggerWorkflowById function, and adds a new folder-document-analysis workflow example. Multiple test files are updated to reflect the new fileId semantics.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: adding a document list operation, unifying fileId identifiers, and extending output mapping flexibility.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feat/document-list-and-output-mapping

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

Tip

CodeRabbit can scan for known vulnerabilities in your dependencies using OSV Scanner.

OSV Scanner will automatically detect and report security vulnerabilities in your project's dependencies. No additional configuration is required.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
services/platform/convex/workflow_engine/helpers/step_execution/initialize_execution_variables.ts (1)

30-57: ⚠️ Potential issue | 🔴 Critical

Protect reserved execution context (userId, org/workflow IDs) from overwrite

userId is injected at Line 34/44/56, but later the merge pass copies arbitrary keys from execution.variables back into fullVariables, which can overwrite system context. This allows workflow state to spoof userId and weaken access-control/audit guarantees.

🔧 Proposed fix
@@
-    for (const [key, value] of Object.entries(executionVars)) {
-      if (key !== 'steps' && key !== 'loop') {
-        fullVariables[key] = value;
-      }
-    }
+    const reservedKeys = new Set([
+      'steps',
+      'loop',
+      'organizationId',
+      'userId',
+      'wfDefinitionId',
+      'rootWfDefinitionId',
+    ]);
+    for (const [key, value] of Object.entries(executionVars)) {
+      if (!reservedKeys.has(key)) {
+        fullVariables[key] = value;
+      }
+    }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@services/platform/convex/workflow_engine/helpers/step_execution/initialize_execution_variables.ts`
around lines 30 - 57, The merge logic for building fullVariables allows
execution.variables to overwrite reserved keys (userId, organizationId,
wfDefinitionId, rootWfDefinitionId), so ensure these reserved context keys are
protected: when merging execution.variables into fullVariables (and when using
inputRecord/config), filter out any keys matching the reserved names (userId,
organizationId, wfDefinitionId, rootWfDefinitionId) before spreading/assigning;
keep the explicit assignments of organizationId, userId, wfDefinitionId,
rootWfDefinitionId last so they always win (refer to fullVariables,
execution.variables, userId, organizationId, wfDefinitionId, rootWfDefinitionId,
and the input/config initialization paths).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@services/platform/convex/documents/__tests__/find_document_by_file_id.test.ts`:
- Around line 47-64: The test only asserts withIndex was called for
findDocumentByFileId but never invokes the index predicate, so update the test
to execute the callback passed to mockWithIndex and verify it builds the
expected equality predicates: capture the function argument given to
mockWithIndex (the predicate) and call it with a mock index builder that records
.eq calls, then assert that .eq was called with ('organizationId', 'org1') and
('fileId', 'file-abc') and that mockFirst was invoked; refer to
findDocumentByFileId, mockWithIndex, mockFirst and the ctx.query.withIndex
callback when making this change.

In `@services/platform/convex/documents/internal_queries.ts`:
- Around line 55-63: The internalQuery findDocumentByFileId currently validates
fileId as v.string(), which bypasses Convex ID-shape checks; change the args
schema to use v.id('_storage') for fileId (matching the public createDocument
mutation) so the file ID is validated at the boundary—update the args definition
in findDocumentByFileId to replace v.string() with v.id('_storage') and keep
organizationId as v.string().

In
`@services/platform/convex/workflow_engine/action_defs/document/document_action.ts`:
- Around line 456-459: The response currently sets totalCount:
allDocuments.length which reflects the capped result set (MAX_TOTAL) rather than
the true matching count; update the return shape in the function that builds the
response (referencing totalCount, allDocuments and MAX_TOTAL) to either rename
totalCount to returnedCount and add a boolean truncated flag (e.g., truncated =
allDocuments.length === MAX_TOTAL) or include both returnedCount and totalCount
with truncated: true when results were capped, and ensure callers/code that
consume this response are updated to use the new field name(s).

In
`@services/platform/convex/workflow_engine/helpers/nodes/llm/execute_agent_with_tools.ts`:
- Around line 226-231: The call to agent.generateObject incorrectly passes
userId; remove userId from the second argument and pass only { threadId } so the
SDK signature is satisfied (ensure thread creation already set userId via
createThread(ctx, components.agent, { userId }) if needed). Update the
generateObject invocation in execute_agent_with_tools.ts (the
agent.generateObject call) to use { threadId } and keep the existing
prompt/schema and contextOptions arguments unchanged.

---

Outside diff comments:
In
`@services/platform/convex/workflow_engine/helpers/step_execution/initialize_execution_variables.ts`:
- Around line 30-57: The merge logic for building fullVariables allows
execution.variables to overwrite reserved keys (userId, organizationId,
wfDefinitionId, rootWfDefinitionId), so ensure these reserved context keys are
protected: when merging execution.variables into fullVariables (and when using
inputRecord/config), filter out any keys matching the reserved names (userId,
organizationId, wfDefinitionId, rootWfDefinitionId) before spreading/assigning;
keep the explicit assignments of organizationId, userId, wfDefinitionId,
rootWfDefinitionId last so they always win (refer to fullVariables,
execution.variables, userId, organizationId, wfDefinitionId, rootWfDefinitionId,
and the input/config initialization paths).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 191d920e-1add-44d4-8a39-92607fb23386

📥 Commits

Reviewing files that changed from the base of the PR and between 85ce7ef and 0d860dd.

⛔ Files ignored due to path filters (1)
  • services/platform/convex/_generated/api.d.ts is excluded by !**/_generated/**
📒 Files selected for processing (38)
  • examples/workflows/folder-document-analysis/config.json
  • services/platform/convex/agent_tools/documents/__tests__/document_find_tool.test.ts
  • services/platform/convex/agent_tools/documents/__tests__/document_retrieve_tool.test.ts
  • services/platform/convex/agent_tools/documents/document_find_tool.ts
  • services/platform/convex/agent_tools/documents/document_retrieve_tool.ts
  • services/platform/convex/agent_tools/documents/helpers/fetch_document_comparison.ts
  • services/platform/convex/agent_tools/documents/helpers/retrieve_document.ts
  • services/platform/convex/agent_tools/files/docx_tool.ts
  • services/platform/convex/agent_tools/files/pptx_tool.ts
  • services/platform/convex/agent_tools/workflows/helpers/syntax_reference.ts
  • services/platform/convex/agent_tools/workflows/internal_actions.ts
  • services/platform/convex/documents/__tests__/find_document_by_file_id.test.ts
  • services/platform/convex/documents/__tests__/get_accessible_document_ids.test.ts
  • services/platform/convex/documents/__tests__/list_documents_for_agent.test.ts
  • services/platform/convex/documents/find_document_by_file_id.ts
  • services/platform/convex/documents/get_accessible_document_ids.ts
  • services/platform/convex/documents/helpers.ts
  • services/platform/convex/documents/internal_queries.ts
  • services/platform/convex/documents/list_documents_for_agent.ts
  • services/platform/convex/documents/schema.ts
  • services/platform/convex/wf_executions/internal_mutations.ts
  • services/platform/convex/wf_executions/mutations.ts
  • services/platform/convex/workflow_engine/action_defs/document/document_action.ts
  • services/platform/convex/workflow_engine/helpers/engine/start_workflow_handler.ts
  • services/platform/convex/workflow_engine/helpers/nodes/llm/execute_agent_with_tools.ts
  • services/platform/convex/workflow_engine/helpers/nodes/llm/execute_llm_node.ts
  • services/platform/convex/workflow_engine/helpers/scheduler/index.ts
  • services/platform/convex/workflow_engine/helpers/scheduler/trigger_workflow_by_id.ts
  • services/platform/convex/workflow_engine/helpers/step_execution/initialize_execution_variables.ts
  • services/platform/convex/workflow_engine/helpers/step_execution/types.ts
  • services/platform/convex/workflow_engine/helpers/validation/steps/output.test.ts
  • services/platform/convex/workflow_engine/helpers/validation/steps/output.ts
  • services/platform/convex/workflow_engine/helpers/validation/variables/parse.ts
  • services/platform/convex/workflow_engine/internal_actions.ts
  • services/platform/convex/workflow_engine/types/nodes.ts
  • services/platform/convex/workflows/schema.ts
  • services/platform/convex/workflows/steps/validators.ts
  • services/platform/convex/workflows/validators.ts
💤 Files with no reviewable changes (5)
  • services/platform/convex/agent_tools/documents/tests/document_find_tool.test.ts
  • services/platform/convex/workflow_engine/helpers/scheduler/index.ts
  • services/platform/convex/documents/list_documents_for_agent.ts
  • services/platform/convex/workflow_engine/internal_actions.ts
  • services/platform/convex/workflow_engine/helpers/scheduler/trigger_workflow_by_id.ts

Comment on lines +47 to +64
it('uses the correct index', async () => {
const mockFirst = vi.fn().mockResolvedValue(null);
const mockWithIndex = vi.fn().mockReturnValue({ first: mockFirst });
const ctx = {
db: {
query: vi.fn().mockReturnValue({ withIndex: mockWithIndex }),
},
};

await findDocumentByFileId(ctx as never, {
organizationId: 'org1',
fileId: 'file-abc',
});

expect(mockWithIndex).toHaveBeenCalledWith(
'by_organizationId_and_fileId',
expect.any(Function),
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Assert index predicate behavior, not just withIndex invocation

The current test verifies index name only. It never executes the callback, so regressions in .eq('organizationId', ...) / .eq('fileId', ...) won’t fail tests.

✅ Stronger assertion pattern
   it('uses the correct index', async () => {
@@
     expect(mockWithIndex).toHaveBeenCalledWith(
       'by_organizationId_and_fileId',
       expect.any(Function),
     );
+
+    const indexCb = mockWithIndex.mock.calls[0]?.[1] as
+      | ((q: { eq: (field: string, value: unknown) => unknown }) => void)
+      | undefined;
+    expect(indexCb).toBeTypeOf('function');
+
+    const eq = vi.fn().mockReturnThis();
+    indexCb?.({ eq });
+    expect(eq).toHaveBeenNthCalledWith(1, 'organizationId', 'org1');
+    expect(eq).toHaveBeenNthCalledWith(2, 'fileId', 'file-abc');
   });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
it('uses the correct index', async () => {
const mockFirst = vi.fn().mockResolvedValue(null);
const mockWithIndex = vi.fn().mockReturnValue({ first: mockFirst });
const ctx = {
db: {
query: vi.fn().mockReturnValue({ withIndex: mockWithIndex }),
},
};
await findDocumentByFileId(ctx as never, {
organizationId: 'org1',
fileId: 'file-abc',
});
expect(mockWithIndex).toHaveBeenCalledWith(
'by_organizationId_and_fileId',
expect.any(Function),
);
it('uses the correct index', async () => {
const mockFirst = vi.fn().mockResolvedValue(null);
const mockWithIndex = vi.fn().mockReturnValue({ first: mockFirst });
const ctx = {
db: {
query: vi.fn().mockReturnValue({ withIndex: mockWithIndex }),
},
};
await findDocumentByFileId(ctx as never, {
organizationId: 'org1',
fileId: 'file-abc',
});
expect(mockWithIndex).toHaveBeenCalledWith(
'by_organizationId_and_fileId',
expect.any(Function),
);
const indexCb = mockWithIndex.mock.calls[0]?.[1] as
| ((q: { eq: (field: string, value: unknown) => unknown }) => void)
| undefined;
expect(indexCb).toBeTypeOf('function');
const eq = vi.fn().mockReturnThis();
indexCb?.({ eq });
expect(eq).toHaveBeenNthCalledWith(1, 'organizationId', 'org1');
expect(eq).toHaveBeenNthCalledWith(2, 'fileId', 'file-abc');
});
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@services/platform/convex/documents/__tests__/find_document_by_file_id.test.ts`
around lines 47 - 64, The test only asserts withIndex was called for
findDocumentByFileId but never invokes the index predicate, so update the test
to execute the callback passed to mockWithIndex and verify it builds the
expected equality predicates: capture the function argument given to
mockWithIndex (the predicate) and call it with a mock index builder that records
.eq calls, then assert that .eq was called with ('organizationId', 'org1') and
('fileId', 'file-abc') and that mockFirst was invoked; refer to
findDocumentByFileId, mockWithIndex, mockFirst and the ctx.query.withIndex
callback when making this change.

Comment on lines +55 to +63
export const findDocumentByFileId = internalQuery({
args: {
organizationId: v.string(),
fileId: v.string(),
},
handler: async (ctx, args) => {
return await DocumentsHelpers.findDocumentByFileId(ctx, args);
},
});
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Verify current validator usage for fileId across Convex document endpoints
rg -nP --type=ts -C2 "fileId:\s*v\.(string|id\('_storage'\))" services/platform/convex/documents

# Inspect the new internal query boundary
rg -nP --type=ts -C3 "export const findDocumentByFileId = internalQuery" services/platform/convex/documents/internal_queries.ts

# Inspect downstream helper expectation/casting
rg -nP --type=ts -C4 "findDocumentByFileId\(|toId<'_storage'>" services/platform/convex/documents/find_document_by_file_id.ts

Repository: tale-project/tale

Length of output: 1488


Use v.id('_storage') for fileId to match the public mutation and validate at the boundary.

Line 58 currently accepts any string, bypassing Convex ID-shape validation. The public createDocument mutation in the same file (line 92) already validates fileId: v.id('_storage'), and this internal query should follow the same pattern for consistency and type safety.

🔧 Proposed fix
 export const findDocumentByFileId = internalQuery({
   args: {
     organizationId: v.string(),
-    fileId: v.string(),
+    fileId: v.id('_storage'),
   },
   handler: async (ctx, args) => {
-    return await DocumentsHelpers.findDocumentByFileId(ctx, args);
+    return await DocumentsHelpers.findDocumentByFileId(ctx, {
+      ...args,
+      fileId: String(args.fileId),
+    });
   },
 });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@services/platform/convex/documents/internal_queries.ts` around lines 55 - 63,
The internalQuery findDocumentByFileId currently validates fileId as v.string(),
which bypasses Convex ID-shape checks; change the args schema to use
v.id('_storage') for fileId (matching the public createDocument mutation) so the
file ID is validated at the boundary—update the args definition in
findDocumentByFileId to replace v.string() with v.id('_storage') and keep
organizationId as v.string().

Comment on lines +456 to +459
return {
documents: allDocuments,
totalCount: allDocuments.length,
};
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 | 🔵 Trivial

totalCount naming may be misleading when results are truncated.

The totalCount field returns allDocuments.length, which reflects the number of documents returned (capped at MAX_TOTAL = 500), not the total matching documents in the database. If the actual total exceeds 500, consumers might misinterpret this as the complete count.

Consider renaming to returnedCount or adding a truncated: boolean flag:

💡 Suggested improvement
         return {
           documents: allDocuments,
-          totalCount: allDocuments.length,
+          returnedCount: allDocuments.length,
+          truncated: allDocuments.length >= MAX_TOTAL,
         };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@services/platform/convex/workflow_engine/action_defs/document/document_action.ts`
around lines 456 - 459, The response currently sets totalCount:
allDocuments.length which reflects the capped result set (MAX_TOTAL) rather than
the true matching count; update the return shape in the function that builds the
response (referencing totalCount, allDocuments and MAX_TOTAL) to either rename
totalCount to returnedCount and add a boolean truncated flag (e.g., truncated =
allDocuments.length === MAX_TOTAL) or include both returnedCount and totalCount
with truncated: true when results were capped, and ensure callers/code that
consume this response are updated to use the new field name(s).

Comment on lines 226 to 231
const result = await agent.generateObject(
ctx,
{ threadId },
{ threadId, userId },
{ prompt: prompts.userPrompt, schema: zodSchema },
{ contextOptions: { excludeToolMessages: false } },
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

@convex-dev/agent generateObject generateText userId parameter

💡 Result:

In @convex-dev/agent, generateText / generateObject don’t take a userId parameter directly. Instead, userId is attached to the thread (and/or individual saved messages), and message generations inherit it from the thread by default. [1]

Where to set userId

1) When creating the thread (recommended)

import { createThread } from "@convex-dev/agent";

const threadId = await createThread(ctx, components.agent, { userId });

A thread created with userId is associated with that user, and generated messages are saved to that user’s history. [1]

2) When saving messages explicitly
If you call saveMessage / agent.saveMessage, you pass userId there:

const { messageId } = await agent.saveMessage(ctx, { threadId, userId, prompt });

[2]

How generateText / generateObject are called

Using the agent directly:

const result = await agent.generateText(ctx, { threadId }, { prompt });
const obj = await agent.generateObject(ctx, { threadId }, { prompt, schema });

[1][3]

Or via the per-thread helper object (no userId argument here either):

const { thread } = await agent.continueThread(ctx, { threadId });
await thread.generateText({ prompt });
await thread.generateObject({ prompt, schema });

[1][3]

Note: you’ll also see userId show up in hooks like usageHandler / rawResponseHandler because it’s derived from the thread/message association, not passed to generateText as an argument. [3]

Sources: [1] [2] [3]


Remove userId from the generateObject call.

The @convex-dev/agent SDK does not accept userId as a parameter to generateObject. Instead, userId should be set when creating the thread via createThread(ctx, components.agent, { userId }). If the thread is already created with a userId, pass only { threadId } to generateObject:

const result = await agent.generateObject(
  ctx,
  { threadId },
  { prompt: prompts.userPrompt, schema: zodSchema },
  { contextOptions: { excludeToolMessages: false } },
);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@services/platform/convex/workflow_engine/helpers/nodes/llm/execute_agent_with_tools.ts`
around lines 226 - 231, The call to agent.generateObject incorrectly passes
userId; remove userId from the second argument and pass only { threadId } so the
SDK signature is satisfied (ensure thread creation already set userId via
createThread(ctx, components.agent, { userId }) if needed). Update the
generateObject invocation in execute_agent_with_tools.ts (the
agent.generateObject call) to use { threadId } and keep the existing
prompt/schema and contextOptions arguments unchanged.

@larryro larryro merged commit d1b473c into main Mar 22, 2026
17 checks passed
@larryro larryro deleted the feat/document-list-and-output-mapping branch March 22, 2026 13:31
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.

1 participant