shortcuts-playground 1.2.1

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.
Files changed (68) hide show
  1. package/README.md +54 -0
  2. package/agents/shortcut-builder.md +172 -0
  3. package/agents/shortcut-remixer.md +239 -0
  4. package/commands/build-shortcut.md +32 -0
  5. package/commands/remix-shortcut.md +34 -0
  6. package/opencode.json +30 -0
  7. package/package.json +47 -0
  8. package/plugin/validator.ts +179 -0
  9. package/skills/shortcuts-playground/ACTIONS.md +713 -0
  10. package/skills/shortcuts-playground/APPINTENTS.md +2760 -0
  11. package/skills/shortcuts-playground/AUTOMATION_TRIGGERS.md +133 -0
  12. package/skills/shortcuts-playground/BEST_PRACTICES.md +357 -0
  13. package/skills/shortcuts-playground/CHANGELOG.md +585 -0
  14. package/skills/shortcuts-playground/CONTROL_FLOW.md +777 -0
  15. package/skills/shortcuts-playground/DATE_TIME.md +75 -0
  16. package/skills/shortcuts-playground/EXAMPLES.md +738 -0
  17. package/skills/shortcuts-playground/FILTERS.md +697 -0
  18. package/skills/shortcuts-playground/HEALTHKIT.md +317 -0
  19. package/skills/shortcuts-playground/ICONS_AND_COLORS.md +89 -0
  20. package/skills/shortcuts-playground/JAVASCRIPT_WEBPAGE.md +51 -0
  21. package/skills/shortcuts-playground/PARAMETER_TYPES.md +1117 -0
  22. package/skills/shortcuts-playground/PLIST_FORMAT.md +296 -0
  23. package/skills/shortcuts-playground/README.md +77 -0
  24. package/skills/shortcuts-playground/SKILL.md +459 -0
  25. package/skills/shortcuts-playground/THIRD_PARTY_ACTIONS.md +77 -0
  26. package/skills/shortcuts-playground/TOOLKIT_SNAPSHOT.md +62 -0
  27. package/skills/shortcuts-playground/URL_SCHEMES.md +59 -0
  28. package/skills/shortcuts-playground/VARIABLES.md +569 -0
  29. package/skills/shortcuts-playground/assets/shortcuts-small.svg +14 -0
  30. package/skills/shortcuts-playground/assets/shortcuts.png +0 -0
  31. package/skills/shortcuts-playground/data/healthkit-ios26.2-reference.json +2603 -0
  32. package/skills/shortcuts-playground/data/macos27-shortpy-grounding.json +4085 -0
  33. package/skills/shortcuts-playground/data/macos27-workflow-trigger-samples.json +1 -0
  34. package/skills/shortcuts-playground/data/shortcuts-glyph-synonyms.json +5102 -0
  35. package/skills/shortcuts-playground/data/shortcuts-icon-colors.json +107 -0
  36. package/skills/shortcuts-playground/data/shortcuts-official-glyph-mapping.json +509 -0
  37. package/skills/shortcuts-playground/data/toolkit-v63-tool-ids.json +1806 -0
  38. package/skills/shortcuts-playground/data/toolkit-v78-first-party-enum-cases.json +1 -0
  39. package/skills/shortcuts-playground/data/toolkit-v78-first-party-parameter-keys.json +1 -0
  40. package/skills/shortcuts-playground/data/toolkit-v78-ios27-tool-ids.json +1222 -0
  41. package/skills/shortcuts-playground/data/toolkit-v78-tool-ids.json +2745 -0
  42. package/skills/shortcuts-playground/data/toolkit-v78-trigger-parameter-keys.json +1051 -0
  43. package/skills/shortcuts-playground/golden-shortcuts/index.jsonl +19 -0
  44. package/skills/shortcuts-playground/golden-shortcuts/xml/1be4dde95b794253bf82438e201b33e7.xml +174 -0
  45. package/skills/shortcuts-playground/golden-shortcuts/xml/2e0fb675e45948aaacee7e534f910492.xml +1016 -0
  46. package/skills/shortcuts-playground/golden-shortcuts/xml/332c12a0060043b388b22b806be7ab58.xml +1924 -0
  47. package/skills/shortcuts-playground/golden-shortcuts/xml/3dd4ee24e43f464f92adaa70a0311eaa.xml +1177 -0
  48. package/skills/shortcuts-playground/golden-shortcuts/xml/4d102301c6e646faa7a8a221f4f4ec98.xml +321 -0
  49. package/skills/shortcuts-playground/golden-shortcuts/xml/51cc4e26d1044893a0c3f2f3630cf2d2.xml +1933 -0
  50. package/skills/shortcuts-playground/golden-shortcuts/xml/623e7f1ca5f948e2bd53811fec63e544.xml +136 -0
  51. package/skills/shortcuts-playground/golden-shortcuts/xml/6a18b76843ac45c384ac3400f3740997.xml +1791 -0
  52. package/skills/shortcuts-playground/golden-shortcuts/xml/71f0cacb0f604b399b76c5dcb7286e7c.xml +2228 -0
  53. package/skills/shortcuts-playground/golden-shortcuts/xml/807525ed9f974829bc8494defac923a8.xml +259 -0
  54. package/skills/shortcuts-playground/golden-shortcuts/xml/8ab0d39826ab4249be58672763caa3ba.xml +420 -0
  55. package/skills/shortcuts-playground/golden-shortcuts/xml/91c45fd3fd3b427897d9ba485efb1227.xml +800 -0
  56. package/skills/shortcuts-playground/golden-shortcuts/xml/97be626bb25c41709d175646a7f6d8f2.xml +424 -0
  57. package/skills/shortcuts-playground/golden-shortcuts/xml/ae59e10d409348f9bd33894f03f9beb4.xml +568 -0
  58. package/skills/shortcuts-playground/golden-shortcuts/xml/afa83b6be811483b9c32189c41eb9312.xml +391 -0
  59. package/skills/shortcuts-playground/golden-shortcuts/xml/cfdb083b857e4ac189629fa386d27cdc.xml +193 -0
  60. package/skills/shortcuts-playground/golden-shortcuts/xml/e01cebe192d64b2fbca80204d03d92ab.xml +111 -0
  61. package/skills/shortcuts-playground/golden-shortcuts/xml/ef669bcf8bad489d9ef4b88bfaf5772f.xml +780 -0
  62. package/skills/shortcuts-playground/golden-shortcuts/xml/f44f5caf5e3e48d4817e73af450c4404.xml +570 -0
  63. package/skills/shortcuts-playground/scripts/generate_healthkit_reference.py +394 -0
  64. package/skills/shortcuts-playground/scripts/lookup_action_grounding.py +1164 -0
  65. package/skills/shortcuts-playground/scripts/select_shortcut_icon_color.py +597 -0
  66. package/skills/shortcuts-playground/scripts/test_random_mixed_shortcuts.py +1067 -0
  67. package/skills/shortcuts-playground/scripts/test_wiring_regressions.py +2247 -0
  68. package/skills/shortcuts-playground/scripts/validate_shortcut.py +4526 -0
@@ -0,0 +1,713 @@
1
+ # Shortcuts Actions Reference
2
+
3
+ Complete catalog of all 365 WF*Action identifiers from the original macOS ToolKit v63 snapshot plus bundled iOS HealthKit backups. OS 27 ToolKit v78 snapshots add additional identifiers to the packaged allowlist; only the v78 actions with inspected metadata are summarized here.
4
+
5
+ > Note: In ToolKit SQLite `Tools`, four control-flow actions are not represented as normal tools:
6
+ > `is.workflow.actions.conditional`, `is.workflow.actions.repeat.count`,
7
+ > `is.workflow.actions.repeat.each`, and `is.workflow.actions.choosefrommenu`.
8
+ > They are still valid and are handled explicitly by this skill/validator.
9
+
10
+ ## Identifier Mapping Rules
11
+
12
+ ### Standard Mapping
13
+ Class `WF<Name>Action` maps to `is.workflow.actions.<lowercasename>`
14
+
15
+ Example: `WFShowResultAction` → `is.workflow.actions.showresult`
16
+
17
+ ### Irregular Mappings
18
+
19
+ Some actions have non-standard mappings:
20
+
21
+ | Class Name | Identifier |
22
+ |------------|-----------|
23
+ | `WFRepeatAction` | `is.workflow.actions.repeat.count` |
24
+ | `WFForEachRepeatAction` | `is.workflow.actions.repeat.each` |
25
+ | `WFFiniteRepeatAction` | `is.workflow.actions.repeat.count` |
26
+ | `WFAskForInputAction` | `is.workflow.actions.ask` |
27
+ | `WFTextAction` | `is.workflow.actions.gettext` |
28
+ | `WFConditionalAction` | `is.workflow.actions.conditional` |
29
+ | `WFChooseFromMenuAction` | `is.workflow.actions.choosefrommenu` |
30
+ | `WFGetFileAction` | `is.workflow.actions.documentpicker.open` |
31
+ | `WFSelectFilesAction` | `is.workflow.actions.documentpicker.open` |
32
+ | `WFSaveFileAction` | `is.workflow.actions.documentpicker.save` |
33
+ | `WFGetCurrentWeatherConditionsAction` | `is.workflow.actions.weather.currentconditions` |
34
+ | `WFGetWeatherForecastAction` | `is.workflow.actions.weather.forecast` |
35
+ | `WFContentItemFilterAction` | `is.workflow.actions.filter.contentitems` |
36
+ | `WFGetUpcomingCalendarItemsAction` | `is.workflow.actions.getupcomingevents` |
37
+ | `WFAppendFileAction` | `is.workflow.actions.file.append` (was `appendfile` in older versions) |
38
+
39
+ ---
40
+
41
+ ## Actions by Category
42
+
43
+ ### OS 27 ToolKit v78 Additions
44
+
45
+ These classic/WF-namespace identifiers are present in local OS 27 ToolKit v78 databases. They are allowlisted for validation only when targeting OS 27+ or `latest`. `Add Item to List` serialization is verified from Federico's macOS 27 sample; Stored Content, Get What's On Screen, and VPN fields have targeted ToolKit-derived validation. Picker-backed values such as VPN selection and iOS workout type/goal payloads still need exported samples before relying on rich generated payloads.
46
+
47
+ | Identifier | Display Name | Observed Parameter Keys |
48
+ |------------|--------------|-------------------------|
49
+ | `is.workflow.actions.additemtolist` | Add Item to List | `WFListVariable`, `WFListItem`, `WFInsertPosition`, `WFItemIndex` |
50
+ | `is.workflow.actions.deletestoredcontent` | Delete Stored Content | `WFStoredContentGlobalValue`, `WFStoredContentKey` |
51
+ | `is.workflow.actions.filter.vpns` | Find VPNs | `WFContentItemFilter`, `WFCompoundType`, `WFContentItemInputParameter`, `WFContentItemSortProperty`, `WFContentItemSortOrder`, `WFContentItemLimitEnabled`, `WFContentItemLimitNumber` |
52
+ | `is.workflow.actions.getonscreencontext` | Get What's On Screen | `WFOnScreenContextScope`, `WFOnScreenContextResultType`, `WFOnScreenContextLimitEnabled`, `WFOnScreenContextLimit` |
53
+ | `is.workflow.actions.getonscreencontent` | Get What's On Screen | Deprecated in v78; use `is.workflow.actions.getonscreencontext` |
54
+ | `is.workflow.actions.getselectedtext` | Get Selected Text | none |
55
+ | `is.workflow.actions.getstoredcontent` | Get Stored Content | `WFStoredContentGlobalValue`, `WFStoredContentKey` |
56
+ | `is.workflow.actions.setstoredcontent` | Store Content | `WFInput`, `WFStoredContentGlobalValue`, `WFStoredContentKey` |
57
+ | `is.workflow.actions.vpn.get` | Get Current VPN | none |
58
+ | `is.workflow.actions.vpn.set` | Set VPN | `WFVPNOperation`, `WFOnDemandValue`, `WFVPN` |
59
+ | `is.workflow.actions.workout.end` | End Workout | `IntentAppDefinition` (iOS/iPadOS 27 only) |
60
+ | `is.workflow.actions.workout.start` | Start Workout | `IntentAppDefinition`, `workoutName`, `isOpenEnded`, `WorkoutGoal` (iOS/iPadOS 27 only) |
61
+
62
+ #### Add Item to List
63
+
64
+ `is.workflow.actions.additemtolist` appends to the end of a list by default when `WFInsertPosition` is omitted.
65
+
66
+ | Behavior | Required Parameters |
67
+ |----------|---------------------|
68
+ | Add to end | `WFListVariable`, `WFListItem` |
69
+ | Add to beginning | `WFListVariable`, `WFListItem`, `WFInsertPosition = "Beginning"` |
70
+ | Add at index | `WFListVariable`, `WFListItem`, `WFInsertPosition = "Index"`, `WFItemIndex` |
71
+
72
+ `WFListVariable` is a `WFTextTokenAttachment` pointing at a list output or named variable. `WFListItem` can be a literal value or `WFTextTokenString`.
73
+
74
+ `WFInsertPosition` accepts exactly `Beginning`, `End`, or `Index`. Include `WFItemIndex` only when `WFInsertPosition = "Index"`, and use a 1-based integer (`1` or greater).
75
+
76
+ #### Stored Content
77
+
78
+ `Store Content`, `Get Stored Content`, and `Delete Stored Content` share a string key in `WFStoredContentKey`. The key must be non-empty. `WFStoredContentGlobalValue` is a boolean; omit it or set it to `false` for shortcut-scoped content, and set it to `true` only when intentionally using the global/iCloud stored-content namespace. This boolean is unrelated to editor rendering; it does not fix an empty `Content` field.
79
+
80
+ `Store Content` also requires explicit `WFInput` pointing at the content to save. Apple saves a manually connected Store Content input as `WFTextTokenString` with a single `` placeholder and an `attachmentsByRange` entry for the source output. Do **not** use a bare `WFTextTokenAttachment` or a wrapped `Type = Variable` attachment for this field; those sign and import, but render as an empty `Content` placeholder in Shortcuts. If `shortcuts sign` rejects this correct XML shape with a format error, use `plutil -convert binary1` on the final `.shortcut` copy and sign that; the bundled signer wrapper retries this automatically.
81
+
82
+ | Action | Required Parameters |
83
+ |--------|---------------------|
84
+ | `is.workflow.actions.setstoredcontent` | `WFInput`, `WFStoredContentKey` |
85
+ | `is.workflow.actions.getstoredcontent` | `WFStoredContentKey` |
86
+ | `is.workflow.actions.deletestoredcontent` | `WFStoredContentKey` |
87
+
88
+ #### VPN Actions
89
+
90
+ `is.workflow.actions.vpn.get` returns the current VPN and takes no parameters. Prefer this classic WF action for "Get Current VPN" output. The similarly named AppIntent entity row `com.apple.systempreferences.CurrentlyConnectedVPN` is filter/query metadata, not the no-parameter current-VPN action. `is.workflow.actions.filter.vpns` and `is.workflow.actions.vpn.set` are OS 27 ToolKit v78 rows available on macOS and iOS/iPadOS targets.
91
+
92
+ For `Find VPNs`, ToolKit exposes VPN content item properties `Name`, `Server Address`, `App`, `Is Connected`, and `Is On Demand Enabled`. The verified sort properties are `Name`, `Server Address`, and `Random`. Prefer ToolKit enum IDs for `WFCompoundType`: `0` means **Any** and `1` means **All**. The validator accepts the display labels `Any`/`All` as compatibility aliases, but generated shortcuts should use `0`/`1`. If `WFContentItemLimitEnabled` is `true`, include a positive numeric `WFContentItemLimitNumber`.
93
+
94
+ | Action | Required/Important Parameters |
95
+ |--------|-------------------------------|
96
+ | `is.workflow.actions.filter.vpns` | `WFContentItemFilter` for predicates, optional `WFContentItemSortProperty`, `WFContentItemSortOrder`, `WFContentItemLimitEnabled`, `WFContentItemLimitNumber`, `WFCompoundType`, `WFContentItemInputParameter = "Library"` |
97
+ | `is.workflow.actions.vpn.get` | none |
98
+ | `is.workflow.actions.vpn.set` | `WFVPNOperation`, `WFVPN`; `WFOnDemandValue` is required when `WFVPNOperation = "Set On Demand"` |
99
+
100
+ `WFVPNOperation` accepts exactly `Connect`, `Disconnect`, `Toggle`, `Set On Demand`, or `Toggle On Demand`. `WFOnDemandValue`, when present, must be a boolean. Treat `WFVPN` as a picker/token state for the selected VPN configuration; do not leave it empty.
101
+
102
+ #### iOS Workout Controls
103
+
104
+ `is.workflow.actions.workout.start` and `is.workflow.actions.workout.end` are present only in the iOS/iPadOS 27 Simulator ToolKit snapshot. Validate them with `--target-platform ios`; the default macOS target intentionally rejects them. Treat the listed ToolKit keys as metadata until an exported iPhone/iPad shortcut confirms picker value serialization for `workoutName` and `WorkoutGoal`.
105
+
106
+ #### Get What's On Screen
107
+
108
+ Use the OS 27 ToolKit v78 parameterized row `is.workflow.actions.getonscreencontext` for new shortcuts. `is.workflow.actions.getonscreencontent` is still present in the ToolKit snapshot but is deprecated by v78 and has no observed parameter schema in the current catalog.
109
+
110
+ | Parameter | Requirement |
111
+ |-----------|-------------|
112
+ | `WFOnScreenContextScope` | Optional. If present, use exactly `All Visible` or `Focused App Only`. |
113
+ | `WFOnScreenContextResultType` | Optional string. Leave omitted unless matching an exported sample or a known Shortcuts UI value. |
114
+ | `WFOnScreenContextLimitEnabled` | Optional boolean. Use `true` only when intentionally limiting the number of returned items. |
115
+ | `WFOnScreenContextLimit` | Required when `WFOnScreenContextLimitEnabled` is `true`; must be a positive number. Omit when limit is disabled. |
116
+
117
+ #### OS 26 to 27 Updated Parameters
118
+
119
+ These parameter additions were cross-checked against the Automators OS 26 to 27 thread and local ToolKit v78 metadata. Treat AppIntent-style WF-namespace actions (`appendnote`, `scanbarcode`, `extracttextfromimage`) as ToolKit-backed AppIntents even though their identifiers begin with `is.workflow.actions.`. The validator rejects these parameter keys when targeting macOS 26 or older even if the action identifier itself is available on that target.
120
+
121
+ | Identifier | Display Name | New/Updated Parameters | Notes |
122
+ |------------|--------------|------------------------|-------|
123
+ | `is.workflow.actions.addnewreminder` | New Reminder | `WFUrgent` | Boolean urgent flag reported in the OS 26.4 delta and present in ToolKit v78. |
124
+ | `is.workflow.actions.appendnote` | Append to Note | `section` (**Section**), `ignoreWhitespace` (**Ignore Whitespace**), `interpretAsMarkdown` (**Interpret as Markdown**); important existing key: `operation` | `section` is the section title/heading; `operation` accepts `append` or `prepend`; the booleans are `On`/`Off` UI toggles. |
125
+ | `com.apple.mobilenotes.SharingExtension` | Create Note | `interpretAsMarkdown` (**Interpret as Markdown**) | This ToolKit row uses `contents` for the note body; `com.apple.Notes.CreateNoteIntent` did not expose the markdown toggle in local macOS 27 v78. |
126
+ | `is.workflow.actions.askllm` | Use Model | `WFAllowWebSearch`, `FollowUp` | `WFAllowWebSearch` is the **Use Broad World Knowledge** toggle; `FollowUp` is the **Follow Up** toggle. Both are plist booleans. |
127
+ | `is.workflow.actions.searchlocalbusinesses` | Find Places | `WFSearchSortOrder` | ToolKit enum values: `Distance` or `Relevance`. |
128
+ | `is.workflow.actions.getdirections` | Open Directions | `WFDestination` | ToolKit notes that multi-stop trips are only supported by Apple Maps; exported multi-stop samples are still needed before generating complex destination lists. |
129
+ | `is.workflow.actions.getdistance` | Get Distance | `WFAvoidTolls` (**Avoid Tolls**), `WFAvoidHighways` (**Avoid Highways**), `WFDistanceUnit`, `Accuracy` | Boolean route options. Route modes: `Driving`, `Walking`, `Biking`, `Direct`. Distance units: `Miles` or `Kilometers`. Accuracy values: `Best`, `NearestTenMeters`, `HundredMeters`, `Kilometer`, `ThreeKilometers`. |
130
+ | `is.workflow.actions.gettraveltime` | Get Travel Time | `WFAvoidTolls` (**Avoid Tolls**), `WFAvoidHighways` (**Avoid Highways**) | Boolean route options. Route modes: `Driving`, `Walking`, `Biking`, `Transit`. |
131
+ | `is.workflow.actions.hide.app` | Hide App | `WFAppsExcept` | Used when `WFHideAppMode = "All Apps"` to keep listed apps open. |
132
+ | `is.workflow.actions.quit.app` | Quit App | `WFAppsExcept`, `WFAskToSaveChanges` | `WFAppsExcept` is used when `WFQuitAppMode = "All Apps"` to keep listed apps open. `WFAskToSaveChanges`, when present, must be a boolean. |
133
+ | `is.workflow.actions.scanbarcode` | Scan QR or Barcode | `imageFile` | ToolKit-backed AppIntent parameter displayed as **Image** for scanning an input image file. |
134
+ | `is.workflow.actions.extracttextfromimage` | Extract from Image | `imageFile` | ToolKit v78 exposes this as the primary image input. Older exported shortcuts may still use `WFImage` or `WFInput`. |
135
+ | `com.apple.Safari.CreateNewTabGroup` / `com.apple.mobilesafari.CreateNewTabGroup` | Create Tab Group | `contents` | Use `com.apple.Safari.*` on macOS and `com.apple.mobilesafari.*` on iOS/iPadOS. Accepts URLs or existing Safari tab entities to seed the new tab group. |
136
+
137
+ OS 27 boolean toggles must be real plist booleans, not strings: `ignoreWhitespace`, `interpretAsMarkdown`, `WFAllowWebSearch`, `FollowUp`, `WFAvoidTolls`, and `WFAvoidHighways`. `WFGetDirectionsActionMode` accepts `Driving`, `Walking`, `Biking`, or `Direct` for Get Distance, and `Driving`, `Walking`, `Biking`, or `Transit` for Get Travel Time. `WFDistanceUnit` accepts `Miles` or `Kilometers`; `Accuracy` accepts `Best`, `NearestTenMeters`, `HundredMeters`, `Kilometer`, or `ThreeKilometers`. For Hide/Quit App, `WFHideAppMode` / `WFQuitAppMode` accept `App` or `All Apps`; `WFApp` is required when the mode is `App`, `WFAppsExcept` should be omitted unless it contains at least one app to keep open, and `WFAskToSaveChanges` must be boolean when present. `Scan QR or Barcode` requires `imageFile` as a non-empty token attachment to an image/file output. `Create Tab Group` `contents` must be omitted or non-empty.
138
+
139
+ #### OS 26 to 27 Display Name Changes
140
+
141
+ | Identifier | Old Name | New Name |
142
+ |------------|----------|----------|
143
+ | `is.workflow.actions.extracttextfromimage` | Extract Text from Image | Extract from Image (`imageFile` in ToolKit v78) |
144
+ | `com.apple.Photos.PhotosSearchAssistantIntent` | Search Photos | Search |
145
+ | `com.apple.TVRemoteUIService.ToggleSystemAppearanceIntent` | Set Light/Dark Mode | Set Appearance on Apple TV |
146
+
147
+ #### OS 26.4 Choose from List Compatibility
148
+
149
+ The linked Automators OS 26.2 to 26.4 delta notes that **Choose from List** works again with more input types, including dictionaries and named text. Prefer direct Dictionary/List/Text inputs over vCard/VCF workarounds unless the user explicitly asks for contact-card formatting. Contact email and phone-number list values remain macOS-only in the reported behavior.
150
+
151
+ `WFChooseFromListActionSelectMultiple` and `WFChooseFromListActionSelectAll` must be plist booleans. Only set **Select All Initially** when **Select Multiple** is also enabled.
152
+
153
+ #### OS 18 to 26.1 Automators Follow-up
154
+
155
+ The earlier Automators iOS 18 to OS 26.1 thread lists a few rows that are also visible in the local ToolKit v78 metadata. Treat these as OS 27-era authoring metadata in this package unless you have an exported shortcut from the older OS that proves the same plist shape.
156
+
157
+ | Action | Identifier | Confirmed Metadata |
158
+ |--------|------------|--------------------|
159
+ | Open App | `is.workflow.actions.openapp` | New `WFWindowingFormat` parameter for **Window Location & Size**. Valid values: `Full Screen`, `Left`, `Right`, `Top`, `Bottom`, `Top Leading`, `Top Trailing`, `Bottom Leading`, `Bottom Trailing`, `Left Third`, `Middle Third`, `Right Third`. |
160
+ | Search in Files (iOS) | unresolved | The thread describes "Search for a file or folder", but no literal `Search in Files` row appears in the local macOS 27 or hydrated iOS 27 Simulator v78 ToolKit databases. The closest current classic row is `is.workflow.actions.filter.files` (`Filter Files`) with `WFContentItemFilter`, sort, limit, compound, and file input parameters. Do not invent a separate Search in Files payload until an exported iPhone/iPad shortcut identifies it. |
161
+
162
+ `WFWindowingFormat` is optional. If present, it must use one of the exact ToolKit enum values above; typoed values now fail validation.
163
+
164
+ ### Text & Input
165
+
166
+ | Identifier | Class | Description |
167
+ |------------|-------|-------------|
168
+ | `gettext` | WFTextAction | Create a text value |
169
+ | `ask` | WFAskForInputAction | Ask user for input |
170
+ | `askllm` | WFAskLLMAction | Use AI model (Apple Intelligence) |
171
+ | `comment` | WFCommentAction | Add a comment (no effect) |
172
+ | `dictatetext` | WFDictateTextAction | Dictate text |
173
+ | `showresult` | WFShowResultAction | Display result to user |
174
+ | `alert` | WFAlertAction | Show alert dialog |
175
+ | `notification` | WFNotificationAction | Send notification |
176
+ | `speaktext` | WFSpeakTextAction | Speak text aloud |
177
+ | `detectlanguage` | WFDetectLanguageAction | Detect language |
178
+
179
+ ### Variables
180
+
181
+ | Identifier | Class | Description |
182
+ |------------|-------|-------------|
183
+ | `setvariable` | WFSetVariableAction | Set a variable |
184
+ | `getvariable` | WFGetVariableAction | Get a variable |
185
+ | `appendvariable` | WFAppendVariableAction | Append to variable |
186
+ | `nothing` | WFNothingAction | Do nothing (pass-through) |
187
+
188
+ ### Control Flow
189
+
190
+ | Identifier | Class | Description |
191
+ |------------|-------|-------------|
192
+ | `repeat.count` | WFRepeatAction | Repeat N times |
193
+ | `repeat.each` | WFForEachRepeatAction | Repeat for each item |
194
+ | `conditional` | WFConditionalAction | If/Otherwise/Otherwise If |
195
+ | `choosefrommenu` | WFChooseFromMenuAction | Menu with cases |
196
+ | `choosefromlist` | WFChooseFromListAction | Choose from list |
197
+ | `exit` | WFExitAction | Exit shortcut |
198
+ | `output` | WFOutputAction | Set output |
199
+
200
+ ### Files & Documents
201
+
202
+ | Identifier | Class | Description |
203
+ |------------|-------|-------------|
204
+ | `file` | WFFileAction | Create file reference |
205
+ | `documentpicker.open` | WFSelectFilesAction | Open file picker |
206
+ | `documentpicker.save` | WFSaveFileAction | Save file |
207
+ | `setitemname` | WFSetItemNameAction | Set Name; produces a renamed item object |
208
+ | `file.rename` | WFRenameFileAction | Rename File; mutates the original file in place |
209
+ | `file.append` | WFAppendFileAction | Append to text file (was `appendfile` in older versions) |
210
+
211
+ ### Web & URLs
212
+
213
+ | Identifier | Class | Description |
214
+ |------------|-------|-------------|
215
+ | `url` | WFURLAction | Create URL |
216
+ | `downloadurl` | WFDownloadURLAction | Get contents of URL |
217
+ | `openurl` | WFOpenURLAction | Open URL |
218
+ | `openxcallbackurl` | WFOpenXCallbackURLAction | Open x-callback-url (see `URL_SCHEMES.md`) |
219
+ | `urlencode` | WFURLEncodeAction | URL encode |
220
+ | `searchweb` | WFSearchWebAction | Search web |
221
+
222
+ ### Apps & System
223
+
224
+ | Identifier | Class | Description |
225
+ |------------|-------|-------------|
226
+ | `openapp` | WFOpenAppAction | Open app |
227
+ | `getcurrentapp` | WFGetCurrentAppAction | Get current app |
228
+ | `runworkflow` | WFRunWorkflowAction | Run another shortcut |
229
+ | `runshellscript` | WFRunShellScriptAction | Run shell script |
230
+ | `getdevicedetails` | WFGetDeviceDetailsAction | Get device info |
231
+ | `getclipboard` | WFGetClipboardAction | Get clipboard |
232
+ | `setclipboard` | WFSetClipboardAction | Set clipboard |
233
+
234
+ ### Lists & Data
235
+
236
+ | Identifier | Class | Description |
237
+ |------------|-------|-------------|
238
+ | `list` | WFListAction | Create list |
239
+ | `dictionary` | WFDictionaryAction | Create dictionary |
240
+ | `getitemfromlist` | WFGetItemFromListAction | Get item from list |
241
+ | `count` | WFCountAction | Count items |
242
+
243
+ ### Numbers & Math
244
+
245
+ | Identifier | Class | Description |
246
+ |------------|-------|-------------|
247
+ | `number` | WFNumberAction | Create number |
248
+
249
+ ### Date & Time
250
+
251
+ | Identifier | Class | Description |
252
+ |------------|-------|-------------|
253
+ | `date` | WFDateAction | Create date |
254
+ | `adjustdate` | WFAdjustDateAction | Adjust date |
255
+ | `converttimezone` | WFConvertTimeZoneAction | Convert timezone |
256
+ | `gettimebetweendates` | WFTimeUntilAction | Get time between dates |
257
+ | `delay` | WFDelayAction | Wait |
258
+ | `waittoreturn` | WFWaitToReturnAction | Wait to return |
259
+
260
+ #### Get Time Between Dates (`is.workflow.actions.gettimebetweendates`)
261
+
262
+ - Set `WFInput` to the target/end date as a `WFTextTokenString` placeholder.
263
+ - Set exactly one date operand: usually `WFTimeUntilFromDate`, also as a `WFTextTokenString` placeholder.
264
+ - To compare an event start date with now, add a **Date** action set to **Current Date** and reference that action output from `WFTimeUntilFromDate`. Do not put a `CurrentDate` magic token directly in `WFTimeUntilFromDate`; it imports as an empty/default date field.
265
+ - Do not use bare `WFTextTokenAttachment` for either date input. It can validate structurally but import as "First Date" / "Second Date" placeholders in Shortcuts.
266
+
267
+ ### Calendar & Reminders
268
+
269
+ | Identifier | Class | Description |
270
+ |------------|-------|-------------|
271
+ | `addnewevent` | WFAddNewEventAction | Create event |
272
+ | `getupcomingevents` | WFGetUpcomingCalendarItemsAction | Get upcoming events |
273
+ | `addnewreminder` | WFAddNewReminderAction | Create reminder |
274
+
275
+ ### Weather & Location
276
+
277
+ | Identifier | Class | Description |
278
+ |------------|-------|-------------|
279
+ | `weather.currentconditions` | WFGetCurrentWeatherConditionsAction | Current weather |
280
+ | `weather.forecast` | WFGetWeatherForecastAction | Weather forecast |
281
+ | `getcurrentlocation` | WFGetCurrentLocationAction | Current location |
282
+ | `location` | WFLocationAction | Create location |
283
+ | `getdirections` | WFGetDirectionsAction | Get directions |
284
+ | `getdistance` | WFGetDistanceAction | Get distance |
285
+ | `searchmaps` | WFSearchMapsAction | Search maps |
286
+
287
+ ### Health
288
+
289
+ These actions are iOS/iPadOS Health actions. macOS Shortcuts can sync their plist XML, but cannot fully configure or run the Health UI. Use [HEALTHKIT.md](HEALTHKIT.md) for the verified parameter schemas.
290
+
291
+ | Identifier | Class | Description |
292
+ |------------|-------|-------------|
293
+ | `filter.health.quantity` | WFFindHealthSamplesAction | Find Health Samples |
294
+ | `properties.health.quantity` | WFGetDetailsOfHealthSampleAction | Get Details of Health Sample |
295
+ | `health.quantity.log` | WFLogHealthSampleAction | Log Health Sample |
296
+ | `health.workout.log` | WFLogWorkoutAction | Log Workout |
297
+
298
+ ### Media
299
+
300
+ | Identifier | Class | Description |
301
+ |------------|-------|-------------|
302
+ | `takephoto` | WFTakePhotoAction | Take photo |
303
+ | `takevideo` | WFTakeVideoAction | Take video |
304
+ | `selectphoto` | WFSelectPhotoAction | Select photos |
305
+ | `filter.photos` | WFContentItemFilterAction | Find/filter photos (see FILTERS.md) |
306
+ | `savetocameraroll` | WFSaveToCameraRollAction | Save to camera roll |
307
+ | `deletephotos` | WFDeletePhotosAction | Delete photos (**uses `photos` param, not `WFInput`**) |
308
+ | `playmusic` | WFPlayMusicAction | Play music |
309
+ | `recordaudio` | WFRecordAudioAction | Record audio |
310
+ | `playsound` | WFPlaySoundAction | Play sound |
311
+
312
+ ### Images
313
+
314
+ | Identifier | Class | Description |
315
+ |------------|-------|-------------|
316
+ | `overlaytext` | WFOverlayTextAction | Overlay text |
317
+ | `extracttextfromimage` | WFExtractTextFromImageAction | OCR |
318
+
319
+ ### PDF
320
+
321
+ | Identifier | Class | Description |
322
+ |------------|-------|-------------|
323
+ | `makepdf` | WFMakePDFAction | Create PDF |
324
+ | `splitpdf` | WFSplitPDFAction | Split PDF |
325
+ | `compresspdf` | WFCompressPDFAction | Compress PDF |
326
+ | `gettextfrompdf` | WFGetTextFromPDFAction | Extract text from PDF |
327
+ | `makeimagefrompdfpage` | WFMakeImageFromPDFPageAction | PDF page to image |
328
+
329
+ ### Sharing & Communication
330
+
331
+ | Identifier | Class | Description |
332
+ |------------|-------|-------------|
333
+ | `share` | WFShareAction | Share |
334
+ | `sendmessage` | WFSendMessageAction | Send message |
335
+ | `sendemail` | WFSendEmailAction | Send email |
336
+ | `contacts` | WFContactsAction | Get contacts |
337
+ | `selectcontacts` | WFSelectContactsAction | Select contacts |
338
+
339
+ ### Settings
340
+
341
+ | Identifier | Class | Description |
342
+ |------------|-------|-------------|
343
+ | `setvolume` | WFSetVolumeAction | Set volume |
344
+
345
+ ---
346
+ ## Complete Identifier List
347
+
348
+ All 365 action identifiers (prefix `is.workflow.actions.` omitted):
349
+
350
+ ```
351
+ addframetogif, addmusictoupnext, addnewcalendar, addnewcontact, addnewevent
352
+ addnewreminder, addquickreminder, address, addtoplaylist, adjustdate
353
+ airdropdocument, airplanemode.set, alert, announcenotifications.set, appearance
354
+ appendnote, appendvariable, ask, askllm, avairyeditphoto
355
+ base64encode, bluetooth.set, calculateexpression, cellulardata.set, choosefromlist
356
+ choosefrommenu, clearupnext, comment, compresspdf, conditional
357
+ connecttoservers, contacts, converttimezone, correctspelling, count
358
+ createplaylist, date, delay, deletephotos, deskconnect.send
359
+ detect.address, detect.contacts, detect.date, detect.dictionary, detect.emailaddress
360
+ detect.images, detect.link, detect.number, detect.phonenumber, detect.text
361
+ detectlanguage, dictatetext, dictionary, dismisssiri, display.always-on.set
362
+ displaysleep, dnd.getfocus, dnd.set, documentpicker.open, documentpicker.save
363
+ downloadurl, dropbox.appendfile, dropbox.open, dropbox.savefile, ejectdisk
364
+ email, encodemedia, evernote.append, evernote.delete, evernote.get
365
+ evernote.getlink, evernote.new, exit, exportsong, extracttextfromimage
366
+ file, file.append, file.createfolder, file.delete, file.getfoldercontents
367
+ file.getlink, file.label, file.move, file.rename, file.reveal
368
+ file.select, filter.apps, filter.articles, filter.calendarevents, filter.contacts
369
+ filter.displays, filter.eventattendees, filter.files, filter.health.quantity
370
+ filter.images, filter.locations, filter.music, filter.notes, filter.photos
371
+ filter.reminders, filter.windows
372
+ finder.getselectedfiles, flashlight, format.date, format.filesize, format.number
373
+ generatebarcode, get.playlist, getarticle, getbatterylevel, getclassaction
374
+ getclipboard, getcurrentapp, getcurrentlocation, getcurrentsong, getdevicedetails
375
+ getdirections, getdistance, getepisodesforpodcast, getframesfromimage, gethalfwaypoint
376
+ gethomeaccessorystate, gethtmlfromrichtext, getipaddress, getitemfromlist, getitemname
377
+ getitemtype, getlastphoto, getlastscreenshot, getlastvideo, getlatestbursts
378
+ getlatestlivephotos, getlatestphotoimport, getmapslink, getmarkdownfromrichtext, getmyworkflows
379
+ getnameofemoji, getonscreencontent, getparentdirectory, getparkedcarlocation, getpodcastsfromlibrary
380
+ getrichtextfromhtml, getrichtextfrommarkdown, gettext, gettextfrompdf, gettimebetweendates
381
+ gettraveltime, gettypeaction, getupcomingevents, getupcomingreminders, geturlcomponent
382
+ getvalueforkey, getvariable, getwebpagecontents, getwifi, giphy
383
+ goodreader.open, handoff, handoffplayback, hash, health.quantity.log
384
+ health.workout.log, hide.app, homeaccessory, image.combine, image.convert
385
+ image.convert.finder, image.crop, image.flip, image.mask, image.removebackground
386
+ image.resize, image.rotate, imgur.upload, importaudiofiles, input
387
+ instapaper.add, instapaper.get, intercom, list, listeningmode.set
388
+ location, lock.app, lockscreen, logout, lowpowermode.set
389
+ makediskimage, makegif, makeimagefrompdfpage, makeimagefromrichtext, makepdf
390
+ makespokenaudiofromtext, makevideofromgif, makezip, math, measurement.convert
391
+ measurement.create, mountdiskimage, movewindow, nightshift.set, nothing
392
+ notification, number, number.random, openapp, openin
393
+ openpasswords, openurl, openxcallbackurl, orientationlock.set, output
394
+ overlayimageonimage, overlaytext, pausemusic, personalhotspot.password.get, personalhotspot.password.set
395
+ personalhotspot.set, phonenumber, photos.createalbum, pinboard.add, pinboard.get
396
+ playmusic, playpodcast, playsound, pocket.add, pocket.get
397
+ podcasts.subscribe, posters.get, posters.switch, postonfacebook, previewdocument
398
+ print, properties.appearance, properties.appstore, properties.articles, properties.calendarevents
399
+ properties.contacts, properties.eventattendees, properties.files, properties.health.quantity
400
+ properties.images, properties.itunesartist, properties.itunesstore, properties.locations
401
+ properties.music, properties.parkedcar, properties.podcast, properties.podcastshow
402
+ properties.reminders, properties.ridestatus, properties.safariwebpage, properties.shazam
403
+ properties.trello, properties.ulysses.sheet, properties.weather.conditions, properties.workflow, quit.app
404
+ readinglist, reboot, recordaudio, reminders.showlist, removeevents
405
+ removefromalbum, removereminders, repeat.count, repeat.each, resizewindow
406
+ returntohomescreen, ride.requestride, round, rss, rss.extract
407
+ runapplescript, runextension, runjavascriptforautomation, runjavascriptonwebpage, runshellscript
408
+ runsshscript, runworkflow, safari.geturl, savetocameraroll, scanbarcode
409
+ searchappstore, searchitunes, searchlocalbusinesses, searchmaps, searchpodcasts
410
+ searchweb, seek, selectcontacts, selectemail, selectphone
411
+ selectphoto, sendemail, sendmessage, setairdropreceiving, setbrightness
412
+ setclipboard, setitemname, setparkedcar, setplaybackdestination, setters.calendarevents
413
+ setters.contacts, setters.reminders, setvalueforkey, setvariable, setvolume
414
+ share, shazamMedia, showdefinition, showinblindsquare, showincalendar
415
+ showinstore, shownote, showresult, showwebpage, silenceunknowncallers.set
416
+ skipback, skipforward, sleep, speaktext, splitpdf
417
+ splitscreen, spotlightsearch, stagemanager.set, startscreensaver, statistics
418
+ takephoto, takescreenshot, takevideo, text.changecase, text.combine
419
+ text.match, text.match.getgroup, text.replace, text.split, text.translate
420
+ text.trimwhitespace, timer.start, todoist.add, trello.add.board, trello.add.card
421
+ trello.add.list, trello.get, trimvideo, truetone.set, tumblr.post
422
+ tweet, unzip, url, url.expand, url.getheaders
423
+ urlencode, venmo.pay, venmo.request, vibrate, viewresult
424
+ vpn.set, waittoreturn, wallpaper.set, watchmedo, weather.currentconditions
425
+ weather.forecast, wifi.set, wordpress.post
426
+ ```
427
+
428
+ ---
429
+
430
+ ## Common Parameter Patterns
431
+
432
+ ### Text Parameters
433
+ ```xml
434
+ <key>WFTextActionText</key>
435
+ <string>Your text here</string>
436
+ ```
437
+
438
+ ### Variable Reference Parameters
439
+ ```xml
440
+ <key>Text</key>
441
+ <dict>
442
+ <key>Value</key>
443
+ <dict>
444
+ <key>attachmentsByRange</key>
445
+ <dict>
446
+ <key>{0, 1}</key>
447
+ <dict>
448
+ <key>OutputUUID</key>
449
+ <string>SOURCE-UUID</string>
450
+ <key>OutputName</key>
451
+ <string>Text</string>
452
+ <key>Type</key>
453
+ <string>ActionOutput</string>
454
+ </dict>
455
+ </dict>
456
+ <key>string</key>
457
+ <string></string>
458
+ </dict>
459
+ <key>WFSerializationType</key>
460
+ <string>WFTextTokenString</string>
461
+ </dict>
462
+ ```
463
+
464
+ ### Boolean Parameters
465
+ ```xml
466
+ <key>WFSomeOption</key>
467
+ <true/>
468
+ ```
469
+
470
+ ### Number Parameters
471
+ ```xml
472
+ <key>WFRepeatCount</key>
473
+ <integer>5</integer>
474
+ ```
475
+
476
+ ### Enum Parameters
477
+ ```xml
478
+ <key>WFHTTPMethod</key>
479
+ <string>GET</string>
480
+ ```
481
+
482
+ ---
483
+
484
+ ## Action-Specific Parameters
485
+
486
+ ### Get Contents of URL (`is.workflow.actions.downloadurl`)
487
+
488
+ The `downloadurl` action (WFDownloadURLAction) makes HTTP requests. It supports various methods, headers, and body types.
489
+
490
+ #### Basic Parameters
491
+
492
+ | Parameter | Type | Description |
493
+ |-----------|------|-------------|
494
+ | `UUID` | String | Unique identifier for variable references |
495
+ | `WFURL` | Variable ref or string | The URL to request |
496
+ | `WFHTTPMethod` | String | HTTP method: `GET`, `POST`, `PUT`, `PATCH`, `DELETE` |
497
+ | `WFHTTPBodyType` | String | Body type: `JSON`, `Form`, `File` |
498
+
499
+ #### Headers (`WFHTTPHeaders`)
500
+
501
+ Headers use `WFDictionaryFieldValue` serialization with key-value items:
502
+
503
+ ```xml
504
+ <key>WFHTTPHeaders</key>
505
+ <dict>
506
+ <key>Value</key>
507
+ <dict>
508
+ <key>WFDictionaryFieldValueItems</key>
509
+ <array>
510
+ <dict>
511
+ <key>WFItemType</key>
512
+ <integer>0</integer>
513
+ <key>WFKey</key>
514
+ <dict>
515
+ <key>Value</key>
516
+ <dict>
517
+ <key>string</key>
518
+ <string>Content-Type</string>
519
+ </dict>
520
+ <key>WFSerializationType</key>
521
+ <string>WFTextTokenString</string>
522
+ </dict>
523
+ <key>WFValue</key>
524
+ <dict>
525
+ <key>Value</key>
526
+ <dict>
527
+ <key>string</key>
528
+ <string>application/json</string>
529
+ </dict>
530
+ <key>WFSerializationType</key>
531
+ <string>WFTextTokenString</string>
532
+ </dict>
533
+ </dict>
534
+ </array>
535
+ </dict>
536
+ <key>WFSerializationType</key>
537
+ <string>WFDictionaryFieldValue</string>
538
+ </dict>
539
+ ```
540
+
541
+ #### JSON Body (`WFJSONValues`)
542
+
543
+ When `WFHTTPBodyType` is `JSON`, use `WFJSONValues` for key-value pairs:
544
+
545
+ ```xml
546
+ <key>WFJSONValues</key>
547
+ <dict>
548
+ <key>Value</key>
549
+ <dict>
550
+ <key>WFDictionaryFieldValueItems</key>
551
+ <array>
552
+ <dict>
553
+ <key>WFItemType</key>
554
+ <integer>0</integer>
555
+ <key>WFKey</key>
556
+ <dict>
557
+ <key>Value</key>
558
+ <dict>
559
+ <key>string</key>
560
+ <string>prompt</string>
561
+ </dict>
562
+ <key>WFSerializationType</key>
563
+ <string>WFTextTokenString</string>
564
+ </dict>
565
+ <key>WFValue</key>
566
+ <!-- Can be a static string or variable reference -->
567
+ <dict>
568
+ <key>Value</key>
569
+ <dict>
570
+ <key>attachmentsByRange</key>
571
+ <dict>
572
+ <key>{0, 1}</key>
573
+ <dict>
574
+ <key>OutputUUID</key>
575
+ <string>ASK-ACTION-UUID</string>
576
+ <key>OutputName</key>
577
+ <string>Provided Input</string>
578
+ <key>Type</key>
579
+ <string>ActionOutput</string>
580
+ </dict>
581
+ </dict>
582
+ <key>string</key>
583
+ <string></string>
584
+ </dict>
585
+ <key>WFSerializationType</key>
586
+ <string>WFTextTokenString</string>
587
+ </dict>
588
+ </dict>
589
+ </array>
590
+ </dict>
591
+ <key>WFSerializationType</key>
592
+ <string>WFDictionaryFieldValue</string>
593
+ </dict>
594
+ ```
595
+
596
+ #### Form Body (`WFFormValues`)
597
+
598
+ When `WFHTTPBodyType` is `Form`, use `WFFormValues` (same structure as `WFJSONValues`).
599
+
600
+ #### File Body (`WFRequestVariable`)
601
+
602
+ When `WFHTTPBodyType` is `File`, use `WFRequestVariable` to reference file data:
603
+
604
+ ```xml
605
+ <key>WFRequestVariable</key>
606
+ <dict>
607
+ <key>Value</key>
608
+ <dict>
609
+ <key>attachmentsByRange</key>
610
+ <dict>
611
+ <key>{0, 1}</key>
612
+ <dict>
613
+ <key>OutputUUID</key>
614
+ <string>FILE-SOURCE-UUID</string>
615
+ <key>OutputName</key>
616
+ <string>File</string>
617
+ <key>Type</key>
618
+ <string>ActionOutput</string>
619
+ </dict>
620
+ </dict>
621
+ <key>string</key>
622
+ <string></string>
623
+ </dict>
624
+ <key>WFSerializationType</key>
625
+ <string>WFTextTokenString</string>
626
+ </dict>
627
+ ```
628
+
629
+ #### WFItemType Values
630
+
631
+ The `WFItemType` field in dictionary items indicates the value type:
632
+
633
+ | Value | Type |
634
+ |-------|------|
635
+ | 0 | Text/String |
636
+ | 1 | Number |
637
+ | 2 | Array |
638
+ | 3 | Dictionary |
639
+ | 4 | Boolean |
640
+
641
+ ---
642
+
643
+ ### Find Photos (`is.workflow.actions.filter.photos`)
644
+
645
+ Searches the photo library with filters. See [FILTERS.md](./FILTERS.md) for complete filter documentation.
646
+
647
+ #### Key Parameters
648
+
649
+ | Parameter | Type | Description |
650
+ |-----------|------|-------------|
651
+ | `UUID` | String | Action identifier for output reference |
652
+ | `WFContentItemFilter` | Dict | Filter conditions (see FILTERS.md) |
653
+ | `WFContentItemSortProperty` | String | Sort by: `Date Taken`, `Creation Date`, etc. |
654
+ | `WFContentItemSortOrder` | String | `Latest First` or `Oldest First` |
655
+ | `WFContentItemLimitEnabled` | Boolean | Enable result limit |
656
+ | `WFContentItemLimitNumber` | Integer | Max results to return |
657
+
658
+ #### Filter Properties for Photos
659
+
660
+ | Property | Type | Notes |
661
+ |----------|------|-------|
662
+ | `Is a Screenshot` | Boolean | Use this for screenshots, NOT media_type |
663
+ | `Media Type` | Enum | ONLY: `Image`, `Video`, `Live Photo` |
664
+ | `Date Taken` | Date | Use operators 1002 (is today), 1001 (is in the last) |
665
+ | `Album` | String | Album name |
666
+ | `Is Favorite` | Boolean | Favorited photos |
667
+ | `Is Hidden` | Boolean | Hidden photos |
668
+
669
+ #### Common Mistake: Screenshot Filtering
670
+
671
+ **WRONG:** Using `Media Type` = `Screenshot` - This value is invalid!
672
+
673
+ **CORRECT:** Use `Is a Screenshot` = `true` (boolean filter)
674
+
675
+ ---
676
+
677
+ ### Delete Photos (`is.workflow.actions.deletephotos`)
678
+
679
+ Deletes photos from the library.
680
+
681
+ #### Critical: Parameter Key
682
+
683
+ **The parameter key is `photos` (lowercase), NOT `WFInput`!**
684
+
685
+ This is an exception to the normal pattern where most actions use `WFInput`.
686
+
687
+ #### Correct Structure
688
+
689
+ ```xml
690
+ <dict>
691
+ <key>WFWorkflowActionIdentifier</key>
692
+ <string>is.workflow.actions.deletephotos</string>
693
+ <key>WFWorkflowActionParameters</key>
694
+ <dict>
695
+ <key>UUID</key>
696
+ <string>DELETE-UUID</string>
697
+ <key>photos</key> <!-- NOT WFInput! -->
698
+ <dict>
699
+ <key>Value</key>
700
+ <dict>
701
+ <key>OutputName</key>
702
+ <string>Photos</string>
703
+ <key>OutputUUID</key>
704
+ <string>FIND-PHOTOS-UUID</string>
705
+ <key>Type</key>
706
+ <string>ActionOutput</string>
707
+ </dict>
708
+ <key>WFSerializationType</key>
709
+ <string>WFTextTokenAttachment</string>
710
+ </dict>
711
+ </dict>
712
+ </dict>
713
+ ```