Commit Graph
237 Commits
Author SHA1 Message Date
dotCooCoo 656d63e4d2 Merge main into feat/learn-panel 2026-11-11 23:31:06 -08:00
BFlat 48e066f475 Merge pull request #6755 from dotCooCoo/fix/ui-params-wrong-type
Commands: app and control channel params of the wrong type are refused
2026-11-12 14:17:29 +07:00
BFlat 5e63104d88 Merge pull request #6800 from dotCooCoo/fix/plugin-automation-install-approval
Plug-ins: an install that automation asked for is not approved in its dialog
2026-11-12 14:16:59 +07:00
BFlat ccfe14f671 Merge pull request #6799 from Hassan1305/docs-6340-followup
Commands: draw_shape and object.reflect say which way they turn (#6340 follow-up)
2026-11-12 14:15:37 +07:00
dotCooCoo 023d2c6c39 Plug-ins: ui.installPlugin's description says it answers null when the web picker opens 2026-11-11 22:26:03 -08:00
dotCooCoo ad05c3b99d Plug-ins: an install that automation asked for is not approved in its dialog
An approval question that a control request, MCP, injected input, or a
file dialog one of them opened leads to now keeps OK disabled and
refuses every confirm, a person's click included. The dialog says to
choose Object › Plug-ins › Install Plug-in…, and ui.installPlugin answers
approval: "personMustStartInstall". The person's own Install Plug-in…,
File › Open or drop inspects the module again and asks a new question
with its half-second delay.

The origin is fixed when the request is made and goes with a native
file dialog's deferred answer and the web picker's answers, which now
arrive apart from drops and from window.vectorcraft.openFile (always
automation). A question about taking another module's place now opens
in the approval dialog, and automation's replace: true no longer skips
it. A module that needs no approval still installs at once.
2026-11-11 21:56:58 -08:00
HassanKhan 386e405800 Commands: draw_shape and object.reflect say which way they turn; test the notes the key walk misses (#6340)
draw_shape's rotation also turns rectangles and ellipses; object.reflect's numeric axis is counter-clockwise from horizontal. A test covers that axis and the Scatter brush's rotation range, which every_turn_param_says_which_way_it_turns can't reach.
2026-11-12 10:47:06 +05:00
dotCooCoo 832fad16e0 Merge main into feat/hang-report 2026-11-11 21:17:30 -08:00
dotCooCoo e83c36785e Commands: pointer events refuse pen values and spaces of the wrong type
ui.pointer and the headless pointer call read a pointer event's pressure,
holdMs, tiltX, tiltY and rotation with a default for any value that was not a
number, and treated any space other than screen as document space. Each event
is now checked before the packet runs: those values must be numbers and space
must be doc or screen, with null keeping the default. docs/mcp.md says so.
2026-11-11 21:04:01 -08:00
BFlat aa4657e1ce Merge pull request #6704 from dotCooCoo/fix/shape-tool-handles-scale
Shape tools: a drag on a bounding-box handle scales the selection
2026-11-12 11:43:06 +07:00
dotCooCoo 7c28138ce3 Commands: pointer packets are read whole before any event runs
A headless or control channel pointer packet now checks every event's kind,
coordinates and mods before it sends any of them, so a malformed later event
no longer leaves the earlier ones applied. A mods value that is not an object,
such as an array, is refused. Rotate View takes null mods as omitted. The MCP
docs name the params that refuse null.
2026-11-11 19:57:39 -08:00
dotCooCoo 396de45501 Merge main into feat/learn-panel 2026-11-11 19:10:42 -08:00
dotCooCoo 4f08f19ce4 Learn: a Learn panel lists tutorials by skill, opened from Explore tutorials on the app bar
Window › Learn and a new Explore tutorials button beside the search icon on
the app bar show and hide the Learn panel. Its For you tab holds a Get started
section with a Quick skill guide card that opens the Skills tab. The Skills tab
lists VectorCraft's own skills with their tutorial counts and empty progress
rings; a skill lists its tutorials, a tutorial shows its numbered steps, and
Back goes up one level. The tutorials live in a data catalog whose test checks
unique ids, that every named tool and command exists and that no skill is
empty.

- window.learn {show?} shows, hides or toggles the panel; showing it also
  shows a hidden dock, and the panel counts as hidden while the dock is hidden
  or a full screen mode hides the panels.
- learn.list lists the skills and tutorials; learn.show {tutorial} opens one.
  A missing, non-string or unknown id is an error and changes nothing.
- New labels and messages have rows in every catalog. The tutorial text is
  English.

Docs: docs/mcp.md, docs/target-app-parity.md, docs/ui-parity.md.
2026-11-11 19:10:02 -08:00
BFlat 765bd30783 Merge pull request #6744 from dotCooCoo/feat/color-show-recent-colors
Color: the panel menu's Show Recent Colors shows or hides the Recent Colors row
2026-11-12 09:55:35 +07:00
BFlat aeffe1d004 Merge pull request #6731 from dotCooCoo/feat/actions-insert-menu-item
Actions: Insert Menu Item adds a menu command to an action
2026-11-12 09:40:12 +07:00
dotCooCoo 172e2923c0 MCP: regenerate the UI catalog 2026-11-11 18:33:55 -08:00
dotCooCoo a8989aff6d Commands: app and control channel params of the wrong type are refused
view.setZoom, view.screenMode, window.panel, file.revert, file.close,
ui.newSwatch, ui.symbolOptions, ui.batchDialog and file.exportSelection
read a number or switch of the wrong type as its default and went on, so
`view.setZoom {"zoom": "200"}` set 100%. They now refuse it and change
nothing.

The control channel's ui.key, ui.move, ui.wheel, ui.click, ui.drag,
ui.pointer, ui.resize, ui.screenshot, ui.render and ui.set, and the
headless session's key, pointer and render calls, do the same for their
numbers, switches and mods, before any input is queued. Omitting a param
or giving null keeps its default.
2026-11-11 18:22:01 -08:00
BFlat ac8c60cad4 Merge pull request #6675 from dotCooCoo/fix/plugin-filter-progress-cancel
Plug-ins: a light filter that reports progress runs in the background with Cancel
2026-11-12 09:14:14 +07:00
BFlat 8f65aaa7fb Merge pull request #6718 from dotCooCoo/fix/issue-6634
Fix #6634: Pen closing drag no longer gives the first anchor symmetric handles
2026-11-12 09:08:12 +07:00
BFlat 358a47c559 Merge pull request #6737 from dotCooCoo/feat/control-bar-options-menu
Control bar: the panel menu turns each group of options on or off
2026-11-12 09:07:47 +07:00
dotCooCoo 7c90c6e93d Shape tools: a press scales only on the drawn handle square
A shape tool now takes a press as a bounding-box handle's only on the
drawn handle square, kept square to the screen: 3 screen points from the
handle's centre along each axis at the default Anchor Size, a half point
more or less per step. A press just beside a handle draws a new shape.

drawing_gestures_snap_to_smart_guides started its second rectangle on the
first rectangle's corner handle, which stays selected; it now deselects
first.
2026-11-11 17:57:08 -08:00
dotCooCoo f3339a47f8 Actions: Insert Menu Item leaves out Image Trace and Pattern, counts recorded steps
Object > Image Trace > Make and Make and Expand, and Object > Pattern >
Make and Edit Pattern, are no longer listed or accepted by
`ui.action.insertMenuItem`. Their menu items do more than run the
command: Image Trace traces off the UI thread with progress and Cancel,
and the Pattern items open the Pattern Options panel. Action playback
runs only the command.

Insert Stop and Insert Menu Item, given a set and action, now count the
steps that the recording in progress adds to that set, so the set as
Stop Playing/Recording leaves it stays within 10,000 steps per action
and 8 MiB as a file.

The command descriptions list every kind of menu item that cannot be
a step.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-11 17:43:32 -08:00
dotCooCoo 62b6f53533 Color: the panel menu's Show Recent Colors shows or hides the Recent Colors row
The Color panel's menu gets a checked Show Recent Colors item under Show
Options / Hide Options. Unchecking it hides the panel's Recent Colors row;
checking it shows the row again. Applied colors still join the list while
the row is hidden, Hide Options hides the row either way, and the Swatches
panel keeps its own row.

The setting is on by default and is kept with the preferences
(ui.color_show_recent_colors); a saved value that is not true or false
reads as on. ui.colorPanel takes recentColors: bool and answers it.

Docs: docs/mcp.md, docs/control-protocol.md, docs/target-app-parity.md.
2026-11-11 17:26:16 -08:00
dotCooCoo 6b4056a447 Control bar: the panel menu turns each group of options on or off
The Control bar's panel menu lists the bar's groups of options above
Dock to Top and Dock to Bottom, each checked while it is on. A click
turns that group off or on, and a group that is off stays out of the
bar even while its tool or object is selected. A group that is off
takes no room, so the groups after it fit a narrower window. The menu
scrolls in a window too short for all its items.

- window.control.options {group, visible?} sets or toggles a group and
  returns {group, visible}; an unknown group or a non-boolean visible
  is an error and changes nothing.
- The groups are off only by choice: every group starts on. The choice
  is kept with the preferences and with each workspace; files saved
  without it show every group, and unknown ids are dropped on read.
- The Artboard tool's bar follows the Artboard Options and Transform
  groups; with Image Options off, an image shows neither its controls
  nor Fill and Stroke.
- New labels have rows in every complete catalog.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-11 16:40:10 -08:00
dotCooCoo 45e6aa4948 Tests: MCP Pen closing drag keeps a clicked first anchor a corner
tests::pen::a_drag_from_the_first_anchor_closes_the_path expected the
closing drag to give the first anchor an outgoing handle mirroring the
incoming one, which is the behavior #6634 reports. The first anchor is
placed by a click, so after the close it stays a corner with its
outgoing handle at the anchor. The test now checks that.
2026-11-11 16:39:55 -08:00
dotCooCoo e4a126f08d Paragraph Styles: Style Options edits indents, spacing, composition, hyphenation and justification
Double-clicking a paragraph style, or Paragraph Style Options... in the
Paragraph Styles panel menu, opens Paragraph Style Options
(`ui.paraStyleOptions`) instead of the rename dialog. Its sections are
General (name and stored attributes), Basic Paragraph Formats (Alignment,
indents, space before and after), Composition (composer, Roman Hanging
Punctuation), Hyphenation and Justification. OK runs the new
`paraStyle.edit {name, to, attrs}`, which replaces the name and attributes
in one undo step; paragraphs that use the style keep their local
overrides. Fields left as they were keep the style's values, empty fields
leave an attribute unset, Preview can be canceled, and each section's
Reset Panel (`ui.paraStyleOptions.resetPanel`) clears only its own
attributes. New Paragraph Style shows the same sections, filled in from
the selected paragraph or the interface language's paragraph defaults.

`paraStyle.new`, `paraStyle.setAttrs` and `paraStyle.edit` now reject a
changed indent or space outside -1296 to 1296 pt, Hyphenation counts and
zone outside their ranges, Justification values outside their ranges or
out of Minimum/Desired/Maximum order, and tab positions outside 0 to
100000 pt. A value the style already holds is kept.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-11 16:34:42 -08:00
dotCooCoo 788d0f517f Actions: Insert Menu Item adds a menu command to an action
The Actions panel menu's Insert Menu Item… opens a dialog that lists the
menu items an action can hold. Find picks the one item that matches the
words typed, or a click on a listed item picks it, and OK inserts its
command as a step after the selected step, at the end of the selected
action, or into the recording in progress, without running it.
Playback runs the step as the menu does.

Items that open a dialog, Object > Align, and the File, Window and Help
menu items are not listed. `ui.action.insertMenuItem` does the same for
agents and refuses a command no listed item runs.

Insert Stop and Insert Menu Item refuse a step that would give an action
more than 10,000 steps or its set a file larger than 8 MiB, the most
Load Actions… reads, for actions and recordings alike.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-11 16:21:55 -08:00
dotCooCoo 96e20d548d Plug-ins: a light filter that reports progress runs in the background with Cancel
A light filter of plug-in API level 2 with the `progress` permission ran
on the UI thread, so its progress reports and `vc_cancelled` never
reached a progress window. It now runs in the background under its light
budget, as a heavy filter does, when it runs at once from Object ›
Plug-ins or its shortcut, or when OK runs it with Preview off. The
progress window shows its share and Cancel stops it. With Preview on, OK
keeps the previewed run. A filter that lists a `commandAllowlist` still
runs on the UI thread.

Docs: docs/plugins.md, docs/mcp.md, docs/target-app-parity.md.
2026-11-11 12:18:18 -08:00
BFlat f83d916d8a Merge pull request #6631 from Hassan1305/docs-6340-rotation-direction
Commands: every angle and rotation param says which way it turns (#6340)
2026-11-12 01:32:17 +07:00
HassanKhan b3860bf7d0 Commands: every angle and rotation param says which way it turns (#6340)
The params docs now state the direction (and the zero) of each angle or
rotation a command takes; behaviour is unchanged. Shape creation, text.create,
the grids, add-on shapes, saved views, Liquify, Puppet Warp pins, Mirror and
Radial Repeat and Vector Halftone turn clockwise; text character rotation,
gradients, the eraser tip and print screen angles turn counter-clockwise.

view.saved.new's rotation note changes its schema, so the API level goes to 3.

A test walks every command's params doc and fails when a param named like an
angle or rotation doesn't say clockwise or counter-clockwise.
2026-11-11 21:40:27 +05:00
Fabio William Conceição 3f26409d4a MCP: keep UI_COMMANDS mirror in sync via xtask
Add `cargo xtask ui-commands` (and `--check` in ci) so the headless
catalogue cannot drift from desktop UI_COMMANDS, and fix params-doc
escaping that printed literal backslashes.
2026-11-11 15:56:33 +00:00
Fabio William Conceição 13098fa9f4 MCP: list UI_COMMANDS in command_list and close catalogue gaps (#6460)
Headless command_list exposes the desktop UI catalogue with ui: true, docs
clarify effect vs command ids, and prompts cover spelling, variables and path tools.
2026-11-11 15:48:05 +00:00
dotCooCoo d9e9adbf45 MCP: answer_dialog sets the fields and answers the dialog in one request
answer_dialog sent ui.dialog.set and then ui.dialog.confirm or
ui.dialog.cancel as two requests. A dialog another control connection
opened between them was confirmed or canceled without the fields.

ui.dialog.set takes `action: confirm | cancel`, checked before any field
is set, and confirms or cancels the dialog the fields were set in within
the same request, replying {dialog, result}. answer_dialog sends set and
action together; an app whose reply has no `dialog` key did not answer
it, and the dialog is then confirmed or canceled with its own request.
2026-11-10 14:51:50 -08:00
BFlat d80e73b76e Merge pull request #6342 from christianlappin/codex/fix-6322-rotate-view-mcp
MCP: handle Rotate View gestures in the desktop canvas
2026-11-10 20:10:24 +07:00
dotCooCoo 7b44ef5737 Merge main into feat/script-run 2026-11-09 23:43:37 -08:00
dotCooCoo 9ccea9cfcb Commands: engine.apiReference returns the command API reference in Markdown
engine.apiReference {} -> {markdown} writes a reference from the built-in
commands' parameter schemas each time it runs: a section per command that
has a schema, in registry order, with its label, menu path, API levels,
what it writes, cost, summary and return, and a table of its parameters
(type, range with included or excluded ends, unit, JSON or worked-out
default, required, levels and description; object members as dotted
rows). Commands without a schema, plug-in commands included, are left
out. Schema text is escaped so it stays plain text in its cell, control
characters become spaces, and a reference past 1 MiB is an error rather
than a cut-short text. The command needs no document.

MCP serves the same text as the fixed resource
vectorcraft://commands/reference (text/markdown; charset=utf-8); the
other resources still read as JSON.

The command's own schema raises the schema API level to 2. Its label and
its size error have rows in every catalog that needs them.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-09 21:24:13 -08:00
dotCooCoo 9d01c0e7b5 MCP: test that list_commands gives input schemas over stdio 2026-11-09 19:59:29 -08:00
dotCooCoo 9172950ad5 MCP: command listings give each command with a schema an inputSchema
engine.commands, command_list and list_commands now list an inputSchema
next to schema for each command with a parameter schema. It is the same
JSON Schema 2020-12 schema with the root type "object", the form an MCP
tool's inputSchema takes
(https://modelcontextprotocol.io/specification/2026-07-28/schema);
schema keeps the root type ["object", "null"] when no parameter is
required. A command without a schema lists neither field. tools/list is
unchanged, and the commands are still run with command_run or
run_command.

brief now leaves out schema and inputSchema as well as the params text;
a listing filtered to the command's id gives them.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-09 19:34:24 -08:00
dotCooCoo 2c0d09e079 Scripts: File › Scripts › Other Script… runs JavaScript files
File › Scripts › Other Script… picks a .js or .jsx file, shows a warning
that can be turned off in Preferences › General, and runs the script
against the open documents through the `vc` object. The new
`script.run` and `script.stop` commands run and stop a script over MCP.

- A run is one transaction. Each document it changed gets one undo step
  named Run Script. An uncaught error, a limit or a stop puts every
  document, the paint, the clipboard, menu state and preferences back.
- A command that fails inside a run, or whose result is too large to
  reach the script, is undone and throws an error the script can catch.
- Files a command wrote stay on disk and the report names them, also
  when the run is stopped from the quit question.
- While a script runs, other commands that change anything fail with a
  busy error; MCP reports it as JSON-RPC error -32003.
- In the app the run advances one slice per frame with a Stop button in
  the status bar. A run that adds a great many objects asks whether to
  continue; Stop and Escape end it.
- Commands that change state outside the documents, such as prefs.*,
  plugin.* and file.place.queue, are refused to scripts.

Docs: docs/mcp.md, docs/gaps.md, docs/roadmap.md,
docs/target-app-parity.md.
2026-11-09 18:35:41 -08:00
Christian Lappin ef25dffe01 fix(mcp): validate and cancel Rotate View gestures (#6322) 2026-11-09 15:31:35 -05:00
dotCooCoo c2753c1169 Merge main into fix/plugin-grant-app-approval 2026-11-08 22:17:36 -08:00
BFlat cc02f7b35e Merge pull request #4379 from dotCooCoo/fix/shape-builder-merge-off-ui-thread
Shape Builder: a large selection merges on another thread
2026-11-09 13:10:54 +08:00
dotCooCoo e7c3307f07 Merge main into fix/plugin-grant-app-approval 2026-11-08 20:58:47 -08:00
dotCooCoo fc728b909e Merge main into fix/shape-builder-merge-off-ui-thread 2026-11-08 20:23:21 -08:00
dotCooCoo 4941b377f9 Merge main into fix/plugin-grant-app-approval 2026-11-08 19:01:49 -08:00
dotCooCoo bf4ec4253d Merge main into fix/save-screens-unknown-options 2026-11-08 18:13:32 -08:00
dotCooCoo 0f002e7625 Plug-ins: tests cover each route that cannot approve an install
Add tests that an action step running plugin.install with grant is
refused, that ui.key, ui.click and ui.pointer sent through the control
path at the open approval dialog approve nothing, with OK focused too,
that MCP answer_dialog reports the app's refusal, that ui.installPlugin
given grant or allowHeavy approves nothing, and that a module recorded
in grants.json installs from a session with that store and no flag
while other bytes under its id are refused.

The batch assertion now checks the refusal's message. The docs and
comments state that Enter confirms the dialog only when OK has the
keyboard focus.
2026-11-08 17:47:02 -08:00
BFlat b652599548 Merge pull request #6264 from dotCooCoo/feat/plugin-importers
Plug-ins: importer plug-ins open file types VectorCraft does not read
2026-11-09 09:24:07 +08:00
dotCooCoo 918ef940cb Merge main into feat/plugin-importers 2026-11-08 16:45:20 -08:00
dotCooCoo 8579f436f7 Merge main into fix/save-screens-unknown-options 2026-11-08 16:12:24 -08:00