@nodegx/mcp 0.1.0 → 0.2.0

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 (64) hide show
  1. package/dist/backend/cli.js +102959 -0
  2. package/dist/cloud-bundle.cjs +35311 -2409
  3. package/dist/kit-extract.cjs +732 -545
  4. package/dist/kit-extract.inputs.json +115 -113
  5. package/dist/node-catalog.json +502 -59
  6. package/dist/noodl-mcp.cjs +44889 -9360
  7. package/dist/package.json +6 -0
  8. package/dist/preset-fonts/dm-sans/OFL.txt +93 -0
  9. package/dist/preset-fonts/dm-sans/dm-sans-latin-ext-wght-normal.woff2 +0 -0
  10. package/dist/preset-fonts/dm-sans/dm-sans-latin-wght-normal.woff2 +0 -0
  11. package/dist/preset-fonts/dm-sans/manifest.json +9 -0
  12. package/dist/preset-fonts/dm-sans/styles.css +25 -0
  13. package/dist/preset-fonts/nunito/OFL.txt +93 -0
  14. package/dist/preset-fonts/nunito/manifest.json +9 -0
  15. package/dist/preset-fonts/nunito/nunito-latin-ext-wght-normal.woff2 +0 -0
  16. package/dist/preset-fonts/nunito/nunito-latin-wght-normal.woff2 +0 -0
  17. package/dist/preset-fonts/nunito/styles.css +25 -0
  18. package/dist/preset-fonts/source-sans-3/OFL.txt +93 -0
  19. package/dist/preset-fonts/source-sans-3/manifest.json +9 -0
  20. package/dist/preset-fonts/source-sans-3/source-sans-3-latin-ext-wght-normal.woff2 +0 -0
  21. package/dist/preset-fonts/source-sans-3/source-sans-3-latin-wght-normal.woff2 +0 -0
  22. package/dist/preset-fonts/source-sans-3/styles.css +25 -0
  23. package/dist/render-harness/data/node-catalog-enriched.json +93650 -0
  24. package/dist/render-harness/data/node-catalog.json +65289 -0
  25. package/dist/render-harness/data/tokens.ts +674 -0
  26. package/dist/render-harness/drive-steps.js +2784 -0
  27. package/dist/render-harness/measure-from-disk.js +2366 -0
  28. package/dist/render-harness/node_modules/ws/LICENSE +20 -0
  29. package/dist/render-harness/node_modules/ws/README.md +548 -0
  30. package/dist/render-harness/node_modules/ws/browser.js +8 -0
  31. package/dist/render-harness/node_modules/ws/index.js +22 -0
  32. package/dist/render-harness/node_modules/ws/lib/buffer-util.js +131 -0
  33. package/dist/render-harness/node_modules/ws/lib/constants.js +19 -0
  34. package/dist/render-harness/node_modules/ws/lib/event-target.js +292 -0
  35. package/dist/render-harness/node_modules/ws/lib/extension.js +203 -0
  36. package/dist/render-harness/node_modules/ws/lib/limiter.js +55 -0
  37. package/dist/render-harness/node_modules/ws/lib/permessage-deflate.js +528 -0
  38. package/dist/render-harness/node_modules/ws/lib/receiver.js +743 -0
  39. package/dist/render-harness/node_modules/ws/lib/sender.js +607 -0
  40. package/dist/render-harness/node_modules/ws/lib/stream.js +161 -0
  41. package/dist/render-harness/node_modules/ws/lib/subprotocol.js +62 -0
  42. package/dist/render-harness/node_modules/ws/lib/validation.js +152 -0
  43. package/dist/render-harness/node_modules/ws/lib/websocket-server.js +562 -0
  44. package/dist/render-harness/node_modules/ws/lib/websocket.js +1407 -0
  45. package/dist/render-harness/node_modules/ws/package.json +74 -0
  46. package/dist/render-harness/node_modules/ws/wrapper.mjs +21 -0
  47. package/dist/render-harness/render-from-disk.js +7306 -0
  48. package/dist/src/external/viewer/global.d.ts.keep +718 -0
  49. package/dist/src/external/viewer/index.html +126 -0
  50. package/dist/src/external/viewer/load_terminator.js +1 -0
  51. package/dist/src/external/viewer/ndl_assets/OpenSans-Bold.ttf +0 -0
  52. package/dist/src/external/viewer/ndl_assets/OpenSans-Regular.ttf +0 -0
  53. package/dist/src/external/viewer/ndl_assets/home-icon.svg +3 -0
  54. package/dist/src/external/viewer/ndl_assets/make-home-instructions@2x.png +0 -0
  55. package/dist/src/external/viewer/ndl_assets/noodl-logo-black.svg +3 -0
  56. package/dist/src/external/viewer/noodl-app.png +0 -0
  57. package/dist/src/external/viewer/noodl.viewer.js +2 -0
  58. package/dist/src/external/viewer/noodl.viewer.js.LICENSE.txt +20 -0
  59. package/dist/src/external/viewer/react-dom.production.min.js +267 -0
  60. package/dist/src/external/viewer/react.production.min.js +31 -0
  61. package/dist/src/external/viewer/react19/VERSION +2 -0
  62. package/dist/src/external/viewer/react19/react-dom.production.min.js +51 -0
  63. package/dist/src/external/viewer/react19/react.production.min.js +21 -0
  64. package/package.json +8 -2
@@ -135,7 +135,8 @@
135
135
  "from": "array",
136
136
  "to": [
137
137
  "collection",
138
- "string"
138
+ "string",
139
+ "optionslist"
139
140
  ]
140
141
  }
141
142
  ],
@@ -156,6 +157,7 @@
156
157
  "compat": "safe"
157
158
  },
158
159
  "docs": "https://docs.noodl.net/nodes/data/cloud-data/add-record-relation",
160
+ "usePortAsLabel": "collectionName",
159
161
  "inputs": [
160
162
  {
161
163
  "name": "idSource",
@@ -997,6 +999,7 @@
997
999
  "Visual"
998
1000
  ],
999
1001
  "allowAsExportRoot": true,
1002
+ "replacedBy": "net.noodl.controls.button",
1000
1003
  "useVariants": true,
1001
1004
  "inputs": [
1002
1005
  {
@@ -1570,7 +1573,7 @@
1570
1573
  },
1571
1574
  "isSignal": false,
1572
1575
  "default": true,
1573
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
1576
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
1574
1577
  "index": 9999
1575
1578
  },
1576
1579
  {
@@ -2301,6 +2304,7 @@
2301
2304
  "docs": "https://docs.noodl.net/nodes/visual/checkbox",
2302
2305
  "allowAsChild": true,
2303
2306
  "allowAsExportRoot": true,
2307
+ "replacedBy": "net.noodl.controls.checkbox",
2304
2308
  "useVariants": true,
2305
2309
  "inputs": [
2306
2310
  {
@@ -2823,7 +2827,7 @@
2823
2827
  },
2824
2828
  "isSignal": false,
2825
2829
  "default": true,
2826
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
2830
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
2827
2831
  "index": 9999
2828
2832
  },
2829
2833
  {
@@ -3872,7 +3876,7 @@
3872
3876
  },
3873
3877
  "isSignal": false,
3874
3878
  "default": true,
3875
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
3879
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
3876
3880
  "index": 9999
3877
3881
  },
3878
3882
  {
@@ -4930,6 +4934,8 @@
4930
4934
  "compat": "safe"
4931
4935
  },
4932
4936
  "docs": "https://docs.noodl.net/nodes/data/cloud-data/cloud-function",
4937
+ "usePortAsLabel": "functionName",
4938
+ "replacedBy": "CloudFunction2",
4933
4939
  "inputs": [
4934
4940
  {
4935
4941
  "name": "call",
@@ -5041,6 +5047,7 @@
5041
5047
  "compat": "safe"
5042
5048
  },
5043
5049
  "docs": "https://docs.noodl.net/nodes/data/cloud-data/cloud-function",
5050
+ "usePortAsLabel": "function",
5044
5051
  "inputs": [
5045
5052
  {
5046
5053
  "name": "call",
@@ -5134,6 +5141,8 @@
5134
5141
  "compat": "safe"
5135
5142
  },
5136
5143
  "docs": "https://docs.noodl.net/nodes/data/array",
5144
+ "usePortAsLabel": "collectionId",
5145
+ "replacedBy": "Collection2",
5137
5146
  "inputs": [
5138
5147
  {
5139
5148
  "name": "add",
@@ -5336,6 +5345,7 @@
5336
5345
  "compat": "safe"
5337
5346
  },
5338
5347
  "docs": "https://docs.noodl.net/nodes/data/array/array-node",
5348
+ "usePortAsLabel": "collectionId",
5339
5349
  "inputs": [
5340
5350
  {
5341
5351
  "name": "collectionId",
@@ -5523,6 +5533,7 @@
5523
5533
  "compat": "safe"
5524
5534
  },
5525
5535
  "docs": "https://docs.noodl.net/nodes/data/array/clear-array",
5536
+ "usePortAsLabel": "collectionId",
5526
5537
  "inputs": [
5527
5538
  {
5528
5539
  "name": "clear",
@@ -5635,6 +5646,7 @@
5635
5646
  "compat": "safe"
5636
5647
  },
5637
5648
  "docs": "https://docs.noodl.net/nodes/data/array/insert-into-array",
5649
+ "usePortAsLabel": "collectionId",
5638
5650
  "inputs": [
5639
5651
  {
5640
5652
  "name": "add",
@@ -5849,6 +5861,7 @@
5849
5861
  "compat": "safe"
5850
5862
  },
5851
5863
  "docs": "https://docs.noodl.net/nodes/data/array/remove-from-array",
5864
+ "usePortAsLabel": "collectionId",
5852
5865
  "inputs": [
5853
5866
  {
5854
5867
  "name": "collectionId",
@@ -6215,6 +6228,9 @@
6215
6228
  },
6216
6229
  "shortDesc": "Placeholder marking where children given to an instance of this component are inserted.",
6217
6230
  "allowAsChild": true,
6231
+ "haveComponentChildren": [
6232
+ "Visual"
6233
+ ],
6218
6234
  "inputs": [],
6219
6235
  "outputs": [],
6220
6236
  "dynamicPorts": null,
@@ -6295,6 +6311,7 @@
6295
6311
  "compat": "safe"
6296
6312
  },
6297
6313
  "docs": "https://docs.noodl.net/nodes/component-utilities/component-object",
6314
+ "replacedBy": "net.noodl.ComponentObject",
6298
6315
  "inputs": [
6299
6316
  {
6300
6317
  "name": "fetch",
@@ -6715,6 +6732,9 @@
6715
6732
  "after the first: only where Reset returns to → Count Changed stays silent",
6716
6733
  "the first one: the count starts there too → Count Changed"
6717
6734
  ]
6735
+ },
6736
+ "warnings": {
6737
+ "counter/min-above-max": "Min Value is above Max Value"
6718
6738
  }
6719
6739
  },
6720
6740
  {
@@ -6860,6 +6880,8 @@
6860
6880
  "compat": "safe"
6861
6881
  },
6862
6882
  "docs": "https://docs.noodl.net/nodes/cloud-services/collection",
6883
+ "usePortAsLabel": "collectionName",
6884
+ "replacedBy": "DbCollection2",
6863
6885
  "inputs": [],
6864
6886
  "outputs": [
6865
6887
  {
@@ -7025,6 +7047,7 @@
7025
7047
  "compat": "safe"
7026
7048
  },
7027
7049
  "docs": "https://docs.noodl.net/nodes/data/cloud-data/query-records",
7050
+ "usePortAsLabel": "collectionName",
7028
7051
  "inputs": [],
7029
7052
  "outputs": [
7030
7053
  {
@@ -7361,6 +7384,8 @@
7361
7384
  "compat": "safe"
7362
7385
  },
7363
7386
  "docs": "https://docs.noodl.net/nodes/cloud-services/model",
7387
+ "usePortAsLabel": "$ndlCollectionName",
7388
+ "replacedBy": "DbModel2",
7364
7389
  "inputs": [
7365
7390
  {
7366
7391
  "name": "delete",
@@ -7628,6 +7653,7 @@
7628
7653
  "compat": "safe"
7629
7654
  },
7630
7655
  "docs": "https://docs.noodl.net/nodes/data/cloud-data/record",
7656
+ "usePortAsLabel": "collectionName",
7631
7657
  "inputs": [
7632
7658
  {
7633
7659
  "name": "fetch",
@@ -7886,6 +7912,7 @@
7886
7912
  "compat": "safe"
7887
7913
  },
7888
7914
  "docs": "https://docs.noodl.net/nodes/data/cloud-data/delete-record",
7915
+ "usePortAsLabel": "collectionName",
7889
7916
  "inputs": [
7890
7917
  {
7891
7918
  "name": "idSource",
@@ -8130,7 +8157,7 @@
8130
8157
  },
8131
8158
  "isSignal": false,
8132
8159
  "default": true,
8133
- "description": "Lets the user drag this element; when off it still renders and still responds to the Snap actions"
8160
+ "description": "Lets the user drag this element; when off (false, 0, empty or the text \"false\") it still renders and still responds to the Snap actions"
8134
8161
  },
8135
8162
  {
8136
8163
  "name": "inputPositionX",
@@ -8164,7 +8191,7 @@
8164
8191
  },
8165
8192
  "isSignal": false,
8166
8193
  "default": true,
8167
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
8194
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
8168
8195
  "index": 9999
8169
8196
  },
8170
8197
  {
@@ -8576,7 +8603,7 @@
8576
8603
  "always: read at the next Do — how long the Y snap takes, in milliseconds; nothing means 300, and 0 or less lands at Value at the next frame"
8577
8604
  ],
8578
8605
  "enabled": [
8579
- "always: read at the next press — off (exactly false; 0 or the text \"false\" is not off), a press starts no drag, a drag under way carries on to its let go, and the snaps still run"
8606
+ "always: read at the next press — off (false, 0, empty or the text \"false\"; nothing yet is on), a press starts no drag, a drag under way carries on to its let go, and the snaps still run"
8580
8607
  ],
8581
8608
  "axis": [
8582
8609
  "always: read at the next press, move or let go, a drag under way included — X, Y or Both; on an axis it does not allow the element stays, Drag X / Y say where it is and Delta X / Y is 0; any other value moves it on neither"
@@ -8616,6 +8643,7 @@
8616
8643
  "compat": "safe"
8617
8644
  },
8618
8645
  "docs": "https://docs.noodl.net/nodes/events/receive-event",
8646
+ "usePortAsLabel": "channelName",
8619
8647
  "inputs": [
8620
8648
  {
8621
8649
  "name": "channelName",
@@ -8703,6 +8731,7 @@
8703
8731
  "compat": "safe"
8704
8732
  },
8705
8733
  "docs": "https://docs.noodl.net/nodes/events/send-event",
8734
+ "usePortAsLabel": "channelName",
8706
8735
  "inputs": [
8707
8736
  {
8708
8737
  "name": "channelName",
@@ -8878,6 +8907,7 @@
8878
8907
  "percent",
8879
8908
  "%"
8880
8909
  ],
8910
+ "usePortAsLabel": "expression",
8881
8911
  "inputs": [
8882
8912
  {
8883
8913
  "name": "evaluateAtLoad",
@@ -9515,7 +9545,7 @@
9515
9545
  },
9516
9546
  "isSignal": false,
9517
9547
  "default": true,
9518
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
9548
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
9519
9549
  "index": 9999
9520
9550
  },
9521
9551
  {
@@ -10755,6 +10785,18 @@
10755
10785
  "refresh": [
10756
10786
  "always: a rebuild at the end of the frame, one however many Refreshes arrived — every row goes and one is built per item, then Done for each Refresh; Failure for each when Template Type has nothing to build from, or there are no Items"
10757
10787
  ]
10788
+ },
10789
+ "warnings": {
10790
+ "repeater/items-not-a-collection": "Items is not a list",
10791
+ "repeater/items-empty-entry": "Items has an empty entry",
10792
+ "repeater/template-script-syntax-error": "Script does not compile",
10793
+ "repeater/template-script-threw": "Script threw for an item, or set its component to something other than a name",
10794
+ "repeater/no-template-for-item": "an item has no component to build its row from",
10795
+ "repeater/template-component-not-found": "an item's component is not in the project",
10796
+ "repeater/input-mapping-syntax-error": "the input mapping does not compile",
10797
+ "repeater/input-mapping-threw": "the input mapping threw for an item",
10798
+ "repeater/no-template": "a Refresh found nothing to build the rows from",
10799
+ "repeater/no-items": "a Refresh found no Items"
10758
10800
  }
10759
10801
  },
10760
10802
  {
@@ -11276,7 +11318,7 @@
11276
11318
  },
11277
11319
  "isSignal": false,
11278
11320
  "default": true,
11279
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
11321
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
11280
11322
  "index": 9999
11281
11323
  },
11282
11324
  {
@@ -13403,7 +13445,7 @@
13403
13445
  },
13404
13446
  "isSignal": false,
13405
13447
  "default": true,
13406
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
13448
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
13407
13449
  "index": 9999
13408
13450
  },
13409
13451
  {
@@ -14675,6 +14717,12 @@
14675
14717
  "visible": [
14676
14718
  "always: shown or hidden at the next paint, its space kept; hidden, it takes no pointer"
14677
14719
  ],
14720
+ "width": [
14721
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
14722
+ ],
14723
+ "height": [
14724
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
14725
+ ],
14678
14726
  "opacity": [
14679
14727
  "always: how see-through it is; at exactly 0 it takes no pointer, and an act goes to what is behind it"
14680
14728
  ],
@@ -14719,8 +14767,8 @@
14719
14767
  "always: read at a drop — which files count as accepted"
14720
14768
  ],
14721
14769
  "focus": [
14722
- "off the page: nothing is listed → Unchanged; Focused stays silent",
14723
- "off the page, after outcomes this frame resolved and has not reported: nothing is listed, and Unchanged comes after them → Focused stays silent",
14770
+ "off the page: nothing is listed, and the editor is told → Unchanged; Focused stays silent",
14771
+ "off the page, after outcomes this frame resolved and has not reported: nothing is listed, the editor is told, and Unchanged comes after them → Focused stays silent",
14724
14772
  "already listed as focused → Done; Focused stays silent",
14725
14773
  "already listed, after outcomes this frame has not reported: Done comes after them → Focused stays silent",
14726
14774
  "on the page: listed as focused → Focused, Done",
@@ -14738,6 +14786,10 @@
14738
14786
  "scrollToElement.do": [
14739
14787
  "always: runs at the end of the frame, waiting as Scroll To Index does — Done when Element is empty (nothing to scroll to), Failure for a value that is not an element"
14740
14788
  ]
14789
+ },
14790
+ "warnings": {
14791
+ "focus/not-mounted": "the last Focus arrived while it was not on the page",
14792
+ "dimensions/wired-dimension-becomes-grow": "a wired Width in a row, or a wired Height in a column, is a percent, so it shares out the space instead of setting a size"
14741
14793
  }
14742
14794
  },
14743
14795
  {
@@ -15946,7 +15998,7 @@
15946
15998
  },
15947
15999
  "isSignal": false,
15948
16000
  "default": true,
15949
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
16001
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
15950
16002
  "index": 9999
15951
16003
  },
15952
16004
  {
@@ -16896,6 +16948,12 @@
16896
16948
  "scrollIntoView": [
16897
16949
  "always: the page, or the scrolling Group holding it, scrolls until the element can be seen"
16898
16950
  ],
16951
+ "width": [
16952
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
16953
+ ],
16954
+ "height": [
16955
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
16956
+ ],
16899
16957
  "visible": [
16900
16958
  "always: shown or hidden at the next paint, its space kept; hidden, it takes no pointer"
16901
16959
  ],
@@ -16945,6 +17003,9 @@
16945
17003
  "srcSet": [
16946
17004
  "always: the sizes the browser may pick from instead, drawn at the end of the frame"
16947
17005
  ]
17006
+ },
17007
+ "warnings": {
17008
+ "dimensions/wired-dimension-becomes-grow": "a wired Width in a row, or a wired Height in a column, is a percent, so it shares out the space instead of setting a size"
16948
17009
  }
16949
17010
  },
16950
17011
  {
@@ -17450,6 +17511,7 @@
17450
17511
  "Visual"
17451
17512
  ],
17452
17513
  "allowAsExportRoot": true,
17514
+ "replacedBy": "Text",
17453
17515
  "useVariants": true,
17454
17516
  "inputs": [
17455
17517
  {
@@ -18391,7 +18453,7 @@
18391
18453
  },
18392
18454
  "isSignal": false,
18393
18455
  "default": true,
18394
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
18456
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
18395
18457
  "index": 9999
18396
18458
  },
18397
18459
  {
@@ -19300,6 +19362,8 @@
19300
19362
  "compat": "safe"
19301
19363
  },
19302
19364
  "docs": "https://docs.noodl.net/nodes/data/object",
19365
+ "usePortAsLabel": "modelId",
19366
+ "replacedBy": "Model2",
19303
19367
  "inputs": [
19304
19368
  {
19305
19369
  "name": "clear",
@@ -19472,6 +19536,7 @@
19472
19536
  "compat": "safe"
19473
19537
  },
19474
19538
  "docs": "https://docs.noodl.net/nodes/data/object/object-node",
19539
+ "usePortAsLabel": "modelId",
19475
19540
  "inputs": [
19476
19541
  {
19477
19542
  "name": "fetch",
@@ -20106,6 +20171,7 @@
20106
20171
  "compat": "safe"
20107
20172
  },
20108
20173
  "docs": "https://docs.noodl.net/nodes/data/cloud-data/create-new-record",
20174
+ "usePortAsLabel": "collectionName",
20109
20175
  "inputs": [
20110
20176
  {
20111
20177
  "name": "accessControl",
@@ -21104,6 +21170,7 @@
21104
21170
  "docs": "https://docs.noodl.net/nodes/visual/options",
21105
21171
  "allowAsChild": true,
21106
21172
  "allowAsExportRoot": true,
21173
+ "replacedBy": "net.noodl.controls.options",
21107
21174
  "useVariants": true,
21108
21175
  "inputs": [
21109
21176
  {
@@ -21758,7 +21825,7 @@
21758
21825
  },
21759
21826
  "isSignal": false,
21760
21827
  "default": true,
21761
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
21828
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
21762
21829
  "index": 9999
21763
21830
  },
21764
21831
  {
@@ -23317,7 +23384,7 @@
23317
23384
  },
23318
23385
  "isSignal": false,
23319
23386
  "default": true,
23320
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
23387
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
23321
23388
  "index": 9999
23322
23389
  },
23323
23390
  {
@@ -24241,6 +24308,7 @@
24241
24308
  "compat": "safe"
24242
24309
  },
24243
24310
  "docs": "https://docs.noodl.net/nodes/component-utilities/parent-component-object",
24311
+ "replacedBy": "net.noodl.ParentComponentObject",
24244
24312
  "inputs": [
24245
24313
  {
24246
24314
  "name": "fetch",
@@ -24370,6 +24438,7 @@
24370
24438
  "request",
24371
24439
  "fetch"
24372
24440
  ],
24441
+ "replacedBy": "net.noodl.HTTP",
24373
24442
  "inputs": [
24374
24443
  {
24375
24444
  "name": "cancel",
@@ -24524,6 +24593,7 @@
24524
24593
  "docs": "https://docs.noodl.net/nodes/visual/radiobutton",
24525
24594
  "allowAsChild": true,
24526
24595
  "allowAsExportRoot": true,
24596
+ "replacedBy": "net.noodl.controls.radiobutton",
24527
24597
  "useVariants": true,
24528
24598
  "inputs": [
24529
24599
  {
@@ -25035,7 +25105,7 @@
25035
25105
  },
25036
25106
  "isSignal": false,
25037
25107
  "default": true,
25038
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
25108
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
25039
25109
  "index": 9999
25040
25110
  },
25041
25111
  {
@@ -25987,7 +26057,7 @@
25987
26057
  },
25988
26058
  "isSignal": false,
25989
26059
  "default": true,
25990
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
26060
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
25991
26061
  "index": 9999
25992
26062
  },
25993
26063
  {
@@ -26562,9 +26632,18 @@
26562
26632
  "scrollIntoView": [
26563
26633
  "always: the page, or the scrolling Group holding it, scrolls until the group can be seen"
26564
26634
  ],
26635
+ "width": [
26636
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
26637
+ ],
26638
+ "height": [
26639
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
26640
+ ],
26565
26641
  "visible": [
26566
26642
  "always: shown or hidden at the next paint, its space kept; hidden, its buttons take no click"
26567
26643
  ]
26644
+ },
26645
+ "warnings": {
26646
+ "dimensions/wired-dimension-becomes-grow": "a wired Width in a row, or a wired Height in a column, is a percent, so it shares out the space instead of setting a size"
26568
26647
  }
26569
26648
  },
26570
26649
  {
@@ -26584,6 +26663,7 @@
26584
26663
  "docs": "https://docs.noodl.net/nodes/visual/range",
26585
26664
  "allowAsChild": true,
26586
26665
  "allowAsExportRoot": true,
26666
+ "replacedBy": "net.noodl.controls.range",
26587
26667
  "useVariants": true,
26588
26668
  "inputs": [
26589
26669
  {
@@ -27005,7 +27085,7 @@
27005
27085
  },
27006
27086
  "isSignal": false,
27007
27087
  "default": true,
27008
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
27088
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
27009
27089
  "index": 9999
27010
27090
  },
27011
27091
  {
@@ -27684,6 +27764,7 @@
27684
27764
  "compat": "safe"
27685
27765
  },
27686
27766
  "docs": "https://docs.noodl.net/nodes/data/cloud-data/remove-record-relation",
27767
+ "usePortAsLabel": "collectionName",
27687
27768
  "inputs": [
27688
27769
  {
27689
27770
  "name": "idSource",
@@ -28125,7 +28206,7 @@
28125
28206
  },
28126
28207
  "isSignal": false,
28127
28208
  "default": true,
28128
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
28209
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
28129
28210
  "index": 9999
28130
28211
  },
28131
28212
  {
@@ -28933,6 +29014,7 @@
28933
29014
  "compat": "safe"
28934
29015
  },
28935
29016
  "docs": "https://docs.noodl.net/nodes/data/variable/set-variable",
29017
+ "usePortAsLabel": "name",
28936
29018
  "inputs": [
28937
29019
  {
28938
29020
  "name": "do",
@@ -29091,6 +29173,7 @@
29091
29173
  "compat": "safe"
29092
29174
  },
29093
29175
  "docs": "https://docs.noodl.net/nodes/data/cloud-data/set-record-properties",
29176
+ "usePortAsLabel": "collectionName",
29094
29177
  "inputs": [
29095
29178
  {
29096
29179
  "name": "accessControl",
@@ -29421,6 +29504,7 @@
29421
29504
  "compat": "safe"
29422
29505
  },
29423
29506
  "docs": "https://docs.noodl.net/nodes/data/object/set-object-properties",
29507
+ "usePortAsLabel": "modelId",
29424
29508
  "inputs": [
29425
29509
  {
29426
29510
  "name": "idSource",
@@ -30111,7 +30195,7 @@
30111
30195
  "always: the list of states; while none is current, the first (or Start State) is entered at the end of the frame"
30112
30196
  ],
30113
30197
  "values": [
30114
- "always: the values that differ between states, each an output"
30198
+ "always: the values that differ between states, each an output; a value named as one of the node's outputs is refused and the editor is told"
30115
30199
  ],
30116
30200
  "useTransitions": [
30117
30201
  "always: whether the next move animates its values or jumps"
@@ -30121,6 +30205,12 @@
30121
30205
  "already in, or already heading to, the next state → Unchanged",
30122
30206
  "otherwise it moves to the next state, wrapping round after the last, at the end of the frame — State Changed, then Done"
30123
30207
  ]
30208
+ },
30209
+ "warnings": {
30210
+ "states/unknown-state": "a state was asked for that is not in the list, and no state in the list has been asked for since",
30211
+ "states/no-states": "a Toggle or a To arrived with no States list",
30212
+ "states/unreadable-transition": "a move would have animated along a transition that is not a curve",
30213
+ "states/reserved-port-name": "a value is named as one of the node's own outputs"
30124
30214
  }
30125
30215
  },
30126
30216
  {
@@ -30292,6 +30382,8 @@
30292
30382
  "compat": "safe"
30293
30383
  },
30294
30384
  "docs": "https://docs.noodl.net/nodes/data/string",
30385
+ "usePortAsLabel": "value",
30386
+ "portLabelTruncationMode": "length",
30295
30387
  "inputs": [
30296
30388
  {
30297
30389
  "name": "runOnChange-value",
@@ -30475,6 +30567,8 @@
30475
30567
  "compat": "safe"
30476
30568
  },
30477
30569
  "docs": "https://docs.noodl.net/nodes/string-manipulation/string-format",
30570
+ "usePortAsLabel": "format",
30571
+ "portLabelTruncationMode": "length",
30478
30572
  "inputs": [
30479
30573
  {
30480
30574
  "name": "format",
@@ -30727,6 +30821,7 @@
30727
30821
  "socket",
30728
30822
  "backend"
30729
30823
  ],
30824
+ "usePortAsLabel": "collectionName",
30730
30825
  "inputs": [
30731
30826
  {
30732
30827
  "name": "enabled",
@@ -31156,6 +31251,8 @@
31156
31251
  "docs": "https://docs.noodl.net/nodes/basic-elements/text",
31157
31252
  "allowAsChild": true,
31158
31253
  "allowAsExportRoot": true,
31254
+ "usePortAsLabel": "text",
31255
+ "portLabelTruncationMode": "length",
31159
31256
  "useVariants": true,
31160
31257
  "visualStates": [
31161
31258
  {
@@ -31920,7 +32017,7 @@
31920
32017
  },
31921
32018
  "isSignal": false,
31922
32019
  "default": true,
31923
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
32020
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
31924
32021
  "index": 9999
31925
32022
  },
31926
32023
  {
@@ -32896,6 +32993,12 @@
32896
32993
  "as": [
32897
32994
  "always: the HTML element the next paint draws (a div when empty) — a new Tag draws a new element"
32898
32995
  ],
32996
+ "width": [
32997
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
32998
+ ],
32999
+ "height": [
33000
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
33001
+ ],
32899
33002
  "visible": [
32900
33003
  "always: shown or hidden at the next paint, its space kept; hidden, it takes no pointer"
32901
33004
  ],
@@ -32939,6 +33042,9 @@
32939
33042
  "acceptedFileTypes": [
32940
33043
  "always: read at a drop — which files count as accepted"
32941
33044
  ]
33045
+ },
33046
+ "warnings": {
33047
+ "dimensions/wired-dimension-becomes-grow": "a wired Width in a row, or a wired Height in a column, is a percent, so it shares out the space instead of setting a size"
32942
33048
  }
32943
33049
  },
32944
33050
  {
@@ -32958,6 +33064,7 @@
32958
33064
  "docs": "https://docs.noodl.net/nodes/visual/text-input",
32959
33065
  "allowAsChild": true,
32960
33066
  "allowAsExportRoot": true,
33067
+ "replacedBy": "net.noodl.controls.textinput",
32961
33068
  "useVariants": true,
32962
33069
  "inputs": [
32963
33070
  {
@@ -33589,7 +33696,7 @@
33589
33696
  },
33590
33697
  "isSignal": false,
33591
33698
  "default": true,
33592
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
33699
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
33593
33700
  "index": 9999
33594
33701
  },
33595
33702
  {
@@ -35026,6 +35133,8 @@
35026
35133
  "compat": "safe"
35027
35134
  },
35028
35135
  "docs": "https://docs.noodl.net/nodes/data/variable",
35136
+ "usePortAsLabel": "name",
35137
+ "replacedBy": "Variable2",
35029
35138
  "inputs": [
35030
35139
  {
35031
35140
  "name": "fetch",
@@ -35143,6 +35252,7 @@
35143
35252
  "compat": "safe"
35144
35253
  },
35145
35254
  "docs": "https://docs.noodl.net/nodes/data/variable/variable-node",
35255
+ "usePortAsLabel": "name",
35146
35256
  "inputs": [
35147
35257
  {
35148
35258
  "name": "fetch",
@@ -36332,7 +36442,7 @@
36332
36442
  },
36333
36443
  "isSignal": false,
36334
36444
  "default": true,
36335
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
36445
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
36336
36446
  "index": 9999
36337
36447
  },
36338
36448
  {
@@ -36536,7 +36646,7 @@
36536
36646
  "allowConnectionsOnly": true
36537
36647
  },
36538
36648
  "isSignal": true,
36539
- "description": "Stops playback and seeks to the beginning"
36649
+ "description": "Stops playback and seeks to Start Time (the beginning when there is none)"
36540
36650
  },
36541
36651
  {
36542
36652
  "name": "restart",
@@ -36548,7 +36658,7 @@
36548
36658
  "allowConnectionsOnly": true
36549
36659
  },
36550
36660
  "isSignal": true,
36551
- "description": "Seeks to the beginning and plays, then fires Done"
36661
+ "description": "Seeks to Start Time (the beginning when there is none) and plays, then fires Done"
36552
36662
  },
36553
36663
  {
36554
36664
  "name": "scrollIntoView",
@@ -37471,6 +37581,12 @@
37471
37581
  "scrollIntoView": [
37472
37582
  "always: the page, or the scrolling Group holding it, scrolls until the element can be seen"
37473
37583
  ],
37584
+ "width": [
37585
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
37586
+ ],
37587
+ "height": [
37588
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
37589
+ ],
37474
37590
  "visible": [
37475
37591
  "always: shown or hidden at the next paint, its space kept; hidden, it takes no pointer"
37476
37592
  ],
@@ -37542,7 +37658,7 @@
37542
37658
  "off the page: waits for the element (at most 16 wait, and the oldest pushed out reports Failure) and plays at the paint that puts the video there — Done then"
37543
37659
  ],
37544
37660
  "restart": [
37545
- "on the page: wants the video playing and, once it has loaded, goes back to second 0 (Playback Position 0 — not Start Time) and starts it as Play does; before the load, only the wanting; an embedded player is not reached — Done, in its turn after outcomes the frame has already resolved",
37661
+ "on the page: wants the video playing and, once it has loaded, goes back to Start Time as last drawn (Playback Position; second 0 when there is none) and starts it as Play does; before the load, only the wanting; an embedded player is not reached — Done, in its turn after outcomes the frame has already resolved",
37546
37662
  "off the page: waits for the element (at most 16 wait, and the oldest pushed out reports Failure) and restarts at the paint that puts the video there — Done then"
37547
37663
  ],
37548
37664
  "pause": [
@@ -37550,9 +37666,12 @@
37550
37666
  "off the page: waits for the element (at most 16 wait, and the oldest pushed out reports Failure) and pauses at the paint that puts the video there — Done then"
37551
37667
  ],
37552
37668
  "reset": [
37553
- "on the page: stops wanting the video playing, goes back to second 0 (Playback Position 0 once loaded — not Start Time) and pauses it — On Pause if it was playing; Autoplay no longer starts it on this load; an embedded player is not reached — Done, in its turn after outcomes the frame has already resolved",
37669
+ "on the page: stops wanting the video playing, goes back to Start Time as last drawn (Playback Position, once loaded; second 0 when there is none) and pauses it — On Pause if it was playing; Autoplay no longer starts it on this load; an embedded player is not reached — Done, in its turn after outcomes the frame has already resolved",
37554
37670
  "off the page: waits for the element (at most 16 wait, and the oldest pushed out reports Failure) and resets at the paint that puts the video there — Done then"
37555
37671
  ]
37672
+ },
37673
+ "warnings": {
37674
+ "dimensions/wired-dimension-becomes-grow": "a wired Width in a row, or a wired Height in a column, is a percent, so it shares out the space instead of setting a size"
37556
37675
  }
37557
37676
  },
37558
37677
  {
@@ -37582,6 +37701,7 @@
37582
37701
  "guided",
37583
37702
  "tour"
37584
37703
  ],
37704
+ "usePortAsLabel": "channel",
37585
37705
  "inputs": [
37586
37706
  {
37587
37707
  "name": "action",
@@ -38030,6 +38150,7 @@
38030
38150
  "remote",
38031
38151
  "command"
38032
38152
  ],
38153
+ "usePortAsLabel": "actionType",
38033
38154
  "inputs": [
38034
38155
  {
38035
38156
  "name": "actionType",
@@ -38625,6 +38746,9 @@
38625
38746
  "the Date cannot be read as a date: Result goes empty → Invalid Date; Changed stays silent",
38626
38747
  "otherwise Result is the Date moved by Amount (0 when not a number) in Unit (days when not one of the eight); in months and years Amount counts whole steps only, and the day stops at the month's last → Changed; Invalid Date stays silent"
38627
38748
  ]
38749
+ },
38750
+ "warnings": {
38751
+ "date-add/unknown-unit": "Unit is not one of the eight"
38628
38752
  }
38629
38753
  },
38630
38754
  {
@@ -38970,6 +39094,9 @@
38970
39094
  "either cannot be read as a date: Difference goes empty → Invalid Date; Changed stays silent",
38971
39095
  "otherwise Difference is To minus From in Unit (days when not one of the eight), negative when To is earlier unless Absolute is on → Changed; Invalid Date stays silent"
38972
39096
  ]
39097
+ },
39098
+ "warnings": {
39099
+ "date-difference/unknown-unit": "Unit is not one of the eight"
38973
39100
  }
38974
39101
  },
38975
39102
  {
@@ -39170,6 +39297,7 @@
39170
39297
  "ssr": {
39171
39298
  "compat": "safe"
39172
39299
  },
39300
+ "usePortAsLabel": "storeName",
39173
39301
  "inputs": [
39174
39302
  {
39175
39303
  "name": "initialState",
@@ -39303,6 +39431,7 @@
39303
39431
  "ssr": {
39304
39432
  "compat": "safe"
39305
39433
  },
39434
+ "usePortAsLabel": "key",
39306
39435
  "inputs": [
39307
39436
  {
39308
39437
  "name": "key",
@@ -39438,6 +39567,7 @@
39438
39567
  "ssr": {
39439
39568
  "compat": "safe"
39440
39569
  },
39570
+ "usePortAsLabel": "keys",
39441
39571
  "inputs": [
39442
39572
  {
39443
39573
  "name": "keys",
@@ -40495,6 +40625,7 @@
40495
40625
  "ssr": {
40496
40626
  "compat": "safe"
40497
40627
  },
40628
+ "usePortAsLabel": "key",
40498
40629
  "inputs": [
40499
40630
  {
40500
40631
  "name": "apply",
@@ -41117,7 +41248,7 @@
41117
41248
  "inputs": [
41118
41249
  {
41119
41250
  "name": "maxBytes",
41120
- "displayName": "Max Bytes",
41251
+ "displayName": "Max Characters",
41121
41252
  "group": "General",
41122
41253
  "plug": "input",
41123
41254
  "type": {
@@ -41125,7 +41256,7 @@
41125
41256
  },
41126
41257
  "isSignal": false,
41127
41258
  "default": 5242880,
41128
- "description": "Refuse a document larger than this, before parsing it. Raise it for a source that really does publish its whole archive in one file"
41259
+ "description": "Refuse a document longer than this many characters (not bytes), before parsing it. Raise it for a source that really does publish its whole archive in one file"
41129
41260
  },
41130
41261
  {
41131
41262
  "name": "text",
@@ -41328,7 +41459,7 @@
41328
41459
  },
41329
41460
  {
41330
41461
  "name": "maxBytes",
41331
- "displayName": "Max Bytes",
41462
+ "displayName": "Max Characters",
41332
41463
  "group": "General",
41333
41464
  "plug": "input",
41334
41465
  "type": {
@@ -41336,7 +41467,7 @@
41336
41467
  },
41337
41468
  "isSignal": false,
41338
41469
  "default": 5242880,
41339
- "description": "Refuse a document larger than this, before parsing it. A big document costs many times its own size in memory once it is an object, and a server can always send more than you expected"
41470
+ "description": "Refuse a document longer than this many characters (not bytes), before parsing it. A big document costs many times its own size in memory once it is an object, and a server can always send more than you expected"
41340
41471
  },
41341
41472
  {
41342
41473
  "name": "text",
@@ -42622,6 +42753,7 @@
42622
42753
  "ssr": {
42623
42754
  "compat": "safe"
42624
42755
  },
42756
+ "usePortAsLabel": "storeName",
42625
42757
  "inputs": [
42626
42758
  {
42627
42759
  "name": "clearHistory",
@@ -42835,6 +42967,7 @@
42835
42967
  "ssr": {
42836
42968
  "compat": "safe"
42837
42969
  },
42970
+ "usePortAsLabel": "storeName",
42838
42971
  "inputs": [
42839
42972
  {
42840
42973
  "name": "jumpTo",
@@ -43026,6 +43159,7 @@
43026
43159
  "ssr": {
43027
43160
  "compat": "safe"
43028
43161
  },
43162
+ "usePortAsLabel": "snapshotName",
43029
43163
  "inputs": [
43030
43164
  {
43031
43165
  "name": "restore",
@@ -44048,6 +44182,8 @@
44048
44182
  "chat",
44049
44183
  "live"
44050
44184
  ],
44185
+ "usePortAsLabel": "url",
44186
+ "portLabelTruncationMode": "path",
44051
44187
  "inputs": [
44052
44188
  {
44053
44189
  "name": "autoConnect",
@@ -44789,6 +44925,8 @@
44789
44925
  "Visual"
44790
44926
  ],
44791
44927
  "allowAsExportRoot": true,
44928
+ "usePortAsLabel": "label",
44929
+ "portLabelTruncationMode": "length",
44792
44930
  "useVariants": true,
44793
44931
  "visualStates": [
44794
44932
  {
@@ -46155,7 +46293,7 @@
46155
46293
  },
46156
46294
  "isSignal": false,
46157
46295
  "default": true,
46158
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
46296
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
46159
46297
  "index": 9999
46160
46298
  },
46161
46299
  {
@@ -47044,7 +47182,7 @@
47044
47182
  "always: the element is put on the page (Did Mount), or taken off it (Will Unmount), at the next paint"
47045
47183
  ],
47046
47184
  "focus": [
47047
- "not on the page: nothing to focus, and the Focus is not kept → Unchanged; Focused stays silent",
47185
+ "not on the page: nothing to focus, the Focus is not kept, and the editor is told → Unchanged; Focused stays silent",
47048
47186
  "it holds the keyboard already, or is disabled or hidden: nothing changes → Done; Focused stays silent",
47049
47187
  "otherwise the keyboard is put on it, and the Focused state goes true → Focused, Done"
47050
47188
  ],
@@ -47055,9 +47193,20 @@
47055
47193
  "scrollIntoView": [
47056
47194
  "always: the page, or the scrolling Group holding it, scrolls until the button can be seen"
47057
47195
  ],
47196
+ "width": [
47197
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
47198
+ ],
47199
+ "height": [
47200
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
47201
+ ],
47058
47202
  "visible": [
47059
47203
  "always: shown or hidden at the next paint, its space kept; hidden, a Focus does not reach it"
47060
47204
  ]
47205
+ },
47206
+ "warnings": {
47207
+ "focus/not-mounted": "the last Focus arrived while it was not on the page",
47208
+ "visual/icon-source-not-an-icon/iconIconSource": "Icon Source holds something that is not an icon",
47209
+ "dimensions/wired-dimension-becomes-grow": "a wired Width in a row, or a wired Height in a column, is a percent, so it shares out the space instead of setting a size"
47061
47210
  }
47062
47211
  },
47063
47212
  {
@@ -47077,6 +47226,8 @@
47077
47226
  "docs": "https://docs.noodl.net/nodes/ui-controls/checkbox",
47078
47227
  "allowAsChild": true,
47079
47228
  "allowAsExportRoot": true,
47229
+ "usePortAsLabel": "label",
47230
+ "portLabelTruncationMode": "length",
47080
47231
  "useVariants": true,
47081
47232
  "visualStates": [
47082
47233
  {
@@ -48415,7 +48566,7 @@
48415
48566
  },
48416
48567
  "isSignal": false,
48417
48568
  "default": true,
48418
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
48569
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
48419
48570
  "index": 9999
48420
48571
  },
48421
48572
  {
@@ -49222,7 +49373,7 @@
49222
49373
  "always: a label is drawn beside the box, or not; the box and its keyboard stay"
49223
49374
  ],
49224
49375
  "focus": [
49225
- "not on the page: nothing to focus, and the Focus is not kept → Unchanged; Focused stays silent",
49376
+ "not on the page: nothing to focus, the Focus is not kept, and the editor is told → Unchanged; Focused stays silent",
49226
49377
  "it holds the keyboard already, or is disabled or hidden: nothing changes → Done; Focused stays silent",
49227
49378
  "otherwise the keyboard is put on it, and the Focused state goes true → Focused, Done"
49228
49379
  ],
@@ -49236,6 +49387,10 @@
49236
49387
  "visible": [
49237
49388
  "always: shown or hidden at the next paint, its space kept; hidden, a Focus does not reach it"
49238
49389
  ]
49390
+ },
49391
+ "warnings": {
49392
+ "focus/not-mounted": "the last Focus arrived while it was not on the page",
49393
+ "visual/icon-source-not-an-icon/iconIconSource": "Icon Source holds something that is not an icon"
49239
49394
  }
49240
49395
  },
49241
49396
  {
@@ -49255,6 +49410,7 @@
49255
49410
  "docs": "https://docs.noodl.net/nodes/ui-controls/dropdown",
49256
49411
  "allowAsChild": true,
49257
49412
  "allowAsExportRoot": true,
49413
+ "usePortAsLabel": "label",
49258
49414
  "useVariants": true,
49259
49415
  "visualStates": [
49260
49416
  {
@@ -50871,7 +51027,7 @@
50871
51027
  },
50872
51028
  "isSignal": false,
50873
51029
  "default": true,
50874
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
51030
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
50875
51031
  "index": 9999
50876
51032
  },
50877
51033
  {
@@ -51822,7 +51978,7 @@
51822
51978
  "always: a label is drawn beside the list, or not; the list, its keyboard and its pick stay"
51823
51979
  ],
51824
51980
  "focus": [
51825
- "not on the page: nothing to focus, and the Focus is not kept → Unchanged; Focused stays silent",
51981
+ "not on the page: nothing to focus, the Focus is not kept, and the editor is told → Unchanged; Focused stays silent",
51826
51982
  "it holds the keyboard already, or is disabled or hidden: nothing changes → Done; Focused stays silent",
51827
51983
  "otherwise the keyboard is put on it, and the Focused state goes true → Focused, Done"
51828
51984
  ],
@@ -51833,9 +51989,20 @@
51833
51989
  "scrollIntoView": [
51834
51990
  "always: the page, or the scrolling Group holding it, scrolls until the list can be seen"
51835
51991
  ],
51992
+ "width": [
51993
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
51994
+ ],
51995
+ "height": [
51996
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
51997
+ ],
51836
51998
  "visible": [
51837
51999
  "always: shown or hidden at the next paint, its space kept; hidden, a Focus does not reach it"
51838
52000
  ]
52001
+ },
52002
+ "warnings": {
52003
+ "focus/not-mounted": "the last Focus arrived while it was not on the page",
52004
+ "visual/icon-source-not-an-icon/iconIconSource": "Icon Source holds something that is not an icon",
52005
+ "dimensions/wired-dimension-becomes-grow": "a wired Width in a row, or a wired Height in a column, is a percent, so it shares out the space instead of setting a size"
51839
52006
  }
51840
52007
  },
51841
52008
  {
@@ -51855,6 +52022,7 @@
51855
52022
  "docs": "https://docs.noodl.net/nodes/ui-controls/radio-button",
51856
52023
  "allowAsChild": true,
51857
52024
  "allowAsExportRoot": true,
52025
+ "usePortAsLabel": "label",
51858
52026
  "useVariants": true,
51859
52027
  "visualStates": [
51860
52028
  {
@@ -53199,7 +53367,7 @@
53199
53367
  },
53200
53368
  "isSignal": false,
53201
53369
  "default": true,
53202
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
53370
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
53203
53371
  "index": 9999
53204
53372
  },
53205
53373
  {
@@ -53998,7 +54166,7 @@
53998
54166
  "always: a label is drawn beside the button, or not; the button and its keyboard stay"
53999
54167
  ],
54000
54168
  "focus": [
54001
- "not on the page: nothing to focus, and the Focus is not kept → Unchanged; Focused stays silent",
54169
+ "not on the page: nothing to focus, the Focus is not kept, and the editor is told → Unchanged; Focused stays silent",
54002
54170
  "it holds the keyboard already, or is disabled or hidden: nothing changes → Done; Focused stays silent",
54003
54171
  "otherwise the keyboard is put on it, and the Focused state goes true → Focused, Done"
54004
54172
  ],
@@ -54012,6 +54180,10 @@
54012
54180
  "visible": [
54013
54181
  "always: shown or hidden at the next paint, its space kept; hidden, it takes no click and a Focus does not reach it"
54014
54182
  ]
54183
+ },
54184
+ "warnings": {
54185
+ "focus/not-mounted": "the last Focus arrived while it was not on the page",
54186
+ "visual/icon-source-not-an-icon/iconIconSource": "Icon Source holds something that is not an icon"
54015
54187
  }
54016
54188
  },
54017
54189
  {
@@ -54426,7 +54598,7 @@
54426
54598
  },
54427
54599
  "isSignal": false,
54428
54600
  "default": true,
54429
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
54601
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
54430
54602
  "index": 9999
54431
54603
  },
54432
54604
  {
@@ -56380,7 +56552,7 @@
56380
56552
  ],
56381
56553
  "value": [
56382
56554
  "empty: no word, and the handle stays where it is",
56383
- "not a number: no word (the runtime reports it), and the handle stays where it is",
56555
+ "not a number: no word, the editor is told, and the handle stays where it is",
56384
56556
  "a number: at the next paint the handle goes there, clamped to Min and Max and rounded to the Step; Value and Value Percent follow when they move — Changed does not fire (only a person's slide fires it)"
56385
56557
  ],
56386
56558
  "min": [
@@ -56396,7 +56568,7 @@
56396
56568
  "always: the slider is put on the page (Did Mount), or taken off it (Will Unmount), at the next paint; put back, the handle is where it was left"
56397
56569
  ],
56398
56570
  "focus": [
56399
- "not on the page: nothing to focus, and the Focus is not kept → Unchanged; Focused stays silent",
56571
+ "not on the page: nothing to focus, the Focus is not kept, and the editor is told → Unchanged; Focused stays silent",
56400
56572
  "it holds the keyboard already, or is disabled or hidden: nothing changes → Done; Focused stays silent",
56401
56573
  "otherwise the keyboard is put on it, and the Focused state goes true → Focused, Done"
56402
56574
  ],
@@ -56407,9 +56579,18 @@
56407
56579
  "scrollIntoView": [
56408
56580
  "always: the page, or the scrolling Group holding it, scrolls until the slider can be seen"
56409
56581
  ],
56582
+ "width": [
56583
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
56584
+ ],
56410
56585
  "visible": [
56411
56586
  "always: shown or hidden at the next paint, its space kept; hidden, a Focus does not reach it"
56412
56587
  ]
56588
+ },
56589
+ "warnings": {
56590
+ "focus/not-mounted": "the last Focus arrived while it was not on the page",
56591
+ "dimensions/wired-dimension-becomes-grow": "a wired Width in a row, or a wired Height in a column, is a percent, so it shares out the space instead of setting a size",
56592
+ "slider/max-below-min": "Max is below Min",
56593
+ "slider/value-not-a-number": "a Value arrived that is not a number"
56413
56594
  }
56414
56595
  },
56415
56596
  {
@@ -56429,6 +56610,7 @@
56429
56610
  "docs": "https://docs.noodl.net/nodes/ui-controls/text-input",
56430
56611
  "allowAsChild": true,
56431
56612
  "allowAsExportRoot": true,
56613
+ "usePortAsLabel": "label",
56432
56614
  "useVariants": true,
56433
56615
  "visualStates": [
56434
56616
  {
@@ -58160,7 +58342,7 @@
58160
58342
  },
58161
58343
  "isSignal": false,
58162
58344
  "default": true,
58163
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
58345
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
58164
58346
  "index": 9999
58165
58347
  },
58166
58348
  {
@@ -59238,7 +59420,7 @@
59238
59420
  "always: a label is drawn above the field, or not; the field and its keyboard stay"
59239
59421
  ],
59240
59422
  "focus": [
59241
- "not on the page: nothing to focus, and the Focus is not kept → Unchanged; Focused stays silent",
59423
+ "not on the page: nothing to focus, the Focus is not kept, and the editor is told → Unchanged; Focused stays silent",
59242
59424
  "it holds the keyboard already, or is disabled or hidden: nothing changes → Done; Focused stays silent",
59243
59425
  "otherwise the keyboard is put on it, and the Focused state goes true → Focused, Done"
59244
59426
  ],
@@ -59252,12 +59434,23 @@
59252
59434
  "blockTouch": [
59253
59435
  "always: on, a pointer act that lands here goes no further — the nodes it sits inside do not hear it"
59254
59436
  ],
59437
+ "width": [
59438
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
59439
+ ],
59440
+ "height": [
59441
+ "always: the size it holds now, a bare number read in the unit it held; drawn at the next paint"
59442
+ ],
59255
59443
  "visible": [
59256
59444
  "always: shown or hidden at the next paint, its space kept; hidden, a Focus does not reach it"
59257
59445
  ],
59258
59446
  "opacity": [
59259
59447
  "always: how see-through it is; at exactly 0 it takes no pointer, and an act goes to what is behind it"
59260
59448
  ]
59449
+ },
59450
+ "warnings": {
59451
+ "focus/not-mounted": "the last Focus arrived while it was not on the page",
59452
+ "visual/icon-source-not-an-icon/iconIconSource": "Icon Source holds something that is not an icon",
59453
+ "dimensions/wired-dimension-becomes-grow": "a wired Width in a row, or a wired Height in a column, is a percent, so it shares out the space instead of setting a size"
59261
59454
  }
59262
59455
  },
59263
59456
  {
@@ -60808,7 +61001,7 @@
60808
61001
  },
60809
61002
  "isSignal": false,
60810
61003
  "default": true,
60811
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
61004
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
60812
61005
  "index": 9999
60813
61006
  },
60814
61007
  {
@@ -61533,7 +61726,7 @@
61533
61726
  },
61534
61727
  "isSignal": false,
61535
61728
  "default": true,
61536
- "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind",
61729
+ "description": "Removes the element from the page entirely when false, unlike Visible which leaves its space behind. Wired, it counts as true until the first value arrives, so set it to false here to start hidden (a lock, a private screen)",
61537
61730
  "index": 9999
61538
61731
  },
61539
61732
  {
@@ -62024,6 +62217,9 @@
62024
62217
  "scrollIntoView": [
62025
62218
  "always: the page, or the scrolling Group holding it, scrolls until the icon can be seen"
62026
62219
  ]
62220
+ },
62221
+ "warnings": {
62222
+ "visual/icon-source-not-an-icon/iconIconSource": "Icon Source holds something that is not an icon"
62027
62223
  }
62028
62224
  },
62029
62225
  {
@@ -62193,7 +62389,21 @@
62193
62389
  }
62194
62390
  ],
62195
62391
  "dynamicPorts": null,
62196
- "parameterEncoding": null
62392
+ "parameterEncoding": null,
62393
+ "rules": {
62394
+ "role": [
62395
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
62396
+ ],
62397
+ "userId": [
62398
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
62399
+ ],
62400
+ "createRole": [
62401
+ "always: read at the end of the frame by a Do pressed in it — only true creates a missing role"
62402
+ ],
62403
+ "treatUnchangedAs": [
62404
+ "always: read when an Unchanged is reported"
62405
+ ]
62406
+ }
62197
62407
  },
62198
62408
  {
62199
62409
  "typeName": "noodl.cloud.aggregate",
@@ -62207,6 +62417,7 @@
62207
62417
  ],
62208
62418
  "providedBy": "noodl-viewer-cloud",
62209
62419
  "docs": "https://docs.noodl.net/nodes/cloud-functions/cloud-data/aggregate-records",
62420
+ "usePortAsLabel": "collectionName",
62210
62421
  "inputs": [
62211
62422
  {
62212
62423
  "name": "aggregates",
@@ -62291,6 +62502,11 @@
62291
62502
  "example": "storageFilterType"
62292
62503
  }
62293
62504
  ]
62505
+ },
62506
+ "rules": {
62507
+ "aggregates": [
62508
+ "always: kept, and read when the next aggregation goes; asks for none itself"
62509
+ ]
62294
62510
  }
62295
62511
  },
62296
62512
  {
@@ -62495,6 +62711,26 @@
62495
62711
  "parameterEncoding": {
62496
62712
  "known": false,
62497
62713
  "reason": "The port helper needs project context this generator cannot supply headlessly — a live component, a connected node, or a backend schema."
62714
+ },
62715
+ "rules": {
62716
+ "username": [
62717
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
62718
+ ],
62719
+ "email": [
62720
+ "always: read at the end of the frame by a Do pressed in it"
62721
+ ],
62722
+ "password": [
62723
+ "always: read at the end of the frame by a Do pressed in it"
62724
+ ],
62725
+ "emailVerified": [
62726
+ "always: read at the end of the frame by a Do pressed in it — only true is verified"
62727
+ ],
62728
+ "properties": [
62729
+ "always: nothing while it runs; each name makes a value input"
62730
+ ],
62731
+ "treatUnchangedAs": [
62732
+ "always: read when an Unchanged is reported"
62733
+ ]
62498
62734
  }
62499
62735
  },
62500
62736
  {
@@ -62630,7 +62866,15 @@
62630
62866
  }
62631
62867
  ],
62632
62868
  "dynamicPorts": null,
62633
- "parameterEncoding": null
62869
+ "parameterEncoding": null,
62870
+ "rules": {
62871
+ "userId": [
62872
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
62873
+ ],
62874
+ "treatUnchangedAs": [
62875
+ "always: read when an Unchanged is reported"
62876
+ ]
62877
+ }
62634
62878
  },
62635
62879
  {
62636
62880
  "typeName": "noodl.cloud.getuserroles",
@@ -62765,7 +63009,15 @@
62765
63009
  }
62766
63010
  ],
62767
63011
  "dynamicPorts": null,
62768
- "parameterEncoding": null
63012
+ "parameterEncoding": null,
63013
+ "rules": {
63014
+ "userId": [
63015
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
63016
+ ],
63017
+ "treatUnchangedAs": [
63018
+ "always: read when an Unchanged is reported"
63019
+ ]
63020
+ }
62769
63021
  },
62770
63022
  {
62771
63023
  "typeName": "noodl.cloud.hmac",
@@ -62925,7 +63177,24 @@
62925
63177
  }
62926
63178
  ],
62927
63179
  "dynamicPorts": null,
62928
- "parameterEncoding": null
63180
+ "parameterEncoding": null,
63181
+ "rules": {
63182
+ "value": [
63183
+ "always: read at the end of the frame by a Do pressed in it — as its text, in UTF-8 bytes (nothing, 0 or false as the empty text)"
63184
+ ],
63185
+ "key": [
63186
+ "always: read at the end of the frame by a Do pressed in it — nothing, empty, 0 or false fails that Do; otherwise its text in UTF-8 bytes, and a text that is empty fails it too"
63187
+ ],
63188
+ "algorithm": [
63189
+ "always: read at the end of the frame by a Do pressed in it (empty reads as SHA-256; one the host does not know fails that Do)"
63190
+ ],
63191
+ "encoding": [
63192
+ "always: read at the end of the frame by a Do pressed in it (empty reads as hex; one not in the list fails that Do)"
63193
+ ],
63194
+ "sign": [
63195
+ "always: one signature at the end of the frame however many presses, of Value under Key as they stand then — Signature and a cleared Error, then Done per press; no Key, an unknown Algorithm or Encoding puts the reason on Error, Signature untouched, Failure per press"
63196
+ ]
63197
+ }
62929
63198
  },
62930
63199
  {
62931
63200
  "typeName": "noodl.cloud.jwtsign",
@@ -63071,7 +63340,24 @@
63071
63340
  }
63072
63341
  ],
63073
63342
  "dynamicPorts": null,
63074
- "parameterEncoding": null
63343
+ "parameterEncoding": null,
63344
+ "rules": {
63345
+ "claims": [
63346
+ "always: read at the end of the frame by a Do pressed in it — nothing signs no claims of its own; text is read as an object literal (not one: no claims); an array, null, a number or true/false fails that Do"
63347
+ ],
63348
+ "key": [
63349
+ "always: read at the end of the frame by a Do pressed in it — nothing, empty, 0 or false fails that Do; otherwise its text in UTF-8 bytes"
63350
+ ],
63351
+ "algorithm": [
63352
+ "always: read at the end of the frame by a Do pressed in it (empty reads as HS256; one not HS256/384/512 fails that Do)"
63353
+ ],
63354
+ "expiresIn": [
63355
+ "always: read at the end of the frame by a Do pressed in it — as a number above 0, exp is that many whole seconds after iat; anything else, no exp"
63356
+ ],
63357
+ "sign": [
63358
+ "always: one token at the end of the frame however many presses, iat the clock's second — Token and a cleared Error, then Done per press; claims that are not an object, an unknown Algorithm or no Key put the reason on Error, Token untouched, Failure per press"
63359
+ ]
63360
+ }
63075
63361
  },
63076
63362
  {
63077
63363
  "typeName": "noodl.cloud.jwtverify",
@@ -63228,7 +63514,24 @@
63228
63514
  }
63229
63515
  ],
63230
63516
  "dynamicPorts": null,
63231
- "parameterEncoding": null
63517
+ "parameterEncoding": null,
63518
+ "rules": {
63519
+ "token": [
63520
+ "always: read at the end of the frame by a Do pressed in it"
63521
+ ],
63522
+ "key": [
63523
+ "always: read at the end of the frame by a Do pressed in it — nothing, empty, 0 or false refuses that Do"
63524
+ ],
63525
+ "algorithm": [
63526
+ "always: read at the end of the frame by a Do pressed in it (empty reads as HS256); the token's header must name the same one"
63527
+ ],
63528
+ "clockTolerance": [
63529
+ "always: read at the end of the frame by a Do pressed in it — that many seconds of leeway on nbf and exp (not a number, or below 0, none)"
63530
+ ],
63531
+ "verify": [
63532
+ "always: one check at the end of the frame however many presses — verified: Valid true, Claims the payload, Error cleared, Done per press; refused: Valid false, the reason on Error, Claims untouched, Failure per press"
63533
+ ]
63534
+ }
63232
63535
  },
63233
63536
  {
63234
63537
  "typeName": "noodl.cloud.listusersinrole",
@@ -63409,7 +63712,21 @@
63409
63712
  }
63410
63713
  ],
63411
63714
  "dynamicPorts": null,
63412
- "parameterEncoding": null
63715
+ "parameterEncoding": null,
63716
+ "rules": {
63717
+ "role": [
63718
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
63719
+ ],
63720
+ "limit": [
63721
+ "always: read at the end of the frame by a Do pressed in it, handed to the store as is"
63722
+ ],
63723
+ "skip": [
63724
+ "always: read at the end of the frame by a Do pressed in it, handed to the store as is"
63725
+ ],
63726
+ "treatUnchangedAs": [
63727
+ "always: read when an Unchanged is reported"
63728
+ ]
63729
+ }
63413
63730
  },
63414
63731
  {
63415
63732
  "typeName": "noodl.cloud.modelrequest",
@@ -63741,7 +64058,48 @@
63741
64058
  }
63742
64059
  ],
63743
64060
  "dynamicPorts": null,
63744
- "parameterEncoding": null
64061
+ "parameterEncoding": null,
64062
+ "rules": {
64063
+ "provider": [
64064
+ "always: read when the call is made — blank is Anthropic"
64065
+ ],
64066
+ "model": [
64067
+ "always: read when the request is built — blank is the default model"
64068
+ ],
64069
+ "apiKeySecret": [
64070
+ "always: the name read from the secret store when the call is made"
64071
+ ],
64072
+ "baseUrl": [
64073
+ "always: read when the call is made — blank is the Anthropic API"
64074
+ ],
64075
+ "instructions": [
64076
+ "always: read when the request is built"
64077
+ ],
64078
+ "callInstructions": [
64079
+ "always: read when the request is built"
64080
+ ],
64081
+ "input": [
64082
+ "always: read when the request is built, unless Messages holds a conversation"
64083
+ ],
64084
+ "messages": [
64085
+ "always: read when the request is built — a non-empty list replaces Input"
64086
+ ],
64087
+ "outputSchema": [
64088
+ "always: read when the request is built and again when its answer lands"
64089
+ ],
64090
+ "effort": [
64091
+ "always: read when the request is built — blank is high"
64092
+ ],
64093
+ "maxTokens": [
64094
+ "always: a positive number, floored, read when the request is built — anything else is 16000"
64095
+ ],
64096
+ "timeoutMs": [
64097
+ "always: a positive number, floored, read when the call starts and in its timeout sentence — anything else is 120000"
64098
+ ],
64099
+ "send": [
64100
+ "always: one call at the end of the frame however many presses — Done with the answer published, or Failure with Error, Error Code and Status, per press"
64101
+ ]
64102
+ }
63745
64103
  },
63746
64104
  {
63747
64105
  "typeName": "noodl.cloud.removeuserfromrole",
@@ -63887,7 +64245,18 @@
63887
64245
  }
63888
64246
  ],
63889
64247
  "dynamicPorts": null,
63890
- "parameterEncoding": null
64248
+ "parameterEncoding": null,
64249
+ "rules": {
64250
+ "role": [
64251
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
64252
+ ],
64253
+ "userId": [
64254
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
64255
+ ],
64256
+ "treatUnchangedAs": [
64257
+ "always: read when an Unchanged is reported"
64258
+ ]
64259
+ }
63891
64260
  },
63892
64261
  {
63893
64262
  "typeName": "noodl.cloud.request",
@@ -64114,6 +64483,14 @@
64114
64483
  "example": "ptype-Sa1"
64115
64484
  }
64116
64485
  ]
64486
+ },
64487
+ "rules": {
64488
+ "allowNoAuth": [
64489
+ "always: read when a request comes, and again when its caller cannot be looked up"
64490
+ ],
64491
+ "params": [
64492
+ "always: nothing while it runs; read when a request comes — each name a contract row and an output a wire can take"
64493
+ ]
64117
64494
  }
64118
64495
  },
64119
64496
  {
@@ -64285,6 +64662,22 @@
64285
64662
  "example": "pm-Sa1"
64286
64663
  }
64287
64664
  ]
64665
+ },
64666
+ "rules": {
64667
+ "params": [
64668
+ "always: nothing while it runs; each name makes a value input the payload carries"
64669
+ ],
64670
+ "errorMessage": [
64671
+ "always: read when Send is pressed with Status Failure"
64672
+ ],
64673
+ "status": [
64674
+ "always: read when Send is pressed — unset or success is a 200, anything else a 400"
64675
+ ],
64676
+ "send": [
64677
+ "no request reached the function this node is part of: the reason on Error → Failure",
64678
+ "the request was already answered — by another Response, by a refusal, or by the runner's timeout: the reason on Error → Failure",
64679
+ "otherwise: the payload goes out just after — a 200 carrying the Parameters when Status is unset or success, else a 400 carrying the Error Message → Done"
64680
+ ]
64288
64681
  }
64289
64682
  },
64290
64683
  {
@@ -64382,7 +64775,15 @@
64382
64775
  }
64383
64776
  ],
64384
64777
  "dynamicPorts": null,
64385
- "parameterEncoding": null
64778
+ "parameterEncoding": null,
64779
+ "rules": {
64780
+ "name": [
64781
+ "always: read at the end of the frame by a Do pressed in it"
64782
+ ],
64783
+ "fetch": [
64784
+ "always: one read at the end of the frame however many presses — found: Value and a cleared Error, Done per press; outside a backend, not found, or a store that cannot be read: the reason on Error, Value cleared, Failure per press"
64785
+ ]
64786
+ }
64386
64787
  },
64387
64788
  {
64388
64789
  "typeName": "noodl.cloud.sendemail",
@@ -64539,7 +64940,30 @@
64539
64940
  }
64540
64941
  ],
64541
64942
  "dynamicPorts": null,
64542
- "parameterEncoding": null
64943
+ "parameterEncoding": null,
64944
+ "rules": {
64945
+ "to": [
64946
+ "always: stamped on each Do pressed after it; read at the end of the frame by a send whose presses agree"
64947
+ ],
64948
+ "template": [
64949
+ "always: read when a send is made — set and not None, the message is that template"
64950
+ ],
64951
+ "variables": [
64952
+ "always: read when a send is made"
64953
+ ],
64954
+ "subject": [
64955
+ "always: read when a send is made"
64956
+ ],
64957
+ "text": [
64958
+ "always: read when a send is made"
64959
+ ],
64960
+ "html": [
64961
+ "always: read when a send is made"
64962
+ ],
64963
+ "send": [
64964
+ "always: at the end of the frame, one send when the frame's presses agree on To (to To as it stands then), or one send per run of presses stamped with the same To, each after the one before is answered — Done per press, or the reason on Error and Failure per press"
64965
+ ]
64966
+ }
64543
64967
  },
64544
64968
  {
64545
64969
  "typeName": "noodl.cloud.updateuser",
@@ -64682,6 +65106,17 @@
64682
65106
  "parameterEncoding": {
64683
65107
  "known": false,
64684
65108
  "reason": "The port helper needs project context this generator cannot supply headlessly — a live component, a connected node, or a backend schema."
65109
+ },
65110
+ "rules": {
65111
+ "userId": [
65112
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
65113
+ ],
65114
+ "password": [
65115
+ "always: read at the end of the frame by a Do pressed in it"
65116
+ ],
65117
+ "properties": [
65118
+ "always: nothing while it runs; each name makes a value input"
65119
+ ]
64685
65120
  }
64686
65121
  },
64687
65122
  {
@@ -64840,7 +65275,15 @@
64840
65275
  }
64841
65276
  ],
64842
65277
  "dynamicPorts": null,
64843
- "parameterEncoding": null
65278
+ "parameterEncoding": null,
65279
+ "rules": {
65280
+ "token": [
65281
+ "always: read at the end of the frame by a Do pressed in it — blank fails that Do"
65282
+ ],
65283
+ "treatUnchangedAs": [
65284
+ "always: read when an Unchanged is reported"
65285
+ ]
65286
+ }
64844
65287
  }
64845
65288
  ]
64846
65289
  }