Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f144519
fix(layout-engine): balance explicit equal-width continuous columns
tupizz Jun 3, 2026
5b96267
fix(layout-adapter): honor per-column w:space for unequal columns
tupizz Jun 3, 2026
1dd2964
Merge branch 'main' into tadeu/sd-2324-feature-render-multi-columns-w…
caio-pizzol Jun 3, 2026
40d4aa2
fix(columns): equal-mode column correctness + explicit count cap (SD-…
caio-pizzol Jun 3, 2026
9ad7abd
test(columns): cover valid-width count cap, equal-mode count, and abs…
caio-pizzol Jun 4, 2026
9653283
feat(columns): add per-column gaps field to ColumnLayout (SD-2629 fou…
caio-pizzol Jun 4, 2026
583b63e
feat(columns): resolved column-geometry API + helpers (SD-2629 step 1)
caio-pizzol Jun 4, 2026
7f7954d
feat(columns): geometry API + resolveColumnMode exports, gaps in equa…
caio-pizzol Jun 4, 2026
5781d57
feat(columns): extraction emits per-column gaps from paired <w:col> r…
caio-pizzol Jun 4, 2026
89f1c1c
fix(columns): explicit scalar gap from first valid column, not first …
caio-pizzol Jun 4, 2026
d3db07e
feat(columns): single resolved-count authority; paginator fill stops …
caio-pizzol Jun 4, 2026
d411e5b
chore(columns): replace em dashes in comments with hyphens/colons (SD…
caio-pizzol Jun 4, 2026
bf1b32d
feat(columns): route all raw column-count decisions through resolveCo…
caio-pizzol Jun 4, 2026
c15b5a4
feat(columns): resolve render-facing column metadata, no phantom colu…
caio-pizzol Jun 4, 2026
282fde6
fix(columns): resolveColumnLayout drops equal-mode widths; resolve re…
caio-pizzol Jun 4, 2026
00c74e3
feat(columns): state-aware column geometry helpers; getCurrentColumnW…
caio-pizzol Jun 4, 2026
fd5b55e
fix(columns): geometry-for-state uses page column snapshot, not globa…
caio-pizzol Jun 4, 2026
664be87
feat(columns): placement reads state-aware columnX(state) via columnX…
caio-pizzol Jun 4, 2026
6e278de
fix(columns): state-aware image width read; drawing test mocks take c…
caio-pizzol Jun 4, 2026
28c259d
feat(columns): renderer separators read resolved geometry, not re-der…
caio-pizzol Jun 4, 2026
3894087
fix(columns): restore equal-mode narrow-column separator guard after …
caio-pizzol Jun 4, 2026
d1dd751
fix(columns): key renderer equal-mode guard on resolveColumnMode, not…
caio-pizzol Jun 4, 2026
fc7941f
chore(columns): remove dead paginator.columnX and its getCurrentColum…
caio-pizzol Jun 4, 2026
273f2c6
chore(columns): remove dead NormalizedColumns type from paginator (SD…
caio-pizzol Jun 4, 2026
017d481
feat(columns): region/cache change-detection uses render equality, no…
caio-pizzol Jun 4, 2026
6c2b34d
Merge branch 'main' into caio-pizzol/sd-2629-column-geometry
harbournick Jun 5, 2026
bdb3bab
fix(columns): ignore gaps-only deltas until geometry uses them
harbournick Jun 5, 2026
d51920b
chore(tests): fix stale test expectation
harbournick Jun 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8,357 changes: 3,764 additions & 4,593 deletions apps/mcp/src/generated/catalog.ts

Large diffs are not rendered by default.

207 changes: 138 additions & 69 deletions apps/mcp/src/generated/intent-dispatch.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,117 +10,186 @@ export function dispatchIntentTool(
case 'superdoc_get_content': {
const { action, ...rest } = args;
switch (action) {
case 'text': return execute('doc.getText', rest);
case 'markdown': return execute('doc.getMarkdown', rest);
case 'html': return execute('doc.getHtml', rest);
case 'info': return execute('doc.info', rest);
case 'extract': return execute('doc.extract', rest);
case 'blocks': return execute('doc.blocks.list', rest);
default: throw new Error(`Unknown action for superdoc_get_content: ${action}`);
case 'text':
return execute('doc.getText', rest);
case 'markdown':
return execute('doc.getMarkdown', rest);
case 'html':
return execute('doc.getHtml', rest);
case 'info':
return execute('doc.info', rest);
case 'extract':
return execute('doc.extract', rest);
case 'blocks':
return execute('doc.blocks.list', rest);
default:
throw new Error(`Unknown action for superdoc_get_content: ${action}`);
}
}
case 'superdoc_edit': {
const { action, ...rest } = args;
switch (action) {
case 'insert': return execute('doc.insert', rest);
case 'replace': return execute('doc.replace', rest);
case 'delete': return execute('doc.delete', rest);
case 'undo': return execute('doc.history.undo', rest);
case 'redo': return execute('doc.history.redo', rest);
default: throw new Error(`Unknown action for superdoc_edit: ${action}`);
case 'insert':
return execute('doc.insert', rest);
case 'replace':
return execute('doc.replace', rest);
case 'delete':
return execute('doc.delete', rest);
case 'undo':
return execute('doc.history.undo', rest);
case 'redo':
return execute('doc.history.redo', rest);
default:
throw new Error(`Unknown action for superdoc_edit: ${action}`);
}
}
case 'superdoc_format': {
const { action, ...rest } = args;
switch (action) {
case 'inline': return execute('doc.format.apply', rest);
case 'set_style': return execute('doc.styles.paragraph.setStyle', rest);
case 'set_alignment': return execute('doc.format.paragraph.setAlignment', rest);
case 'set_indentation': return execute('doc.format.paragraph.setIndentation', rest);
case 'set_spacing': return execute('doc.format.paragraph.setSpacing', rest);
case 'set_flow_options': return execute('doc.format.paragraph.setFlowOptions', rest);
case 'set_direction': return execute('doc.format.paragraph.setDirection', rest);
default: throw new Error(`Unknown action for superdoc_format: ${action}`);
case 'inline':
return execute('doc.format.apply', rest);
case 'set_style':
return execute('doc.styles.paragraph.setStyle', rest);
case 'set_alignment':
return execute('doc.format.paragraph.setAlignment', rest);
case 'set_indentation':
return execute('doc.format.paragraph.setIndentation', rest);
case 'set_spacing':
return execute('doc.format.paragraph.setSpacing', rest);
case 'set_flow_options':
return execute('doc.format.paragraph.setFlowOptions', rest);
case 'set_direction':
return execute('doc.format.paragraph.setDirection', rest);
default:
throw new Error(`Unknown action for superdoc_format: ${action}`);
}
}
case 'superdoc_create': {
const { action, ...rest } = args;
switch (action) {
case 'paragraph': return execute('doc.create.paragraph', rest);
case 'heading': return execute('doc.create.heading', rest);
case 'table': return execute('doc.create.table', rest);
default: throw new Error(`Unknown action for superdoc_create: ${action}`);
case 'paragraph':
return execute('doc.create.paragraph', rest);
case 'heading':
return execute('doc.create.heading', rest);
case 'table':
return execute('doc.create.table', rest);
default:
throw new Error(`Unknown action for superdoc_create: ${action}`);
}
}
case 'superdoc_list': {
const { action, ...rest } = args;
switch (action) {
case 'insert': return execute('doc.lists.insert', rest);
case 'create': return execute('doc.lists.create', rest);
case 'attach': return execute('doc.lists.attach', rest);
case 'detach': return execute('doc.lists.detach', rest);
case 'delete': return execute('doc.lists.delete', rest);
case 'indent': return execute('doc.lists.indent', rest);
case 'outdent': return execute('doc.lists.outdent', rest);
case 'merge': return execute('doc.lists.merge', rest);
case 'split': return execute('doc.lists.split', rest);
case 'set_level': return execute('doc.lists.setLevel', rest);
case 'set_value': return execute('doc.lists.setValue', rest);
case 'continue_previous': return execute('doc.lists.continuePrevious', rest);
case 'set_type': return execute('doc.lists.setType', rest);
default: throw new Error(`Unknown action for superdoc_list: ${action}`);
case 'insert':
return execute('doc.lists.insert', rest);
case 'create':
return execute('doc.lists.create', rest);
case 'attach':
return execute('doc.lists.attach', rest);
case 'detach':
return execute('doc.lists.detach', rest);
case 'delete':
return execute('doc.lists.delete', rest);
case 'indent':
return execute('doc.lists.indent', rest);
case 'outdent':
return execute('doc.lists.outdent', rest);
case 'merge':
return execute('doc.lists.merge', rest);
case 'split':
return execute('doc.lists.split', rest);
case 'set_level':
return execute('doc.lists.setLevel', rest);
case 'set_value':
return execute('doc.lists.setValue', rest);
case 'continue_previous':
return execute('doc.lists.continuePrevious', rest);
case 'set_type':
return execute('doc.lists.setType', rest);
default:
throw new Error(`Unknown action for superdoc_list: ${action}`);
}
}
case 'superdoc_comment': {
const { action, ...rest } = args;
switch (action) {
case 'create': return execute('doc.comments.create', rest);
case 'update': return execute('doc.comments.patch', rest);
case 'delete': return execute('doc.comments.delete', rest);
case 'get': return execute('doc.comments.get', rest);
case 'list': return execute('doc.comments.list', rest);
default: throw new Error(`Unknown action for superdoc_comment: ${action}`);
case 'create':
return execute('doc.comments.create', rest);
case 'update':
return execute('doc.comments.patch', rest);
case 'delete':
return execute('doc.comments.delete', rest);
case 'get':
return execute('doc.comments.get', rest);
case 'list':
return execute('doc.comments.list', rest);
default:
throw new Error(`Unknown action for superdoc_comment: ${action}`);
}
}
case 'superdoc_track_changes': {
const { action, ...rest } = args;
switch (action) {
case 'list': return execute('doc.trackChanges.list', rest);
case 'decide': return execute('doc.trackChanges.decide', rest);
default: throw new Error(`Unknown action for superdoc_track_changes: ${action}`);
case 'list':
return execute('doc.trackChanges.list', rest);
case 'decide':
return execute('doc.trackChanges.decide', rest);
default:
throw new Error(`Unknown action for superdoc_track_changes: ${action}`);
}
}
case 'superdoc_search':
return execute('doc.query.match', args);
case 'superdoc_mutations': {
const { action, ...rest } = args;
switch (action) {
case 'preview': return execute('doc.mutations.preview', rest);
case 'apply': return execute('doc.mutations.apply', rest);
default: throw new Error(`Unknown action for superdoc_mutations: ${action}`);
case 'preview':
return execute('doc.mutations.preview', rest);
case 'apply':
return execute('doc.mutations.apply', rest);
default:
throw new Error(`Unknown action for superdoc_mutations: ${action}`);
}
}
case 'superdoc_table': {
const { action, ...rest } = args;
switch (action) {
case 'delete': return execute('doc.tables.delete', rest);
case 'set_layout': return execute('doc.tables.setLayout', rest);
case 'insert_row': return execute('doc.tables.insertRow', rest);
case 'delete_row': return execute('doc.tables.deleteRow', rest);
case 'set_row': return execute('doc.tables.setRowHeight', rest);
case 'set_row_options': return execute('doc.tables.setRowOptions', rest);
case 'insert_column': return execute('doc.tables.insertColumn', rest);
case 'delete_column': return execute('doc.tables.deleteColumn', rest);
case 'set_column': return execute('doc.tables.setColumnWidth', rest);
case 'merge_cells': return execute('doc.tables.mergeCells', rest);
case 'unmerge_cells': return execute('doc.tables.unmergeCells', rest);
case 'set_cell': return execute('doc.tables.setCellProperties', rest);
case 'set_cell_text': return execute('doc.tables.setCellText', rest);
case 'set_shading': return execute('doc.tables.setShading', rest);
case 'set_style_options': return execute('doc.tables.applyStyle', rest);
case 'set_borders': return execute('doc.tables.setBorders', rest);
case 'set_options': return execute('doc.tables.setTableOptions', rest);
default: throw new Error(`Unknown action for superdoc_table: ${action}`);
case 'delete':
return execute('doc.tables.delete', rest);
case 'set_layout':
return execute('doc.tables.setLayout', rest);
case 'insert_row':
return execute('doc.tables.insertRow', rest);
case 'delete_row':
return execute('doc.tables.deleteRow', rest);
case 'set_row':
return execute('doc.tables.setRowHeight', rest);
case 'set_row_options':
return execute('doc.tables.setRowOptions', rest);
case 'insert_column':
return execute('doc.tables.insertColumn', rest);
case 'delete_column':
return execute('doc.tables.deleteColumn', rest);
case 'set_column':
return execute('doc.tables.setColumnWidth', rest);
case 'merge_cells':
return execute('doc.tables.mergeCells', rest);
case 'unmerge_cells':
return execute('doc.tables.unmergeCells', rest);
case 'set_cell':
return execute('doc.tables.setCellProperties', rest);
case 'set_cell_text':
return execute('doc.tables.setCellText', rest);
case 'set_shading':
return execute('doc.tables.setShading', rest);
case 'set_style_options':
return execute('doc.tables.applyStyle', rest);
case 'set_borders':
return execute('doc.tables.setBorders', rest);
case 'set_options':
return execute('doc.tables.setTableOptions', rest);
default:
throw new Error(`Unknown action for superdoc_table: ${action}`);
}
}
default:
Expand Down
6 changes: 2 additions & 4 deletions packages/document-api/src/contract/contract.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,8 @@ const TEMPLATES_APPLY_RECEIPT_FAILURE_CODES = [

// Exhaustiveness: assigning the union to the array's element type (and vice
// versa) guarantees the list above covers every TemplatesApplyFailureCode value.
type _TemplatesFailureCoverageForward = TemplatesApplyFailureCode extends
(typeof TEMPLATES_APPLY_RECEIPT_FAILURE_CODES)[number]
? true
: never;
type _TemplatesFailureCoverageForward =
TemplatesApplyFailureCode extends (typeof TEMPLATES_APPLY_RECEIPT_FAILURE_CODES)[number] ? true : never;
const _templatesFailureCoverage: _TemplatesFailureCoverageForward = true;
void _templatesFailureCoverage;

Expand Down
8 changes: 4 additions & 4 deletions packages/document-api/src/contract/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@
const entityAddressSchema = ref('EntityAddress');
const selectionTargetSchema = ref('SelectionTarget');
const commentTrackedChangeLinkSchema = ref('CommentTrackedChangeLink');
const targetLocatorSchema = ref('TargetLocator');

Check warning on line 647 in packages/document-api/src/contract/schemas.ts

View workflow job for this annotation

GitHub Actions / build

'targetLocatorSchema' is assigned a value but never used. Allowed unused vars must match /^_/u
const deleteBehaviorSchema = ref('DeleteBehavior');
const resolvedHandleSchema = ref('ResolvedHandle');
const pageInfoSchema = ref('PageInfo');
Expand Down Expand Up @@ -926,7 +926,7 @@
text: { type: 'string' },
});

const nodeInfoSchema: JsonSchema = {

Check warning on line 929 in packages/document-api/src/contract/schemas.ts

View workflow job for this annotation

GitHub Actions / build

'nodeInfoSchema' is assigned a value but never used. Allowed unused vars must match /^_/u
type: 'object',
required: ['nodeType', 'kind'],
properties: {
Expand All @@ -942,7 +942,7 @@
additionalProperties: false,
};

const matchContextSchema = objectSchema(

Check warning on line 945 in packages/document-api/src/contract/schemas.ts

View workflow job for this annotation

GitHub Actions / build

'matchContextSchema' is assigned a value but never used. Allowed unused vars must match /^_/u
{
address: nodeAddressSchema,
snippet: { type: 'string' },
Expand All @@ -953,7 +953,7 @@
['address', 'snippet', 'highlightRange'],
);

const unknownNodeDiagnosticSchema = objectSchema(

Check warning on line 956 in packages/document-api/src/contract/schemas.ts

View workflow job for this annotation

GitHub Actions / build

'unknownNodeDiagnosticSchema' is assigned a value but never used. Allowed unused vars must match /^_/u
{
message: { type: 'string' },
address: nodeAddressSchema,
Expand Down Expand Up @@ -3816,10 +3816,10 @@
'sectionDefaults',
],
};
const scopeReportSchema = objectSchema(
{ scope: scopeEnum, part: { type: 'string' }, detail: { type: 'string' } },
['scope', 'part'],
);
const scopeReportSchema = objectSchema({ scope: scopeEnum, part: { type: 'string' }, detail: { type: 'string' } }, [
'scope',
'part',
]);
const scopeSkipSchema = objectSchema(
{
scope: { type: 'string' },
Expand Down
6 changes: 3 additions & 3 deletions packages/document-api/src/templates/apply.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,9 @@ describe('executeTemplatesApply contract', () => {

it('throws INVALID_INPUT when path source has empty path', () => {
const adapter = makeAdapter();
expect(() =>
executeTemplatesApply(adapter, { source: { kind: 'path', path: '' } } as TemplatesApplyInput),
).toThrow(DocumentApiValidationError);
expect(() => executeTemplatesApply(adapter, { source: { kind: 'path', path: '' } } as TemplatesApplyInput)).toThrow(
DocumentApiValidationError,
);
});

it('throws INVALID_INPUT when base64 source has empty data', () => {
Expand Down
6 changes: 1 addition & 5 deletions packages/document-api/src/templates/apply.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,7 @@ export interface TemplateScopeReport {
detail?: string;
}

export type TemplateSkipReason =
| 'NOT_PRESENT_IN_SOURCE'
| 'OUT_OF_SCOPE'
| 'NO_CHANGE'
| 'CAPABILITY_UNAVAILABLE';
export type TemplateSkipReason = 'NOT_PRESENT_IN_SOURCE' | 'OUT_OF_SCOPE' | 'NO_CHANGE' | 'CAPABILITY_UNAVAILABLE';

export interface TemplateScopeSkip {
scope: string;
Expand Down
Loading
Loading