@things-factory/ai-dashboard 10.1.223 → 10.1.227
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/index.d.ts +1 -1
- package/dist-server/index.js +1 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/service/card/card-definition.d.ts +1 -1
- package/dist-server/service/card/card-definition.js +1 -1
- package/dist-server/service/card/card-definition.js.map +1 -1
- package/dist-server/service/card/card-run.d.ts +1 -1
- package/dist-server/service/card/card-run.js +1 -1
- package/dist-server/service/card/card-run.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/server/index.ts +1 -1
- package/server/service/card/card-definition.ts +1 -1
- package/server/service/card/card-run.ts +2 -2
- package/translations/ko.json +11 -11
package/dist-server/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* shaped and how they are drawn - kept in the database and run as the viewer whenever it is drawn, with no model.
|
|
6
6
|
* Cards are one's own, versioned, shared with people, departments or the domain, and placed on one's dashboard.
|
|
7
7
|
*
|
|
8
|
-
* Uses `ai-assistant` - its read declarations, its
|
|
8
|
+
* Uses `ai-assistant` - its read declarations, its 작업 패널 blocks and their renderer, its conversations and proposals.
|
|
9
9
|
* An application declares its reads and puts the `my-dashboard` page in its menu.
|
|
10
10
|
*/
|
|
11
11
|
export * from './service/index.js';
|
package/dist-server/index.js
CHANGED
|
@@ -8,7 +8,7 @@ const tslib_1 = require("tslib");
|
|
|
8
8
|
* shaped and how they are drawn - kept in the database and run as the viewer whenever it is drawn, with no model.
|
|
9
9
|
* Cards are one's own, versioned, shared with people, departments or the domain, and placed on one's dashboard.
|
|
10
10
|
*
|
|
11
|
-
* Uses `ai-assistant` - its read declarations, its
|
|
11
|
+
* Uses `ai-assistant` - its read declarations, its 작업 패널 blocks and their renderer, its conversations and proposals.
|
|
12
12
|
* An application declares its reads and puts the `my-dashboard` page in its menu.
|
|
13
13
|
*/
|
|
14
14
|
tslib_1.__exportStar(require("./service/index.js"), exports);
|
package/dist-server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;GASG;AACH,6DAAkC;AAElC,yDAA4D;AAC5D,mDAA4C;AAE5C,KAAK,MAAM,IAAI,IAAI,0BAAU;IAAE,IAAA,4BAAgB,EAAC,IAAI,CAAC,CAAA","sourcesContent":["/**\n * `@things-factory/ai-dashboard` - 나의 대시보드 (operato-application/adr/ADR-0160.md).\n *\n * A card is a definition made with the assistant in a conversation - which declared read it draws, how its rows are\n * shaped and how they are drawn - kept in the database and run as the viewer whenever it is drawn, with no model.\n * Cards are one's own, versioned, shared with people, departments or the domain, and placed on one's dashboard.\n *\n * Uses `ai-assistant` - its read declarations, its
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;GASG;AACH,6DAAkC;AAElC,yDAA4D;AAC5D,mDAA4C;AAE5C,KAAK,MAAM,IAAI,IAAI,0BAAU;IAAE,IAAA,4BAAgB,EAAC,IAAI,CAAC,CAAA","sourcesContent":["/**\n * `@things-factory/ai-dashboard` - 나의 대시보드 (operato-application/adr/ADR-0160.md).\n *\n * A card is a definition made with the assistant in a conversation - which declared read it draws, how its rows are\n * shaped and how they are drawn - kept in the database and run as the viewer whenever it is drawn, with no model.\n * Cards are one's own, versioned, shared with people, departments or the domain, and placed on one's dashboard.\n *\n * Uses `ai-assistant` - its read declarations, its 작업 패널 blocks and their renderer, its conversations and proposals.\n * An application declares its reads and puts the `my-dashboard` page in its menu.\n */\nexport * from './service/index.js'\n\nimport { registerRoleTask } from '@things-factory/auth-base'\nimport { ROLE_TASKS } from './role-tasks.js'\n\nfor (const task of ROLE_TASKS) registerRoleTask(task)\n"]}
|
|
@@ -9,7 +9,7 @@ export type MatchOp = (typeof MATCH_OPS)[number];
|
|
|
9
9
|
/** The rows a table shows, and the points a chart draws, at most (ADR-0160 decision 4). */
|
|
10
10
|
export declare const MAX_TABLE_ROWS = 200;
|
|
11
11
|
export declare const MAX_CHART_POINTS = 50;
|
|
12
|
-
/** The AI
|
|
12
|
+
/** The AI 작업 패널 draws eight hues and twelve figures; a card that needs more is refused, never folded (decision 5). */
|
|
13
13
|
export declare const MAX_SERIES = 8;
|
|
14
14
|
export declare const MAX_FIGURES = 12;
|
|
15
15
|
export interface CardSourceRef {
|
|
@@ -18,7 +18,7 @@ exports.LIST_OPS = ['in', 'not_in'];
|
|
|
18
18
|
/** The rows a table shows, and the points a chart draws, at most (ADR-0160 decision 4). */
|
|
19
19
|
exports.MAX_TABLE_ROWS = 200;
|
|
20
20
|
exports.MAX_CHART_POINTS = 50;
|
|
21
|
-
/** The AI
|
|
21
|
+
/** The AI 작업 패널 draws eight hues and twelve figures; a card that needs more is refused, never folded (decision 5). */
|
|
22
22
|
exports.MAX_SERIES = 8;
|
|
23
23
|
exports.MAX_FIGURES = 12;
|
|
24
24
|
/** The source a reference names - or why there is none. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-definition.js","sourceRoot":"","sources":["../../../server/service/card/card-definition.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * What a dashboard card is - a definition, never its values (operato-application/adr/ADR-0160.md).\n *\n * A card names one read an application declared for the assistant (a list read target, or a list inside a detail\n * read's answer), the conditions it is read with, what is done to its rows (filtered, grouped, ordered, cut) and how\n * the rows are drawn (a number, a table, bars or a line). The assistant writes it once, in a conversation; drawing it\n * runs the definition and asks no model. Nothing a definition holds runs as code: a name it does not know is refused,\n * never passed over.\n *\n * Pure - the rules are tested without a server.\n */\nimport type { DetailList, DetailRead, ReadColumn, ReadTarget } from '@things-factory/ai-assistant'\n\nexport const CARD_SCHEMA_VERSION = 1\n\nexport const VIEW_KINDS = ['number', 'table', 'bar', 'line'] as const\nexport type ViewKind = (typeof VIEW_KINDS)[number]\n\nexport const MATCH_OPS = ['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'not_in'] as const\n/** The operators whose value is a list - one of these values, none of them. */\nexport const LIST_OPS = ['in', 'not_in'] as const\nexport type MatchOp = (typeof MATCH_OPS)[number]\n\n/** The rows a table shows, and the points a chart draws, at most (ADR-0160 decision 4). */\nexport const MAX_TABLE_ROWS = 200\nexport const MAX_CHART_POINTS = 50\n/** The AI 작업판 draws eight hues and twelve figures; a card that needs more is refused, never folded (decision 5). */\nexport const MAX_SERIES = 8\nexport const MAX_FIGURES = 12\n\nexport interface CardSourceRef {\n /** The read's key - `office.cash-transaction`, `office.receivables`. */\n read: string\n /** A detail read's list key - `by-contract`. Absent for a list read target. */\n list?: string\n /** The conditions (a list) or the arguments (a detail read) - a date may be relative (`this-month-start`). */\n where?: Record<string, unknown>\n}\n\nexport interface CardMatch {\n column: string\n op: MatchOp\n /** A list for `in` and `not_in` (status not_in [APPROVED, REJECTED, WITHDRAWN]); one value otherwise. */\n value: string | number | boolean | (string | number)[]\n}\n\nexport interface CardRows {\n match?: CardMatch[]\n groupBy?: string\n sortBy?: string\n desc?: boolean\n limit?: number\n}\n\nexport interface CardView {\n kind: ViewKind\n /** bar · line: the column along the bottom - the grouped column when rows are grouped. */\n label?: string\n /** number · bar · line: the number columns summed or drawn; none counts the rows. table: shown after `columns`. */\n values?: string[]\n /** table: the columns shown, in order. Absent: every column. */\n columns?: string[]\n /** A unit said beside the numbers when no currency says one (`건`, `%`). */\n unit?: string\n}\n\nexport interface CardDefinition {\n schemaVersion: number\n source: CardSourceRef\n rows?: CardRows\n view: CardView\n}\n\n/** A refusal the card and the model both read - a code and what it is about, never prose. */\nexport interface CardIssue {\n code: string\n params?: Record<string, unknown>\n}\n\n/** A condition a source takes - its name and type, from the declaration. */\nexport interface SourceCondition {\n name: string\n type: string\n values?: string[]\n description?: string\n /** A detail read's argument its query cannot run without. */\n required?: boolean\n /** A string condition that holds a month as YYYY-MM - it takes a relative month (this-month, -5m). */\n format?: 'month'\n /** It takes several values at once - a list read's statuses (`status: [..]`, `statusNot: [..]`). */\n many?: boolean\n}\n\n/** What a card may read from one declaration - the same whichever kind of read it is. */\nexport interface CardSource {\n key: string\n kind: 'list' | 'detail'\n labelKey?: string\n description: string\n query: string\n columns: ReadColumn[]\n conditions: SourceCondition[]\n target?: ReadTarget\n detail?: DetailRead\n list?: DetailList\n /** The rows are the viewer's own, whoever looks (내 지출결의, 나의 전략 업무) - ReadTarget.mine · DetailRead.mine. */\n mine?: boolean\n}\n\n/** The source a reference names - or why there is none. */\nexport function sourceOf(\n ref: CardSourceRef | undefined,\n readTargetOf: (key: string) => ReadTarget | undefined,\n detailReadOf: (key: string) => DetailRead | undefined\n): { source?: CardSource; issue?: CardIssue } {\n if (!ref || typeof ref.read !== 'string' || !ref.read) return { issue: { code: 'no-source' } }\n const target = readTargetOf(ref.read)\n if (target) {\n if (ref.list) return { issue: { code: 'list-of-a-list', params: { read: ref.read } } }\n return {\n source: {\n key: target.key,\n kind: 'list',\n labelKey: target.labelKey,\n description: target.description,\n query: target.query,\n columns: target.columns,\n conditions: [\n ...target.criteria.map(one => ({ name: one.name, type: one.type, values: one.values, description: one.description, ...(one.format ? { format: one.format } : {}), ...(one.many ? { many: true } : {}) })),\n ...(target.search ? [{ name: 'text', type: 'string', description: target.search.description }] : [])\n ],\n target,\n ...(target.mine ? { mine: true } : {})\n }\n }\n }\n const detail = detailReadOf(ref.read)\n if (!detail) return { issue: { code: 'unknown-read', params: { read: ref.read } } }\n const lists = detail.lists ?? []\n if (!lists.length) return { issue: { code: 'not-a-card-source', params: { read: ref.read } } }\n /* One list needs no name; with several, the card names one. */\n const list = ref.list ? lists.find(one => one.key === ref.list) : lists.length === 1 ? lists[0] : undefined\n if (!list) return { issue: { code: ref.list ? 'unknown-list' : 'list-not-named', params: { read: ref.read, list: ref.list ?? null, lists: lists.map(one => one.key) } } }\n return {\n source: {\n key: detail.key,\n kind: 'detail',\n labelKey: list.labelKey ?? detail.labelKey,\n description: list.description ?? detail.description,\n query: detail.query,\n columns: list.columns,\n conditions: (detail.args ?? []).map(one => ({ name: one.name, type: one.type, values: one.values, description: one.description, required: !!one.required, ...(one.format ? { format: one.format } : {}) })),\n detail,\n list,\n ...(detail.mine ? { mine: true } : {})\n }\n }\n}\n\n/* ── Relative dates (ADR-0160 decision 3) ─────────────────────────────────────────────────────────────────── */\n\n/*\n * The words of a period that stays current - the only ones a card keeps:\n * a day today · -30d · this-month-start · last-year-end · -5m-start (the first day of five months ago)\n * a year or a month as an integer this-year · last-month · -5m\n * a month as YYYY-MM this-month · last-month · -5m · this-year-start (its January) · this-year-end\n * \"The last six months\" is from -5m-start to this-month-end (or a YYYY-MM range from -5m to this-month).\n */\nconst RELATIVE_DATE = /^(today|(this|last|next)-(week|month|quarter|year)-(start|end)|[+-]?\\d{1,4}d|-\\d{1,2}m-(start|end))$/\nconst RELATIVE_PERIOD = /^((this|last|next)-(year|month)|-\\d{1,2}m)$/\nconst RELATIVE_MONTH = /^((this|last|next)-month|-\\d{1,2}m|(this|last|next)-year-(start|end))$/\n/** A value that looks meant as a relative one - checked against the words above, never taken for a literal. */\nconst LOOKS_RELATIVE = /^((this|last|next)-|today$|-\\d)/\n\nexport const isRelativeDate = (value: unknown) => typeof value === 'string' && RELATIVE_DATE.test(value)\nexport const isRelativePeriod = (value: unknown) => typeof value === 'string' && RELATIVE_PERIOD.test(value)\nexport const isRelativeMonth = (value: unknown) => typeof value === 'string' && RELATIVE_MONTH.test(value)\n\nconst pad = (n: number) => String(n).padStart(2, '0')\nconst ymd = (date: Date) => `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`\nconst utc = (y: number, m: number, d: number) => new Date(Date.UTC(y, m, d))\n\n/** Today in a time zone - `YYYY-MM-DD`; the system's zone when the domain names none or one the runtime does not know. */\nexport function todayIn(timeZone: string | undefined, now: Date = new Date()): string {\n try {\n return new Intl.DateTimeFormat('en-CA', { timeZone: timeZone || undefined, year: 'numeric', month: '2-digit', day: '2-digit' }).format(now)\n } catch {\n return new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit' }).format(now)\n }\n}\n\n/** A relative date as a day, from `today` - weeks start on Monday, an end is that last day (a range's `to` takes the whole day). */\nexport function resolveRelativeDate(value: string, today: string): string {\n const [y, m, d] = today.split('-').map(Number)\n if (value === 'today') return today\n const days = /^([+-]?\\d{1,4})d$/.exec(value)\n if (days) return ymd(utc(y, m - 1, d + Number(days[1])))\n const monthsAgo = /^-(\\d{1,2})m-(start|end)$/.exec(value)\n if (monthsAgo) return ymd(monthsAgo[2] === 'start' ? utc(y, m - 1 - Number(monthsAgo[1]), 1) : utc(y, m - Number(monthsAgo[1]), 0))\n const [, which, unit, edge] = /^(this|last|next)-(week|month|quarter|year)-(start|end)$/.exec(value)!\n const step = which === 'last' ? -1 : which === 'next' ? 1 : 0\n if (unit === 'week') {\n const weekday = (utc(y, m - 1, d).getUTCDay() + 6) % 7\n const monday = d - weekday + step * 7\n return ymd(utc(y, m - 1, edge === 'start' ? monday : monday + 6))\n }\n if (unit === 'month') return ymd(edge === 'start' ? utc(y, m - 1 + step, 1) : utc(y, m + step, 0))\n if (unit === 'quarter') {\n const first = Math.floor((m - 1) / 3) * 3 + step * 3\n return ymd(edge === 'start' ? utc(y, first, 1) : utc(y, first + 3, 0))\n }\n return ymd(edge === 'start' ? utc(y + step, 0, 1) : utc(y + step, 11, 31))\n}\n\n/** How many months a relative month moves from this one - `last-month` -1, `-5m` -5. */\nconst monthStep = (value: string) => (/^-(\\d{1,2})m$/.test(value) ? -Number(value.slice(1, -1)) : value.startsWith('last') ? -1 : value.startsWith('next') ? 1 : 0)\n\n/** A relative month as YYYY-MM, from `today` - `this-year-start` is this year's January. */\nexport function resolveRelativeMonth(value: string, today: string): string {\n const [y, m] = today.split('-').map(Number)\n const year = /^(this|last|next)-year-(start|end)$/.exec(value)\n if (year) return `${y + (year[1] === 'last' ? -1 : year[1] === 'next' ? 1 : 0)}-${year[2] === 'start' ? '01' : '12'}`\n const month = utc(y, m - 1 + monthStep(value), 1)\n return `${month.getUTCFullYear()}-${pad(month.getUTCMonth() + 1)}`\n}\n\n/**\n * The relative values of a definition's conditions, as of `today` - each by what its condition holds (`conditions`):\n * a month as YYYY-MM, a day, an integer year or month. A year and a month are read from one month: with a month token\n * in the same conditions, `this-year` is that month's year - January's `last-month` with `this-year` is last December,\n * never this year's December.\n */\nexport function resolveWhere(where: Record<string, unknown> | undefined, today: string, conditions: readonly SourceCondition[] = []): Record<string, unknown> {\n const given = where ?? {}\n const formats = new Map(conditions.map(one => [one.name, one.format]))\n const [y, m] = today.split('-').map(Number)\n const monthToken = Object.entries(given).find(([name, value]) => formats.get(name) !== 'month' && typeof value === 'string' && /^((this|last|next)-month|-\\d{1,2}m)$/.test(value))?.[1] as string | undefined\n const base = monthToken ? utc(y, m - 1 + monthStep(monthToken), 1) : utc(y, m - 1, 1)\n const baseYear = base.getUTCFullYear()\n const out: Record<string, unknown> = {}\n for (const [name, value] of Object.entries(given)) {\n if (formats.get(name) === 'month' && isRelativeMonth(value)) out[name] = resolveRelativeMonth(value as string, today)\n else if (isRelativeDate(value)) out[name] = resolveRelativeDate(value as string, today)\n else if (isRelativePeriod(value)) {\n const [which, unit] = (value as string).split('-')\n const step = which === 'last' ? -1 : which === 'next' ? 1 : 0\n out[name] = unit === 'year' ? baseYear + step : base.getUTCMonth() + 1\n } else out[name] = value\n }\n return out\n}\n\n/* ── Checking a definition against its source ─────────────────────────────────────────────────────────────── */\n\n/** The columns the rows have after `rows` - a grouped card's group column, its count and its sums. */\nexport function shapedColumnNames(source: CardSource, rows: CardRows | undefined): Map<string, ReadColumn> {\n if (!rows?.groupBy) return new Map(source.columns.map(one => [one.name, one]))\n const by = source.columns.find(one => one.name === rows.groupBy)\n const out = new Map<string, ReadColumn>()\n if (by) out.set(by.name, { ...by, type: by.type === 'date' ? 'string' : by.type })\n out.set('count', { name: 'count', type: 'number' })\n for (const column of source.columns.filter(one => one.type === 'number' && one.name !== rows.groupBy)) out.set(column.name, column)\n return out\n}\n\nconst known = (list: readonly string[], value: unknown) => typeof value === 'string' && list.includes(value)\n\n/**\n * Whether a definition fits its source - every name it uses is the source's, every value one it takes. Issues, never\n * repairs: a definition the model wrote wrong is sent back with what the source has.\n */\nexport function checkDefinition(definition: CardDefinition | undefined, source: CardSource): CardIssue[] {\n const issues: CardIssue[] = []\n if (!definition || typeof definition !== 'object') return [{ code: 'no-definition' }]\n if (definition.schemaVersion !== CARD_SCHEMA_VERSION) issues.push({ code: 'unknown-schema-version', params: { given: definition.schemaVersion ?? null, known: CARD_SCHEMA_VERSION } })\n\n const conditions = new Map(source.conditions.map(one => [one.name, one]))\n const where = definition.source?.where ?? {}\n for (const [name, value] of Object.entries(where)) {\n const condition = conditions.get(name)\n if (!condition && !(source.kind === 'list' && name === 'id')) {\n /* A column put among the conditions - the rows are filtered by it with rows.match instead. */\n const column = source.columns.some(one => one.name === name)\n issues.push({ code: 'unknown-condition', params: { name, conditions: [...conditions.keys()], ...(column ? { isColumn: true, use: `rows.match: [{ column: '${name}', op: 'eq', value: ${JSON.stringify(value)} }]` } : {}) } })\n continue\n }\n if (condition?.format === 'month') {\n if (typeof value === 'string' && LOOKS_RELATIVE.test(value) && !isRelativeMonth(value)) issues.push({ code: 'relative-value-unfit', params: { name, value, takes: 'a month as YYYY-MM, or this-month, last-month, -5m, this-year-start, this-year-end' } })\n continue\n }\n if (typeof value === 'string' && LOOKS_RELATIVE.test(value) && !isRelativeDate(value) && !isRelativePeriod(value)) issues.push({ code: 'unknown-relative-value', params: { name, value } })\n if (isRelativePeriod(value) && condition?.type !== 'integer') issues.push({ code: 'relative-period-on-non-integer', params: { name, value } })\n if (isRelativeDate(value) && condition?.type !== 'date') issues.push({ code: 'relative-date-on-non-date', params: { name, value } })\n }\n\n /* What the query cannot run without - said before it runs, with what it takes. */\n for (const condition of source.conditions.filter(one => one.required)) {\n const value = where[condition.name]\n if (value === undefined || value === null || value === '') issues.push({ code: 'missing-condition', params: { name: condition.name, ...(condition.values ? { values: condition.values } : {}), ...(condition.description ? { description: condition.description } : {}) } })\n }\n\n const columns = new Map(source.columns.map(one => [one.name, one]))\n const columnNames = [...columns.keys()]\n const rows = definition.rows ?? {}\n const scalar = (value: unknown) => typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'\n for (const match of rows.match ?? []) {\n if (!columns.has(match?.column)) issues.push({ code: 'unknown-column', params: { where: 'match', column: match?.column ?? null, columns: columnNames } })\n if (!known(MATCH_OPS, match?.op)) issues.push({ code: 'unknown-operator', params: { op: match?.op ?? null, ops: MATCH_OPS } })\n else if (known(LIST_OPS, match.op)) {\n if (!Array.isArray(match.value) || !match.value.length || !match.value.every(scalar)) issues.push({ code: 'match-without-values', params: { column: match.column, op: match.op } })\n } else if (match?.value === undefined || match?.value === null || !scalar(match.value)) issues.push({ code: 'match-without-value', params: { column: match?.column ?? null } })\n /*\n * A relative value is read on a date column only - on another it is the literal text 「this-month」, which no row\n * holds: 「이번 달 지출결의 합계」 matched month eq this-month and drew 0 (2026-10-25). A period is the source's\n * condition (a YYYY-MM one takes this-month).\n */\n const column = columns.get(match?.column)\n const relative = (Array.isArray(match?.value) ? match.value : [match?.value]).filter(one => typeof one === 'string' && LOOKS_RELATIVE.test(one))\n if (column && relative.length) {\n if (column.type !== 'date') issues.push({ code: 'relative-value-on-non-date-column', params: { column: column.name, value: relative[0], periodConditions: source.conditions.filter(one => one.type === 'date' || one.format === 'month' || (one.type === 'integer' && /year|month/i.test(one.name))).map(one => one.name) } })\n else if (relative.some(one => !isRelativeDate(one))) issues.push({ code: 'unknown-relative-value', params: { name: column.name, value: relative.find(one => !isRelativeDate(one)) } })\n }\n }\n /*\n * Conditions that no row can meet - two `eq` of one column (status 작성중 AND 상신), or an `eq` outside its own `in`.\n * Every match must hold, so these draw nothing, or a number of nothing that looks true (2026-10-25).\n */\n const equals = new Map<string, Set<string>>()\n for (const match of rows.match ?? []) {\n if (!match || typeof match.column !== 'string') continue\n const values = match.op === 'eq' && scalar(match.value) ? [String(match.value)] : match.op === 'in' && Array.isArray(match.value) ? match.value.map(String) : undefined\n if (!values) continue\n const before = equals.get(match.column)\n const kept = before ? values.filter(one => before.has(one)) : values\n if (before && !kept.length) {\n issues.push({ code: 'match-never-true', params: { column: match.column, use: `one match of ${match.column} with op in and every value it may hold` } })\n continue\n }\n equals.set(match.column, new Set(kept))\n }\n if (rows.groupBy !== undefined) {\n const by = columns.get(rows.groupBy)\n if (!by) issues.push({ code: 'unknown-column', params: { where: 'groupBy', column: rows.groupBy, columns: columnNames } })\n else if (by.type === 'number') issues.push({ code: 'group-by-number', params: { column: rows.groupBy } })\n }\n const shaped = shapedColumnNames(source, rows)\n const shapedNames = [...shaped.keys()]\n if (rows.sortBy !== undefined && !shaped.has(rows.sortBy)) issues.push({ code: 'unknown-column', params: { where: 'sortBy', column: rows.sortBy, columns: shapedNames } })\n if (rows.desc !== undefined && typeof rows.desc !== 'boolean') issues.push({ code: 'desc-not-boolean' })\n\n const view = definition.view\n if (!view || !known(VIEW_KINDS, view.kind)) {\n issues.push({ code: 'unknown-view', params: { kind: view?.kind ?? null, kinds: VIEW_KINDS } })\n return issues\n }\n const cap = view.kind === 'table' ? MAX_TABLE_ROWS : view.kind === 'number' ? Infinity : MAX_CHART_POINTS\n if (rows.limit !== undefined && (!Number.isInteger(rows.limit) || rows.limit < 1 || rows.limit > cap)) issues.push({ code: 'limit-out-of-range', params: { limit: rows.limit, max: cap === Infinity ? null : cap } })\n for (const name of view.values ?? []) {\n const column = shaped.get(name)\n if (!column) issues.push({ code: 'unknown-column', params: { where: 'values', column: name, columns: shapedNames } })\n else if (column.type !== 'number') issues.push({ code: 'value-not-a-number', params: { column: name } })\n }\n for (const name of view.columns ?? []) if (!shaped.has(name)) issues.push({ code: 'unknown-column', params: { where: 'columns', column: name, columns: shapedNames } })\n if (view.kind === 'bar' || view.kind === 'line') {\n const label = view.label ?? rows.groupBy\n if (!label) issues.push({ code: 'chart-without-label', params: { columns: shapedNames.filter(one => shaped.get(one)!.type !== 'number') } })\n else if (!shaped.has(label)) issues.push({ code: 'unknown-column', params: { where: 'label', column: label, columns: shapedNames } })\n if (!rows.groupBy && !(view.values ?? []).length) issues.push({ code: 'chart-without-values', params: { columns: shapedNames.filter(one => shaped.get(one)!.type === 'number') } })\n }\n if (view.unit !== undefined && (typeof view.unit !== 'string' || view.unit.length > 20)) issues.push({ code: 'unit-too-long' })\n return issues\n}\n\n/* ── What the card says it shows, against what it reads ───────────────────────────────────────────────────── */\n\nexport type PeriodUnit = 'day' | 'week' | 'month' | 'months' | 'year'\n\n/*\n * The periods a card's name or line may say, in the languages the module ships the most - a name the dashboard shows\n * every day. 「이번 달 합계」 with no condition of the month summed all time (2026-10-25).\n */\nconst NAMED_PERIODS: [PeriodUnit, RegExp][] = [\n ['months', /(최근|지난)\\s*\\d+\\s*개월|\\d+\\s*개월\\s*(간|동안)|\\b(last|past)\\s+\\d+\\s+months?\\b|過去\\s*\\d+\\s*(ヶ|か|カ)月|近\\s*\\d+\\s*个月/i],\n ['month', /이번\\s*달|이달|금월|당월|지난\\s*달|저번\\s*달|전월|다음\\s*달|\\b(this|last|next)\\s+month\\b|今月|先月|本月|上个?月/i],\n ['year', /올해|금년|당해|작년|지난\\s*해|전년도|내년|\\b(this|last|next)\\s+year\\b|今年|昨年|去年/i],\n ['week', /이번\\s*주|금주|지난\\s*주|저번\\s*주|다음\\s*주|\\b(this|last|next)\\s+week\\b|今週|先週|本周|上周/i],\n ['day', /오늘|금일|\\btoday\\b|今日|今天/i]\n]\n\n/**\n * Words that say when a state is read, never a period it covers - 「내 퇴직금 (오늘 기준)」 is the estimate as it stands,\n * and was refused as 「today」 with no condition of it (2026-10-25).\n */\nconst AS_OF = /(오늘|금일|현재)\\s*(기준|시점)|\\bas of (today|now)\\b|今日(時点|現在)|截至(今天|目前)/gi\n\n/** The periods a text says - none for a text without one. */\nexport function periodsNamed(text: string | undefined): PeriodUnit[] {\n const given = String(text ?? '').replace(AS_OF, ' ')\n return NAMED_PERIODS.filter(([, words]) => words.test(given)).map(([unit]) => unit)\n}\n\n/** The units a relative value reads - `this-month-start` a month, `-5m` months back, `-30d` days. */\nfunction unitsOf(value: unknown): PeriodUnit[] {\n if (typeof value !== 'string') return []\n if (/^-\\d{1,2}m(-(start|end))?$/.test(value)) return ['months']\n if (/^today$|^[+-]?\\d{1,4}d$/.test(value)) return /^[+-]?([7-9]|1[0-4])d$/.test(value) ? ['day', 'week'] : ['day']\n const unit = /^(this|last|next)-(week|month|quarter|year)/.exec(value)?.[2]\n return unit === 'quarter' ? ['months'] : unit ? [unit as PeriodUnit] : []\n}\n\nconst FIXED_DAY = /^\\d{4}(-\\d{2}(-\\d{2})?)?$/\n/** A bound held to one day, month or year - `2026-10-01`, `2026-10`, or an integer year or month (`year: 2026, month: 10`). */\nconst isFixed = (value: unknown) => typeof value === 'number' || (typeof value === 'string' && FIXED_DAY.test(value))\n\n/** The viewer as the definition may name them by mistake - their user id, name and e-mail. */\nexport interface ViewerNames {\n id?: string\n name?: string\n email?: string\n}\n\n/**\n * Whether a card means what its name says, and reads as whoever looks at it. Issues, never repairs:\n * - a period in the name or line (이번 달, 최근 6개월) with no condition of that period - it would sum all time;\n * - a period said relatively but held to fixed days - it would stop being \"this month\" next month;\n * - a filter on the viewer's own name or id: a read of the viewer's own rows needs none (it is theirs whoever looks),\n * and another read filtered by one person shows that person to everyone the card is shared with - the viewer's own\n * read (`mine`) is the source instead.\n * `mineSources` are the reads of one's own rows the model may use instead (cardSources).\n */\nexport function checkCardIntent(\n card: { name?: string; description?: string; definition: CardDefinition },\n source: CardSource,\n viewer: ViewerNames = {},\n mineSources: string[] = []\n): CardIssue[] {\n const issues: CardIssue[] = []\n const { definition } = card\n const where = definition.source?.where ?? {}\n const matches = definition.rows?.match ?? []\n const dateColumns = new Set(source.columns.filter(one => one.type === 'date').map(one => one.name))\n const periodConditions = new Set(source.conditions.filter(one => one.type === 'date' || one.format === 'month' || (one.type === 'integer' && /year|month/i.test(one.name))).map(one => one.name))\n\n /* The values that bound a period - a period condition's, a date column's match. */\n const bounds = [\n ...Object.entries(where).filter(([name]) => periodConditions.has(name)).map(([, value]) => value),\n ...matches.filter(one => dateColumns.has(one?.column)).map(one => one.value)\n ]\n const named = [...new Set([...periodsNamed(card.name), ...periodsNamed(card.description)])]\n if (named.length) {\n if (!bounds.length) issues.push({ code: 'period-without-condition', params: { said: named, conditions: [...periodConditions], dateColumns: [...dateColumns] } })\n else if (bounds.some(isFixed)) issues.push({ code: 'period-held-to-fixed-days', params: { said: named, given: bounds.filter(isFixed) } })\n else {\n const read = new Set(bounds.flatMap(unitsOf))\n const missing = named.filter(unit => !read.has(unit))\n if (read.size && missing.length) issues.push({ code: 'period-unlike-condition', params: { said: missing, given: bounds } })\n }\n }\n\n const own = [viewer.id, viewer.name, viewer.email].filter((one): one is string => !!one && one.trim().length > 1).map(one => one.trim().toLowerCase())\n const isOwn = (value: unknown) => (Array.isArray(value) ? value : [value]).some(one => (typeof one === 'string' || typeof one === 'number') && own.includes(String(one).trim().toLowerCase()))\n const onViewer = [...Object.entries(where).filter(([, value]) => isOwn(value)).map(([name]) => name), ...matches.filter(one => isOwn(one?.value)).map(one => one.column)]\n if (onViewer.length) {\n if (source.mine) issues.push({ code: 'viewer-filter-on-own-read', params: { filters: onViewer } })\n else if (mineSources.length) issues.push({ code: 'viewer-filter-use-own-read', params: { filters: onViewer, mine: mineSources } })\n }\n return issues\n}\n"]}
|
|
1
|
+
{"version":3,"file":"card-definition.js","sourceRoot":"","sources":["../../../server/service/card/card-definition.ts"],"names":[],"mappings":";;;AA8GA,4BA+CC;AA0BD,0BAMC;AAGD,kDAoBC;AAMD,oDAMC;AAQD,oCAkBC;AAKD,8CAQC;AAQD,0CAoGC;AAyBD,oCAGC;AA+BD,0CAqCC;AAtcY,QAAA,mBAAmB,GAAG,CAAC,CAAA;AAEvB,QAAA,UAAU,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAU,CAAA;AAGxD,QAAA,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAU,CAAA;AACxF,+EAA+E;AAClE,QAAA,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAU,CAAA;AAGjD,2FAA2F;AAC9E,QAAA,cAAc,GAAG,GAAG,CAAA;AACpB,QAAA,gBAAgB,GAAG,EAAE,CAAA;AAClC,sHAAsH;AACzG,QAAA,UAAU,GAAG,CAAC,CAAA;AACd,QAAA,WAAW,GAAG,EAAE,CAAA;AAiF7B,2DAA2D;AAC3D,SAAgB,QAAQ,CACtB,GAA8B,EAC9B,YAAqD,EACrD,YAAqD;IAErD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAA;IAC9F,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAA;QACtF,OAAO;YACL,MAAM,EAAE;gBACN,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,UAAU,EAAE;oBACV,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACzM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrG;gBACD,MAAM;gBACN,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvC;SACF,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAA;IACnF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAChC,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAA;IAC9F,+DAA+D;IAC/D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC3G,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAA;IACzK,OAAO;QACL,MAAM,EAAE;YACN,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ;YAC1C,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW;YACnD,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3M,MAAM;YACN,IAAI;YACJ,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvC;KACF,CAAA;AACH,CAAC;AAED,iHAAiH;AAEjH;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,sGAAsG,CAAA;AAC5H,MAAM,eAAe,GAAG,6CAA6C,CAAA;AACrE,MAAM,cAAc,GAAG,wEAAwE,CAAA;AAC/F,+GAA+G;AAC/G,MAAM,cAAc,GAAG,iCAAiC,CAAA;AAEjD,MAAM,cAAc,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAA3F,QAAA,cAAc,kBAA6E;AACjG,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAA/F,QAAA,gBAAgB,oBAA+E;AACrG,MAAM,eAAe,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAA7F,QAAA,eAAe,mBAA8E;AAE1G,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AACrD,MAAM,GAAG,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAA;AAC/G,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAE5E,0HAA0H;AAC1H,SAAgB,OAAO,CAAC,QAA4B,EAAE,MAAY,IAAI,IAAI,EAAE;IAC1E,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC7I,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC5G,CAAC;AACH,CAAC;AAED,oIAAoI;AACpI,SAAgB,mBAAmB,CAAC,KAAa,EAAE,KAAa;IAC9D,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9C,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAA;IACnC,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5C,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,MAAM,SAAS,GAAG,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzD,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACnI,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,0DAA0D,CAAC,IAAI,CAAC,KAAK,CAAE,CAAA;IACrG,MAAM,IAAI,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7D,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,GAAG,CAAC,CAAA;QACrC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAClG,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;QACpD,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACxE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;AAC5E,CAAC;AAED,wFAAwF;AACxF,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEnK,4FAA4F;AAC5F,SAAgB,oBAAoB,CAAC,KAAa,EAAE,KAAa;IAC/D,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3C,MAAM,IAAI,GAAG,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9D,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACrH,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;IACjD,OAAO,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,CAAA;AACpE,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,KAA0C,EAAE,KAAa,EAAE,aAAyC,EAAE;IACjI,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,CAAA;IACzB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACtE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAuB,CAAA;IAC7M,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;IACtC,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,IAAA,uBAAe,EAAC,KAAK,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,KAAe,EAAE,KAAK,CAAC,CAAA;aAChH,IAAI,IAAA,sBAAc,EAAC,KAAK,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAe,EAAE,KAAK,CAAC,CAAA;aAClF,IAAI,IAAA,wBAAgB,EAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAI,KAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClD,MAAM,IAAI,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7D,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QACxE,CAAC;;YAAM,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IAC1B,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,iHAAiH;AAEjH,sGAAsG;AACtG,SAAgB,iBAAiB,CAAC,MAAkB,EAAE,IAA0B;IAC9E,IAAI,CAAC,IAAI,EAAE,OAAO;QAAE,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9E,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,CAAA;IAChE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAsB,CAAA;IACzC,IAAI,EAAE;QAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;IAClF,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;IACnD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACnI,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,IAAuB,EAAE,KAAc,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAE5G;;;GAGG;AACH,SAAgB,eAAe,CAAC,UAAsC,EAAE,MAAkB;IACxF,MAAM,MAAM,GAAgB,EAAE,CAAA;IAC9B,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAA;IACrF,IAAI,UAAU,CAAC,aAAa,KAAK,2BAAmB;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,IAAI,IAAI,EAAE,KAAK,EAAE,2BAAmB,EAAE,EAAE,CAAC,CAAA;IAEtL,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IACzE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAA;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAC7D,8FAA8F;YAC9F,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;YAC5D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,2BAA2B,IAAI,uBAAuB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAC9N,SAAQ;QACV,CAAC;QACD,IAAI,SAAS,EAAE,MAAM,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAA,uBAAe,EAAC,KAAK,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,oFAAoF,EAAE,EAAE,CAAC,CAAA;YAC3P,SAAQ;QACV,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAA,sBAAc,EAAC,KAAK,CAAC,IAAI,CAAC,IAAA,wBAAgB,EAAC,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;QAC3L,IAAI,IAAA,wBAAgB,EAAC,KAAK,CAAC,IAAI,SAAS,EAAE,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;QAC9I,IAAI,IAAA,sBAAc,EAAC,KAAK,CAAC,IAAI,SAAS,EAAE,IAAI,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;IACtI,CAAC;IAED,kFAAkF;IAClF,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtE,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9Q,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IACnE,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAA;IACvH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;QACzJ,IAAI,CAAC,KAAK,CAAC,iBAAS,EAAE,KAAK,EAAE,EAAE,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,IAAI,EAAE,GAAG,EAAE,iBAAS,EAAE,EAAE,CAAC,CAAA;aACzH,IAAI,KAAK,CAAC,gBAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACrL,CAAC;aAAM,IAAI,KAAK,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC,CAAA;QAC/K;;;;WAIG;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACzC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAChJ,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;iBACzT,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAA,sBAAc,EAAC,GAAG,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAA,sBAAc,EAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACxL,CAAC;IACH,CAAC;IACD;;;OAGG;IACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAA;IAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAAE,SAAQ;QACxD,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACvK,IAAI,CAAC,MAAM;YAAE,SAAQ;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACpE,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,KAAK,CAAC,MAAM,yCAAyC,EAAE,EAAE,CAAC,CAAA;YACvJ,SAAQ;QACV,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACzC,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;aACrH,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC3G,CAAC;IACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC9C,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;IAC1K,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAA;IAExG,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;IAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAU,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,kBAAU,EAAE,EAAE,CAAC,CAAA;QAC9F,OAAO,MAAM,CAAA;IACf,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,sBAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,wBAAgB,CAAA;IACzG,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACrN,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;aAChH,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IAC1G,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;IACvK,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAA;QACxC,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;aACvI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;QACrI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;IACrL,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAA;IAC/H,OAAO,MAAM,CAAA;AACf,CAAC;AAMD;;;GAGG;AACH,MAAM,aAAa,GAA2B;IAC5C,CAAC,QAAQ,EAAE,wGAAwG,CAAC;IACpH,CAAC,OAAO,EAAE,qFAAqF,CAAC;IAChG,CAAC,MAAM,EAAE,iEAAiE,CAAC;IAC3E,CAAC,MAAM,EAAE,yEAAyE,CAAC;IACnF,CAAC,KAAK,EAAE,wBAAwB,CAAC;CAClC,CAAA;AAED;;;GAGG;AACH,MAAM,KAAK,GAAG,kEAAkE,CAAA;AAEhF,6DAA6D;AAC7D,SAAgB,YAAY,CAAC,IAAwB;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACpD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;AACrF,CAAC;AAED,qGAAqG;AACrG,SAAS,OAAO,CAAC,KAAc;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IACxC,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/D,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAClH,MAAM,IAAI,GAAG,6CAA6C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC3E,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC3E,CAAC;AAED,MAAM,SAAS,GAAG,2BAA2B,CAAA;AAC7C,+HAA+H;AAC/H,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;AASrH;;;;;;;;GAQG;AACH,SAAgB,eAAe,CAC7B,IAAyE,EACzE,MAAkB,EAClB,SAAsB,EAAE,EACxB,cAAwB,EAAE;IAE1B,MAAM,MAAM,GAAgB,EAAE,CAAA;IAC9B,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;IAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAA;IAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAA;IAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACnG,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IAEjM,mFAAmF;IACnF,MAAM,MAAM,GAAG;QACb,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;QACjG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;KAC7E,CAAA;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3F,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,GAAG,gBAAgB,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,CAAC,CAAA;aAC3J,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;aACpI,CAAC;YACJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;YAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;YACrD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QAC7H,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;IACtJ,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC9L,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACzK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,MAAM,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;aAC7F,IAAI,WAAW,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;IACpI,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["/*\n * What a dashboard card is - a definition, never its values (operato-application/adr/ADR-0160.md).\n *\n * A card names one read an application declared for the assistant (a list read target, or a list inside a detail\n * read's answer), the conditions it is read with, what is done to its rows (filtered, grouped, ordered, cut) and how\n * the rows are drawn (a number, a table, bars or a line). The assistant writes it once, in a conversation; drawing it\n * runs the definition and asks no model. Nothing a definition holds runs as code: a name it does not know is refused,\n * never passed over.\n *\n * Pure - the rules are tested without a server.\n */\nimport type { DetailList, DetailRead, ReadColumn, ReadTarget } from '@things-factory/ai-assistant'\n\nexport const CARD_SCHEMA_VERSION = 1\n\nexport const VIEW_KINDS = ['number', 'table', 'bar', 'line'] as const\nexport type ViewKind = (typeof VIEW_KINDS)[number]\n\nexport const MATCH_OPS = ['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'not_in'] as const\n/** The operators whose value is a list - one of these values, none of them. */\nexport const LIST_OPS = ['in', 'not_in'] as const\nexport type MatchOp = (typeof MATCH_OPS)[number]\n\n/** The rows a table shows, and the points a chart draws, at most (ADR-0160 decision 4). */\nexport const MAX_TABLE_ROWS = 200\nexport const MAX_CHART_POINTS = 50\n/** The AI 작업 패널 draws eight hues and twelve figures; a card that needs more is refused, never folded (decision 5). */\nexport const MAX_SERIES = 8\nexport const MAX_FIGURES = 12\n\nexport interface CardSourceRef {\n /** The read's key - `office.cash-transaction`, `office.receivables`. */\n read: string\n /** A detail read's list key - `by-contract`. Absent for a list read target. */\n list?: string\n /** The conditions (a list) or the arguments (a detail read) - a date may be relative (`this-month-start`). */\n where?: Record<string, unknown>\n}\n\nexport interface CardMatch {\n column: string\n op: MatchOp\n /** A list for `in` and `not_in` (status not_in [APPROVED, REJECTED, WITHDRAWN]); one value otherwise. */\n value: string | number | boolean | (string | number)[]\n}\n\nexport interface CardRows {\n match?: CardMatch[]\n groupBy?: string\n sortBy?: string\n desc?: boolean\n limit?: number\n}\n\nexport interface CardView {\n kind: ViewKind\n /** bar · line: the column along the bottom - the grouped column when rows are grouped. */\n label?: string\n /** number · bar · line: the number columns summed or drawn; none counts the rows. table: shown after `columns`. */\n values?: string[]\n /** table: the columns shown, in order. Absent: every column. */\n columns?: string[]\n /** A unit said beside the numbers when no currency says one (`건`, `%`). */\n unit?: string\n}\n\nexport interface CardDefinition {\n schemaVersion: number\n source: CardSourceRef\n rows?: CardRows\n view: CardView\n}\n\n/** A refusal the card and the model both read - a code and what it is about, never prose. */\nexport interface CardIssue {\n code: string\n params?: Record<string, unknown>\n}\n\n/** A condition a source takes - its name and type, from the declaration. */\nexport interface SourceCondition {\n name: string\n type: string\n values?: string[]\n description?: string\n /** A detail read's argument its query cannot run without. */\n required?: boolean\n /** A string condition that holds a month as YYYY-MM - it takes a relative month (this-month, -5m). */\n format?: 'month'\n /** It takes several values at once - a list read's statuses (`status: [..]`, `statusNot: [..]`). */\n many?: boolean\n}\n\n/** What a card may read from one declaration - the same whichever kind of read it is. */\nexport interface CardSource {\n key: string\n kind: 'list' | 'detail'\n labelKey?: string\n description: string\n query: string\n columns: ReadColumn[]\n conditions: SourceCondition[]\n target?: ReadTarget\n detail?: DetailRead\n list?: DetailList\n /** The rows are the viewer's own, whoever looks (내 지출결의, 나의 전략 업무) - ReadTarget.mine · DetailRead.mine. */\n mine?: boolean\n}\n\n/** The source a reference names - or why there is none. */\nexport function sourceOf(\n ref: CardSourceRef | undefined,\n readTargetOf: (key: string) => ReadTarget | undefined,\n detailReadOf: (key: string) => DetailRead | undefined\n): { source?: CardSource; issue?: CardIssue } {\n if (!ref || typeof ref.read !== 'string' || !ref.read) return { issue: { code: 'no-source' } }\n const target = readTargetOf(ref.read)\n if (target) {\n if (ref.list) return { issue: { code: 'list-of-a-list', params: { read: ref.read } } }\n return {\n source: {\n key: target.key,\n kind: 'list',\n labelKey: target.labelKey,\n description: target.description,\n query: target.query,\n columns: target.columns,\n conditions: [\n ...target.criteria.map(one => ({ name: one.name, type: one.type, values: one.values, description: one.description, ...(one.format ? { format: one.format } : {}), ...(one.many ? { many: true } : {}) })),\n ...(target.search ? [{ name: 'text', type: 'string', description: target.search.description }] : [])\n ],\n target,\n ...(target.mine ? { mine: true } : {})\n }\n }\n }\n const detail = detailReadOf(ref.read)\n if (!detail) return { issue: { code: 'unknown-read', params: { read: ref.read } } }\n const lists = detail.lists ?? []\n if (!lists.length) return { issue: { code: 'not-a-card-source', params: { read: ref.read } } }\n /* One list needs no name; with several, the card names one. */\n const list = ref.list ? lists.find(one => one.key === ref.list) : lists.length === 1 ? lists[0] : undefined\n if (!list) return { issue: { code: ref.list ? 'unknown-list' : 'list-not-named', params: { read: ref.read, list: ref.list ?? null, lists: lists.map(one => one.key) } } }\n return {\n source: {\n key: detail.key,\n kind: 'detail',\n labelKey: list.labelKey ?? detail.labelKey,\n description: list.description ?? detail.description,\n query: detail.query,\n columns: list.columns,\n conditions: (detail.args ?? []).map(one => ({ name: one.name, type: one.type, values: one.values, description: one.description, required: !!one.required, ...(one.format ? { format: one.format } : {}) })),\n detail,\n list,\n ...(detail.mine ? { mine: true } : {})\n }\n }\n}\n\n/* ── Relative dates (ADR-0160 decision 3) ─────────────────────────────────────────────────────────────────── */\n\n/*\n * The words of a period that stays current - the only ones a card keeps:\n * a day today · -30d · this-month-start · last-year-end · -5m-start (the first day of five months ago)\n * a year or a month as an integer this-year · last-month · -5m\n * a month as YYYY-MM this-month · last-month · -5m · this-year-start (its January) · this-year-end\n * \"The last six months\" is from -5m-start to this-month-end (or a YYYY-MM range from -5m to this-month).\n */\nconst RELATIVE_DATE = /^(today|(this|last|next)-(week|month|quarter|year)-(start|end)|[+-]?\\d{1,4}d|-\\d{1,2}m-(start|end))$/\nconst RELATIVE_PERIOD = /^((this|last|next)-(year|month)|-\\d{1,2}m)$/\nconst RELATIVE_MONTH = /^((this|last|next)-month|-\\d{1,2}m|(this|last|next)-year-(start|end))$/\n/** A value that looks meant as a relative one - checked against the words above, never taken for a literal. */\nconst LOOKS_RELATIVE = /^((this|last|next)-|today$|-\\d)/\n\nexport const isRelativeDate = (value: unknown) => typeof value === 'string' && RELATIVE_DATE.test(value)\nexport const isRelativePeriod = (value: unknown) => typeof value === 'string' && RELATIVE_PERIOD.test(value)\nexport const isRelativeMonth = (value: unknown) => typeof value === 'string' && RELATIVE_MONTH.test(value)\n\nconst pad = (n: number) => String(n).padStart(2, '0')\nconst ymd = (date: Date) => `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`\nconst utc = (y: number, m: number, d: number) => new Date(Date.UTC(y, m, d))\n\n/** Today in a time zone - `YYYY-MM-DD`; the system's zone when the domain names none or one the runtime does not know. */\nexport function todayIn(timeZone: string | undefined, now: Date = new Date()): string {\n try {\n return new Intl.DateTimeFormat('en-CA', { timeZone: timeZone || undefined, year: 'numeric', month: '2-digit', day: '2-digit' }).format(now)\n } catch {\n return new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit' }).format(now)\n }\n}\n\n/** A relative date as a day, from `today` - weeks start on Monday, an end is that last day (a range's `to` takes the whole day). */\nexport function resolveRelativeDate(value: string, today: string): string {\n const [y, m, d] = today.split('-').map(Number)\n if (value === 'today') return today\n const days = /^([+-]?\\d{1,4})d$/.exec(value)\n if (days) return ymd(utc(y, m - 1, d + Number(days[1])))\n const monthsAgo = /^-(\\d{1,2})m-(start|end)$/.exec(value)\n if (monthsAgo) return ymd(monthsAgo[2] === 'start' ? utc(y, m - 1 - Number(monthsAgo[1]), 1) : utc(y, m - Number(monthsAgo[1]), 0))\n const [, which, unit, edge] = /^(this|last|next)-(week|month|quarter|year)-(start|end)$/.exec(value)!\n const step = which === 'last' ? -1 : which === 'next' ? 1 : 0\n if (unit === 'week') {\n const weekday = (utc(y, m - 1, d).getUTCDay() + 6) % 7\n const monday = d - weekday + step * 7\n return ymd(utc(y, m - 1, edge === 'start' ? monday : monday + 6))\n }\n if (unit === 'month') return ymd(edge === 'start' ? utc(y, m - 1 + step, 1) : utc(y, m + step, 0))\n if (unit === 'quarter') {\n const first = Math.floor((m - 1) / 3) * 3 + step * 3\n return ymd(edge === 'start' ? utc(y, first, 1) : utc(y, first + 3, 0))\n }\n return ymd(edge === 'start' ? utc(y + step, 0, 1) : utc(y + step, 11, 31))\n}\n\n/** How many months a relative month moves from this one - `last-month` -1, `-5m` -5. */\nconst monthStep = (value: string) => (/^-(\\d{1,2})m$/.test(value) ? -Number(value.slice(1, -1)) : value.startsWith('last') ? -1 : value.startsWith('next') ? 1 : 0)\n\n/** A relative month as YYYY-MM, from `today` - `this-year-start` is this year's January. */\nexport function resolveRelativeMonth(value: string, today: string): string {\n const [y, m] = today.split('-').map(Number)\n const year = /^(this|last|next)-year-(start|end)$/.exec(value)\n if (year) return `${y + (year[1] === 'last' ? -1 : year[1] === 'next' ? 1 : 0)}-${year[2] === 'start' ? '01' : '12'}`\n const month = utc(y, m - 1 + monthStep(value), 1)\n return `${month.getUTCFullYear()}-${pad(month.getUTCMonth() + 1)}`\n}\n\n/**\n * The relative values of a definition's conditions, as of `today` - each by what its condition holds (`conditions`):\n * a month as YYYY-MM, a day, an integer year or month. A year and a month are read from one month: with a month token\n * in the same conditions, `this-year` is that month's year - January's `last-month` with `this-year` is last December,\n * never this year's December.\n */\nexport function resolveWhere(where: Record<string, unknown> | undefined, today: string, conditions: readonly SourceCondition[] = []): Record<string, unknown> {\n const given = where ?? {}\n const formats = new Map(conditions.map(one => [one.name, one.format]))\n const [y, m] = today.split('-').map(Number)\n const monthToken = Object.entries(given).find(([name, value]) => formats.get(name) !== 'month' && typeof value === 'string' && /^((this|last|next)-month|-\\d{1,2}m)$/.test(value))?.[1] as string | undefined\n const base = monthToken ? utc(y, m - 1 + monthStep(monthToken), 1) : utc(y, m - 1, 1)\n const baseYear = base.getUTCFullYear()\n const out: Record<string, unknown> = {}\n for (const [name, value] of Object.entries(given)) {\n if (formats.get(name) === 'month' && isRelativeMonth(value)) out[name] = resolveRelativeMonth(value as string, today)\n else if (isRelativeDate(value)) out[name] = resolveRelativeDate(value as string, today)\n else if (isRelativePeriod(value)) {\n const [which, unit] = (value as string).split('-')\n const step = which === 'last' ? -1 : which === 'next' ? 1 : 0\n out[name] = unit === 'year' ? baseYear + step : base.getUTCMonth() + 1\n } else out[name] = value\n }\n return out\n}\n\n/* ── Checking a definition against its source ─────────────────────────────────────────────────────────────── */\n\n/** The columns the rows have after `rows` - a grouped card's group column, its count and its sums. */\nexport function shapedColumnNames(source: CardSource, rows: CardRows | undefined): Map<string, ReadColumn> {\n if (!rows?.groupBy) return new Map(source.columns.map(one => [one.name, one]))\n const by = source.columns.find(one => one.name === rows.groupBy)\n const out = new Map<string, ReadColumn>()\n if (by) out.set(by.name, { ...by, type: by.type === 'date' ? 'string' : by.type })\n out.set('count', { name: 'count', type: 'number' })\n for (const column of source.columns.filter(one => one.type === 'number' && one.name !== rows.groupBy)) out.set(column.name, column)\n return out\n}\n\nconst known = (list: readonly string[], value: unknown) => typeof value === 'string' && list.includes(value)\n\n/**\n * Whether a definition fits its source - every name it uses is the source's, every value one it takes. Issues, never\n * repairs: a definition the model wrote wrong is sent back with what the source has.\n */\nexport function checkDefinition(definition: CardDefinition | undefined, source: CardSource): CardIssue[] {\n const issues: CardIssue[] = []\n if (!definition || typeof definition !== 'object') return [{ code: 'no-definition' }]\n if (definition.schemaVersion !== CARD_SCHEMA_VERSION) issues.push({ code: 'unknown-schema-version', params: { given: definition.schemaVersion ?? null, known: CARD_SCHEMA_VERSION } })\n\n const conditions = new Map(source.conditions.map(one => [one.name, one]))\n const where = definition.source?.where ?? {}\n for (const [name, value] of Object.entries(where)) {\n const condition = conditions.get(name)\n if (!condition && !(source.kind === 'list' && name === 'id')) {\n /* A column put among the conditions - the rows are filtered by it with rows.match instead. */\n const column = source.columns.some(one => one.name === name)\n issues.push({ code: 'unknown-condition', params: { name, conditions: [...conditions.keys()], ...(column ? { isColumn: true, use: `rows.match: [{ column: '${name}', op: 'eq', value: ${JSON.stringify(value)} }]` } : {}) } })\n continue\n }\n if (condition?.format === 'month') {\n if (typeof value === 'string' && LOOKS_RELATIVE.test(value) && !isRelativeMonth(value)) issues.push({ code: 'relative-value-unfit', params: { name, value, takes: 'a month as YYYY-MM, or this-month, last-month, -5m, this-year-start, this-year-end' } })\n continue\n }\n if (typeof value === 'string' && LOOKS_RELATIVE.test(value) && !isRelativeDate(value) && !isRelativePeriod(value)) issues.push({ code: 'unknown-relative-value', params: { name, value } })\n if (isRelativePeriod(value) && condition?.type !== 'integer') issues.push({ code: 'relative-period-on-non-integer', params: { name, value } })\n if (isRelativeDate(value) && condition?.type !== 'date') issues.push({ code: 'relative-date-on-non-date', params: { name, value } })\n }\n\n /* What the query cannot run without - said before it runs, with what it takes. */\n for (const condition of source.conditions.filter(one => one.required)) {\n const value = where[condition.name]\n if (value === undefined || value === null || value === '') issues.push({ code: 'missing-condition', params: { name: condition.name, ...(condition.values ? { values: condition.values } : {}), ...(condition.description ? { description: condition.description } : {}) } })\n }\n\n const columns = new Map(source.columns.map(one => [one.name, one]))\n const columnNames = [...columns.keys()]\n const rows = definition.rows ?? {}\n const scalar = (value: unknown) => typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'\n for (const match of rows.match ?? []) {\n if (!columns.has(match?.column)) issues.push({ code: 'unknown-column', params: { where: 'match', column: match?.column ?? null, columns: columnNames } })\n if (!known(MATCH_OPS, match?.op)) issues.push({ code: 'unknown-operator', params: { op: match?.op ?? null, ops: MATCH_OPS } })\n else if (known(LIST_OPS, match.op)) {\n if (!Array.isArray(match.value) || !match.value.length || !match.value.every(scalar)) issues.push({ code: 'match-without-values', params: { column: match.column, op: match.op } })\n } else if (match?.value === undefined || match?.value === null || !scalar(match.value)) issues.push({ code: 'match-without-value', params: { column: match?.column ?? null } })\n /*\n * A relative value is read on a date column only - on another it is the literal text 「this-month」, which no row\n * holds: 「이번 달 지출결의 합계」 matched month eq this-month and drew 0 (2026-10-25). A period is the source's\n * condition (a YYYY-MM one takes this-month).\n */\n const column = columns.get(match?.column)\n const relative = (Array.isArray(match?.value) ? match.value : [match?.value]).filter(one => typeof one === 'string' && LOOKS_RELATIVE.test(one))\n if (column && relative.length) {\n if (column.type !== 'date') issues.push({ code: 'relative-value-on-non-date-column', params: { column: column.name, value: relative[0], periodConditions: source.conditions.filter(one => one.type === 'date' || one.format === 'month' || (one.type === 'integer' && /year|month/i.test(one.name))).map(one => one.name) } })\n else if (relative.some(one => !isRelativeDate(one))) issues.push({ code: 'unknown-relative-value', params: { name: column.name, value: relative.find(one => !isRelativeDate(one)) } })\n }\n }\n /*\n * Conditions that no row can meet - two `eq` of one column (status 작성중 AND 상신), or an `eq` outside its own `in`.\n * Every match must hold, so these draw nothing, or a number of nothing that looks true (2026-10-25).\n */\n const equals = new Map<string, Set<string>>()\n for (const match of rows.match ?? []) {\n if (!match || typeof match.column !== 'string') continue\n const values = match.op === 'eq' && scalar(match.value) ? [String(match.value)] : match.op === 'in' && Array.isArray(match.value) ? match.value.map(String) : undefined\n if (!values) continue\n const before = equals.get(match.column)\n const kept = before ? values.filter(one => before.has(one)) : values\n if (before && !kept.length) {\n issues.push({ code: 'match-never-true', params: { column: match.column, use: `one match of ${match.column} with op in and every value it may hold` } })\n continue\n }\n equals.set(match.column, new Set(kept))\n }\n if (rows.groupBy !== undefined) {\n const by = columns.get(rows.groupBy)\n if (!by) issues.push({ code: 'unknown-column', params: { where: 'groupBy', column: rows.groupBy, columns: columnNames } })\n else if (by.type === 'number') issues.push({ code: 'group-by-number', params: { column: rows.groupBy } })\n }\n const shaped = shapedColumnNames(source, rows)\n const shapedNames = [...shaped.keys()]\n if (rows.sortBy !== undefined && !shaped.has(rows.sortBy)) issues.push({ code: 'unknown-column', params: { where: 'sortBy', column: rows.sortBy, columns: shapedNames } })\n if (rows.desc !== undefined && typeof rows.desc !== 'boolean') issues.push({ code: 'desc-not-boolean' })\n\n const view = definition.view\n if (!view || !known(VIEW_KINDS, view.kind)) {\n issues.push({ code: 'unknown-view', params: { kind: view?.kind ?? null, kinds: VIEW_KINDS } })\n return issues\n }\n const cap = view.kind === 'table' ? MAX_TABLE_ROWS : view.kind === 'number' ? Infinity : MAX_CHART_POINTS\n if (rows.limit !== undefined && (!Number.isInteger(rows.limit) || rows.limit < 1 || rows.limit > cap)) issues.push({ code: 'limit-out-of-range', params: { limit: rows.limit, max: cap === Infinity ? null : cap } })\n for (const name of view.values ?? []) {\n const column = shaped.get(name)\n if (!column) issues.push({ code: 'unknown-column', params: { where: 'values', column: name, columns: shapedNames } })\n else if (column.type !== 'number') issues.push({ code: 'value-not-a-number', params: { column: name } })\n }\n for (const name of view.columns ?? []) if (!shaped.has(name)) issues.push({ code: 'unknown-column', params: { where: 'columns', column: name, columns: shapedNames } })\n if (view.kind === 'bar' || view.kind === 'line') {\n const label = view.label ?? rows.groupBy\n if (!label) issues.push({ code: 'chart-without-label', params: { columns: shapedNames.filter(one => shaped.get(one)!.type !== 'number') } })\n else if (!shaped.has(label)) issues.push({ code: 'unknown-column', params: { where: 'label', column: label, columns: shapedNames } })\n if (!rows.groupBy && !(view.values ?? []).length) issues.push({ code: 'chart-without-values', params: { columns: shapedNames.filter(one => shaped.get(one)!.type === 'number') } })\n }\n if (view.unit !== undefined && (typeof view.unit !== 'string' || view.unit.length > 20)) issues.push({ code: 'unit-too-long' })\n return issues\n}\n\n/* ── What the card says it shows, against what it reads ───────────────────────────────────────────────────── */\n\nexport type PeriodUnit = 'day' | 'week' | 'month' | 'months' | 'year'\n\n/*\n * The periods a card's name or line may say, in the languages the module ships the most - a name the dashboard shows\n * every day. 「이번 달 합계」 with no condition of the month summed all time (2026-10-25).\n */\nconst NAMED_PERIODS: [PeriodUnit, RegExp][] = [\n ['months', /(최근|지난)\\s*\\d+\\s*개월|\\d+\\s*개월\\s*(간|동안)|\\b(last|past)\\s+\\d+\\s+months?\\b|過去\\s*\\d+\\s*(ヶ|か|カ)月|近\\s*\\d+\\s*个月/i],\n ['month', /이번\\s*달|이달|금월|당월|지난\\s*달|저번\\s*달|전월|다음\\s*달|\\b(this|last|next)\\s+month\\b|今月|先月|本月|上个?月/i],\n ['year', /올해|금년|당해|작년|지난\\s*해|전년도|내년|\\b(this|last|next)\\s+year\\b|今年|昨年|去年/i],\n ['week', /이번\\s*주|금주|지난\\s*주|저번\\s*주|다음\\s*주|\\b(this|last|next)\\s+week\\b|今週|先週|本周|上周/i],\n ['day', /오늘|금일|\\btoday\\b|今日|今天/i]\n]\n\n/**\n * Words that say when a state is read, never a period it covers - 「내 퇴직금 (오늘 기준)」 is the estimate as it stands,\n * and was refused as 「today」 with no condition of it (2026-10-25).\n */\nconst AS_OF = /(오늘|금일|현재)\\s*(기준|시점)|\\bas of (today|now)\\b|今日(時点|現在)|截至(今天|目前)/gi\n\n/** The periods a text says - none for a text without one. */\nexport function periodsNamed(text: string | undefined): PeriodUnit[] {\n const given = String(text ?? '').replace(AS_OF, ' ')\n return NAMED_PERIODS.filter(([, words]) => words.test(given)).map(([unit]) => unit)\n}\n\n/** The units a relative value reads - `this-month-start` a month, `-5m` months back, `-30d` days. */\nfunction unitsOf(value: unknown): PeriodUnit[] {\n if (typeof value !== 'string') return []\n if (/^-\\d{1,2}m(-(start|end))?$/.test(value)) return ['months']\n if (/^today$|^[+-]?\\d{1,4}d$/.test(value)) return /^[+-]?([7-9]|1[0-4])d$/.test(value) ? ['day', 'week'] : ['day']\n const unit = /^(this|last|next)-(week|month|quarter|year)/.exec(value)?.[2]\n return unit === 'quarter' ? ['months'] : unit ? [unit as PeriodUnit] : []\n}\n\nconst FIXED_DAY = /^\\d{4}(-\\d{2}(-\\d{2})?)?$/\n/** A bound held to one day, month or year - `2026-10-01`, `2026-10`, or an integer year or month (`year: 2026, month: 10`). */\nconst isFixed = (value: unknown) => typeof value === 'number' || (typeof value === 'string' && FIXED_DAY.test(value))\n\n/** The viewer as the definition may name them by mistake - their user id, name and e-mail. */\nexport interface ViewerNames {\n id?: string\n name?: string\n email?: string\n}\n\n/**\n * Whether a card means what its name says, and reads as whoever looks at it. Issues, never repairs:\n * - a period in the name or line (이번 달, 최근 6개월) with no condition of that period - it would sum all time;\n * - a period said relatively but held to fixed days - it would stop being \"this month\" next month;\n * - a filter on the viewer's own name or id: a read of the viewer's own rows needs none (it is theirs whoever looks),\n * and another read filtered by one person shows that person to everyone the card is shared with - the viewer's own\n * read (`mine`) is the source instead.\n * `mineSources` are the reads of one's own rows the model may use instead (cardSources).\n */\nexport function checkCardIntent(\n card: { name?: string; description?: string; definition: CardDefinition },\n source: CardSource,\n viewer: ViewerNames = {},\n mineSources: string[] = []\n): CardIssue[] {\n const issues: CardIssue[] = []\n const { definition } = card\n const where = definition.source?.where ?? {}\n const matches = definition.rows?.match ?? []\n const dateColumns = new Set(source.columns.filter(one => one.type === 'date').map(one => one.name))\n const periodConditions = new Set(source.conditions.filter(one => one.type === 'date' || one.format === 'month' || (one.type === 'integer' && /year|month/i.test(one.name))).map(one => one.name))\n\n /* The values that bound a period - a period condition's, a date column's match. */\n const bounds = [\n ...Object.entries(where).filter(([name]) => periodConditions.has(name)).map(([, value]) => value),\n ...matches.filter(one => dateColumns.has(one?.column)).map(one => one.value)\n ]\n const named = [...new Set([...periodsNamed(card.name), ...periodsNamed(card.description)])]\n if (named.length) {\n if (!bounds.length) issues.push({ code: 'period-without-condition', params: { said: named, conditions: [...periodConditions], dateColumns: [...dateColumns] } })\n else if (bounds.some(isFixed)) issues.push({ code: 'period-held-to-fixed-days', params: { said: named, given: bounds.filter(isFixed) } })\n else {\n const read = new Set(bounds.flatMap(unitsOf))\n const missing = named.filter(unit => !read.has(unit))\n if (read.size && missing.length) issues.push({ code: 'period-unlike-condition', params: { said: missing, given: bounds } })\n }\n }\n\n const own = [viewer.id, viewer.name, viewer.email].filter((one): one is string => !!one && one.trim().length > 1).map(one => one.trim().toLowerCase())\n const isOwn = (value: unknown) => (Array.isArray(value) ? value : [value]).some(one => (typeof one === 'string' || typeof one === 'number') && own.includes(String(one).trim().toLowerCase()))\n const onViewer = [...Object.entries(where).filter(([, value]) => isOwn(value)).map(([name]) => name), ...matches.filter(one => isOwn(one?.value)).map(one => one.column)]\n if (onViewer.length) {\n if (source.mine) issues.push({ code: 'viewer-filter-on-own-read', params: { filters: onViewer } })\n else if (mineSources.length) issues.push({ code: 'viewer-filter-use-own-read', params: { filters: onViewer, mine: mineSources } })\n }\n return issues\n}\n"]}
|
|
@@ -33,7 +33,7 @@ export interface CardCounts {
|
|
|
33
33
|
shown: number;
|
|
34
34
|
}
|
|
35
35
|
export interface CardRunResult {
|
|
36
|
-
/** One AI
|
|
36
|
+
/** One AI 작업 패널 block - metrics, table or chart. */
|
|
37
37
|
block?: Record<string, unknown>;
|
|
38
38
|
issue?: CardIssue;
|
|
39
39
|
counts?: CardCounts;
|
|
@@ -7,7 +7,7 @@ exports.runCard = runCard;
|
|
|
7
7
|
*
|
|
8
8
|
* The read's door is asked first, with the viewer's request; then the application's query runs with that request,
|
|
9
9
|
* so the rows are those its API gives this person. The rows are filtered, grouped, ordered and cut - in that order -
|
|
10
|
-
* and become one AI
|
|
10
|
+
* and become one AI 작업 패널 block, already within what the 작업 패널 draws: a card that would need a ninth series or a
|
|
11
11
|
* thirteenth figure is refused, never folded, so two currencies are never added on the way. Nothing is kept.
|
|
12
12
|
*
|
|
13
13
|
* Dependencies come in as arguments - tested without a server.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-run.js","sourceRoot":"","sources":["../../../server/service/card/card-run.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Drawing a card - its definition run as the one looking at it (ADR-0160 decisions 2, 4, 5, 6).\n *\n * The read's door is asked first, with the viewer's request; then the application's query runs with that request,\n * so the rows are those its API gives this person. The rows are filtered, grouped, ordered and cut - in that order -\n * and become one AI 작업판 block, already within what the 작업판 draws: a card that would need a ninth series or a\n * thirteenth figure is refused, never folded, so two currencies are never added on the way. Nothing is kept.\n *\n * Dependencies come in as arguments - tested without a server.\n */\nimport { filtersOf, MAX_READ_ROWS, readCriteria, readRows, rootFieldOf, rowOf, runDetail, valueAt, wordOf, type ReadColumn } from '@things-factory/ai-assistant'\n\nimport {\n checkDefinition,\n MAX_CHART_POINTS,\n MAX_FIGURES,\n MAX_SERIES,\n MAX_TABLE_ROWS,\n resolveRelativeDate,\n isRelativeDate,\n resolveWhere,\n shapedColumnNames,\n sourceOf,\n type CardDefinition,\n type CardIssue,\n type CardSource\n} from './card-definition.js'\n\ntype Row = Record<string, string | number | null>\ntype Runner = (document: string, variables: Record<string, unknown>) => Promise<{ data?: any; errors?: readonly { message: string }[] }>\n\nexport interface CardRunDeps {\n readTargetOf(key: string): any\n detailReadOf(key: string): any\n /** Whether the viewer passes a door (`Query.receivables`) - their request's answer. */\n passesDoor(door: string): Promise<boolean>\n /** The application's API with the viewer's request state. */\n run: Runner\n /** Today in the domain's time zone - `YYYY-MM-DD`. */\n today: string\n /** The domain's time zone - a moment in the rows is read in it. */\n timeZone?: string\n /** The reader's words for a label key. */\n words?(key: string | undefined, fallback: string): string\n}\n\n/** How much of the source the card was drawn from - said on the card (decision 4). */\nexport interface CardCounts {\n /** Rows read from the source. */\n read: number\n /** Rows the source holds. */\n total: number\n /** Every row of the source was read. */\n complete: boolean\n /** Rows (or groups) after filtering and grouping, before the cut. */\n shaped: number\n /** Rows (or points) drawn. */\n shown: number\n}\n\nexport interface CardRunResult {\n /** One AI 작업판 block - metrics, table or chart. */\n block?: Record<string, unknown>\n issue?: CardIssue\n counts?: CardCounts\n /** The day relative conditions were read for. */\n asOf: string\n source?: { key: string; labelKey?: string }\n}\n\n/** A column of the shaped rows, with the currency its sums are kept in. */\ninterface Shaped extends ReadColumn {\n /** Set on a column split by currency: `remaining:USD` holds remaining in USD only. */\n of?: string\n code?: string\n}\n\nconst compare = (a: unknown, b: unknown): number => {\n if (typeof a === 'number' && typeof b === 'number') return a - b\n if (a === null || a === undefined) return b === null || b === undefined ? 0 : 1\n if (b === null || b === undefined) return -1\n return String(a).localeCompare(String(b))\n}\n\nfunction matches(row: Row, column: ReadColumn, op: string, given: unknown, today: string): boolean {\n const cell = row[column.name]\n if (op === 'in' || op === 'not_in') {\n const listed = (given as unknown[]).some(one => (column.type === 'number' ? Number(cell) === Number(one) : String(cell ?? '') === String(one)))\n return op === 'in' ? listed : !listed\n }\n const value = column.type === 'date' && isRelativeDate(given) ? resolveRelativeDate(given as string, today) : given\n if (op === 'eq') return column.type === 'number' ? Number(cell) === Number(value) : String(cell ?? '') === String(value)\n if (op === 'ne') return column.type === 'number' ? Number(cell) !== Number(value) : String(cell ?? '') !== String(value)\n if (cell === null || cell === undefined) return false\n /*\n * A date column holds a month, a day or a time - compared as text over the shorter of the two, so a time of\n * 2026-10-01 is within `gte 2026-10-01`, and a pay month 2026-05 is within `gte 2026-05-01` (2026-10-25: compared over\n * the day's length, the first month of 「최근 6개월」 always fell out).\n */\n const shorter = column.type === 'date' ? Math.min(String(cell).length, String(value).length) : String(value).length\n const order = column.type === 'number' ? Number(cell) - Number(value) : String(cell).slice(0, shorter).localeCompare(String(value).slice(0, shorter))\n return op === 'gt' ? order > 0 : op === 'gte' ? order >= 0 : op === 'lt' ? order < 0 : order <= 0\n}\n\n/** The rows of the source, read as the viewer - or why there are none. */\nasync function readSource(source: CardSource, where: Record<string, unknown>, deps: CardRunDeps): Promise<{ rows?: Row[]; total?: number; complete?: boolean; issue?: CardIssue }> {\n if (source.kind === 'list') {\n const { criteria, refused } = readCriteria(source.target!, where)\n if (refused.length) return { issue: { code: 'condition-unreadable', params: { refused } } }\n try {\n const read = await readRows(source.target!, filtersOf(source.target!, criteria), deps.run, typeof criteria.text === 'string' && source.target!.search ? criteria.text : undefined, {\n timeZone: deps.timeZone\n })\n return { rows: read.rows as Row[], total: read.total, complete: read.complete }\n } catch (error: any) {\n return { issue: { code: 'query-failed', params: { message: String(error?.message ?? error) } } }\n }\n }\n const ran = await runDetail(source.detail!, where, deps.run)\n if (ran.error === 'argument-unreadable') return { issue: { code: 'condition-unreadable', params: { refused: ran.refused } } }\n if (ran.error === 'query-failed') return { issue: { code: 'query-failed', params: { message: ran.message } } }\n if (ran.error === 'not-found') return { issue: { code: 'not-found' } }\n const at = source.list!.at\n const items = at ? valueAt(ran.value, at) : ran.value\n /* An empty list is no rows; a path that holds no list is the declaration's mistake, said as such. */\n if (!Array.isArray(items)) return { issue: { code: 'list-missing', params: { read: source.key, list: source.list!.key, at } } }\n const rows = items.slice(0, MAX_READ_ROWS).map(item => rowOf({ columns: source.columns }, item, { timeZone: deps.timeZone }) as Row)\n return { rows, total: items.length, complete: items.length <= MAX_READ_ROWS }\n}\n\n/** The currencies a currency column's rows hold - `unknown` for a row without one. */\nfunction currenciesIn(rows: Row[], column: ReadColumn): string[] {\n const codes = new Set<string>()\n for (const row of rows) codes.add(typeof row[column.currency!] === 'string' && row[column.currency!] ? String(row[column.currency!]) : 'unknown')\n return [...codes].sort()\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100\n\n/**\n * Grouped rows - the group column, a count and each number column summed. A number with a currency is summed per\n * currency; its column is split into one per currency when the rows hold more than one.\n */\nfunction group(rows: Row[], by: ReadColumn, numbers: ReadColumn[]): { rows: Row[]; columns: Shaped[] } {\n const splits = new Map(numbers.filter(one => one.currency).map(one => [one.name, currenciesIn(rows, one)]))\n const columns: Shaped[] = [\n { ...by, type: by.type === 'date' ? 'string' : by.type },\n { name: 'count', type: 'number' },\n ...numbers.flatMap(one => {\n const codes = splits.get(one.name)\n return codes && codes.length > 1 ? codes.map(code => ({ ...one, name: `${one.name}:${code}`, of: one.name, code })) : [{ ...one, ...(codes ? { code: codes[0] } : {}) }]\n })\n ]\n const groups = new Map<string, Row[]>()\n for (const row of rows) {\n const raw = row[by.name]\n const key = raw === null || raw === undefined ? '' : by.type === 'date' ? String(raw).slice(0, 7) : String(raw)\n groups.set(key, [...(groups.get(key) ?? []), row])\n }\n const out = [...groups].map(([key, members]) => {\n const row: Row = { [by.name]: key, count: members.length }\n for (const column of columns.slice(2)) {\n const name = column.of ?? column.name\n const kept = column.of ? members.filter(one => (one[column.currency!] || 'unknown') === column.code) : members\n row[column.name] = round(kept.reduce((sum, one) => sum + (typeof one[name] === 'number' ? (one[name] as number) : 0), 0))\n }\n return row\n })\n return { rows: out, columns }\n}\n\n/** Ungrouped rows with a number column split by currency when the rows hold more than one - each row in its own. */\nfunction splitUngrouped(rows: Row[], columns: ReadColumn[]): { rows: Row[]; columns: Shaped[] } {\n const shaped: Shaped[] = []\n const splits: { column: ReadColumn; codes: string[] }[] = []\n for (const column of columns) {\n const codes = column.currency ? currenciesIn(rows, column) : []\n if (codes.length > 1) {\n splits.push({ column, codes })\n shaped.push(...codes.map(code => ({ ...column, name: `${column.name}:${code}`, of: column.name, code })))\n } else shaped.push({ ...column, ...(codes.length ? { code: codes[0] } : {}) })\n }\n if (!splits.length) return { rows, columns: shaped }\n return {\n rows: rows.map(row => {\n const out: Row = { ...row }\n for (const { column, codes } of splits) {\n const mine = (row[column.currency!] as string) || 'unknown'\n for (const code of codes) out[`${column.name}:${code}`] = code === mine ? row[column.name] : null\n }\n return out\n }),\n columns: shaped\n }\n}\n\n/** The shaped columns a definition's name stands for - one, or one per currency when it was split. */\nconst expand = (columns: Shaped[], name: string) => columns.filter(one => one.name === name || one.of === name)\n\n/** Runs a card's definition as the viewer and draws it as one block. */\nexport async function runCard(definition: CardDefinition, deps: CardRunDeps): Promise<CardRunResult> {\n const asOf = deps.today\n const words = deps.words ?? ((_key: string | undefined, fallback: string) => fallback)\n const { source, issue } = sourceOf(definition?.source, deps.readTargetOf, deps.detailReadOf)\n if (!source) return { issue, asOf }\n const about = { key: source.key, ...(source.labelKey ? { labelKey: source.labelKey } : {}) }\n const issues = checkDefinition(definition, source)\n if (issues.length) return { issue: issues[0], asOf, source: about }\n\n /* ① The viewer may read this source at all - a shared card gives the definition, never the data (decision 6). */\n if (!(await deps.passesDoor(rootFieldOf(source.query, 'query')))) return { issue: { code: 'door-closed' }, asOf, source: about }\n\n const read = await readSource(source, resolveWhere(definition.source.where, asOf, source.conditions), deps)\n if (read.issue) return { issue: read.issue, asOf, source: about }\n const rowsDef = definition.rows ?? {}\n const view = definition.view\n const columns = new Map(source.columns.map(one => [one.name, one]))\n\n /* ② Filter → group → order → cut (decision 4). */\n let rows = read.rows!.filter(row => (rowsDef.match ?? []).every(one => matches(row, columns.get(one.column)!, one.op, one.value, asOf)))\n let shaped: { rows: Row[]; columns: Shaped[] }\n if (rowsDef.groupBy) {\n const by = columns.get(rowsDef.groupBy)!\n const numbers = source.columns.filter(one => one.type === 'number' && one.name !== by.name)\n shaped = group(rows, by, numbers)\n } else shaped = splitUngrouped(rows, source.columns)\n /* A group of rows with no value in the grouped column is said as such, never drawn as a bar without a name. */\n if (rowsDef.groupBy) {\n const blank = words('ai-dashboard.card.blank', '(none)')\n shaped.rows = shaped.rows.map(row => (row[rowsDef.groupBy!] === '' ? { ...row, [rowsDef.groupBy!]: blank } : row))\n }\n rows = shaped.rows\n const shapedCount = rows.length\n\n if (rowsDef.sortBy) {\n const order = expand(shaped.columns, rowsDef.sortBy)\n /* Two currencies have no common order - ranking them would compare yen with won. */\n if (order.length > 1) return { issue: { code: 'mixed-currency-order', params: { column: rowsDef.sortBy, currencies: order.map(one => one.code) } }, asOf, source: about }\n const by = order[0].name\n rows = [...rows].sort((a, b) => (rowsDef.desc ? -compare(a[by], b[by]) : compare(a[by], b[by])))\n }\n const cap = view.kind === 'table' ? MAX_TABLE_ROWS : view.kind === 'number' ? Infinity : MAX_CHART_POINTS\n const limit = Math.min(rowsDef.limit ?? cap, cap)\n if (view.kind !== 'number') rows = rows.slice(0, limit)\n\n const counts: CardCounts = { read: read.rows!.length, total: read.total!, complete: !!read.complete, shaped: shapedCount, shown: view.kind === 'number' ? shapedCount : rows.length }\n const label = (column: Shaped) => {\n const base = column.name === 'count' ? words('ai-dashboard.card.count', 'count') : words(column.labelKey, column.of ?? column.name)\n return column.code && column.of ? `${base} (${column.code})` : base\n }\n /* A unit beside the numbers: a single currency says itself, else the card's own. */\n const unitOf = (drawn: Shaped[]) => {\n const codes = [...new Set(drawn.map(one => one.code).filter(Boolean))]\n return codes.length === 1 && !drawn.some(one => one.of) ? codes[0] : view.unit\n }\n\n if (view.kind === 'number') {\n const names = view.values?.length ? view.values : []\n const drawn = names.flatMap(name => expand(shaped.columns, name))\n const items = drawn.length\n ? drawn.map(column => ({ label: label(column), value: round(rows.reduce((sum, row) => sum + (typeof row[column.name] === 'number' ? (row[column.name] as number) : 0), 0)), ...(column.code && column.code !== 'unknown' ? { unit: column.code } : view.unit ? { unit: view.unit } : {}) }))\n : [{ label: words('ai-dashboard.card.count', 'count'), value: rowsDef.groupBy ? shapedCount : rows.length, ...(view.unit ? { unit: view.unit } : {}) }]\n if (items.length > MAX_FIGURES) return { issue: { code: 'too-many-figures', params: { figures: items.length, max: MAX_FIGURES } }, asOf, source: about, counts }\n return { block: { kind: 'metrics', items }, counts, asOf, source: about }\n }\n\n if (view.kind === 'table') {\n const names = [...(view.columns ?? []), ...(view.values ?? []).filter(one => !(view.columns ?? []).includes(one))]\n const drawn = names.length ? names.flatMap(name => expand(shaped.columns, name)) : shaped.columns\n return {\n block: {\n kind: 'table',\n columns: drawn.map(column => ({ name: column.name, label: label(column), type: column.type })),\n /* A coded value is shown by its word in the viewer's language; the rows were matched and sorted by the code. */\n rows: rows.map(row => Object.fromEntries(drawn.map(column => [column.name, wordOf(column, row[column.name] ?? null, words)])))\n },\n counts,\n asOf,\n source: about\n }\n }\n\n const x = (view.label ?? rowsDef.groupBy)!\n const values = view.values?.length ? view.values : ['count']\n const series = values.flatMap(name => expand(shaped.columns, name))\n if (series.length > MAX_SERIES) return { issue: { code: 'too-many-series', params: { series: series.length, max: MAX_SERIES } }, asOf, source: about, counts }\n return {\n block: {\n kind: 'chart',\n chart: view.kind,\n x: rows.map(row => String(wordOf(shaped.columns.find(one => one.name === x), row[x] ?? '', words) ?? '').slice(0, 60)),\n series: series.map(column => ({ name: label(column), values: rows.map(row => (typeof row[column.name] === 'number' ? (row[column.name] as number) : null)) })),\n ...(unitOf(series) && unitOf(series) !== 'unknown' ? { unit: unitOf(series) } : {})\n },\n counts,\n asOf,\n source: about\n }\n}\n\n/** The columns a definition may name after its `rows` - for a refusal that says what there is. */\nexport { shapedColumnNames }\n"]}
|
|
1
|
+
{"version":3,"file":"card-run.js","sourceRoot":"","sources":["../../../server/service/card/card-run.ts"],"names":[],"mappings":";;;AAwMA,0BAkGC;AA1SD;;;;;;;;;GASG;AACH,+DAAgK;AAEhK,6DAc6B;AAmRpB,kGAxRP,sCAAiB,OAwRO;AAhO1B,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,CAAU,EAAU,EAAE;IACjD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAChE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/E,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAA;IAC5C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3C,CAAC,CAAA;AAED,SAAS,OAAO,CAAC,GAAQ,EAAE,MAAkB,EAAE,EAAU,EAAE,KAAc,EAAE,KAAa;IACtF,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,MAAM,GAAI,KAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC/I,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACvC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,IAAA,mCAAc,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAA,wCAAmB,EAAC,KAAe,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnH,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAA;IACxH,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAA;IACxH,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACrD;;;;OAIG;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;IACnH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;IACrJ,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;AACnG,CAAC;AAED,0EAA0E;AAC1E,KAAK,UAAU,UAAU,CAAC,MAAkB,EAAE,KAA8B,EAAE,IAAiB;IAC7F,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAA,2BAAY,EAAC,MAAM,CAAC,MAAO,EAAE,KAAK,CAAC,CAAA;QACjE,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;QAC3F,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAA,uBAAQ,EAAC,MAAM,CAAC,MAAO,EAAE,IAAA,wBAAS,EAAC,MAAM,CAAC,MAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE;gBACjL,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAA;YACF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAa,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;QACjF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,CAAA;QAClG,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,IAAA,wBAAS,EAAC,MAAM,CAAC,MAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5D,IAAI,GAAG,CAAC,KAAK,KAAK,qBAAqB;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,CAAA;IAC7H,IAAI,GAAG,CAAC,KAAK,KAAK,cAAc;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,CAAA;IAC9G,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAA;IACtE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAK,CAAC,EAAE,CAAA;IAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,IAAA,sBAAO,EAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAA;IACrD,qGAAqG;IACrG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAK,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;IAC/H,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,4BAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,oBAAK,EAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAQ,CAAC,CAAA;IACpI,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,4BAAa,EAAE,CAAA;AAC/E,CAAC;AAED,sFAAsF;AACtF,SAAS,YAAY,CAAC,IAAW,EAAE,MAAkB;IACnD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,QAAS,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACjJ,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;AAEtD;;;GAGG;AACH,SAAS,KAAK,CAAC,IAAW,EAAE,EAAc,EAAE,OAAqB;IAC/D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3G,MAAM,OAAO,GAAa;QACxB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;QACxD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;QACjC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAClC,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1K,CAAC,CAAC;KACH,CAAA;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAA;IACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACxB,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC/G,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE;QAC7C,MAAM,GAAG,GAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAA;QAC1D,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,CAAA;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAS,CAAC,IAAI,SAAS,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;YAC9G,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3H,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAA;AAC/B,CAAC;AAED,oHAAoH;AACpH,SAAS,cAAc,CAAC,IAAW,EAAE,OAAqB;IACxD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,MAAM,GAA8C,EAAE,CAAA;IAC5D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;YAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3G,CAAC;;YAAM,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAChF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IACpD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACnB,MAAM,GAAG,GAAQ,EAAE,GAAG,GAAG,EAAE,CAAA;YAC3B,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAI,GAAG,CAAC,MAAM,CAAC,QAAS,CAAY,IAAI,SAAS,CAAA;gBAC3D,KAAK,MAAM,IAAI,IAAI,KAAK;oBAAE,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACnG,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,CAAC;QACF,OAAO,EAAE,MAAM;KAChB,CAAA;AACH,CAAC;AAED,sGAAsG;AACtG,MAAM,MAAM,GAAG,CAAC,OAAiB,EAAE,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAA;AAE/G,wEAAwE;AACjE,KAAK,UAAU,OAAO,CAAC,UAA0B,EAAE,IAAiB;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAwB,EAAE,QAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAA;IACtF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,6BAAQ,EAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;IAC5F,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACnC,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IAC5F,MAAM,MAAM,GAAG,IAAA,oCAAe,EAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAEnE,iHAAiH;IACjH,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAA,0BAAW,EAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAEhI,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,IAAA,iCAAY,EAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAA;IAC3G,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IACjE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,CAAA;IACrC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAEnE,kDAAkD;IAClD,IAAI,IAAI,GAAG,IAAI,CAAC,IAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IACxI,IAAI,MAA0C,CAAA;IAC9C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAE,CAAA;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,CAAA;QAC3F,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC;;QAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IACpD,+GAA+G;IAC/G,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAA;QACxD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACpH,CAAC;IACD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IAClB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAA;IAE/B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QACpD,oFAAoF;QACpF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QACzK,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACxB,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAClG,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,mCAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,qCAAgB,CAAA;IACzG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG,CAAC,CAAA;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAEvD,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA;IACrL,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;QACnI,OAAO,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IACrE,CAAC,CAAA;IACD,oFAAoF;IACpF,MAAM,MAAM,GAAG,CAAC,KAAe,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACtE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAChF,CAAC,CAAA;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM;YACxB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5R,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,yBAAyB,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACzJ,IAAI,KAAK,CAAC,MAAM,GAAG,gCAAW;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gCAAW,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;QAChK,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC3E,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAClH,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAA;QACjG,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9F,gHAAgH;gBAChH,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAA,qBAAM,EAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aAC/H;YACD,MAAM;YACN,IAAI;YACJ,MAAM,EAAE,KAAK;SACd,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAE,CAAA;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IACnE,IAAI,MAAM,CAAC,MAAM,GAAG,+BAAU;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,+BAAU,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IAC9J,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAA,qBAAM,EAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtH,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9J,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpF;QACD,MAAM;QACN,IAAI;QACJ,MAAM,EAAE,KAAK;KACd,CAAA;AACH,CAAC","sourcesContent":["/*\n * Drawing a card - its definition run as the one looking at it (ADR-0160 decisions 2, 4, 5, 6).\n *\n * The read's door is asked first, with the viewer's request; then the application's query runs with that request,\n * so the rows are those its API gives this person. The rows are filtered, grouped, ordered and cut - in that order -\n * and become one AI 작업 패널 block, already within what the 작업 패널 draws: a card that would need a ninth series or a\n * thirteenth figure is refused, never folded, so two currencies are never added on the way. Nothing is kept.\n *\n * Dependencies come in as arguments - tested without a server.\n */\nimport { filtersOf, MAX_READ_ROWS, readCriteria, readRows, rootFieldOf, rowOf, runDetail, valueAt, wordOf, type ReadColumn } from '@things-factory/ai-assistant'\n\nimport {\n checkDefinition,\n MAX_CHART_POINTS,\n MAX_FIGURES,\n MAX_SERIES,\n MAX_TABLE_ROWS,\n resolveRelativeDate,\n isRelativeDate,\n resolveWhere,\n shapedColumnNames,\n sourceOf,\n type CardDefinition,\n type CardIssue,\n type CardSource\n} from './card-definition.js'\n\ntype Row = Record<string, string | number | null>\ntype Runner = (document: string, variables: Record<string, unknown>) => Promise<{ data?: any; errors?: readonly { message: string }[] }>\n\nexport interface CardRunDeps {\n readTargetOf(key: string): any\n detailReadOf(key: string): any\n /** Whether the viewer passes a door (`Query.receivables`) - their request's answer. */\n passesDoor(door: string): Promise<boolean>\n /** The application's API with the viewer's request state. */\n run: Runner\n /** Today in the domain's time zone - `YYYY-MM-DD`. */\n today: string\n /** The domain's time zone - a moment in the rows is read in it. */\n timeZone?: string\n /** The reader's words for a label key. */\n words?(key: string | undefined, fallback: string): string\n}\n\n/** How much of the source the card was drawn from - said on the card (decision 4). */\nexport interface CardCounts {\n /** Rows read from the source. */\n read: number\n /** Rows the source holds. */\n total: number\n /** Every row of the source was read. */\n complete: boolean\n /** Rows (or groups) after filtering and grouping, before the cut. */\n shaped: number\n /** Rows (or points) drawn. */\n shown: number\n}\n\nexport interface CardRunResult {\n /** One AI 작업 패널 block - metrics, table or chart. */\n block?: Record<string, unknown>\n issue?: CardIssue\n counts?: CardCounts\n /** The day relative conditions were read for. */\n asOf: string\n source?: { key: string; labelKey?: string }\n}\n\n/** A column of the shaped rows, with the currency its sums are kept in. */\ninterface Shaped extends ReadColumn {\n /** Set on a column split by currency: `remaining:USD` holds remaining in USD only. */\n of?: string\n code?: string\n}\n\nconst compare = (a: unknown, b: unknown): number => {\n if (typeof a === 'number' && typeof b === 'number') return a - b\n if (a === null || a === undefined) return b === null || b === undefined ? 0 : 1\n if (b === null || b === undefined) return -1\n return String(a).localeCompare(String(b))\n}\n\nfunction matches(row: Row, column: ReadColumn, op: string, given: unknown, today: string): boolean {\n const cell = row[column.name]\n if (op === 'in' || op === 'not_in') {\n const listed = (given as unknown[]).some(one => (column.type === 'number' ? Number(cell) === Number(one) : String(cell ?? '') === String(one)))\n return op === 'in' ? listed : !listed\n }\n const value = column.type === 'date' && isRelativeDate(given) ? resolveRelativeDate(given as string, today) : given\n if (op === 'eq') return column.type === 'number' ? Number(cell) === Number(value) : String(cell ?? '') === String(value)\n if (op === 'ne') return column.type === 'number' ? Number(cell) !== Number(value) : String(cell ?? '') !== String(value)\n if (cell === null || cell === undefined) return false\n /*\n * A date column holds a month, a day or a time - compared as text over the shorter of the two, so a time of\n * 2026-10-01 is within `gte 2026-10-01`, and a pay month 2026-05 is within `gte 2026-05-01` (2026-10-25: compared over\n * the day's length, the first month of 「최근 6개월」 always fell out).\n */\n const shorter = column.type === 'date' ? Math.min(String(cell).length, String(value).length) : String(value).length\n const order = column.type === 'number' ? Number(cell) - Number(value) : String(cell).slice(0, shorter).localeCompare(String(value).slice(0, shorter))\n return op === 'gt' ? order > 0 : op === 'gte' ? order >= 0 : op === 'lt' ? order < 0 : order <= 0\n}\n\n/** The rows of the source, read as the viewer - or why there are none. */\nasync function readSource(source: CardSource, where: Record<string, unknown>, deps: CardRunDeps): Promise<{ rows?: Row[]; total?: number; complete?: boolean; issue?: CardIssue }> {\n if (source.kind === 'list') {\n const { criteria, refused } = readCriteria(source.target!, where)\n if (refused.length) return { issue: { code: 'condition-unreadable', params: { refused } } }\n try {\n const read = await readRows(source.target!, filtersOf(source.target!, criteria), deps.run, typeof criteria.text === 'string' && source.target!.search ? criteria.text : undefined, {\n timeZone: deps.timeZone\n })\n return { rows: read.rows as Row[], total: read.total, complete: read.complete }\n } catch (error: any) {\n return { issue: { code: 'query-failed', params: { message: String(error?.message ?? error) } } }\n }\n }\n const ran = await runDetail(source.detail!, where, deps.run)\n if (ran.error === 'argument-unreadable') return { issue: { code: 'condition-unreadable', params: { refused: ran.refused } } }\n if (ran.error === 'query-failed') return { issue: { code: 'query-failed', params: { message: ran.message } } }\n if (ran.error === 'not-found') return { issue: { code: 'not-found' } }\n const at = source.list!.at\n const items = at ? valueAt(ran.value, at) : ran.value\n /* An empty list is no rows; a path that holds no list is the declaration's mistake, said as such. */\n if (!Array.isArray(items)) return { issue: { code: 'list-missing', params: { read: source.key, list: source.list!.key, at } } }\n const rows = items.slice(0, MAX_READ_ROWS).map(item => rowOf({ columns: source.columns }, item, { timeZone: deps.timeZone }) as Row)\n return { rows, total: items.length, complete: items.length <= MAX_READ_ROWS }\n}\n\n/** The currencies a currency column's rows hold - `unknown` for a row without one. */\nfunction currenciesIn(rows: Row[], column: ReadColumn): string[] {\n const codes = new Set<string>()\n for (const row of rows) codes.add(typeof row[column.currency!] === 'string' && row[column.currency!] ? String(row[column.currency!]) : 'unknown')\n return [...codes].sort()\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100\n\n/**\n * Grouped rows - the group column, a count and each number column summed. A number with a currency is summed per\n * currency; its column is split into one per currency when the rows hold more than one.\n */\nfunction group(rows: Row[], by: ReadColumn, numbers: ReadColumn[]): { rows: Row[]; columns: Shaped[] } {\n const splits = new Map(numbers.filter(one => one.currency).map(one => [one.name, currenciesIn(rows, one)]))\n const columns: Shaped[] = [\n { ...by, type: by.type === 'date' ? 'string' : by.type },\n { name: 'count', type: 'number' },\n ...numbers.flatMap(one => {\n const codes = splits.get(one.name)\n return codes && codes.length > 1 ? codes.map(code => ({ ...one, name: `${one.name}:${code}`, of: one.name, code })) : [{ ...one, ...(codes ? { code: codes[0] } : {}) }]\n })\n ]\n const groups = new Map<string, Row[]>()\n for (const row of rows) {\n const raw = row[by.name]\n const key = raw === null || raw === undefined ? '' : by.type === 'date' ? String(raw).slice(0, 7) : String(raw)\n groups.set(key, [...(groups.get(key) ?? []), row])\n }\n const out = [...groups].map(([key, members]) => {\n const row: Row = { [by.name]: key, count: members.length }\n for (const column of columns.slice(2)) {\n const name = column.of ?? column.name\n const kept = column.of ? members.filter(one => (one[column.currency!] || 'unknown') === column.code) : members\n row[column.name] = round(kept.reduce((sum, one) => sum + (typeof one[name] === 'number' ? (one[name] as number) : 0), 0))\n }\n return row\n })\n return { rows: out, columns }\n}\n\n/** Ungrouped rows with a number column split by currency when the rows hold more than one - each row in its own. */\nfunction splitUngrouped(rows: Row[], columns: ReadColumn[]): { rows: Row[]; columns: Shaped[] } {\n const shaped: Shaped[] = []\n const splits: { column: ReadColumn; codes: string[] }[] = []\n for (const column of columns) {\n const codes = column.currency ? currenciesIn(rows, column) : []\n if (codes.length > 1) {\n splits.push({ column, codes })\n shaped.push(...codes.map(code => ({ ...column, name: `${column.name}:${code}`, of: column.name, code })))\n } else shaped.push({ ...column, ...(codes.length ? { code: codes[0] } : {}) })\n }\n if (!splits.length) return { rows, columns: shaped }\n return {\n rows: rows.map(row => {\n const out: Row = { ...row }\n for (const { column, codes } of splits) {\n const mine = (row[column.currency!] as string) || 'unknown'\n for (const code of codes) out[`${column.name}:${code}`] = code === mine ? row[column.name] : null\n }\n return out\n }),\n columns: shaped\n }\n}\n\n/** The shaped columns a definition's name stands for - one, or one per currency when it was split. */\nconst expand = (columns: Shaped[], name: string) => columns.filter(one => one.name === name || one.of === name)\n\n/** Runs a card's definition as the viewer and draws it as one block. */\nexport async function runCard(definition: CardDefinition, deps: CardRunDeps): Promise<CardRunResult> {\n const asOf = deps.today\n const words = deps.words ?? ((_key: string | undefined, fallback: string) => fallback)\n const { source, issue } = sourceOf(definition?.source, deps.readTargetOf, deps.detailReadOf)\n if (!source) return { issue, asOf }\n const about = { key: source.key, ...(source.labelKey ? { labelKey: source.labelKey } : {}) }\n const issues = checkDefinition(definition, source)\n if (issues.length) return { issue: issues[0], asOf, source: about }\n\n /* ① The viewer may read this source at all - a shared card gives the definition, never the data (decision 6). */\n if (!(await deps.passesDoor(rootFieldOf(source.query, 'query')))) return { issue: { code: 'door-closed' }, asOf, source: about }\n\n const read = await readSource(source, resolveWhere(definition.source.where, asOf, source.conditions), deps)\n if (read.issue) return { issue: read.issue, asOf, source: about }\n const rowsDef = definition.rows ?? {}\n const view = definition.view\n const columns = new Map(source.columns.map(one => [one.name, one]))\n\n /* ② Filter → group → order → cut (decision 4). */\n let rows = read.rows!.filter(row => (rowsDef.match ?? []).every(one => matches(row, columns.get(one.column)!, one.op, one.value, asOf)))\n let shaped: { rows: Row[]; columns: Shaped[] }\n if (rowsDef.groupBy) {\n const by = columns.get(rowsDef.groupBy)!\n const numbers = source.columns.filter(one => one.type === 'number' && one.name !== by.name)\n shaped = group(rows, by, numbers)\n } else shaped = splitUngrouped(rows, source.columns)\n /* A group of rows with no value in the grouped column is said as such, never drawn as a bar without a name. */\n if (rowsDef.groupBy) {\n const blank = words('ai-dashboard.card.blank', '(none)')\n shaped.rows = shaped.rows.map(row => (row[rowsDef.groupBy!] === '' ? { ...row, [rowsDef.groupBy!]: blank } : row))\n }\n rows = shaped.rows\n const shapedCount = rows.length\n\n if (rowsDef.sortBy) {\n const order = expand(shaped.columns, rowsDef.sortBy)\n /* Two currencies have no common order - ranking them would compare yen with won. */\n if (order.length > 1) return { issue: { code: 'mixed-currency-order', params: { column: rowsDef.sortBy, currencies: order.map(one => one.code) } }, asOf, source: about }\n const by = order[0].name\n rows = [...rows].sort((a, b) => (rowsDef.desc ? -compare(a[by], b[by]) : compare(a[by], b[by])))\n }\n const cap = view.kind === 'table' ? MAX_TABLE_ROWS : view.kind === 'number' ? Infinity : MAX_CHART_POINTS\n const limit = Math.min(rowsDef.limit ?? cap, cap)\n if (view.kind !== 'number') rows = rows.slice(0, limit)\n\n const counts: CardCounts = { read: read.rows!.length, total: read.total!, complete: !!read.complete, shaped: shapedCount, shown: view.kind === 'number' ? shapedCount : rows.length }\n const label = (column: Shaped) => {\n const base = column.name === 'count' ? words('ai-dashboard.card.count', 'count') : words(column.labelKey, column.of ?? column.name)\n return column.code && column.of ? `${base} (${column.code})` : base\n }\n /* A unit beside the numbers: a single currency says itself, else the card's own. */\n const unitOf = (drawn: Shaped[]) => {\n const codes = [...new Set(drawn.map(one => one.code).filter(Boolean))]\n return codes.length === 1 && !drawn.some(one => one.of) ? codes[0] : view.unit\n }\n\n if (view.kind === 'number') {\n const names = view.values?.length ? view.values : []\n const drawn = names.flatMap(name => expand(shaped.columns, name))\n const items = drawn.length\n ? drawn.map(column => ({ label: label(column), value: round(rows.reduce((sum, row) => sum + (typeof row[column.name] === 'number' ? (row[column.name] as number) : 0), 0)), ...(column.code && column.code !== 'unknown' ? { unit: column.code } : view.unit ? { unit: view.unit } : {}) }))\n : [{ label: words('ai-dashboard.card.count', 'count'), value: rowsDef.groupBy ? shapedCount : rows.length, ...(view.unit ? { unit: view.unit } : {}) }]\n if (items.length > MAX_FIGURES) return { issue: { code: 'too-many-figures', params: { figures: items.length, max: MAX_FIGURES } }, asOf, source: about, counts }\n return { block: { kind: 'metrics', items }, counts, asOf, source: about }\n }\n\n if (view.kind === 'table') {\n const names = [...(view.columns ?? []), ...(view.values ?? []).filter(one => !(view.columns ?? []).includes(one))]\n const drawn = names.length ? names.flatMap(name => expand(shaped.columns, name)) : shaped.columns\n return {\n block: {\n kind: 'table',\n columns: drawn.map(column => ({ name: column.name, label: label(column), type: column.type })),\n /* A coded value is shown by its word in the viewer's language; the rows were matched and sorted by the code. */\n rows: rows.map(row => Object.fromEntries(drawn.map(column => [column.name, wordOf(column, row[column.name] ?? null, words)])))\n },\n counts,\n asOf,\n source: about\n }\n }\n\n const x = (view.label ?? rowsDef.groupBy)!\n const values = view.values?.length ? view.values : ['count']\n const series = values.flatMap(name => expand(shaped.columns, name))\n if (series.length > MAX_SERIES) return { issue: { code: 'too-many-series', params: { series: series.length, max: MAX_SERIES } }, asOf, source: about, counts }\n return {\n block: {\n kind: 'chart',\n chart: view.kind,\n x: rows.map(row => String(wordOf(shaped.columns.find(one => one.name === x), row[x] ?? '', words) ?? '').slice(0, 60)),\n series: series.map(column => ({ name: label(column), values: rows.map(row => (typeof row[column.name] === 'number' ? (row[column.name] as number) : null)) })),\n ...(unitOf(series) && unitOf(series) !== 'unknown' ? { unit: unitOf(series) } : {})\n },\n counts,\n asOf,\n source: about\n }\n}\n\n/** The columns a definition may name after its `rows` - for a refusal that says what there is. */\nexport { shapedColumnNames }\n"]}
|