Logitech Controller under melodic distro?

System Setup

ROS Distro: Melodic
provided ISO image installed: https://packages.clearpathrobotics.com/stable/images/latest/melodic-husky/amd64/
real hardware

I updated the real robot from kinetic to melodic. I followed the instructions here: https://www.clearpathrobotics.com/assets/guides/kinetic/husky/InstallHuskySoftware.html#installing-husky-software
ROS seems to work fine, but I can't control the robot with the Logitech controller (I exported the HUSKY_LOGITECH as stated in the instructions). Any help on that?

What button are you using as the deadman switch/enable button on the controller?  In Melodic we changed the enable button used on the F710 controllers.  Instead of the X button, you must now hold the LB button, located by your left index finger when holding the controller.  This change was made to keep the button mappings consistent across different robots and different controllers, as well as to make it easier to operate Husky with only one hand.
You can revert to the old behavior of you want by editing husky_control/config/teleop-logitech.yaml and changing the button_enable property.  There's a diagram in that file that shows the button and axis indices for the controller.
If you are holding down LB to enable the robot, the issue may be with the udev rule that handles the controller permissions.  With the USB dongle for the controller inserted into a USB port, can you please confirm that the Logitech input device is showing up in /dev/input by running
ls -l /dev/input

This should show a file called /dev/input/f710, which should be a symlink to /dev/input/js0 (or similar, e.g. js1).
If that file doesn't exist, please ensure that /etc/udev/rules.d/41-logitech.rules exists and contains the following:
# Udev rule for the Logitech controller (e.g. the one shipped with Husky)
KERNEL=="js*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c21f", SYMLINK="input/f710"

If that udev rule does exist already, and the controller device is still now being symlinked correctly, please let me know and I'll provide additional instructions.

@civerachb-cpr Thanks for your reply. Indeed, I used the old button combination since I didn't stumble upon the information. That was an easy fix :). Thanks!


[Feedback] Events

This is a placeholder issue for feedback on events.
Some of the feedback here may be addressed in https://github.com/opencollective/opencollective/issues/5084

We'd love to use the platform and avoid the expense of ti.to or eventbrite, but I want to understand what's possible or coming soon with your events functionality.

When purchasing a ticket to an event the monthly and yearly recurring contribution options appear alongside, this makes no sense.

The ticket name/type doesn't appear in the purchase process

I can pay for more than one ticket as part of an order but there is nowhere for me to ad another's attendee details

It's unclear whether there is a process for cancelling/refunding tickets

Add to this

when paying for multiple tickets the order is still classes as a single ticket

 Event creation process should not end before a tier is created #5465

 Event creation process could involve emailing project members #5466

Request for the ability to edit events fields, e.g. It would be great to be able to edit the fields to add a surname option and, for different events, a question and answer box.

From https://github.com/opencollective/opencollective/issues/7301:

Simplify Captcha for Event Check-In (https://github.com/opencollective/opencollective/issues/7302 could help with that)
The "Sponsors and Participants" section is only displayed for logged-in users. I'm not sure about the rationale for this, but I tend to agree with this person that we should show it.

Full feedback

We have been using the events feature on the Open Collective platform as a means to check in people to our in-person events as a way to keep track of attendance in the same place where people and organizations can donate to us."
A frequent complaint that we have is that the Captcha feature is annoying and too complicated. For instance, in the last event, someone failed the Captcha 3 times and ended up not checking in. I understand that this is for security reasons, but would there be a way to make the experience simpler and smoother?
An idea would be to add types of events when an admin is creating a new event. In our case, we make use of events for attendance purposes only, so it would make sense to allow only attendees to get tickets during the duration of the event. This could potentially eliminate the need for a Captcha. On a related note, we did a test and we were able to get a ticket to a past event.
Another suggestion to work around this issue would be to allow the possibility to confirm check-in by email, where the person would enter their email and then confirm attendance by clicking on the link sent to their email.
Lastly, I have noticed that if someone is not logged in to the Open Collective platform, they are not able to see how many people attended each event. This is not ideal for us, because we are trying to collect data in this platform so that potential financial sponsors can see the work we have been doing and the dimension of our community when they come to this page. Would it be possible to have the total number of attendees as part of the event summary? Currently, it says "Attended by" followed by the initials of the first 4 people who signed up. Then, even if you are signed up, you need to click the event to see the count of people who attended. An more helpful alternative would be to show "Attended by" followed by "{initials of the first person who checked in} and {number of remaining check-ins}".


POST Requests with raw post data

Maybe I'm missing something but I couldn't find a way to do a post request with a custom content-type and raw body which is needed for many REST APIs that expect e.g. JSON in a POST body.

You're actually right, there's no way to upload raw data with POST/PUT/PATCH. This is an oversight, I'll have to get this down in 1.2, but it'll be pretty high priority. In the meantime, there is a way to set the content-type, but it requires you to go through the header. You have to add a Header{{"content-type"}, {"application/json"}} to your request call.
While we're on the subject, what are your thoughts on providing a json library (I'm thinking Niels Lohmann's library)? This would let me do things like accept a Json object and set the header automatically.

For now, I'm going to limit the scope of this to just providing an API for setting a raw data type for a request.

I personally think that adding json is out of the scope of a HTTP library. Honestly I'm a big fan of the HTTP package of Go https://golang.org/pkg/net/http/ and that's also pretty clear on staying in the HTTP realm.
Also when cpr supports raw bodys either with it's own Body type or directly as string (this should probably be kept in sync with response.text / response.body) using json with it is absolutely trivial so the gain in my opinion isn't too big.


Fix broken streaming mode

#658 broke the streaming mode, this PR fixes my mistake.

This is a rather grave issue, is this change ok for you?

I will have a look over the weekend!

@Johannesd3 I haven't had the time to look into the implementation in detail - I played around a bit and it seems so follow the old behaviour of adding the file to cache after the fetch is complete..
So LGTM!

Then I'll go ahead


ci: codecov fix

The code coverage silently fails, since the python:slim image doesn't contain git and curl for it to function. This is fixed.

Codecov Report

Merging #108 (fe15b16) into master (2f80266) will increase coverage by 2.20%.
The diff coverage is 91.80%.

@@            Coverage Diff             @@
##           master     #108      +/-   ##
==========================================
+ Coverage   93.15%   95.35%   +2.20%
==========================================
  Files          14       15       +1
  Lines         628      668      +40
==========================================
+ Hits          585      637      +52
+ Misses         43       31      -12

Impacted Files
Coverage Δ

connaisseur/__main__.py
0.00% <0.00%> (ø)

connaisseur/crypto.py
100.00% <ø> (ø)

connaisseur/flask_server.py
93.87% <ø> (+22.44%)
:arrow_up:

connaisseur/notary_api.py
95.65% <60.00%> (-1.50%)
:arrow_down:

connaisseur/validate.py
94.31% <94.31%> (ø)

connaisseur/key_store.py
90.32% <100.00%> (ø)

connaisseur/mutate.py
100.00% <100.00%> (+5.55%)
:arrow_up:

connaisseur/policy.py
93.50% <100.00%> (ø)

connaisseur/trust_data.py
98.01% <100.00%> (ø)

... and 2 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 47b60ab...fe15b16. Read the comment docs.

Maybe we should also be running the codecov action with fail_ci_if_error: true # optional (default = false) such that it will visibly fail in the future


Add a Gitter chat badge to README.md

xorz57/forest now has a Chat Room on Gitter
@xorz57 has just created a chat room. You can visit it here: https://gitter.im/repository-forest/Lobby.
This pull-request adds this badge to your README.md:

If my aim is a little off, please let me know.
Happy chatting.
PS: Click here if you would prefer not to receive automatic pull-requests from Gitter in future.

Thanks for the pr but the aim was off. The badge should have been placed along with the other badges.


Multiple folders per project

Since an update today, all my projects that had multiple folders have been reduced to 1, and after adding them they don't get saved automatically; I need to add them manually in the CSON file.

Having the same issue, I noticed that the CSON file was also having all default keys which I skipped in my own file.
Re-adding the paths made no change, when opening up the project it gets reverted back to the first path in the list.
Atom: 1.10.2
Package: 3.2.0

Please update and try again. Should be fixed now.

Seems to work fine again, thank you very much for the quick fixing 👍

Ta.


Replace Ajax with REST API or pure PHP ajax request

As ajax is soooo slow it would be better to use the REST API or use a pure PHP solution for the Ajax request as WordPress is not needed while running the checks.
Here is an example how it could be done with pure PHP: https://gist.github.com/gmazzap/be3d8723f2481a7bc3bea05976544f25

So that would mean separating current wp_ajax_ hooked functions to their own files and calling them instead of using the admin-ajax wrapper?

or use a pure PHP solution for the Ajax request as WordPress is not needed while running the checks.

Does that mean WordPress functions can't be used? Such as get_theme() to see if it's a child? Or to use transients?

@joyously Ulrich was talking about the ns-theme-check plugin, not the sniffs ;)

Does that mean WordPress functions can't be used? Such as get_theme() to see if it's a child? Or to use transients?

In the latest version of the plugin we run the checks on each file via AJAX. I was talking about that process and not stopping theme authors from using WordPress functions. I hope that makes sense.

So that would mean separating current wp_ajax_ hooked functions to their own files and calling them instead of using the admin-ajax wrapper?

Yes, loading WordPress every time to run pure PHP does not make sense.

I'll take look for this tomorrow probably. And I definitely agree that we don't need to load WP every time we do the check.

ns-theme-check plugin, not the sniffs
not stopping theme authors from using WordPress functions.

One is saying it's not the sniffs, and the other is saying it's not theme author code.
I'm saying you are referring to the plugin (that runs under WordPress), checking theme author code using sniffs, so I wanted to make sure that the sniff code could still make WordPress calls to check some things such as get_theme() or perhaps a transient to help in sniff code.

I wanted to make sure that the sniff code could still make WordPress calls

I don't expect the PHPCS sniffs to start using WordPress functions. PHPCS needs to be able to run without needing to install WordPress or a database. If the sniff needs extra information then we can pass that information along in form of arguments.

I was thinking, and could we use fetch API instead of AJAX? This gives us a bit more control over the result, as the fetch returns a promise. I think that would also give us better control over any possible errors that might come up while sniffing files (especially large JS files that can cause memory issues).
We could create a custom endpoint with the two files we now use for AJAX and then just fetch them.
I started working on rewriting this using PHP ajax, but got some other projects that came along so I kinda neglected this, but I think I will have some more time after WordCamp Zagreb.


Picard Compatibility

Hi there Tommy,
I've been using Bamclipper and it has been very useful!
I thought I would bring to attention an issue that other users may have had when using Bamclipper and then picard tools (and a possible solution to the issue).
Because clipping can lead to reads becoming unmapped, there may be some unexpected issues that can come up due to interactions between BWA, Bamclipper, and Picard. I noticed these unmapped reads cause issue, especially if they have the supplemental flag added to them from BWA.
Furthermore, as the newly unmapped reads have a non-zero MAPQ score, they have cause errors with Picard.
To get around these two issues I have done the following:

Used bwa mem with the -M option, which prevents the use of supplement alignment flag
Used awk to change the '*'/newly unmapped reads to have 0 for their MAPQ score
 (awk -F '\t' 'BEGIN{OFS="\t"} {if ($6 ~ /[*]/) sub(/.*/,0,$5); print $0;}')

Together this seems to have fixed the issues I had so I thought I would share that with others in case others have the same problem
PS if you can give me the internal code to implement counting of how many times each pair/arms was clipped, that would be greatly appreciated!
Thanks!

Thank you so much for your contribution!
I am currently out of office and cannot access the private code repo at the moment. I will get back to you once I can.


logs appear in the wrong cities

Noticing that logs for NY are appearing in the other city locations

this was a dumb caching mistake on my part--it should be fixed now, i'll wait a bit and see to be sure


Add tests for duplicate dims in batch_dims and input_dims

Description of proposed changes
This PR adds two tests for BatchGenerator when there are one or more dimensions included in both input_dims and batch_dims. The testing utilities are updated to account for this case. The tests currently fail due to https://github.com/xarray-contrib/xbatcher/issues/131, but including them will be helpful for finishing #132.

Maybe add some xfails so CI passes?

Good idea, thanks!


[Doc] Add CANCEL REFRESH MATERIALIZED VIEW

What type of PR is this：

[ ] BugFix
[ ] Feature
[ ] Enhancement
[ ] Refactor
[ ] UT
[x] Doc
[ ] Tool

Which issues of this PR fixes ：

Fixes #
Problem Summary(Required) ：

Checklist:

[ ] I have added test cases for my bug fix or my new feature
[ ] I have added user document for my new feature or new function

run starrocks_admit_test

run starrocks_admit_test

@mergify backport branch-2.4


[error] Create Listing Order (Error signing PSBT Error: No taproot scripts signed)

I can create a listing psbt (sell order).
But I got:
Failed to sign transaction
Error signing PSBT Error: No taproot scripts signed

Inputs:
[
    {
        "nonWitnessUtxo": {
            "type": "Buffer",
            "data": [
                ...
            ]
        },
        "witnessUtxo": {
            "script": {
                "type": "Buffer",
                "data": [
                    ...
                ]
            },
            "value": 1897
        },
        "sighashType": 131
    }
]

signPsbtListingXverse: async ({ psbt, address }) => {
            let psbtBase64 = '';
            const signPsbtOptions = {
                payload: {
                    network: {
                        type: NETWORK_NAME,
                    } as BitcoinNetwork,
                    message: 'Sign Transaction',
                    psbtBase64: psbt.toBase64(),
                    broadcast: false,
                    inputsToSign: [
                        {
                            address, // ordinal address
                            signingIndexes: [0],
                            sigHash: 131,
                        },
                    ],
                },
                onFinish: ({ psbtBase64: _psbtBase64, txId: _txId }) => {
                    psbtBase64 = _psbtBase64;
                },
                onCancel: () => alert('Request canceled.'),
            };
            await signTransaction(signPsbtOptions);
            const finalPsbt = bitcoin.Psbt.fromBase64(psbtBase64, {
                network: NETWORK,
            }).finalizeInput(0);
            return finalPsbt;
        },

Did you set the txid and output index for the input correctly? Difficult to tell what went wrong unless you post the raw PSBT. Usually the "No taproot scripts signed" error means the input can't be signed by the key.

I resolved that issue by adding redeemScript to my input.
const wpkh = bitcoin.payments.p2wpkh({ pubkey: Buffer.from(payerPubkey, 'hex'), network: NETWORK });
if (wpkh) {
    redeemScript = wpkh.output;
}
...

psbt.addInput({
  hash: utxo.txid,
  index: utxo.vout,
  nonWitnessUtxo: utxoTx.toBuffer(),
  redeemScript,
  });


Shared storage driver

This is discussion continued from https://github.com/blockstack/blockstack-core/issues/584
Design Goals:

Should be able to wrap a number a number of backends
Should be able to handle an arbitrary number of users
Should check those users addresses or profile verifications to allow writes

@muneeb-ali @jcnelson @kantai @larrysalibra

I think the engineering team on this is going to be @jackzampolin and I!
Okay -- from our design meeting -- the plan is construct something like a "Gaia Hub" which authenticates writes using end user's bitcoin addresses. Reads will be performed out of band.
User addresses must be associated with social verifications for spam protection, and eventually a name should be registered for the address, or the allocated storage will be reaped.

There's basically two pieces of this:

the server which is authenticating writes, initializing the storage backend (in the initial case, s3 bucket), and forwarding the writes. hopefully we can write pass-through to s3
the storage driver in blockstack-core -- this should be really straight-forward

Also, unless someone has a strong argument otherwise, the server is going to be written for nodeJS. The goal is for the server to be basically stateless (apart from the spam protection -- which should at least be trivially shardable)

Could we use nginx for their rate limiting and keep that code out of node?

That's a great idea.

I'll go ahead and stub out a /hub directory with a node server that can make an s3 call to get this started.

Okay -- initial thought for the format of write requests.
PUT /{address}/{path}
The PUT data will just be the bytes to store.
The request will need to have some specific headers:
X-BLOCKSTACK-SOCIAL-PROOF
AUTHENTICATION: bearer XYZ
The Authentication bearer token (XYZ above), should be a signature over an endpoint specific challenge, say:
gaiahub-{date}-{hub_server_url}-{hub_server_challenge}
The {date} ensures that these authentication tokens expire. The {hub_server_url} and the {hub_server_challenge} ensures that the signed token is only valid for this server.
The Content-Length header will also be important.

@jcnelson raised a good point that maybe we should put the social proofs into the Authentication header as well -- some software strips custom headers, and we'd prefer not to lose the social proof headers.


Backslash substitution does not work properly when Vim extension is enabled

When used together with the Vim extension, if the cursor is before a character, completing a backslash substitution places the cursor after that character, instead of after the newly inserted character. For instance, in the below screen capture, the cursor is expected to be positioned before the f instead of after the f after the substitution:
https://github.com/razetime/bqn-vscode/assets/50083900/20b90105-27ac-41ab-b06a-a308b313bfef
Another issue is that, when entering a command (press : in normal mode), backslashes cannot be inserted into the command; they are instead inserted into the file:
https://github.com/razetime/bqn-vscode/assets/50083900/1b548f82-6a12-4cf2-b34b-95c7480462bb
Using BQN language v0.1.5 and Vim v1.26.0.

I doubt i can address interactions with other extensions properly. However, if you have a system-wide input method that works in vscode, I can add an option to disable backslash substitution.

Backslash can be disabled in the upcoming version 0.1.6.


Add I Never Dream by Against All Logic

Song Name
I Never Dream
Artist Name
Against All Logic
Source
Youtube
Youtube Link
HMgV9OVfb24
Direct File Link
No response
Song ID
1102673
Start Offset [ms]
0
Extra
Created from Auto Nong.
Created for level: 76931927
Downloaded: No

hi


[fork] Include block transaction hash in the generation signature

I recently started mining burstcoin as the proof of capacity system seemed rather novel and unique. However, both pointing my capacity at a pool and trying to solo mine I was surprised by how often forks and orphans seemed to occur compared to other coins that I've mined and so I looked into the code to see if I could find anything that might make these events occur more often than expected.
There is one thing which I think I've found that could explain some of this, but thinking about it more there are potentially worse consequences than just pools and miners thinking they've found blocks that are then overtaken.
Sorry for the length and explaining some basic concepts - I expect you'll be familiar with these, it was more to solidify my understanding and explain my assumptions as I'm new to burstcoin.
The Problem
When miners produce blocks they do so by building on top of the generation signature for that block and the block beforehand. The new generation signature is made from hashing the previous gensig and the id of the generator of the previous block with no data that makes up the current block.
This allows a miner, upon finding a deadline that they can use to make a block, to produce many permutations of the same block with different contents. A malicious miner could connect to many peers on the network and send each peer a different version of the block, both taking up resources as each peer will verify and broadcast each version of the block and also deliberately increasing the fork risk as if pools and miners start building on different blocks and find very similar deadlines.
The problem described above, while frustrating and potentially detrimental to the amount of resources needed to run a node on the network, wouldn't fundamentally affect the ability of network participants to transact and, after forks are resolved, miners will still receive the income for finding the lowest deadline. As such this alone isn't enough to justify changing the consensus rules in my opinion.
There is another consequence of the generation signature only including this limited amount of information: a minor potential for double spends. Right now, the contents of the block are signed by the miner and include a hash of the transactions in the previous block. As long as different miners find blocks there is no problem, it isn't possible to broadcast a (valid) chain with different transactions in all but the latest block. A problem occurs though when one miner or pool finds more than one block in a row: they can resign all the blocks they find sequentially and as such remove a transaction even with several confirmations. Given the size pools have reached in the past (based upon https://forums.burst-team.us/topic/3965/burst-ninja-is-getting-too-big and other forum threads) this seems like a very real risk and would significantly increase the number of confirmations needed, basically to the point that more than one miner has mined a block. This wouldn't be perfect though as a miner with a large amount of the hash rate could simply mine under different accounts to hide the proportion that they have.
Note that even 10% of the hash rate could potentially allow for a successful double spend based upon 4 confirmations. As such I think making a change to prevent miners from rewriting their own transaction history is worth the large cost of performing a flag day upgrade of the software.
Proposed fix
This change includes a hash of the transactions in the block as part of the generation signature. This is done by selecting transactions for inclusion as soon as mining begins on a new block rather than once a deadline has been found.
With this change in place it is no longer possible to modify the contents of a block - changing a transaction would change the generation signature and make the deadline found no longer valid. This successfully mitigates both the block flood and double spending attacks described above as both depend upon changing the contents of a block after a deadline has been found.
Alternatives
Rather than changing how the generation signature is computed it would be possible to change how the deadline is computed. My understanding of the latter is that it would require most, if not all, mining software to be upgraded whereas the generation signature is already fetched from a burstcoin wallet using getMiningInfo and so the change as proposed would only require wallets to upgrade by the flag day, a much easier and feasible task.
Advantages of this approach

Fixes block flood and double spend attacks by malicious miners with significant minorities of the network capacity
Can be done with only wallet upgrades, current pool, plotting and miner software will still work correctly.
Brings burstcoin in line with how most other coins build their blockchains - the transaction hash is including the bitcoin block header, for example.

There is one other advantage that I'm less confident about as I'm still developing my understanding of how the burstcoin mining process works. I think this change makes it hard to perform a double spend even with 51% of the network capacity as I'll explain below.
On a proof of work based coin, finding a block is effectively a race and if you have 51% of the hashrate you can pick an arbitrary block in the past that you wish to rewrite the blockchain up to and, given enough time, you will always win the race to find the longest chain, therefore rewriting the history as you please. Burstcoin, with proof of capacity, is different: finding a block is more like a lottery than a race. With 51% of the hashrate you'll expect to have the winning deadline 51% of the time, but for the other 49% of the time you might lose by quite a large margin and no amount of additional time (bar regenerating all the plots, which is infeasible simply to find another block). As such, if a miner with 51% tries to rewrite history, the further back they wish to rewrite the more blocks in a row they must find a low deadline for, but as this is only expected 51% of the time they won't get very far.
Note that I'm not saying that confirmations are not required to have confidence of a double spend - that remains the case. However, in the event of a miner with 51% (which would still be bad and a serious cause for concern), the number of blocks they could rewrite would be rather limited.
Note that I've only done some very cursory analysis of the probabilities behind this (and my probability is very rusty), but everything seems to line up that with even 90% of the capacity a malicious miner to rewrite the last 4 blocks with a 65% success rate, dropping steeply the more confirmations there are. This is much better than a PoW coin where 51% will rewrite history given enough time every time.
Disadvantages of this approach
This is a hard fork. It will require all wallets to upgrade. There was no way I could think of that changing the generation signature could be done any other way. However, I think the potential advantages (even excluding the speculative increased difficulty of double spends with a majority capacity) are well worth doing this and I'm sure all miners will appreciate less risks of forks and all users, especially those running businesses such as exchanges, would rather it isn't possible to double spend with a minority of the hash rate.
I picked a rather arbitrary number for the actual fork block that was about 2 weeks in the future when I originally wrote this (since then I've tried to do more analysis and testing to ensure this change is correct and addressing real issues), this should of course be changed to something that would be feasible to do the upgrade by - however I would recommend some haste to this due to the potential risks present from denial of service block floods and double spends in the time before a fork would come into effect. However, as there are easier DOS attacks possible right now (e.g. DDOS pool servers) and since the fall of ninja.pool I don't think any pools currently have too large a share there is no reason to panic.
(And my apologies for proposing such a drastic change as my first PR, I really wasn't expecting to find something like this on my first read through the codebase!)

Tagging @de-luxe as you appear to managing merges and release, let me know if there are others who should be on here.

@masshalting Guess the following should look into this @SOELexicon @IceBurst @catbref also some more currently working on new version at https://github.com/BurstCore/Burst-Core-Wallet as far as i could see/research.

I've made a forum thread at https://forums.burst-team.us/topic/6226/wallet-proposal-include-block-transaction-hash-in-generation-signature for discussion as that seems more active than either github account.

I have a few concerns that were brought up to me from @call_me_jack, we should definitely have a chat with him before this goes into anything further.

My intepretation of the propsed changes:

the prior block transactions are used as part of the seed going into the deadline calculation

i think a possible mining exploit might be:
When you legally get the deadline for a block, you can calculate a number of permutations of the contents of this block by including or excluding transactions.
Then do a parrallel search in own plots for next block deadlines for each of these permutations (because now the transactions going into the block is part of the hash being used for the deadline).
if each of the permutated blocks N-1 results in a different deadline for block N, then for instance if you created 1024 permutations, you would get a deadline that was the same as if you had 1024 times more space plotted.
i believe to have read somewhere that it is in fact a feature that the block contents are not used in the hash seed for the deadline, specifically to avoid this kind of mining attack, where you get to seach your plot space for many deadline and scope seeds, then select the winning block that gives you the best next deadline.

@DennisFantoni That's my understanding as well... I wasn't sure if I'm missing something since I'm new to Burstcoin. It seems like it would make bandwidth much more important, and might affect the predictability of the timing of the blocks.


Upgrade cats -> 1.3.1 and cats-effect -> 1.0 and fix fallout

Overview
This PR upgrades cats and cats-effect to current versions. Main changes are:

parFoo methods were replaced with Foo, since I'm not sure right now how to provide evidence for Parallel[IO, F]
implicit t: Timer[IO] -> implicit contextShift: ContextShift[IO], since the latter is what's required for evidence in cats-effect 1.0

Testing

compilation is fine
run some examples

Closes #30

Looks like ContextShift was enough to get parallelism working. I took the liberty of reverting the changes which impacted parallel execution.

The parallelism seems fine with your ContextShift change, so I've gone back and re-parallelized


New collective page: last blockers before release

This issue tracks the last blockers that we have for releasing the new collective page. It may be updated during the week based on feedback.

New collective page

General

[x] Add funds button for organizations
[x] FB Open Source page is crashing

Budget

[x] Add link to View all expenses

Updates

[x] Remove "Create a new update" button
[x] Don't show "Create a new update" to non-admins

Contribute section

[x] Events contributor is wrong
[x] Remove "View all the ways to contribute"
[x] Rename More ways to contribute to Events
[x] Show past events with a disabled CTA
[x] Add tier button
[x] Add event button
[x] Center contribute cards

Contributions

[x] Contribution cards: bubbles lines are too thick

Contributors grid

[x] Webpack: core contributors doesn't match
[x] New contributor card design
[x] Less padding below
[x] Limit number of contributors

Top contributors

[x] Avatars darker grey

Transactions

[x] Show expenses properly (resolve https://github.com/opencollective/opencollective/issues/2210)

Tier page

[x] Add tooltip on copy to clipboard button to make behavior explicit
[x] Unify icons with NCP
[x] Setting to enable tier page https://github.com/opencollective/opencollective/issues/2431

All blockers are done :tada:


HTML table rows get rendered with paragraph tags

The following input in an mdx file:

            hello
            world

            0
            1

has the following output:

                hello
                world

                0
                1

The additional paragraph tags cause the table formatting to break. Is there a recommended workaround to this? (I'm not using GFM tables because I want to apply custom styles to some cells of the table.)
This works as expected but looks more messy:

hello
            world

0
            1

Output: (the
 tag gets moved under tbody but it renders fine...)

                hello
                world

                0
                1

Interesting case! This is somewhat related to https://github.com/wooorm/xdm/issues/38.
There are two ways around this:
Be more explicit about the paragraphs:

      a

      b

->

{"a"}

{"b"}

Or to explicitly enter JS(X)-only by using an expression:
{

      a
      b

}

->

    a
    b

Currently, we’re “unraveling” paragraphs that contain a single JSX elements. We could expand that to unravel paragraphs with one or more JSX elements?

Or to explicitly enter JS(X)-only by using an expression:

Interesting, didn't consider that! Unfortunately that would also mean that the content inside the  tags isn't parsed by MDX (so I wouldn't be able to use Latex within the  tags). Is it possible to "break out" of the JSX expression and re-enter Markdown (ie. with something like {This is JSX, and this is <Markdown>**markdown**</Markdown>	}?)

We could expand that to unravel paragraphs with one or more JSX elements?

Would doing that break something like:
I expect this to be a **markdown** paragraph with a custom inline <Tooltip tooltipContent="hello world!">JSX Element</Tooltip>.

Where the Tooltip element will add a tooltip when the user hovers over the text "JSX Element"? (or more generally, how should it handle inline JSX tags that are supposed to be inline? just accept a list of acceptable "inline" JSX elements?) I would still expect the paragraph to be wrapped in a
 tag in this situation.

nope, no way to get “back” into MDX/markdown from JS(X)!

Would doing that break something like:

I mean “paragraph”s that contains only one or more JSX elements. So:
whateverwhatever

Or:
whatever
whatever

Currently a single one is “unraveled”:
whatever

Released!

Thanks for pushing such a quick fix! ❤


code wrong for "is_running"

https://github.com/nats-io/python-nats/blob/master/nats/io/client.py#L686
here, that's a bug. why not testing strict.

:/ yeah currently it relies on value being truthy but that is wrong and should be calling the function instead...


CED method link broken

When I click the different file formats of the CED method files, none of the links are available to download.

Thanks for pointing this out. We just updated the json-ld link.


Dynamically update not working well

Describe the bug
ProgressDialogType.Download , show/hide works well.
When use pr.update, the process is stopped and dialog is showing.
To Reproduce
await dio.download(
      downloadUrl,
      savePath,
      onReceiveProgress: (rcv, total) {
        print('received: ${rcv.toStringAsFixed(0)} out of total: ${total.toStringAsFixed(0)}');

        setState(() {
          progress = ((rcv / total) * 100 * 10).roundToDouble() / 10;
          print('progress:$progress');
        });

        pr.update(progress: progress, message: "Downloading file...");   // <-- this code not working

        if (progress == 100.0) {
          setState(() {
            isDownloaded = true;
          });
        } else if (progress < 100.0) {}
      },
      deleteOnError: true,
    );

Expected behavior
progress text will be updated
Smartphone:

Device: [iPhoneX Max]
OS: [iOS13.6]

I am having the same problem. Have you found the solution?


@types in dependencies causing build failures

Unfortunately, we just hit the dependencies vs devDependencies issue as discussed in https://github.com/TypeStrong/typedoc/pull/310#pullrequestreview-4978799. Specifically, our project:

Uses a different version of Lodash / its own @types/lodash.
Has a dev dependency on typedoc, which installs a separate version of @types/lodash

Both @types/lodash installations are being picked up by the typescript compiler, causing duplicate definition warnings. Per discussion in that thread, can we move those types back out to devDependencies to prevent the unnecessary downstream installation?
If any of the @types/ modules are actually needed by the generated typedoc.d.ts (seems like @types/handlebars might fall into this category?), I propose we inline those typings (re-expose them manually) so that we don't cause any build inconsistencies for other folks that might be using a different version of handlebars.
Will you all accept a PR for this? Any concerns about the approach?

I already made a PR for this #335 but it seams the project is close to death
Have to remove typedoc from my projects because this creates a lot of trouble 😡

Answered in https://github.com/TypeStrong/typedoc/pull/335#issuecomment-268070899. The definition needs to be fixed in DefinitelyTyped - which it may already have been, because this was brought up to them a few weeks ago.

If this seriously needs to be done for TypeScript to function, it's also a flaw in TypeScript that should be fixed. There's no reasonable expectation here for module authors to require duplication of dependencies to work.

There is, because Typdoc add typings that are not needed for the project. Modules show up that are not available in the project and create conflicts with typings installed from other sources like typings. I don't see any case were typings are needed at runtime!


Added gravatar plugin so no more manually creating the gravatar hash

The default gravatar image will be displayed if no email or no image exists for the email.

Awesome gravatar-y goodness!


Shader exception when loading GLTF 2.0 model with tangents

Loading a model that was converted from DAE using COLLADA2GLTF and with exported tangents/binormals leads to Cesium crashing with a shader exception.
I also documented this issue on the COLLADA2GLTF repo and waiting for feedback on this issue. https://github.com/KhronosGroup/COLLADA2GLTF/issues/294
As a note, when working from 3DS max, is it better to use COLLADA2GLTF or OBJ2GLTF (which one is better maintained?). Any other converter/exporter recommended?

Yes, it seems like COLLADA2GLTF is producing invalid tangents. They should be VEC4 instead of VEC3. That said, the test model doesn't have a normal texture so you don't need tangents. Is there an option to export DAE without tangents?
OBJ2GLTF is better maintained but OBJ is a more limited format - no node hierarchy, no animations, no tangents, etc.
I haven't tried the Babylon 3DS Max plugin before, but it looks good: https://doc.babylonjs.com/features/featuresDeepDive/Exporters/3DSMax_to_glTF

Test model was just for testing ;) I do need tangents in my shaders. (but yes, you can export DAE without tangents if needed)
Babylon plugin is interesting but gave mixed results so far, for me. File weight is very high (not sure why), I could not manage to enable draco compression, etc.

Once thing you might be able to consider is exporting the model as DAE and then importing it to blender and using the built in GLTF 2.0 exporter there. I've had no issues with that exporter so far, but I can't be certain if it would work correctly with models made in a separate program.

@lilleyse, I keep experimenting with various options to generate GLTF2.0 models and I was wondering if you would share some advice, best practices or if you had some roadmap for new tools for artists working with GLTF and Cesium?
Here is so far what I found out:

COLLADA2GLTF is outdated and has this tangent problem. I am not sure this tools has any future: can you confirm?
3DSMax Babylon plugin is the best option in my case (working with 3DSMax) and after some time to master it gives nice output, proper tangents if needed and Draco compression when libs are provided.
Blender exporter works well too but add extra import/export steps.

I am still stuck with the problem of either using native exported PBR shaders or find a way to apply multiple materials while using Cesium's customShader API (as described here https://community.cesium.com/t/dropping-support-for-gltf-1-0/19969/20?u=xavier_tassin)

Closing this issue as it appears to be a data problem rather than a CesiumJS bug.


Add info about FP8 support

What does this PR do?
Add info about FP8 support and change default values in README.

@regisss please review


feat(model): Add new USE_SOUNDBOARD, MANAGE_GUILD_EXPRESSIONS and VIEW_CREATOR_MONETIZATION_ANALYTICS permissions

Adds:

USE_SOUNDBOARD for the upcoming soundboard feature
MANAGE_GUILD_EXPRESSIONS, renamed from MANAGE_EMOJIS_AND_STICKERS to now include editing soundboard sounds.
VIEW_CREATOR_MONETIZATION_ANALYTICS for permissions on viewing subscription insights.

Ref:

https://github.com/discord/discord-api-docs/pull/6017

Thanks for the additions


[BUG] When I try to launch a game I get a error message saying "an exeption occured while running Bloxstrap" and "System.Net.Http.HttpRequestException: Response status code does not indicate success: 403 (Forbidden)."

Acknowledgement of preliminary instructions

[X] I have read the preliminary instructions, and I am certain that my problem has not already been addressed.

What problem did you encounter?
Here are the log file
Bloxstrap_20240702T123628Z.log

Thanks

Update to the latest version: https://github.com/pizzaboxer/bloxstrap/releases/latest


DOPS-171: Update translation process with weblate changes.

Summary
Minimalistic changes to keep the translation process up to date with the weblate migration.
Ticket Link
https://mattermost.atlassian.net/browse/DOPS-171

Some minor suggestions but otherwise LGTM! :)

Discovered a few issues in the final version. I'm proposing changes. Please wait before merging.

integrating what has been discussed before from the L10n channel.

@metanerd Would you be open to add instructions for how to update user permissions in Weblate? I tried but was unsuccessful and the docs didn't prove to be useful.

@jasonblais added.

@justinegeffen Ready for re-review, pending feedback from @wget :)


remove git2 and openssh dependencies

Signed-off-by: stevelr<EMAIL_ADDRESS>

Does this work on Linux Windows and Mac?

Yes Yes and Yes
(Windows tested with WSL. Should be tested on Windows without WSL but I ran into unrelated complications building the 'ring' dependency and need to create a new build/test environment).

This resolves one of the most common sources of cross build failures and improves portability.   (The other platform dependency is 'ring' which is harder to remove but has better support for cross compilation).
My first plan to remove the OpenSSH dependency was to replace the git2 crate with pure rust crates that use git's rest api over reqwest and rustls, but that would have had much higher complexity than the approach taken here, which adds a dependency on git cli.
The minimum version of git cli required is 2.26.0 (3/22/2020) when 'sparse-checkout set' was added. Current git cli version is 2.38.1 as of 10/07/22.

 I can see its usefulness there, but I'd also consider that as out of scope for this PR

I am not in favor of adding the new macro dep. I don’t see the need to add yet another dependency to something that already has a ton of deps. Plus it abstracts away too much IMO. Being able to access the status of things is important, plus I still think the normal rust stuff reads better.

Followed Taylor's suggestion to remove from dependencies. Left the existing uses in tests (run_cmd moved to dev-dependencies).


TypeError: No method name messages.SentMessage found

I want to send message to channel. But i got the error "No method name messages.SentMessage found".
I am using telegram-mtproto 3.2.11.

use messages.sendMessage
https://schema.horner.tj/#!/method/messages.sendMessage

It wasn't worked.
@wfjsw you have the same issue at #25, how did you fix it?

@DucNguyen0611 please provide code, not only error

also read FAQ https://github.com/zerobias/telegram-mtproto/wiki/FAQ#how-to-send-objects

I used code in examples folder and add sendMessage function to chat-history
const sendMessage = async (chat, mess) => {
await telegram('messages.SentMessage', {
peer: {
_          : 'inputPeerChannel',
channel_id : chat.id,
access_hash: chat.access_hash
},
message: mess
})
}

Not messages.SentMessage but messages.sendMessage
@wfjsw already helped you

Thank you


Adds ABSL_PRETTY_FUNCTION support for clang.

Clang has had this feature for quite some time now.

Closing due to no response from the author of this pull request.


Google maps fails to load from home server but ok in cloud

I have deployed to a Jelastic server and that works fine but the version I have installed to my home server just shows the Google Maps error "This page didn't load Google Maps correctly. See the JavaScript console for technical details"
If I look in the console I have: "Google Maps API error: InvalidKeyMapError" however I have put the same key into the Jelastic version and it works fine. Looking on the Google API dashboard I can see requests registering from the Jelastic version but none arrive from the home server so it seems like they are never even reaching Google.
Update: Ok, if I don't run it without the --host <IP_ADDRESS> switch, it works ok. That means I can only see it from the server itself though and not my main PC across the network. Any ideas?

Have you got a restriction on which URLs can run that API key? Check on your Google API dashboard.

No, I have to referrers set.

I seem to have fixed it. I changed the switch to the host machine's local IP rather than using <IP_ADDRESS> and it is loading ok now.


CI tests only run on conda

🚀 Feature
Run CI tests on pip as well.
Motivation
We have traditionally built torchvision via both conda and pip, but we only perform tests on conda.
This has been generally fine because there was nothing which was specific to pip that could affect runtime and wouldn't be catch by a conda test.
This is not true anymore since the addition of libpng / libjpeg / ffmpeg as dependencies to torchvision, which requires different manipulations for pip.
This lack of coverage is illustrated in https://github.com/pytorch/vision/pull/2775, where only the conda binaries work, and not the pip packages.
cc @andfoy @seemethere

Yes, better smoke tests could also be a possibility. This is the type of smoke test I would add in addition to importing torchvision.
One thing to take into account though is that smoke tests generally only run on a schedule, but while implementing / debugging a new feature that has different handling for pip / conda, having iterative CI signal is valuable.


Korean Language Support

Some translations missed. but, necessary HUD Translations complete.

I fixed some syntax errors.

Is this considered ready to merge or are you going to be translating more?

I ready to merge my commit.

Thank you!

Hey @mjkim0727, I am currently in the process of relicensing Controllable to a more suitable license. I would like your permission to relicense your contributions to Controllable under MIT.


ECS Cluster default Service Discovery Namespace support

what

add support for default service discovery namespace

why

service discovery acts as a local DNS for all your ECS Services, it is often useful to have an entire cluster of services capable of speaking with one another.

references:

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_cluster#service_connect_defaults

/terratest


Enhance Concurrency and Cancellation Handling in Job Execution

Description:
This Pull Request introduces significant enhancements to how concurrency and cancellation are managed within job executions. Key changes include:

Asynchronous Execution Enhancements: All job runs are now fully asynchronous, ensuring that operations are non-blocking and responsive throughout their execution paths.
Improved Cancellation Support: Enhancements to cancellation token usage allow for more responsive cancellation of ongoing jobs. Cancellation checks are integrated more deeply into the job execution logic, allowing for quicker termination of jobs in response to cancellation requests.
 This allows multiple job instances to run in parallel while respecting priority constraints.

These changes aim to make the job execution process more efficient, responsive, and reliable, particularly under high load and in complex scheduling scenarios.
Future work, the concurrency control responsibilities still need to be moved into the JobExecutor , this shift will centralize how parallel executions are managed, simplifying maintenance and extending capabilities.

Since #21 piggybacks on this one I suppose this one is unnecessary. I probably should have worked on the same branch but wasn't sure about your contributions preferences.

One thing to note, the Tests are broken at the moment. I didn't spend any time fixing them because I just wanted to have you review the design changes first.

That is fine - they can be fixed afterward.

Closing this PR as it is superceded by #21.


Donate page - better descriptions of food

Instead of the current select boxes, we'll probably want a picture + text box for description

SORRY THIS WAS THE WRONG REPO


[Organization and Shared with me]: 'Duplicate' button is not available on chat details for chats with not allowed model or addon from 'Shared with me' and Organization sections

EPAM AI DIAL chat version
0.18.0
How to reproduce
Preconditions:
user1 has a chat01 with not allowed model or addon (e.g. model is not available for user but chat was exported from another user)
user2 also do not have access to model (or addon ) from chat01
Steps:

Share this chat01 with user2 -> User2 has chat01 in Shared with me section
by user 2 click on chat01 in Shared with me section ->
Publish chat01 -> chat01 becomes available for user2 in Organization
by user 2 click on chat01 in Organization ->

Actual result
2,4
Error message displayed in the bottom "Not allowed model selected. Please, change the model to proceed"
Dublicate button is absent on chat01 details on the central part of the screen
Note: duplicate option is available from context menu for chat01

Expected result

Error message need to be updated , because from Shared with me and Organization user can not select other model or addon
Button "duplicate" should be available from chat's details in the central part of the screen

Confidential information

[X] I confirm that do not share any confidential information

related issue #2183


UX: hard to spot python provider in output

[Filing per @zanieb request in #9819 comment]
I'm a definite corner case configuration, so there may not be much that can be done. I have a MS Surface X (arm64 processor) running windows 11, and spend most of my python time in a Git-bash shell. The sequence of events that led to me uncovering the issue in #9819 is roughly:

upgrade uv to latest
see if there is yet an arm64 version of python available via uv python list
misread the output, and took a wrong guess at how to request installation
uncovered the #9819 issue

While an arm64 box can transparently run x86_64 binaries, there is a performance hit which is most noticeable during python startup. So I've been trying to figure out how to use uv with a native arm64 python. (That's been a challenge I haven't solved cleanly yet, but not high on my list.)
Today, step 2 above (the only command I knew at the time) produced the following output:
❯ uv python list
cpython-3.13.1+freethreaded-windows-x86_64-none    <download available>
cpython-3.13.1-windows-x86_64-none                 <download available>
cpython-3.13.0-windows-x86_64-none                 AppData\Roaming\uv\python\cpython-3.13.0-windows-x86_64-none\python.exe
cpython-3.13.0-windows-aarch64-none                AppData\Local\Programs\Python\Python313-arm64\python.exe
cpython-3.12.8-windows-x86_64-none                 <download available>
cpython-3.12.2-windows-x86_64-none                 AppData\Roaming\uv\python\cpython-3.12.2-windows-x86_64-none\python.exe
cpython-3.12.2-windows-aarch64-none                .pyenv\pyenv-win\versions\3.12.2-arm\python.exe
cpython-3.11.11-windows-x86_64-none                <download available>
cpython-3.11.10-windows-x86_64-none                AppData\Roaming\uv\python\cpython-3.11.10-windows-x86_64-none\python.exe
cpython-3.10.16-windows-x86_64-none                <download available>
cpython-3.10.15-windows-x86_64-none                AppData\Roaming\uv\python\cpython-3.10.15-windows-x86_64-none\python.exe
cpython-3.9.21-windows-x86_64-none                 <download available>
cpython-3.8.20-windows-x86_64-none                 <download available>
cpython-3.7.9-windows-x86_64-none                  <download available>
pypy-3.10.14-windows-x86_64-none                   <download available>
pypy-3.9.19-windows-x86_64-none                    <download available>
pypy-3.8.16-windows-x86_64-none                    <download available>
pypy-3.7.13-windows-x86_64-none                    <download available>

Focusing on the left column, I saw the "windows-aarch64-none" and got excited. I glanced to the right column and (wrongly) ended up on a "<download available>" line, and jumped to the incorrect conclusion that uv could now install arm64 python versions on windows. After @zanieb pointed me to the correct command to use (uv python list --only-downloads) it was clear that windows arm64 builds are not yet available from uv.
What would help reduce the confusion, I think, would be some distinction in the listing between uv installed pythons, and all other. In my case, I have both a pyenv python and python.org python in the mix. Maybe using a different color for the non-uv ones in the right column (which are all blue for installed versions)? Or a prefix character on the left column (similar to ls -l output)?

Ah I thought you were saying uv python list --only-downloads was showing system interpreters. This is less surprising, but perhaps we can do better.

Oops - clicked the wrong link and answered over here


error in plot_sensors_2d()

`---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
10 plt.gca().set_aspect('equal', 'box')
11 plt.axis('off')
---> 12 viz.plot_sensors_2d(epo1, epo2,lab=True)  # bads are represented as squares
13 # plotting links according to sign (red for positive values,
14 # blue for negative) and value (line thickness increases
TypeError: plot_sensors_2d() got an unexpected keyword argument ['lab'`]

@YouyanLee Did you try to reinstall the last version of HyPyP since we changed the parameters of the plot_sensors_2d function.


Support for custom "wrappers"

Per the documentation, there are convenience wrappers for common commands like ls. It would be very useful if this feature can be extended such that we can add custom wrappers, and even share them:
var result = transport.getuid('mylogin');
if( result.code === 0 && result.stdout !== 10000 )
    transport.abort("User 'mylogin' already exists with the wrong uid: " + result.stdout);

I realise stdoutin the above is a string, it contains a newline, etc, but I am ignoring that in the interest of keeping example simple. I hope you get what I am driving at.
Since this is a somewhat significant and philosophical issue, I am asking first if this is an interesting direction for the project, rather than sending a PR.

Hey @ravi
If you're still interested in this subject, please make a quick proposal in the form of code snippets how you'd like to write extensions and how to load them as a developer.
Thanks
Patrick

Hi @pstadler
I'm working on a pull request for that. What do think about registration with the following synopsis registerCommand(cmdName, cmdDef[, defaultOptions]) that can be used like so:
plan.registerCommand('mkpdir', 'mkdir -p');
// or
plan.registerCommand('mkpdir', ['mkdir', '-p']);

In the same way I want to extend argument passing so that the when those are given as an array automatic shell escaping occurs (through https://www.npmjs.com/package/shell-escape) which can make scripts smore readable:
  var dirWithBlanks = '/var/foo bar/bazz'
  plan.mkdir('-p "' + dirWithBlanks + '"');
  // can be written as
  plan.mkdir(['-p', dirWithBlanks]);

This would be backwards compatible as it is only triggered if extension has type array.
What do you think?

Hi @akloeber
1 plan is an instance of Flightplan. You need to register commands on the Transport class.
2. how to handle commands which are only available for either SSH or Shell but not both?
3. newly introduced commands are not following the API of existing commands
4. what's the advantage over simply writing transport.exec('mkdir -p "dir"')?

@pstadler:
-> 1.
Well, so far flightplan is the only exposed object, so there is no real alternative to that without changing the API of the entire package. Maybe the flightplan object could expose some kind of config handle to do that kind of global configuration.
-> 2.
My intention was that registerCommand could be used to define a custom alias for a command (optionally with default options) that is often used, so that the overall deployment code becomes more readable and provided options can be managed centrally at one point (at the location where the command is defined). If the command can only run locally or remotely of course there will be a command not found error but that is in the responsability of the user that defines the alias. Even now there is no guarantee that each shell supports all of the build-in commands coming from commands.js (although of course the major ones do). Or there may be small differences in the supported arguments (see hostname -n command for example which works on Linux but not on Mac). Even then the possibility of registering own commands at a central place would support workarounds for that at a single place.
-> 3. and 4.
The API for using a command should be the same as the current ones. Providing arguments as an array with automatic shell escaping should be optional and providing the entire command string should still be supported. It's only for readability, compare the following:
var source = '/var/foo bar/bazz';
var target = '/var/bar foo/bazz';
plan.exec('mv "' + source + '" "' + target + '"');
// can be written as
plan.exec(['mv', source, target]);

If source/target may contain additional special characters (like &) it may be necessary to do something like that:
var esc = require('shell-escape');
plan.exec('mv ' + esc(source) + ' ' + esc(target));

In my opinion that could be handled nicely within flightplan (while also staying backwards compatible) and it would improve the overall readability/maintainability of the scripts.

With apologies for not fully reading the comments above before I write the below: IMHO custom commands/wrappers should be auto-discovered by Flightplan, such as in the example above. Wrappers should be able to do complex operations not just run one single command.


Type vs "Anything in the heiarchy rooted at this type"

One problem that many modern OOP languages have is a failure to discern between "exactly this type" and "this type or any of its decedents" in parameters. -- For convenience let us call the "hierarchy rooted at this type"a class.
("type types" just sound wrong,; and I'd rather not use "abstract type" or "interface" because they're further away from the idea than I'd like.)
One way to distinguish between the type and the class would be to co-opt something like Ada's class attribute. (Attributes being a property of the type rather than a method [e.g. an array-type has the attributes first and last which are always the first and last values of the index] and are indicated with the ' character.)
Thus, in Ada, it's possible to express something like:
Function Image( Object : Sometype ) return String;
and
Function Image( Object : Sometype'Class ) return String;
with the former meaning "a parameter of exactly this type" and the latter meaning "a parameter of this type or anything descended from it".
There are several advantages to this separation:

Dynamic-dispatch is slow compared to static calls.
It allows for a clear indication between dynamically-dispatched calls and static-calls in the source.
Only method calls with a class parameter need dynamic dispatching; calls without can be statically determined.
Inheritance-wise, a method with class means that it is written/implemented in the general manner and need not (and probably should not) be overridden... whereas an inheriting type should override a method with a parameter of the type.

@OneWingedShark you know that we decided not to have classes in EO? Only types and subtypes.

Perhaps using the word "class" was a mistake, I am using the term to mean "family of types" -- IIUC the EO types are essentially just interfaces, which is fine... but that doesn't change the need (or advantages) of being able to say/distinguish-between "this thing specifically" and "this thing and any of its children". The former can (and ought to) be done statically, the latter cannot be done statically in the general case.
(You can do a lot w/ static analysis, to include resolving some dynamic calls to static calls, which is awesome, but TTBOMK hasn't been adopted. [There was an ACM paper on it awhile back, they used Modula-2; sorry, I cannot remember the title, date, or author.] -- this general case problem comes to the forefront when dealing w/ libraries.: given a method operating on a "thing of this type or anything derived from it", you cannot optimize it at all because there's no guarantees [other than the base type's interface] that can be presented to the compiler.)

Wow, Ada...

Assim, em Ada, é possível expressar algo como:
Function Image( Object : Sometype ) return String;
e
Function Image( Object : Sometype'Class ) return String;
com o primeiro significado "um parâmetro de exatamente este tipo" eo último significado "um parâmetro deste tipo ou qualquer coisa desceu a partir dele".

That isn't a good syntax.
I could be wrong, but in Object Pascal you only write this:
function Image(var Object : TSometype): string;
function Image(Object : TSometype): string;

This do the same of your code.
The "only" difference is that var keyword was used.

Wow, Ada...

Function Image( Object : Sometype ) return String;
and
Function Image( Object : Sometype'Class ) return String;

That isn't a good syntax.

The point I'm trying to illustrate isn't about syntax, but a very specific portion of semantics with respect to dealing with OOP.

I could be wrong, but in Object Pascal you only write this:
function Image(var Object : TSometype): string;
function Image(Object : TSometype): string;
This do the same of your code.
The "only" difference is that var keyword was used.

Those aren't the same as what I'm trying to say/illustrate; in Ada they are equivalent to
function Image(Object : in out TSometype) return string; and function Image(Object : TSometype) return string;, respectively.
What I'm trying to bring up is the point that there's a difference between "exactly, literally THIS type" and "this type, and anything that extends it". -- In the former we know exactly, statically what's there and what operations are available... in the second, we don't, and so require dynamic dispatching [e.g. C++'s vtables].
As an example, let us consider the type Integer and the subtype Positive (Integer with the added constraint of "X > 0" for all values X). If we have method F1( Item : Integer ) should Item refer to only Integer, or should it refer to Integer and Positive both? (This is what the underlying semantics of Ada's Sometype and Sometype'Class syntax, the former is exactly that type and the latter is that type and things derived from it; it has nothing to do with whether or not the parameter is by value or reference.)
The consideration is relevant to both performance and optimization as every operation that can be done w/o a dynamic dispatch is simpler and faster and less information is unknown.  -- For example of optimization, if we have the general function Op#( X : Positive ) return Positive where # is 1..4 we could have a call-chain of  Op1( Op2( Op3( Op4( Positive_Value ) ) ) ) and eliminate all checks on the constraint in the bodies of all the Op#-functions as soon as we verify that Positive_Value indeed satisfies the constraints of Positive... and we can do it because the functions all return Positive. (The case doesn't hold if they return Integer.)

@OneWingedShark I know about "parameter is by value or reference". But using Objects, the parameter is always by reference. In that case, var keyword works different — but I could be wrong — only in FreePascal, ie, in Delphi there is no difference. I mean, thevar keyworkd will says to compiler: "Accept only this type".
I've tried to found a paper, but I didn't found (yet). I'll search again later.

@mdbs99

I know about "parameter is by value or reference". But using Objects, the parameter is always by reference.

With Delphi, Object Pascal and Java this is correct, as per the language definition.
This need not be the case language-/implementation-wise though.

In that case, var keyword works different — but I could be wrong — only in FreePascal, ie, in Delphi there is no difference. I mean, the var keyword will says to compiler: "Accept only this type".

You're wrong, the var keyword (in parameters) has two meanings to the compiler in Object Pascal; the first is "this thing is modifiable inside the subprogram", the second is "this thing is passed by reference".
The const keyword in Delphi parameters was added to provide a foil to the var keyword, explicitly saying "this thing is not modifiable by the subprogram".
Side note: The var keyword for parameters, along with const and out are allowed to be typeless. This typeless parameter form goes all the way back to the UCSD Pascal days -- and have been in Turbo Pascal since at least Version 3, which was before objects were added. (Here's the manual as a PDF, the page you want is PDF page 129 [marked 115].)
In Delphi/Object Pascal Function Fn( X : Object ): Integer, and Java int fn( Object x ), and the C++ or C# equivalent these are all the same: the parameter is not specifically/exclusively the type, but "instance of the class", which does mean there's no way in those languages to actually specify "only this type". -- This design decision makes a lot of sense in the context of those languages.
In the context of both Delphi and Java, they are both single-inheritance languages (see note 7) with single-root object hierarchies. Because of this, allowing a parameter of the root-type "Object in both cases" to refer to "this, and anything derived from it" means that you could pass am object of Window to fn because that single-inheritance means that it is an Object because that inheritance-line goes directly [and linearly] to Object.
C++ is different, it doesn't have a single base object. However, IIRC [my C++ is rusty], coming from the implicit-conversion happy background of C, it too chose to make the parameter (at least accept) anything derived from the type. (This comes close to what I'm trying to get at, in a way.)

You're wrong, the var keyword (in parameters) has two meanings to the compiler in Object Pascal; the first is "this thing is modifiable inside the subprogram", the second is "this thing is passed by reference".

@OneWingedShark
Look this thread. If you do not want to read everything, take a look on the 2d Florian Klaempfl's answer here.
That's what I was talk about.

@mdbs99 -- That example code illustrates, tangentially, the problem that I'm getting at.
{$mode objfpc}
type
  tc1 = class
  end;

  tc2 = class(tc1)
  end;

  tc3 = class(tc2)
  end;

procedure p(var c : tc1);
  begin
    c:=tc2.create;
  end;

var
  c3 : tc3;

begin
  p(c3);
end.

The reason that the above was, at all, ever considered valid is because in Delphi/Object Pascal there is no way to indicate whether or not you're referring to "this type exactly" or "this type, and anything derived from it"
The var parameter mode has nothing to do with this issue.

There was an ACM paper on it awhile back, they used Modula-2; sorry, I cannot remember the title, date, or author.

Found it:
Simple and Effective Link-Time Optimization of Modula-3 Programs

@OneWingedShark I'm closing this, since we don't have types anymore in EO

@OneWingedShark I'm closing this, since we don't have types anymore in EO


feat: lens open frames

Change Summary
Add support for Lens frame specification. Export isLensFrameActionPayload and getLensFrameMessage (using Lens client SDK for authentication) functions in frames.js package, update docs, update multi-protocol example.
Merge Checklist

[ ] PR has a Changeset
[x] PR includes documentation if necessary
[x] PR updates the boilerplates if necessary

thanks for the contribution @defispartan, almost there! i have rebased the pr branch to dev, and fixed some integration issues. please see my comments above regarding the getLensFrameMessage method

@defispartan we recently added XMTP signer support to our debugger - would be good to support Lens in there as well. Would require creating useLensIdentity() and useLensContext() hooks, similar to what was implemented for XMTP: useXmtpIdentity() and useXmtpContext()
if you're willing to implement those then i'll happily connect them up in the debugger!

Hey @stephancill, I'm working on these hooks now. Should be ready tomorrow.

@defispartan we recently added XMTP signer support to our debugger - would be good to support Lens in there as well. Would require creating useLensIdentity() and useLensContext() hooks, similar to what was implemented for XMTP: useXmtpIdentity() and useXmtpContext()
if you're willing to implement those then i'll happily connect them up in the debugger!

@stephancill I added and integrated the debugger hooks, with a new modal to select Lens profile to interact. Here is a demo Frame for testing:
https://lens-guestbook-frame.vercel.app/guestbooks/9fa99190-8f9a-4dd2-aed1-465166e950c3

@defispartan thanks, reviewing asap!

hey @defispartan, i am experiencing CORS issues when trying the lens signer on the new-api-multi-protocol example at http://localhost:3000/examples/new-api-multi-protocol. see below - any ideas?

http://localhost:3000/examples/new-api-multi-protocol.

@stephancill This should be fixed now, there was a firewall on the API that was checking the request body and throwing an error based on the url parameter.
I also updated the types of the isLensFrameActionPayload to match XMTP. The way it was set up previously caused a build error in the example app.

@defispartan getting the following error trying the example mentioned above with my lens signer (stephancill.lens)
Error: Lens manager is not enabled to sign on behalf of the user.: {"response":{"errors":[{"message":"Lens manager is not enabled to sign on behalf of the user.","locations":[{"line":2,"column":3}],"path":["result"],"extensions":{"code":"GRAPHQL_VALIDATION_FAILED","stacktrace":["GraphQLError: Lens manager is not enabled to sign on behalf of the user.","    at new ValidationError (/usr/src/app/packages/apollo-server-errors/lib/index.js:40:9)","    at FramesLensManagerMutationsResolver.signFrameAction (/usr/src/app/packages/api-lens/lib/frames/resolvers/mutations/frame-lens-manager.js:31:19)","    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)","    at async dispatchHandler (/usr/src/app/node_modules/type-graphql/build/cjs/resolvers/helpers.js:80:24)","    at async /usr/src/app/node_modules/type-graphql/build/cjs/resolvers/helpers.js:81:26","    at async dispatchHandler (/usr/src/app/node_modules/type-graphql/build/cjs/resolvers/helpers.js:80:24)"]}}],"data":null,"status":200,"headers":{}},"request":{"query":"mutation SignFrameAction($request: FrameLensManagerEIP712Request!) {\n  result: signFrameAction(request: $request) {\n    ...FrameLensManagerSignatureResult\n  }\n}\n\nfragment CreateFrameEIP712TypedData on CreateFrameEIP712TypedData {\n  types {\n    FrameData {\n      name\n      type\n    }\n  }\n  domain {\n    ...EIP712TypedDataDomain\n  }\n  value {\n    specVersion\n    url\n    buttonIndex\n    profileId\n    pubId\n    inputText\n    state\n    actionResponse\n    deadline\n  }\n}\n\nfragment FrameLensManagerSignatureResult on FrameLensManagerSignatureResult {\n  signedTypedData {\n    ...CreateFrameEIP712TypedData\n  }\n  signature\n}\n\nfragment EIP712TypedDataDomain on EIP712TypedDataDomain {\n  name\n  chainId\n  version\n  verifyingContract\n}","variables":{"request":{"url":"http://localhost:3000/examples/new-api-multi-protocol","inputText":"","state":"","buttonIndex":1,"actionResponse":"","profileId":"0x01df7e","pubId":"0x01-0x01","specVersion":"1.0.0"}}}}
    at makeRequest (index.js:301:15)

this is my lens signer context
is this example working for you and am i doing something wrong?

@stephancill This should work for you now.
The way it was written was assuming that the profile had Lens Manager enabled (enabling Lens API to sign messages on a profiles behalf, this is what enables signless interactions on most Lens apps and is enabled for newer profiles by default). The Lens Frames spec does include a fallback in case manager is disabled which is manually signing typed data, so I just added that option to the debugger as well.
For testing if you want to toggle the manager on and off from a profile you can do that here

@defispartan is the example at http://localhost:3000/examples/new-api-multi-protocol working for you with this setup?
i'm now getting these errors when trying to validate the action on the frame server using getLensFrameMessage

Field "identityToken" is not defined by type "FrameEIP712Request".
Field "unixTimestamp" is not defined by type "FrameEIP712Request"

Full output below:
ClientError: Variable "$request" got invalid value { specVersion: "1.0.0", url: "http://localhost:3000/examples/new-api-multi-protocol", buttonIndex: 1, profileId: "0x01df7e", pubId: "0x01-0x01", inputText: "", state: "", actionResponse: "", deadline:<PHONE_NUMBER>, identityToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjB4MDFkZjdlIiwiZXZtQWRkcmVzcyI6IjB4OGQyNTY4NzgyOUQ2Yjg1ZDllMDAyMEI4Yzg5ZTNDYTI0ZEUyMGE4OSIsInJvbGUiOiJwcm9maWxlX2lkZW50aXR5IiwiYXV0aG9yaXphdGlvbklkIjoiZGE0Y2NlZWYtNDc3Ni00NTQ1LTlhNmItMzFlMDQ1YzUzZmNlIiwiaWF0IjoxNzE1Nzg0OTE3LCJleHAiOjE3MTU3ODY3MTd9.TzERQfZ4A94mzfXnkYxqXs40yUllCus0rCtoztkeXNY", unixTimestamp:<PHONE_NUMBER>916 }; Field "identityToken" is not defined by type "FrameEIP712Request".: {"response":{"errors":[{"message":"Variable \"$request\" got invalid value { specVersion: \"1.0.0\", url: \"http://localhost:3000/examples/new-api-multi-protocol\", buttonIndex: 1, profileId: \"0x01df7e\", pubId: \"0x01-0x01\", inputText: \"\", state: \"\", actionResponse: \"\", deadline:<PHONE_NUMBER>, identityToken: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjB4MDFkZjdlIiwiZXZtQWRkcmVzcyI6IjB4OGQyNTY4NzgyOUQ2Yjg1ZDllMDAyMEI4Yzg5ZTNDYTI0ZEUyMGE4OSIsInJvbGUiOiJwcm9maWxlX2lkZW50aXR5IiwiYXV0aG9yaXphdGlvbklkIjoiZGE0Y2NlZWYtNDc3Ni00NTQ1LTlhNmItMzFlMDQ1YzUzZmNlIiwiaWF0IjoxNzE1Nzg0OTE3LCJleHAiOjE3MTU3ODY3MTd9.TzERQfZ4A94mzfXnkYxqXs40yUllCus0rCtoztkeXNY\", unixTimestamp:<PHONE_NUMBER>916 }; Field \"identityToken\" is not defined by type \"FrameEIP712Request\".","locations":[{"line":1,"column":28}],"extensions":{"code":"BAD_USER_INPUT","stacktrace":["GraphQLError: Field \"identityToken\" is not defined by type \"FrameEIP712Request\".","    at coerceInputValueImpl (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:134:11)","    at coerceInputValueImpl (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:49:14)","    at coerceInputValue (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:32:10)","    at coerceVariableValues (/usr/src/app/node_modules/graphql/execution/values.js:132:69)","    at getVariableValues (/usr/src/app/node_modules/graphql/execution/values.js:45:21)","    at buildExecutionContext (/usr/src/app/node_modules/graphql/execution/execute.js:280:63)","    at execute (/usr/src/app/node_modules/graphql/execution/execute.js:116:22)","    at execute (/usr/src/app/node_modules/dd-trace/packages/datadog-instrumentations/src/graphql.js:151:20)","    at executeIncrementally (/usr/src/app/node_modules/@apollo/server/dist/cjs/incrementalDeliveryPolyfill.js:47:34)","    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)","    at async execute (/usr/src/app/node_modules/@apollo/server/dist/cjs/requestPipeline.js:229:37)","    at async processGraphQLRequest (/usr/src/app/node_modules/@apollo/server/dist/cjs/requestPipeline.js:158:32)","    at async internalExecuteOperation (/usr/src/app/node_modules/@apollo/server/dist/cjs/ApolloServer.js:634:16)","    at async runHttpQuery (/usr/src/app/node_modules/@apollo/server/dist/cjs/runHttpQuery.js:135:29)","    at async runPotentiallyBatchedHttpQuery (/usr/src/app/node_modules/@apollo/server/dist/cjs/httpBatching.js:37:16)","    at async ApolloServer.executeHTTPGraphQLRequest (/usr/src/app/node_modules/@apollo/server/dist/cjs/ApolloServer.js:544:20)"]}},{"message":"Variable \"$request\" got invalid value { specVersion: \"1.0.0\", url: \"http://localhost:3000/examples/new-api-multi-protocol\", buttonIndex: 1, profileId: \"0x01df7e\", pubId: \"0x01-0x01\", inputText: \"\", state: \"\", actionResponse: \"\", deadline:<PHONE_NUMBER>, identityToken: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjB4MDFkZjdlIiwiZXZtQWRkcmVzcyI6IjB4OGQyNTY4NzgyOUQ2Yjg1ZDllMDAyMEI4Yzg5ZTNDYTI0ZEUyMGE4OSIsInJvbGUiOiJwcm9maWxlX2lkZW50aXR5IiwiYXV0aG9yaXphdGlvbklkIjoiZGE0Y2NlZWYtNDc3Ni00NTQ1LTlhNmItMzFlMDQ1YzUzZmNlIiwiaWF0IjoxNzE1Nzg0OTE3LCJleHAiOjE3MTU3ODY3MTd9.TzERQfZ4A94mzfXnkYxqXs40yUllCus0rCtoztkeXNY\", unixTimestamp:<PHONE_NUMBER>916 }; Field \"unixTimestamp\" is not defined by type \"FrameEIP712Request\".","locations":[{"line":1,"column":28}],"extensions":{"code":"BAD_USER_INPUT","stacktrace":["GraphQLError: Field \"unixTimestamp\" is not defined by type \"FrameEIP712Request\".","    at coerceInputValueImpl (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:134:11)","    at coerceInputValueImpl (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:49:14)","    at coerceInputValue (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:32:10)","    at coerceVariableValues (/usr/src/app/node_modules/graphql/execution/values.js:132:69)","    at getVariableValues (/usr/src/app/node_modules/graphql/execution/values.js:45:21)","    at buildExecutionContext (/usr/src/app/node_modules/graphql/execution/execute.js:280:63)","    at execute (/usr/src/app/node_modules/graphql/execution/execute.js:116:22)","    at execute (/usr/src/app/node_modules/dd-trace/packages/datadog-instrumentations/src/graphql.js:151:20)","    at executeIncrementally (/usr/src/app/node_modules/@apollo/server/dist/cjs/incrementalDeliveryPolyfill.js:47:34)","    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)","    at async execute (/usr/src/app/node_modules/@apollo/server/dist/cjs/requestPipeline.js:229:37)","    at async processGraphQLRequest (/usr/src/app/node_modules/@apollo/server/dist/cjs/requestPipeline.js:158:32)","    at async internalExecuteOperation (/usr/src/app/node_modules/@apollo/server/dist/cjs/ApolloServer.js:634:16)","    at async runHttpQuery (/usr/src/app/node_modules/@apollo/server/dist/cjs/runHttpQuery.js:135:29)","    at async runPotentiallyBatchedHttpQuery (/usr/src/app/node_modules/@apollo/server/dist/cjs/httpBatching.js:37:16)","    at async ApolloServer.executeHTTPGraphQLRequest (/usr/src/app/node_modules/@apollo/server/dist/cjs/ApolloServer.js:544:20)"]}}],"status":400,"headers":{}},"request":{"query":"query CreateFrameTypedData($request: FrameEIP712Request!) {\n  result: createFrameTypedData(request: $request) {\n    ...CreateFrameEIP712TypedData\n  }\n}\n\nfragment CreateFrameEIP712TypedData on CreateFrameEIP712TypedData {\n  types {\n    FrameData {\n      name\n      type\n    }\n  }\n  domain {\n    ...EIP712TypedDataDomain\n  }\n  value {\n    specVersion\n    url\n    buttonIndex\n    profileId\n    pubId\n    inputText\n    state\n    actionResponse\n    deadline\n  }\n}\n\nfragment EIP712TypedDataDomain on EIP712TypedDataDomain {\n  name\n  chainId\n  version\n  verifyingContract\n}","variables":{"request":{"specVersion":"1.0.0","url":"http://localhost:3000/examples/new-api-multi-protocol","buttonIndex":1,"profileId":"0x01df7e","pubId":"0x01-0x01","inputText":"","state":"","actionResponse":"","deadline":1715786747,"identityToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjB4MDFkZjdlIiwiZXZtQWRkcmVzcyI6IjB4OGQyNTY4NzgyOUQ2Yjg1ZDllMDAyMEI4Yzg5ZTNDYTI0ZEUyMGE4OSIsInJvbGUiOiJwcm9maWxlX2lkZW50aXR5IiwiYXV0aG9yaXphdGlvbklkIjoiZGE0Y2NlZWYtNDc3Ni00NTQ1LTlhNmItMzFlMDQ1YzUzZmNlIiwiaWF0IjoxNzE1Nzg0OTE3LCJleHAiOjE3MTU3ODY3MTd9.TzERQfZ4A94mzfXnkYxqXs40yUllCus0rCtoztkeXNY","unixTimestamp":1715784947916}}}}

@defispartan thank you for advising that part seems to be working now. is the example at http://localhost:3000/examples/new-api-multi-protocol working for you with this setup when you try it?
i'm now getting these errors when trying to validate the action on the frame server using getLensFrameMessage

Field "identityToken" is not defined by type "FrameEIP712Request".
Field "unixTimestamp" is not defined by type "FrameEIP712Request"

Full output below:
ClientError: Variable "$request" got invalid value { specVersion: "1.0.0", url: "http://localhost:3000/examples/new-api-multi-protocol", buttonIndex: 1, profileId: "0x01df7e", pubId: "0x01-0x01", inputText: "", state: "", actionResponse: "", deadline:<PHONE_NUMBER>, identityToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjB4MDFkZjdlIiwiZXZtQWRkcmVzcyI6IjB4OGQyNTY4NzgyOUQ2Yjg1ZDllMDAyMEI4Yzg5ZTNDYTI0ZEUyMGE4OSIsInJvbGUiOiJwcm9maWxlX2lkZW50aXR5IiwiYXV0aG9yaXphdGlvbklkIjoiZGE0Y2NlZWYtNDc3Ni00NTQ1LTlhNmItMzFlMDQ1YzUzZmNlIiwiaWF0IjoxNzE1Nzg0OTE3LCJleHAiOjE3MTU3ODY3MTd9.TzERQfZ4A94mzfXnkYxqXs40yUllCus0rCtoztkeXNY", unixTimestamp:<PHONE_NUMBER>916 }; Field "identityToken" is not defined by type "FrameEIP712Request".: {"response":{"errors":[{"message":"Variable \"$request\" got invalid value { specVersion: \"1.0.0\", url: \"http://localhost:3000/examples/new-api-multi-protocol\", buttonIndex: 1, profileId: \"0x01df7e\", pubId: \"0x01-0x01\", inputText: \"\", state: \"\", actionResponse: \"\", deadline:<PHONE_NUMBER>, identityToken: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjB4MDFkZjdlIiwiZXZtQWRkcmVzcyI6IjB4OGQyNTY4NzgyOUQ2Yjg1ZDllMDAyMEI4Yzg5ZTNDYTI0ZEUyMGE4OSIsInJvbGUiOiJwcm9maWxlX2lkZW50aXR5IiwiYXV0aG9yaXphdGlvbklkIjoiZGE0Y2NlZWYtNDc3Ni00NTQ1LTlhNmItMzFlMDQ1YzUzZmNlIiwiaWF0IjoxNzE1Nzg0OTE3LCJleHAiOjE3MTU3ODY3MTd9.TzERQfZ4A94mzfXnkYxqXs40yUllCus0rCtoztkeXNY\", unixTimestamp:<PHONE_NUMBER>916 }; Field \"identityToken\" is not defined by type \"FrameEIP712Request\".","locations":[{"line":1,"column":28}],"extensions":{"code":"BAD_USER_INPUT","stacktrace":["GraphQLError: Field \"identityToken\" is not defined by type \"FrameEIP712Request\".","    at coerceInputValueImpl (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:134:11)","    at coerceInputValueImpl (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:49:14)","    at coerceInputValue (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:32:10)","    at coerceVariableValues (/usr/src/app/node_modules/graphql/execution/values.js:132:69)","    at getVariableValues (/usr/src/app/node_modules/graphql/execution/values.js:45:21)","    at buildExecutionContext (/usr/src/app/node_modules/graphql/execution/execute.js:280:63)","    at execute (/usr/src/app/node_modules/graphql/execution/execute.js:116:22)","    at execute (/usr/src/app/node_modules/dd-trace/packages/datadog-instrumentations/src/graphql.js:151:20)","    at executeIncrementally (/usr/src/app/node_modules/@apollo/server/dist/cjs/incrementalDeliveryPolyfill.js:47:34)","    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)","    at async execute (/usr/src/app/node_modules/@apollo/server/dist/cjs/requestPipeline.js:229:37)","    at async processGraphQLRequest (/usr/src/app/node_modules/@apollo/server/dist/cjs/requestPipeline.js:158:32)","    at async internalExecuteOperation (/usr/src/app/node_modules/@apollo/server/dist/cjs/ApolloServer.js:634:16)","    at async runHttpQuery (/usr/src/app/node_modules/@apollo/server/dist/cjs/runHttpQuery.js:135:29)","    at async runPotentiallyBatchedHttpQuery (/usr/src/app/node_modules/@apollo/server/dist/cjs/httpBatching.js:37:16)","    at async ApolloServer.executeHTTPGraphQLRequest (/usr/src/app/node_modules/@apollo/server/dist/cjs/ApolloServer.js:544:20)"]}},{"message":"Variable \"$request\" got invalid value { specVersion: \"1.0.0\", url: \"http://localhost:3000/examples/new-api-multi-protocol\", buttonIndex: 1, profileId: \"0x01df7e\", pubId: \"0x01-0x01\", inputText: \"\", state: \"\", actionResponse: \"\", deadline:<PHONE_NUMBER>, identityToken: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjB4MDFkZjdlIiwiZXZtQWRkcmVzcyI6IjB4OGQyNTY4NzgyOUQ2Yjg1ZDllMDAyMEI4Yzg5ZTNDYTI0ZEUyMGE4OSIsInJvbGUiOiJwcm9maWxlX2lkZW50aXR5IiwiYXV0aG9yaXphdGlvbklkIjoiZGE0Y2NlZWYtNDc3Ni00NTQ1LTlhNmItMzFlMDQ1YzUzZmNlIiwiaWF0IjoxNzE1Nzg0OTE3LCJleHAiOjE3MTU3ODY3MTd9.TzERQfZ4A94mzfXnkYxqXs40yUllCus0rCtoztkeXNY\", unixTimestamp:<PHONE_NUMBER>916 }; Field \"unixTimestamp\" is not defined by type \"FrameEIP712Request\".","locations":[{"line":1,"column":28}],"extensions":{"code":"BAD_USER_INPUT","stacktrace":["GraphQLError: Field \"unixTimestamp\" is not defined by type \"FrameEIP712Request\".","    at coerceInputValueImpl (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:134:11)","    at coerceInputValueImpl (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:49:14)","    at coerceInputValue (/usr/src/app/node_modules/graphql/utilities/coerceInputValue.js:32:10)","    at coerceVariableValues (/usr/src/app/node_modules/graphql/execution/values.js:132:69)","    at getVariableValues (/usr/src/app/node_modules/graphql/execution/values.js:45:21)","    at buildExecutionContext (/usr/src/app/node_modules/graphql/execution/execute.js:280:63)","    at execute (/usr/src/app/node_modules/graphql/execution/execute.js:116:22)","    at execute (/usr/src/app/node_modules/dd-trace/packages/datadog-instrumentations/src/graphql.js:151:20)","    at executeIncrementally (/usr/src/app/node_modules/@apollo/server/dist/cjs/incrementalDeliveryPolyfill.js:47:34)","    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)","    at async execute (/usr/src/app/node_modules/@apollo/server/dist/cjs/requestPipeline.js:229:37)","    at async processGraphQLRequest (/usr/src/app/node_modules/@apollo/server/dist/cjs/requestPipeline.js:158:32)","    at async internalExecuteOperation (/usr/src/app/node_modules/@apollo/server/dist/cjs/ApolloServer.js:634:16)","    at async runHttpQuery (/usr/src/app/node_modules/@apollo/server/dist/cjs/runHttpQuery.js:135:29)","    at async runPotentiallyBatchedHttpQuery (/usr/src/app/node_modules/@apollo/server/dist/cjs/httpBatching.js:37:16)","    at async ApolloServer.executeHTTPGraphQLRequest (/usr/src/app/node_modules/@apollo/server/dist/cjs/ApolloServer.js:544:20)"]}}],"status":400,"headers":{}},"request":{"query":"query CreateFrameTypedData($request: FrameEIP712Request!) {\n  result: createFrameTypedData(request: $request) {\n    ...CreateFrameEIP712TypedData\n  }\n}\n\nfragment CreateFrameEIP712TypedData on CreateFrameEIP712TypedData {\n  types {\n    FrameData {\n      name\n      type\n    }\n  }\n  domain {\n    ...EIP712TypedDataDomain\n  }\n  value {\n    specVersion\n    url\n    buttonIndex\n    profileId\n    pubId\n    inputText\n    state\n    actionResponse\n    deadline\n  }\n}\n\nfragment EIP712TypedDataDomain on EIP712TypedDataDomain {\n  name\n  chainId\n  version\n  verifyingContract\n}","variables":{"request":{"specVersion":"1.0.0","url":"http://localhost:3000/examples/new-api-multi-protocol","buttonIndex":1,"profileId":"0x01df7e","pubId":"0x01-0x01","inputText":"","state":"","actionResponse":"","deadline":1715786747,"identityToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjB4MDFkZjdlIiwiZXZtQWRkcmVzcyI6IjB4OGQyNTY4NzgyOUQ2Yjg1ZDllMDAyMEI4Yzg5ZTNDYTI0ZEUyMGE4OSIsInJvbGUiOiJwcm9maWxlX2lkZW50aXR5IiwiYXV0aG9yaXphdGlvbklkIjoiZGE0Y2NlZWYtNDc3Ni00NTQ1LTlhNmItMzFlMDQ1YzUzZmNlIiwiaWF0IjoxNzE1Nzg0OTE3LCJleHAiOjE3MTU3ODY3MTd9.TzERQfZ4A94mzfXnkYxqXs40yUllCus0rCtoztkeXNY","unixTimestamp":1715784947916}}}}

@stephancill Sorry about that, I thought it was working before but didn't realize that the clientProtocol field wasn't being set correctly 🙇♂
I updated the line that was causing this issue to ensure only required fields are passed and tested that the example (http://localhost:3000/examples/new-api-multi-protocol) should work on the debugger now (with and without profile manager enabled).

@defispartan thanks for fixing. i've rebased and we should be good to go!


Cart update does not trigger items quantities to refresh in the products view

When testing out the demo shop, I tried updating the cart directly from the cart items view and I saw that the items quantities do not update.
I'm not sure what the idiomatic HTMX solution would be, should the whole page be triggered ?

Hi @jch-neos, you should be able to use the hx-trigger with a custom event. That said, I have found using out-of-band updates to also be a good way to update chrome elements (things in the header).
https://htmx.org/attributes/hx-trigger/

@jcheritat it's true, it depends on what you're attempting. If you can have some UI lag then invoking an hx-trigger event after the response comes back would be easier to logic about. All about trade-offs and compromises. :)
I really should think about creating an HTMX.NET online user-group where we can talk about this stuff. 😅

👋 Hi folks. I wrote a sample thanks to a blog post from Htmx.Net contributor showing how to use Hx-Trigger to listen and react to global events coming from the server.
This is a nice way to scale up your UI if you don't want to use out-of-band swaps. Try it out!
https://github.com/khalidabuhakmeh/HxTriggerSample


TS 4.1+ Key remapping in mapped types allows bypassing statically known members check

Bug Report
🔎 Search Terms
key remapping static member, arbitrary interface keys, bypassing interface dynamic member check
🕗 Version & Regression Information
With the key remapping introduced in TS 4.1 for mapped types, the following error can be bypassed:

An interface can only extend an object type or intersection of object types with statically known members. (2312)

I was unable to test this on prior versions because key remapping didn't exist.
⏯ Playground Link

Playground

💻 Code
// @ts-expect-error -- this isn't allowed
interface RecordInterface<K extends keyof any, V> extends Record<K, V> { }

type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }

// @ts-expect-error -- but this is!
interface RecordInterface<K extends keyof any, V> extends RemapRecord<K, V> { }

🙁 Actual behavior
TypeScript inconsistently prevents using interfaces with dynamic members.
🙂 Expected behavior
Either RecordInterface to have an error, or to be able to replace Record1 with Record without any error.
CC: @tjjfvi, who discovered this, but hasn't submitted a bug.
There is a feature request (#41383) about changing the definition of Pick which includes a comment about this.

Seems like a feature to me 🤷

I'm confused what in never is even supposed to be.
When hovering over RemapRecord<> the tooltip shows that it maps to {}, so it's an empty interface and a result assignable to any other type.
When mapping it to another type and providing type arguments, e.g. type Foo = RemapRecord<...>, then the type Foo has properties.

It has to be [_ in "" as K] to work.

Please don't take a production dependency on this; I have no idea what might be hiddenly broken when that type starts getting used.

it would be great if this was an actual feature. "dynamically" adding typings would be great in some scenarios

Please don't take a production dependency on this; I have no idea what might be hiddenly broken when that type starts getting used.

👍 ; thinking back now, I remember having some really cryptic bugs that were fixed when I stopped using this behavior


Some minor ui changes

Hi, when panelType = true then the scroll bar in the bottom isn't necessary.

Can you set it unvisible then?
is it possible to make the header text sizable:

Scrollbar appears when content is wider card size. Please change the size of elements (all options end with 'Width').
Cover title font size is calculated from positionWidth and gapWidth. Reduce them will reduce the fontsize.

Ok, understood the text size.
But thisis my config:
background: transparent
buttonPath: /lovelace/0
buttonText: Home
closedColor: 'hsl(0, 0%, 90%)'
countText: open
entities:
  - entity: cover.rolladen_wohnzimmer
    name: Wohnzimmer
  - entity: cover.rolladen_kuche
    name: Küche
icon: 'mdi:blinds'
iconSize: 35px
openColor: 'hsl(0, 0%, 20%, 0.8)'
panelType: true
positionHeight: 150px
positionWidth: 100px
showButton: false
sideColor1: var(--primary-color)
sideColor2: var(--primary-background-color)
switchColor: var(--primary-color)
switchHeight: 30px
title: ' '
titleSize: 30px
type: 'custom:vertical-slider-cover-card'

This is the picture:

The scrollbar is still there, even there is huge space available ;-)

Does gapWidth: 20px help?

already tested: nope

cache clearing tested as well without change

I will take an deeper look.

Your config looks fine on mine, no scrollbar but I will test on some other browser. Which browser are you using?

chrome

Hi, I checked my mobiles(phone and tablet) and there the scrollbar disappeared. It seems to be a problem only with Chrome on windows. That is not important for me. We can close this request if you like.
Thanks for your support.

Please update to 0.1.0 and let me know if it solves your issue.
Thanks for your feedback!

Hi, sorry for being late. Issue is solved. Everything's fine.
Thank you!!!