Kaizen
Browse modulesInsightsinsights/serverInterfaces

Interface: DraftReportInput

Defined in: server/insights/ask/report-drafter.ts:30

Everything a drafter is given. Widening this type is a security decision: every new field is a new channel out of the server and into a model provider, so keep it to metadata + the user's own question + the temporal frame + the prior validation failures.

Properties

metadata

metadata: {
  cannedReports?: {
     definition: {
        aggregations?: {
           alias: string;
           field?: string;
           fn: "min" | "max" | "count" | "avg" | "sum";
        }[];
        columns: string[];
        filter?: FilterNode;
        groupBy?: {
           bucket?: "year" | "month" | "day" | "week" | "quarter";
           field: string;
        }[];
        schemaVersion: 1;
        sort: {
           by: string;
           direction: "asc" | "desc";
        }[];
        subject: string;
        timezone: string;
        totals?: boolean;
     };
     key: string;
     name: string;
  }[];
  dashboards?: {
     filters?: (
        | {
        field: string;
        id: string;
        kind: "date-range";
        label: string;
      }
        | {
        field: string;
        id: string;
        kind: "select";
        label: string;
        multiple?: boolean;
        searchable?: boolean;
      }
        | {
        defaultOperator?: "gt" | "lt" | "gte" | "lte" | "eq";
        field: string;
        format?: "number" | "currency";
        id: string;
        kind: "measure";
        label: string;
        operators?: (... | ... | ... | ... | ...)[];
      }
        | {
        field: string;
        id: string;
        kind: "search";
        label: string;
     })[];
     key: string;
     label: string;
     tiles: (
        | {
        id: string;
        kind: "metric" | "canned-report";
        layout: {
           h: number;
           w: number;
           x: number;
           y: number;
        };
        ref: string;
        visualization?:   | {
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "metric";
           legend?: boolean;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           ticker?: {
              colorCoded?: ...;
              invertColors?: ...;
              label?: ...;
              value: ...;
           };
           tickers?: ...[];
           value: string;
         }
           | {
           category: string;
           facet?: {
              field: ...;
              scales?: ...;
           };
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "bar";
           legend?: boolean;
           mode?: "percent" | "stacked" | "grouped" | "diverging";
           orientation?: "vertical" | "horizontal";
           series: {
              colorSlot?: ...;
              field: ...;
              label?: ...;
           }[];
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
         }
           | {
           bars: {
              colorSlot?: ...;
              field: ...;
              label?: ...;
           }[];
           curve?: "linear" | "monotone";
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "combo";
           legend?: boolean;
           lines: {
              colorSlot?: ...;
              field: ...;
              label?: ...;
           }[];
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           x: string;
         }
           | {
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "gauge";
           legend?: boolean;
           limit?: number;
           limitField?: string;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           sweep?: 180 | 270 | 360;
           thresholds?: ...[];
           value: string;
         }
           | {
           area?: boolean;
           compact?: boolean;
           curve?: "linear" | "monotone";
           facet?: {
              field: ...;
              scales?: ...;
           };
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "line";
           legend?: boolean;
           points?: boolean;
           series: {
              colorSlot?: ...;
              field: ...;
              label?: ...;
           }[];
           stack?: "none" | "absolute" | "percent";
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           x: string;
         }
           | {
           category: string;
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           innerRadiusRatio?: number;
           kind: "pie";
           legend?: boolean;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           value: string;
         }
           | {
           facet?: {
              field: ...;
              scales?: ...;
           };
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           group?: string;
           kind: "scatter";
           label?: string;
           legend?: boolean;
           size?: string;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           x: string;
           y: string;
         }
           | {
           bins?: number;
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "histogram";
           legend?: boolean;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           value: string;
         }
           | {
           color?: "diverging" | "sequential";
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "heatmap";
           legend?: boolean;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           value: string;
           x: string;
           y: string;
         }
           | {
           after: string;
           before: string;
           category: string;
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "dumbbell";
           legend?: boolean;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
         }
           | {
           category: string;
           change: string;
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "waterfall";
           legend?: boolean;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           total?: string;
         }
           | {
           conversion?: "previous" | "first";
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "funnel";
           legend?: boolean;
           stage: string;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           value: string;
         }
           | {
           color?: "diverging" | "sequential";
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "us-map";
           label?: string;
           latitude: string;
           legend?: boolean;
           longitude: string;
           state: string;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           value: string;
         }
           | {
           color?: "diverging" | "sequential";
           format?: {
              compact?: ...;
              dateStyle?: ...;
              maximumFractionDigits?: ...;
              wholeNumberTicks?: ...;
           };
           grid?: boolean;
           kind: "choropleth";
           legend?: boolean;
           region: string;
           summary?: {
              field: ...;
              fn: ...;
              label?: ...;
           };
           value: string;
         }
           | {
           kind: "table";
         };
      }
        | {
        background?: boolean;
        id: string;
        kind: "text-cell";
        layout: {
           h: number;
           w: number;
           x: number;
           y: number;
        };
        ref?: undefined;
        text: string;
        variant: "body" | "heading-1" | "heading-2";
        visualization?: undefined;
     })[];
  }[];
  metrics?: {
     aggregation: {
        field?: string;
        fn: "min" | "max" | "count" | "avg" | "sum";
     };
     format?: {
        money?: {
           currencyCode?: string;
           representation: "decimal" | "minorUnits";
           scale: number;
        };
        type: "string" | "number" | "boolean" | "date" | "enum" | "datetime" | "money";
     };
     key: string;
     label: string;
     subject: string;
  }[];
  subjects: {
     defaultColumns?: string[];
     fields: {
        capabilities: {
           aggregatable: boolean;
           filterable: boolean;
           groupable: boolean;
           sortable: boolean;
        };
        enumValues?: string[];
        key: string;
        label: string;
        money?: {
           currencyCode?: string;
           representation: "decimal" | "minorUnits";
           scale: number;
        };
        type: "string" | "number" | "boolean" | "date" | "enum" | "datetime" | "money";
     }[];
     key: string;
     label: string;
  }[];
};

Defined in: server/insights/ask/report-drafter.ts:37

The physical-free projection, VERBATIM — enum-allowlist capping is the adapter's job (capEnumValues in the Anthropic adapter and the eval harness), not this port's. A custom drafter that serializes the metadata itself must cap before sending.

cannedReports?

optional cannedReports?: {
  definition: {
     aggregations?: {
        alias: string;
        field?: string;
        fn: "min" | "max" | "count" | "avg" | "sum";
     }[];
     columns: string[];
     filter?: FilterNode;
     groupBy?: {
        bucket?: "year" | "month" | "day" | "week" | "quarter";
        field: string;
     }[];
     schemaVersion: 1;
     sort: {
        by: string;
        direction: "asc" | "desc";
     }[];
     subject: string;
     timezone: string;
     totals?: boolean;
  };
  key: string;
  name: string;
}[];

dashboards?

optional dashboards?: {
  filters?: (
     | {
     field: string;
     id: string;
     kind: "date-range";
     label: string;
   }
     | {
     field: string;
     id: string;
     kind: "select";
     label: string;
     multiple?: boolean;
     searchable?: boolean;
   }
     | {
     defaultOperator?: "gt" | "lt" | "gte" | "lte" | "eq";
     field: string;
     format?: "number" | "currency";
     id: string;
     kind: "measure";
     label: string;
     operators?: (... | ... | ... | ... | ...)[];
   }
     | {
     field: string;
     id: string;
     kind: "search";
     label: string;
  })[];
  key: string;
  label: string;
  tiles: (
     | {
     id: string;
     kind: "metric" | "canned-report";
     layout: {
        h: number;
        w: number;
        x: number;
        y: number;
     };
     ref: string;
     visualization?:   | {
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "metric";
        legend?: boolean;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        ticker?: {
           colorCoded?: ...;
           invertColors?: ...;
           label?: ...;
           value: ...;
        };
        tickers?: ...[];
        value: string;
      }
        | {
        category: string;
        facet?: {
           field: ...;
           scales?: ...;
        };
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "bar";
        legend?: boolean;
        mode?: "percent" | "stacked" | "grouped" | "diverging";
        orientation?: "vertical" | "horizontal";
        series: {
           colorSlot?: ...;
           field: ...;
           label?: ...;
        }[];
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
      }
        | {
        bars: {
           colorSlot?: ...;
           field: ...;
           label?: ...;
        }[];
        curve?: "linear" | "monotone";
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "combo";
        legend?: boolean;
        lines: {
           colorSlot?: ...;
           field: ...;
           label?: ...;
        }[];
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        x: string;
      }
        | {
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "gauge";
        legend?: boolean;
        limit?: number;
        limitField?: string;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        sweep?: 180 | 270 | 360;
        thresholds?: ...[];
        value: string;
      }
        | {
        area?: boolean;
        compact?: boolean;
        curve?: "linear" | "monotone";
        facet?: {
           field: ...;
           scales?: ...;
        };
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "line";
        legend?: boolean;
        points?: boolean;
        series: {
           colorSlot?: ...;
           field: ...;
           label?: ...;
        }[];
        stack?: "none" | "absolute" | "percent";
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        x: string;
      }
        | {
        category: string;
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        innerRadiusRatio?: number;
        kind: "pie";
        legend?: boolean;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        value: string;
      }
        | {
        facet?: {
           field: ...;
           scales?: ...;
        };
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        group?: string;
        kind: "scatter";
        label?: string;
        legend?: boolean;
        size?: string;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        x: string;
        y: string;
      }
        | {
        bins?: number;
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "histogram";
        legend?: boolean;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        value: string;
      }
        | {
        color?: "diverging" | "sequential";
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "heatmap";
        legend?: boolean;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        value: string;
        x: string;
        y: string;
      }
        | {
        after: string;
        before: string;
        category: string;
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "dumbbell";
        legend?: boolean;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
      }
        | {
        category: string;
        change: string;
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "waterfall";
        legend?: boolean;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        total?: string;
      }
        | {
        conversion?: "previous" | "first";
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "funnel";
        legend?: boolean;
        stage: string;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        value: string;
      }
        | {
        color?: "diverging" | "sequential";
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "us-map";
        label?: string;
        latitude: string;
        legend?: boolean;
        longitude: string;
        state: string;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        value: string;
      }
        | {
        color?: "diverging" | "sequential";
        format?: {
           compact?: ...;
           dateStyle?: ...;
           maximumFractionDigits?: ...;
           wholeNumberTicks?: ...;
        };
        grid?: boolean;
        kind: "choropleth";
        legend?: boolean;
        region: string;
        summary?: {
           field: ...;
           fn: ...;
           label?: ...;
        };
        value: string;
      }
        | {
        kind: "table";
      };
   }
     | {
     background?: boolean;
     id: string;
     kind: "text-cell";
     layout: {
        h: number;
        w: number;
        x: number;
        y: number;
     };
     ref?: undefined;
     text: string;
     variant: "body" | "heading-1" | "heading-2";
     visualization?: undefined;
  })[];
}[];

metrics?

optional metrics?: {
  aggregation: {
     field?: string;
     fn: "min" | "max" | "count" | "avg" | "sum";
  };
  format?: {
     money?: {
        currencyCode?: string;
        representation: "decimal" | "minorUnits";
        scale: number;
     };
     type: "string" | "number" | "boolean" | "date" | "enum" | "datetime" | "money";
  };
  key: string;
  label: string;
  subject: string;
}[];

subjects

subjects: {
  defaultColumns?: string[];
  fields: {
     capabilities: {
        aggregatable: boolean;
        filterable: boolean;
        groupable: boolean;
        sortable: boolean;
     };
     enumValues?: string[];
     key: string;
     label: string;
     money?: {
        currencyCode?: string;
        representation: "decimal" | "minorUnits";
        scale: number;
     };
     type: "string" | "number" | "boolean" | "date" | "enum" | "datetime" | "money";
  }[];
  key: string;
  label: string;
}[];

priorIssues?

optional priorIssues?: readonly InsightsIssue[];

Defined in: server/insights/ask/report-drafter.ts:49

Validation failures from the previous attempt. Present ONLY on the single bounded retry (AskService never loops), so a drafter can treat a populated priorIssues as "this is your last chance".


prompt

prompt: string;

Defined in: server/insights/ask/report-drafter.ts:39

The end user's trimmed natural-language question.


timezone?

optional timezone?: string;

Defined in: server/insights/ask/report-drafter.ts:43

IANA zone the drafted definition should carry. Defaults to UTC.


today

today: string;

Defined in: server/insights/ask/report-drafter.ts:41

YYYY-MM-DD in timezone, so "last month" resolves the same way twice.

On this page