Skip to content

Conversation

@damian-rakus
Copy link
Collaborator

@damian-rakus damian-rakus commented Nov 5, 2025

  • Adjust board_insights to get people names when grouping by people column

  • Made sure following columns are supported: people, status, text, number, dropdown, formula, board relation

  • Marked mirror column as not supported



  • Changed logic for all columns to use "text" field first and then "value" as fallback (inverse) - The change was done in order to return more human & LLM friendly data
    Example 1: "People" column has fullname in "text" field, while "value" includes person id
image Example 2: "Status" column has friendly name in "text" while "value" includes status id image Example 3: "Dropdown" column includes selected labels in "text" field while "value" includes ids image

Outcome:
LLM now requires 1 less tool invocation to return human-friendly data. It also fixes issue when less-smart/non-reasoning LLMs were sometimes just pasting user_ids as "task owners" or label ids.

BEFORE (2 calls or 1 call and non-human-friendly output with ids):
image
image

AFTER CHANGE (1 call & human-friendly output):
image

@damian-rakus damian-rakus marked this pull request as ready for review November 5, 2025 12:04

setResponse: (data: any) => {
mockRequest.mockResolvedValue(data);
setResponse: (data: any, onlyOnce = false) => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

How about having a separate function instead?

setResponseOnce: (data: any) => ...

return JSON.parse(cv.value);
} catch {
return cv.value
return cv.value || null;
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why null as a default value and not an empty string?

const aggregationsToBuild = input.aggregations!.slice();

// select fullname of people when grouping by people columns
for(const peopleColumnId of input.groupBy?.filter(columnId => peopleColumnIds.includes(columnId)) ?? []) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Wouldn't it be cleaner to have the filter logic inside the loop body as an if statement?

for(const peopleColumnId of (input.groupBy ?? [])) {
  if (...) {
    aggregationsToBuild.push(...)
  }
}

Copy link
Collaborator

Choose a reason for hiding this comment

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

or event cleaner

const peopleAggregations = input.groupBy?
  .filter(columnId => peopleColumnIds.includes(columnId)) ?? [])
  .map(peopleColumnId => ({
      function: AggregateSelectFunctionName.Label,
      columnId: peopleColumnId,
    })

const selectElements = [...input.aggregations, ...peopleAggregations].map(...)

return { content: `Board with id ${input.boardId} not found or you don't have access to it.` };
}

const peopleColumnIds = board.columns?.filter((column) => column?.type === NonDeprecatedColumnType.People)?.map((column) => column!.id) ?? [];
Copy link
Collaborator

Choose a reason for hiding this comment

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

I got to ask:
Now you added the ability to group by specifically person column.
Why we are adding this? Is it a customer request?
Second, there are different columns that are also worth to group (if needed). For example: status column or date column.
So the grouping ability is going to be a bit more generic in the future? Or currently we are only going to group by people?

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.

4 participants