makersclaw 0.8.0 → 0.8.2
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/README.md +9 -3
- package/package.json +1 -1
- package/r/activity-log.json +52 -0
- package/r/agent-changes.json +51 -0
- package/r/agent-chat.json +53 -0
- package/r/agent-column.json +85 -0
- package/r/agent-dock.json +57 -0
- package/r/agent-kit.json +49 -0
- package/r/agent-marks.json +49 -0
- package/r/agent-pane.json +93 -0
- package/r/ai-action.json +56 -0
- package/r/annotate.json +3 -3
- package/r/approval-request.json +2 -2
- package/r/approval.json +54 -0
- package/r/ask-bar.json +50 -0
- package/r/audio-player.json +2 -2
- package/r/auth-form.json +2 -2
- package/r/automation-editor.json +66 -0
- package/r/automation-list.json +57 -0
- package/r/automation-model.json +118 -0
- package/r/automations-screen.json +71 -0
- package/r/board.json +2 -2
- package/r/calendar-view.json +3 -3
- package/r/cart.json +2 -2
- package/r/chart.json +2 -2
- package/r/chat-pane.json +84 -0
- package/r/chat.json +2 -2
- package/r/code-editor.json +2 -2
- package/r/comment-box.json +3 -3
- package/r/connect-card.json +51 -0
- package/r/contact-section.json +2 -2
- package/r/core.json +13 -7
- package/r/cost.json +51 -0
- package/r/csv-import.json +3 -3
- package/r/data-picker.json +60 -0
- package/r/data-table.json +2 -2
- package/r/diagram.json +2 -2
- package/r/doc-editor.json +2 -2
- package/r/doc-page.json +3 -3
- package/r/email-render.json +2 -2
- package/r/faq.json +2 -2
- package/r/file-upload.json +2 -2
- package/r/first-run.json +63 -0
- package/r/fix-note.json +57 -0
- package/r/flow-canvas.json +2 -2
- package/r/flow-editor.json +79 -0
- package/r/footer.json +2 -2
- package/r/gantt.json +3 -3
- package/r/job-panel.json +2 -2
- package/r/json-editor.json +3 -3
- package/r/library-shelf.json +56 -0
- package/r/map.json +2 -2
- package/r/margin-notes.json +67 -0
- package/r/menubar.json +2 -2
- package/r/mind-map.json +3 -3
- package/r/navigation-menu.json +2 -2
- package/r/needs-you.json +55 -0
- package/r/order-detail.json +2 -2
- package/r/org-chart.json +3 -3
- package/r/pace-bar.json +69 -0
- package/r/page-builder.json +2 -2
- package/r/payment-methods.json +2 -2
- package/r/pdf-document.json +2 -2
- package/r/pdf-viewer.json +2 -2
- package/r/product-detail.json +2 -2
- package/r/product-grid.json +3 -3
- package/r/record-form.json +2 -2
- package/r/record-grid.json +52 -0
- package/r/record-notes.json +4 -4
- package/r/registry.json +4086 -1512
- package/r/run-history.json +52 -0
- package/r/run-view.json +80 -0
- package/r/schedule-card.json +54 -0
- package/r/schedule-engine.json +79 -0
- package/r/schedule-gantt.json +83 -0
- package/r/schedule-ruler.json +64 -0
- package/r/search-dialog.json +2 -2
- package/r/settings-list.json +2 -2
- package/r/setup-checklist.json +2 -2
- package/r/share-dialog.json +2 -2
- package/r/sidebar.json +2 -2
- package/r/signature-pad.json +2 -2
- package/r/sketch-canvas.json +2 -2
- package/r/source-receipt.json +52 -0
- package/r/spreadsheet.json +3 -3
- package/r/stat-cards.json +3 -3
- package/r/step-picker.json +53 -0
- package/r/step-settings.json +72 -0
- package/r/suggestion.json +58 -0
- package/r/sum-bar.json +64 -0
- package/r/task-list.json +3 -3
- package/r/task-model.json +2 -2
- package/r/testimonials.json +2 -2
- package/r/tier-map.json +67 -0
- package/r/time-grid.json +73 -0
- package/r/time-strip.json +64 -0
- package/r/top-bar.json +66 -0
- package/r/transaction-list.json +2 -2
- package/r/trigger-picker.json +61 -0
- package/r/whiteboard.json +3 -3
- package/r/workflow-view.json +55 -0
- package/registry/blocks/activity-log/README.md +112 -0
- package/registry/blocks/activity-log/activity-log.jsx +351 -0
- package/registry/blocks/activity-log/block.json +33 -0
- package/registry/blocks/activity-log/demo.jsx +48 -0
- package/registry/blocks/activity-log/index.js +4 -0
- package/registry/blocks/agent-changes/README.md +94 -0
- package/registry/blocks/agent-changes/agent-changes.jsx +118 -0
- package/registry/blocks/agent-changes/block.json +28 -0
- package/registry/blocks/agent-changes/demo.jsx +39 -0
- package/registry/blocks/agent-changes/index.js +3 -0
- package/registry/blocks/agent-chat/README.md +145 -0
- package/registry/blocks/agent-chat/agent-chat.jsx +415 -0
- package/registry/blocks/agent-chat/block.json +30 -0
- package/registry/blocks/agent-chat/demo.jsx +165 -0
- package/registry/blocks/agent-chat/index.js +3 -0
- package/registry/blocks/agent-column/README.md +197 -0
- package/registry/blocks/agent-column/agent-column.jsx +492 -0
- package/registry/blocks/agent-column/block.json +67 -0
- package/registry/blocks/agent-column/column-picker.jsx +163 -0
- package/registry/blocks/agent-column/demo.jsx +50 -0
- package/registry/blocks/agent-column/index.js +7 -0
- package/registry/blocks/agent-column/model.js +164 -0
- package/registry/blocks/agent-column/receipt.jsx +483 -0
- package/registry/blocks/agent-column/spreadsheet-type.jsx +24 -0
- package/registry/blocks/agent-dock/README.md +210 -0
- package/registry/blocks/agent-dock/agent-dock.jsx +356 -0
- package/registry/blocks/agent-dock/block.json +47 -0
- package/registry/blocks/agent-dock/demo.jsx +153 -0
- package/registry/blocks/agent-dock/dock-model.js +118 -0
- package/registry/blocks/agent-dock/index.js +5 -0
- package/registry/blocks/agent-kit/README.md +73 -0
- package/registry/blocks/agent-kit/agent-kit.jsx +86 -0
- package/registry/blocks/agent-kit/block.json +10 -0
- package/registry/blocks/agent-kit/demo.jsx +35 -0
- package/registry/blocks/agent-kit/index.js +3 -0
- package/registry/blocks/agent-marks/README.md +80 -0
- package/registry/blocks/agent-marks/agent-marks.jsx +133 -0
- package/registry/blocks/agent-marks/block.json +27 -0
- package/registry/blocks/agent-marks/demo.jsx +49 -0
- package/registry/blocks/agent-marks/index.js +3 -0
- package/registry/blocks/agent-pane/README.md +234 -0
- package/registry/blocks/agent-pane/agent-pane.jsx +246 -0
- package/registry/blocks/agent-pane/block.json +41 -0
- package/registry/blocks/agent-pane/composer.jsx +6 -0
- package/registry/blocks/agent-pane/demo.jsx +233 -0
- package/registry/blocks/agent-pane/dock-context.js +10 -0
- package/registry/blocks/agent-pane/index.js +4 -0
- package/registry/blocks/agent-pane/prose.jsx +84 -0
- package/registry/blocks/agent-pane/questions.jsx +134 -0
- package/registry/blocks/agent-pane/transcript.jsx +268 -0
- package/registry/blocks/agent-pane/work.jsx +368 -0
- package/registry/blocks/ai-action/README.md +94 -0
- package/registry/blocks/ai-action/ai-action.jsx +188 -0
- package/registry/blocks/ai-action/block.json +34 -0
- package/registry/blocks/ai-action/demo.jsx +93 -0
- package/registry/blocks/ai-action/index.js +3 -0
- package/registry/blocks/approval/README.md +145 -0
- package/registry/blocks/approval/approval.jsx +163 -0
- package/registry/blocks/approval/block.json +31 -0
- package/registry/blocks/approval/demo.jsx +121 -0
- package/registry/blocks/approval/index.js +3 -0
- package/registry/blocks/ask-bar/README.md +105 -0
- package/registry/blocks/ask-bar/ask-bar.jsx +166 -0
- package/registry/blocks/ask-bar/block.json +26 -0
- package/registry/blocks/ask-bar/demo.jsx +78 -0
- package/registry/blocks/ask-bar/index.js +3 -0
- package/registry/blocks/automation-editor/README.md +291 -0
- package/registry/blocks/automation-editor/automation-editor.jsx +656 -0
- package/registry/blocks/automation-editor/block.json +39 -0
- package/registry/blocks/automation-editor/demo.jsx +284 -0
- package/registry/blocks/automation-editor/index.js +4 -0
- package/registry/blocks/automation-editor/run-inputs.jsx +82 -0
- package/registry/blocks/automation-list/README.md +129 -0
- package/registry/blocks/automation-list/automation-list.jsx +476 -0
- package/registry/blocks/automation-list/block.json +35 -0
- package/registry/blocks/automation-list/demo.jsx +67 -0
- package/registry/blocks/automation-list/index.js +3 -0
- package/registry/blocks/automation-model/README.md +109 -0
- package/registry/blocks/automation-model/block.json +135 -0
- package/registry/blocks/automation-model/catalog.js +256 -0
- package/registry/blocks/automation-model/check.js +161 -0
- package/registry/blocks/automation-model/demo.jsx +42 -0
- package/registry/blocks/automation-model/edit.js +262 -0
- package/registry/blocks/automation-model/fixes.js +287 -0
- package/registry/blocks/automation-model/glyph.jsx +13 -0
- package/registry/blocks/automation-model/graph.js +410 -0
- package/registry/blocks/automation-model/index.js +33 -0
- package/registry/blocks/automation-model/overlay.js +175 -0
- package/registry/blocks/automation-model/parts.jsx +94 -0
- package/registry/blocks/automation-model/schedule.js +53 -0
- package/registry/blocks/automation-model/templates.js +128 -0
- package/registry/blocks/automation-model/values.js +29 -0
- package/registry/blocks/automation-model/words.js +439 -0
- package/registry/blocks/automations-screen/README.md +207 -0
- package/registry/blocks/automations-screen/automations-screen.jsx +452 -0
- package/registry/blocks/automations-screen/block.json +47 -0
- package/registry/blocks/automations-screen/demo.jsx +364 -0
- package/registry/blocks/automations-screen/index.js +4 -0
- package/registry/blocks/automations-screen/screen-model.js +129 -0
- package/registry/blocks/chat-pane/README.md +143 -0
- package/registry/blocks/chat-pane/block.json +48 -0
- package/registry/blocks/chat-pane/chat-attach.js +166 -0
- package/registry/blocks/chat-pane/chat-composer.jsx +195 -0
- package/registry/blocks/chat-pane/chat-context.js +17 -0
- package/registry/blocks/chat-pane/chat-model.js +43 -0
- package/registry/blocks/chat-pane/chat-pane.jsx +398 -0
- package/registry/blocks/chat-pane/chats-list.jsx +52 -0
- package/registry/blocks/chat-pane/demo.jsx +103 -0
- package/registry/blocks/chat-pane/index.js +9 -0
- package/registry/blocks/connect-card/README.md +99 -0
- package/registry/blocks/connect-card/block.json +10 -0
- package/registry/blocks/connect-card/connect-card.jsx +103 -0
- package/registry/blocks/connect-card/demo.jsx +49 -0
- package/registry/blocks/connect-card/index.js +3 -0
- package/registry/blocks/cost/README.md +115 -0
- package/registry/blocks/cost/block.json +10 -0
- package/registry/blocks/cost/cost.jsx +176 -0
- package/registry/blocks/cost/demo.jsx +66 -0
- package/registry/blocks/cost/index.js +3 -0
- package/registry/blocks/data-picker/README.md +81 -0
- package/registry/blocks/data-picker/block.json +38 -0
- package/registry/blocks/data-picker/data-picker.jsx +210 -0
- package/registry/blocks/data-picker/demo.jsx +34 -0
- package/registry/blocks/data-picker/fields.js +89 -0
- package/registry/blocks/data-picker/index.js +4 -0
- package/registry/blocks/data-table/demo.jsx +1 -1
- package/registry/blocks/first-run/README.md +118 -0
- package/registry/blocks/first-run/block.json +11 -0
- package/registry/blocks/first-run/demo.jsx +88 -0
- package/registry/blocks/first-run/first-run-model.js +51 -0
- package/registry/blocks/first-run/first-run.jsx +156 -0
- package/registry/blocks/first-run/index.js +5 -0
- package/registry/blocks/first-run/probe-rules.js +26 -0
- package/registry/blocks/fix-note/README.md +79 -0
- package/registry/blocks/fix-note/block.json +35 -0
- package/registry/blocks/fix-note/demo.jsx +30 -0
- package/registry/blocks/fix-note/fix-note.jsx +235 -0
- package/registry/blocks/fix-note/index.js +3 -0
- package/registry/blocks/flow-editor/README.md +108 -0
- package/registry/blocks/flow-editor/block.json +44 -0
- package/registry/blocks/flow-editor/demo.jsx +115 -0
- package/registry/blocks/flow-editor/flow-canvas.jsx +568 -0
- package/registry/blocks/flow-editor/flow-editor.jsx +154 -0
- package/registry/blocks/flow-editor/index.js +6 -0
- package/registry/blocks/flow-editor/minimap.jsx +78 -0
- package/registry/blocks/flow-editor/outline.jsx +134 -0
- package/registry/blocks/library-shelf/README.md +117 -0
- package/registry/blocks/library-shelf/block.json +28 -0
- package/registry/blocks/library-shelf/demo.jsx +68 -0
- package/registry/blocks/library-shelf/index.js +3 -0
- package/registry/blocks/library-shelf/library-shelf.jsx +211 -0
- package/registry/blocks/library-shelf/probe-rules.js +15 -0
- package/registry/blocks/margin-notes/README.md +222 -0
- package/registry/blocks/margin-notes/block.json +10 -0
- package/registry/blocks/margin-notes/demo.jsx +144 -0
- package/registry/blocks/margin-notes/index.js +20 -0
- package/registry/blocks/margin-notes/margin-model.js +224 -0
- package/registry/blocks/margin-notes/margin-notes.jsx +465 -0
- package/registry/blocks/needs-you/README.md +177 -0
- package/registry/blocks/needs-you/block.json +34 -0
- package/registry/blocks/needs-you/demo.jsx +143 -0
- package/registry/blocks/needs-you/index.js +3 -0
- package/registry/blocks/needs-you/needs-you.jsx +441 -0
- package/registry/blocks/pace-bar/README.md +230 -0
- package/registry/blocks/pace-bar/block.json +10 -0
- package/registry/blocks/pace-bar/demo.jsx +255 -0
- package/registry/blocks/pace-bar/index.js +22 -0
- package/registry/blocks/pace-bar/pace-bar.jsx +461 -0
- package/registry/blocks/pace-bar/pace-model.js +288 -0
- package/registry/blocks/record-grid/README.md +100 -0
- package/registry/blocks/record-grid/block.json +28 -0
- package/registry/blocks/record-grid/demo.jsx +43 -0
- package/registry/blocks/record-grid/index.js +3 -0
- package/registry/blocks/record-grid/record-grid.jsx +251 -0
- package/registry/blocks/run-history/README.md +138 -0
- package/registry/blocks/run-history/block.json +10 -0
- package/registry/blocks/run-history/demo.jsx +74 -0
- package/registry/blocks/run-history/index.js +3 -0
- package/registry/blocks/run-history/run-history.jsx +218 -0
- package/registry/blocks/run-view/README.md +174 -0
- package/registry/blocks/run-view/block.json +50 -0
- package/registry/blocks/run-view/demo.jsx +286 -0
- package/registry/blocks/run-view/index.js +5 -0
- package/registry/blocks/run-view/run-controls.jsx +266 -0
- package/registry/blocks/run-view/run-view.jsx +236 -0
- package/registry/blocks/run-view/runs-list.jsx +99 -0
- package/registry/blocks/schedule-card/README.md +121 -0
- package/registry/blocks/schedule-card/block.json +10 -0
- package/registry/blocks/schedule-card/demo.jsx +82 -0
- package/registry/blocks/schedule-card/index.js +3 -0
- package/registry/blocks/schedule-card/schedule-card.jsx +136 -0
- package/registry/blocks/schedule-engine/README.md +137 -0
- package/registry/blocks/schedule-engine/block.json +10 -0
- package/registry/blocks/schedule-engine/demo.jsx +82 -0
- package/registry/blocks/schedule-engine/engine.js +769 -0
- package/registry/blocks/schedule-engine/index.js +9 -0
- package/registry/blocks/schedule-engine/ops.js +71 -0
- package/registry/blocks/schedule-engine/place.js +294 -0
- package/registry/blocks/schedule-engine/tree.js +79 -0
- package/registry/blocks/schedule-engine/waits.js +80 -0
- package/registry/blocks/schedule-gantt/README.md +159 -0
- package/registry/blocks/schedule-gantt/block.json +10 -0
- package/registry/blocks/schedule-gantt/demo.jsx +223 -0
- package/registry/blocks/schedule-gantt/gantt-model.js +219 -0
- package/registry/blocks/schedule-gantt/geometry.js +176 -0
- package/registry/blocks/schedule-gantt/index.js +26 -0
- package/registry/blocks/schedule-gantt/schedule-gantt.jsx +882 -0
- package/registry/blocks/schedule-gantt/sheet.jsx +372 -0
- package/registry/blocks/schedule-gantt/track.jsx +190 -0
- package/registry/blocks/schedule-ruler/README.md +148 -0
- package/registry/blocks/schedule-ruler/block.json +10 -0
- package/registry/blocks/schedule-ruler/demo.jsx +181 -0
- package/registry/blocks/schedule-ruler/index.js +21 -0
- package/registry/blocks/schedule-ruler/ruler-model.js +239 -0
- package/registry/blocks/schedule-ruler/schedule-ruler.jsx +548 -0
- package/registry/blocks/source-receipt/README.md +97 -0
- package/registry/blocks/source-receipt/block.json +30 -0
- package/registry/blocks/source-receipt/demo.jsx +71 -0
- package/registry/blocks/source-receipt/index.js +3 -0
- package/registry/blocks/source-receipt/source-receipt.jsx +107 -0
- package/registry/blocks/spreadsheet/spreadsheet.jsx +15 -1
- package/registry/blocks/step-picker/README.md +78 -0
- package/registry/blocks/step-picker/block.json +31 -0
- package/registry/blocks/step-picker/demo.jsx +23 -0
- package/registry/blocks/step-picker/index.js +3 -0
- package/registry/blocks/step-picker/step-picker.jsx +144 -0
- package/registry/blocks/step-settings/README.md +100 -0
- package/registry/blocks/step-settings/block.json +44 -0
- package/registry/blocks/step-settings/demo.jsx +93 -0
- package/registry/blocks/step-settings/fields.jsx +58 -0
- package/registry/blocks/step-settings/flow-settings.jsx +115 -0
- package/registry/blocks/step-settings/index.js +5 -0
- package/registry/blocks/step-settings/step-settings.jsx +290 -0
- package/registry/blocks/suggestion/README.md +171 -0
- package/registry/blocks/suggestion/block.json +40 -0
- package/registry/blocks/suggestion/demo.jsx +91 -0
- package/registry/blocks/suggestion/index.js +3 -0
- package/registry/blocks/suggestion/suggestion.jsx +436 -0
- package/registry/blocks/sum-bar/README.md +122 -0
- package/registry/blocks/sum-bar/block.json +10 -0
- package/registry/blocks/sum-bar/demo.jsx +110 -0
- package/registry/blocks/sum-bar/index.js +5 -0
- package/registry/blocks/sum-bar/sum-bar.jsx +209 -0
- package/registry/blocks/sum-bar/sum-model.js +126 -0
- package/registry/blocks/tier-map/README.md +217 -0
- package/registry/blocks/tier-map/block.json +10 -0
- package/registry/blocks/tier-map/demo.jsx +222 -0
- package/registry/blocks/tier-map/index.js +24 -0
- package/registry/blocks/tier-map/tier-map.jsx +574 -0
- package/registry/blocks/tier-map/tier-model.js +318 -0
- package/registry/blocks/time-grid/README.md +305 -0
- package/registry/blocks/time-grid/block.json +10 -0
- package/registry/blocks/time-grid/demo.jsx +279 -0
- package/registry/blocks/time-grid/grid-model.js +322 -0
- package/registry/blocks/time-grid/index.js +25 -0
- package/registry/blocks/time-grid/time-grid.jsx +1325 -0
- package/registry/blocks/time-strip/README.md +141 -0
- package/registry/blocks/time-strip/block.json +10 -0
- package/registry/blocks/time-strip/demo.jsx +129 -0
- package/registry/blocks/time-strip/index.js +19 -0
- package/registry/blocks/time-strip/strip-model.js +178 -0
- package/registry/blocks/time-strip/time-strip.jsx +260 -0
- package/registry/blocks/top-bar/README.md +149 -0
- package/registry/blocks/top-bar/block.json +35 -0
- package/registry/blocks/top-bar/demo.jsx +78 -0
- package/registry/blocks/top-bar/index.js +5 -0
- package/registry/blocks/top-bar/probe-rules.js +74 -0
- package/registry/blocks/top-bar/top-bar-model.js +152 -0
- package/registry/blocks/top-bar/top-bar.jsx +244 -0
- package/registry/blocks/trigger-picker/README.md +98 -0
- package/registry/blocks/trigger-picker/block.json +38 -0
- package/registry/blocks/trigger-picker/demo.jsx +59 -0
- package/registry/blocks/trigger-picker/index.js +3 -0
- package/registry/blocks/trigger-picker/trigger-picker.jsx +374 -0
- package/registry/blocks/workflow-view/README.md +123 -0
- package/registry/blocks/workflow-view/block.json +10 -0
- package/registry/blocks/workflow-view/demo.jsx +90 -0
- package/registry/blocks/workflow-view/index.js +3 -0
- package/registry/blocks/workflow-view/workflow-view.jsx +203 -0
- package/src/install.mjs +77 -16
- package/src/registry.mjs +3 -0
- package/templates/next/browser/lib/data.js +6 -1
- package/templates/next/files/README.md +627 -24
- package/templates/next/files/check/automation-format.ts +2103 -0
- package/templates/next/files/check/automation-package.ts +142 -0
- package/templates/next/files/check/run.mjs +968 -9
- package/templates/next/files/components/ui/field.jsx +17 -4
- package/templates/next/files/components/ui/icon.jsx +13 -0
- package/templates/next/files/components/ui/index.js +2 -1
- package/templates/next/files/components/ui/layout.jsx +77 -2
- package/templates/next/files/components/ui/notice.jsx +70 -0
- package/templates/next/files/components/ui/page.jsx +124 -0
- package/templates/next/files/components/ui/stat.jsx +22 -7
- package/templates/next/files/components/ui/toast.jsx +6 -3
- package/templates/next/files/lib/automations.js +660 -0
- package/templates/next/files/lib/claw.js +241 -5
- package/templates/next/files/lib/door.js +92 -0
- package/templates/next/files/lib/hooks.js +1677 -8
- package/templates/next/files/lib/platform.js +529 -21
- package/templates/next/template.json +13 -3
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// Copied from claw shared/src/automation-package.ts @ 33de2374. Never edit; refresh with scripts/sync-automation-format.mjs.
|
|
2
|
+
/**
|
|
3
|
+
* An app package's automations (docs/AUTOMATIONS-PLAN.md phase 9, "App
|
|
4
|
+
* packages, and members editing them").
|
|
5
|
+
*
|
|
6
|
+
* What an app ships: `automations` in `app/makersclaw.json` and
|
|
7
|
+
* `store.json` `seeds.automations` (the same list, as `actions` is). Each
|
|
8
|
+
* entry is a definition (format 1, ./automation.ts) plus ONE field that is
|
|
9
|
+
* not part of it:
|
|
10
|
+
*
|
|
11
|
+
* replaces_wake the name of a legacy wake (`seeds.wakes`) this
|
|
12
|
+
* automation takes over. Adopt and the Update switch that
|
|
13
|
+
* wake off, so the job never fires twice, and the lift
|
|
14
|
+
* (phase 5) stops showing it. It lives in the package,
|
|
15
|
+
* not in the definition: the definition is what a member
|
|
16
|
+
* edits and what the three-way merge hashes, and "which
|
|
17
|
+
* old wake this replaces" is neither.
|
|
18
|
+
*
|
|
19
|
+
* One function checks the whole list, for every door that takes a package
|
|
20
|
+
* in: the template's `npm run check`, the store's `publish.mjs`, the
|
|
21
|
+
* registry sync and the install.
|
|
22
|
+
*
|
|
23
|
+
* Standalone, with no runtime import, so the template and the store can
|
|
24
|
+
* load a copy under plain node (type stripping): the format's own module
|
|
25
|
+
* is handed in as `fmt` (`import * as fmt from "./automation.ts"`), and
|
|
26
|
+
* only its TYPES are imported here (erased).
|
|
27
|
+
*/
|
|
28
|
+
import type { AutomationDef, Problem, ValidateOptions, validateAutomation, walkSteps, CODE_STEP_KINDS } from "./automation.js";
|
|
29
|
+
|
|
30
|
+
export interface PackageAutomation {
|
|
31
|
+
automation: AutomationDef;
|
|
32
|
+
replaces_wake: string | null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** The pieces of `./automation.ts` this file calls. */
|
|
36
|
+
export interface FormatModule {
|
|
37
|
+
validateAutomation: typeof validateAutomation;
|
|
38
|
+
walkSteps: typeof walkSteps;
|
|
39
|
+
CODE_STEP_KINDS: typeof CODE_STEP_KINDS;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface PackageContext {
|
|
43
|
+
/** The app's declared action names (`seeds.actions`). An `action` step
|
|
44
|
+
* must name one. Absent: not checked. */
|
|
45
|
+
actionNames?: ReadonlySet<string> | null;
|
|
46
|
+
/** The output shape of an action (from its declaration), if known. */
|
|
47
|
+
actionShape?: ValidateOptions["actionShape"];
|
|
48
|
+
/** The package's wakes. `replaces_wake` must name a scheduled one
|
|
49
|
+
* (advance or review): an event wake is fired by the app and the
|
|
50
|
+
* engine does not claim its receipts yet. Absent: not checked. */
|
|
51
|
+
wakes?: readonly { name: string; kind?: string | null }[] | null;
|
|
52
|
+
/** The kinds of account a `tool` step may ask for (connection
|
|
53
|
+
* categories). Absent: not checked. */
|
|
54
|
+
categories?: ReadonlySet<string> | null;
|
|
55
|
+
cronCheck?: ValidateOptions["cronCheck"];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const PACKAGE_AUTOMATIONS_MAX = 20;
|
|
59
|
+
/** A package's whole `automations` list, as JSON. */
|
|
60
|
+
export const PACKAGE_AUTOMATIONS_BYTES = 400 * 1024;
|
|
61
|
+
const WAKE_NAME = /^[A-Za-z0-9][A-Za-z0-9_-]{0,59}$/;
|
|
62
|
+
|
|
63
|
+
export type PackageResult = { ok: true; entries: PackageAutomation[] } | { ok: false; problems: Problem[] };
|
|
64
|
+
|
|
65
|
+
const isObject = (v: unknown): v is Record<string, unknown> => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Every rule for a package's list: the list's shape, unique keys, each
|
|
69
|
+
* definition through `validateAutomation` (the kinds an engine runs), the
|
|
70
|
+
* declared actions, the kinds of account, and `replaces_wake`. Problems name
|
|
71
|
+
* the entry: `automations[1] (friday-review).steps[0].action`.
|
|
72
|
+
*/
|
|
73
|
+
export function validatePackageAutomations(raw: unknown, ctx: PackageContext, fmt: FormatModule): PackageResult {
|
|
74
|
+
const problems: Problem[] = [];
|
|
75
|
+
const add = (path: string, message: string) => problems.push({ path, message });
|
|
76
|
+
if (raw === undefined || raw === null) return { ok: true, entries: [] };
|
|
77
|
+
if (!Array.isArray(raw)) return { ok: false, problems: [{ path: "automations", message: "automations is a list" }] };
|
|
78
|
+
if (raw.length > PACKAGE_AUTOMATIONS_MAX) add("automations", `at most ${PACKAGE_AUTOMATIONS_MAX} automations; this package ships ${raw.length}`);
|
|
79
|
+
let bytes = 0;
|
|
80
|
+
try {
|
|
81
|
+
bytes = JSON.stringify(raw).length;
|
|
82
|
+
} catch {
|
|
83
|
+
add("automations", "only JSON values");
|
|
84
|
+
}
|
|
85
|
+
if (bytes > PACKAGE_AUTOMATIONS_BYTES) add("automations", `the list is ${Math.round(bytes / 1024)} KB; at most ${Math.round(PACKAGE_AUTOMATIONS_BYTES / 1024)} KB`);
|
|
86
|
+
const entries: PackageAutomation[] = [];
|
|
87
|
+
const keys = new Set<string>();
|
|
88
|
+
const taken = new Map<string, string>();
|
|
89
|
+
raw.slice(0, PACKAGE_AUTOMATIONS_MAX).forEach((item, i) => {
|
|
90
|
+
const key = isObject(item) && typeof item.key === "string" ? item.key : null;
|
|
91
|
+
const where = key ? `automations[${i}] (${key})` : `automations[${i}]`;
|
|
92
|
+
if (!isObject(item)) return add(where, "an automation is a JSON object");
|
|
93
|
+
const { replaces_wake: replaces, ...definition } = item;
|
|
94
|
+
let replacesWake: string | null = null;
|
|
95
|
+
if (replaces !== undefined && replaces !== null) {
|
|
96
|
+
if (typeof replaces !== "string" || !WAKE_NAME.test(replaces)) add(`${where}.replaces_wake`, "replaces_wake is the name of one of the package's wakes");
|
|
97
|
+
else {
|
|
98
|
+
replacesWake = replaces;
|
|
99
|
+
const wake = ctx.wakes?.find((w) => w.name === replaces);
|
|
100
|
+
if (ctx.wakes && !wake) {
|
|
101
|
+
const names = ctx.wakes.map((w) => w.name);
|
|
102
|
+
add(`${where}.replaces_wake`, `"${replaces}" is not a wake of this package${names.length ? ` (its wakes: ${names.join(", ")})` : " (it has none)"}`);
|
|
103
|
+
} else if (wake && (wake.kind ?? "advance") === "event") {
|
|
104
|
+
add(`${where}.replaces_wake`, `"${replaces}" is an event wake: the app fires it, and an automation does not take its events yet`);
|
|
105
|
+
}
|
|
106
|
+
const other = taken.get(replaces);
|
|
107
|
+
if (other) add(`${where}.replaces_wake`, `"${replaces}" is already replaced by "${other}"`);
|
|
108
|
+
else taken.set(replaces, key ?? String(i));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const checked = fmt.validateAutomation(definition, {
|
|
112
|
+
kinds: fmt.CODE_STEP_KINDS,
|
|
113
|
+
...(ctx.actionNames !== undefined ? { actionNames: ctx.actionNames } : {}),
|
|
114
|
+
...(ctx.actionShape ? { actionShape: ctx.actionShape } : {}),
|
|
115
|
+
...(ctx.cronCheck ? { cronCheck: ctx.cronCheck } : {}),
|
|
116
|
+
});
|
|
117
|
+
if (!checked.ok) {
|
|
118
|
+
for (const p of checked.problems) add(p.path ? `${where}.${p.path}` : where, p.message);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const def = checked.automation;
|
|
122
|
+
if (keys.has(def.key)) add(`${where}.key`, `"${def.key}" is used by another automation of this package`);
|
|
123
|
+
keys.add(def.key);
|
|
124
|
+
const categories = ctx.categories;
|
|
125
|
+
fmt.walkSteps(def.steps, (s) => {
|
|
126
|
+
// An app's own automation acts on its own app (A4): it never names another.
|
|
127
|
+
if (s.kind === "action" && s.app) add(`${where}.steps.${s.id}.app`, "a package's automation runs its own app's actions: leave app out");
|
|
128
|
+
if (categories && s.kind === "tool" && !categories.has(s.needs.category)) {
|
|
129
|
+
add(`${where}.steps.${s.id}.needs`, `"${s.needs.category}" is not a kind of account (${[...categories].join(", ")})`);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
entries.push({ automation: def, replaces_wake: replacesWake });
|
|
133
|
+
});
|
|
134
|
+
return problems.length ? { ok: false, problems } : { ok: true, entries };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Problems as one line each, for a refusal's text. */
|
|
138
|
+
export function packageProblemLines(problems: readonly Problem[], max = 8): string[] {
|
|
139
|
+
const lines = problems.slice(0, max).map((p) => (p.path ? `${p.path}: ${p.message}` : p.message));
|
|
140
|
+
if (problems.length > max) lines.push(`and ${problems.length - max} more`);
|
|
141
|
+
return lines;
|
|
142
|
+
}
|