Record landing page: record statistics frontend implementation

The design should take into account currently provided stats:

The design should take into account the confusion of the users on how statistcs are computed (once per day). There should be clearly visible information
The design should also apply to record search view

Comments:

Seems more reasonable to display the Unique Views first (check the latest spec of COUNTER and see what is the recommendation there)
Explain in the UI that admins/curators/owners are excluded (if implemented)

Nice to have:
Graph visualisations with time evolution
Prerequisites:

finalised backend payload or finalised backend

Decisions
Mockups

[DISCUSSION NEEDED] Event payload for aggregated views (mock response)

[ ] We need to decide how the backend response will be to incorporate all the statistics needed to be shown. Below is a sample response but fields can vary.

OpenSearch: Events
Record view:
    "hits": [
      {
        "_index": "my-site-events-stats-record-view-2023-02-14",
        "_id": "2023-02-14T10:44:20-9650b423ae31a0fadd60c51d58c38b55f3956eb1",
        "_score": 1,
        "_source": {
          "timestamp": "2023-02-14T10:44:26",
          "referrer": "https://<IP_ADDRESS>:5000/",
          "recid": "g0k00-37e25",
          "parent_recid": "hbf9a-8sr53",
          "via_api": false,
          "is_robot": false,
          "country": null,
          "visitor_id": "a0465c28b0b8144c3da4673cd9734668fd860a26bf91221125cb171e",
          "unique_session_id": "d3342f948c9774c5fad255c9d2afd01c01753b292b898493bfea2fa6",
          "unique_id": "ui_g0k00-37e25"
        }
      },

File download:
      {
        "_index": "my-site-events-stats-file-download-2023-02-14",
        "_id": "2023-02-14T10:44:30-50be4e8552b18f262724d7ce401eb25991189f02",
        "_score": 1,
        "_source": {
          "timestamp": "2023-02-14T10:44:30",
          "bucket_id": "222b7b2d-9f21-4b2b-9199-bb630cea6ee2",
          "file_id": "0e359078-1379-4b61-85a5-f6af0a988c75",
          "file_key": "62kyt6(2).jpg",
          "size": 49457,
          "referrer": "https://<IP_ADDRESS>:5000/records/g0k00-37e25",
          "recid": "g0k00-37e25",
          "parent_recid": "hbf9a-8sr53",
          "via_api": true,
          "is_robot": false,
          "country": null,
          "visitor_id": "a0465c28b0b8144c3da4673cd9734668fd860a26bf91221125cb171e",
          "unique_session_id": "d3342f948c9774c5fad255c9d2afd01c01753b292b898493bfea2fa6",
          "unique_id": "222b7b2d-9f21-4b2b-9199-bb630cea6ee2_0e359078-1379-4b61-85a5-f6af0a988c75"
        }
      },

OpenSearch: Aggregations
Record views:
    "hits": [
      {
        "_index": "my-site-stats-record-view-2023-02",
        "_id": "ui_g0k00-37e25-2023-02-14",
        "_score": 1,
        "_source": {
          "timestamp": "2023-02-14T00:00:00",
          "unique_id": "ui_g0k00-37e25",
          "count": 2,
          "unique_count": 1,
          "recid": "g0k00-37e25",
          "parent_recid": "hbf9a-8sr53",
          "via_api": false
        }
      }
    ]

Record downloads (all file downloads for a record):
    "hits": [
      {
        "_index": "my-site-stats-file-download-2023-02",
        "_id": "222b7b2d-9f21-4b2b-9199-bb630cea6ee2_0e359078-1379-4b61-85a5-f6af0a988c75-2023-02-14",
        "_score": 1,
        "_source": {
          "timestamp": "2023-02-14T00:00:00",
          "unique_id": "222b7b2d-9f21-4b2b-9199-bb630cea6ee2_0e359078-1379-4b61-85a5-f6af0a988c75",
          "count": 1,
          "unique_count": 1,
          "volume": 49457,
          "file_id": "0e359078-1379-4b61-85a5-f6af0a988c75",
          "file_key": "62kyt6(2).jpg",
          "bucket_id": "222b7b2d-9f21-4b2b-9199-bb630cea6ee2",
          "recid": "g0k00-37e25",
          "parent_recid": "hbf9a-8sr53"
        }
      }
    ]

Python Invenio-Stats query results
Record views:
{'start_date': None,
 'end_date': None,
 'recid': 'g0k00-37e25',
 'parent_recid': 'hbf9a-8sr53',
 'count': 2.0,
 'unique_count': 1.0}

Record downloads:
{'start_date': None,
 'end_date': None,
 'recid': 'g0k00-37e25',
 'parent_recid': 'hbf9a-8sr53',
 'count': 2.0,
 'unique_count': 2.0,
 'volume': 51339.0}

Statistics segment

SUI styled accordion
SUI definition table
SUI info icon message

On landing page

for the search view, I have found some old mockups, how about placing the stats as it suggests? see:

for the search view, I have found some old mockups, how about placing the stats as it suggests? see:

Search list item v2

SUI tiny label

Conclusions (discussed irl)

Keep the unstyled accordion
"Read more" on new line
Recharts is preferred (fits better with SUI)
Test search list item for request list as well (where we also have buttons on top)
Split task in to (statistics component, graph section[nice to have])

Updated layout
Final statistics layout after discussion

SUI statistic

Label icons: view, download

SUI accordion
SUI definition table
SUI info icon message

Nice to have (separate task)

Graph by Recharts

Search list item v3
Front page

My dashboard

The big blue box "All statistics updated daily" seems to big and scary to me...

to test: 6,7 figures statistics

Nice work! A few comments on my side:

The table's titles/label "Unique views", "All versions" maybe look too bold? The important data is the values.
Warning about using React for graphs (if we will do it at some point): prefer pure JS if possible. To be discussed if this will be implemented.

More options for the info-box:

No icon:

No icon, tiny text

Gray (but this is a bit against the consistency we have with blue info boxes)

For the table titles, it's the default SUI styling. (We also have bold titles on e.g. the file table in the deposit form.) If we unbold it, I feel like it gets slightly harder to relate the cell to each heading, as the headings don't stand out? WDYT?

vs

For the graphs, Chart.js is not React, so we could use that one instead of Recharts, or I maybe CancasJS could work instead?

Bigger numbers

For the table titles, it's the default SUI styling. (We also have bold titles on e.g. the file table in the deposit form.) If we unbold it, I feel like it gets slightly harder to relate the cell to each heading, as the headings don't stand out? WDYT?

I prefer it "unbold", the grey background does the job, but I think it is a personal choice, so it would be nice to have other opinions.

Bigger numbers
I am again the annoying guy, sorry! Often, when the numbers are very high, others display a more readable version and then, on hover or on click with an icon or something, display the real number, e.g.:
1.4 M on hover/click, 1,490,811. Like the Tb for the file size.
But again it is just IMO, a preference.

When it will implemented, do not forget to take into account the internationalization ;)

I like the idea with the "1.4M"! The text also works good like this I think! The unbold headings I'm still not sure, I agree it maybe looks cleaner, but I feel like it's getting harder to quickly connect the cells when reading it... More opinions would be nice indeed! 😄

I like the 1.4M, looks very good and it scales up nicely.
I would remove the bold formatting from the headers, numbers are more important than headings, but by highlighting them we actually give them more importance.

To elaborate on my argument... I actually disagree that the number is the most important, as the number doesn't make sense without the headings, which makes it important to being able to connect the cells easily. As there are two headings they are even more difficult to connect. It's not a huge difference, but a slight one.

Info: using the stats REST API endpoint
The Invenio-Stats module provides a REST API endpoint where the configured queries can be called with a custom set of parameters. Example:
mmoser@Alpha ~/rdm/my-site $ curl -ks -X POST -H "authorization: bearer $API_TOKEN" \
-H "content-type: application/json" https://localhost:5000/api/stats -d @query.json
{
  "downloads": {
    "count": 5.0,
    "end_date": null,
    "parent_recid": "s24n2-pkw51",
    "recid": "5j71c-mr205",
    "start_date": null,
    "unique_count": 3.0,
    "volume": 3836161.0
  },
  "downloads-all": {
    "count": 6.0,
    "end_date": null,
    "parent_recid": "s24n2-pkw51",
    "start_date": null,
    "unique_count": 4.0,
    "volume": 4705401.0
  },
  "views": {
    "count": 3.0,
    "end_date": null,
    "parent_recid": "s24n2-pkw51",
    "recid": "5j71c-mr205",
    "start_date": null,
    "unique_count": 1.0
  },
  "views-all": {
    "count": 4.0,
    "end_date": null,
    "parent_recid": "s24n2-pkw51",
    "start_date": null,
    "unique_count": 2.0
  }
}

With the following query.json:
{
    "views": {
        "stat": "record-view",
        "params": {
            "recid": "5j71c-mr205"
        }
    },
    "views-all": {
        "stat": "record-view-all-versions",
        "params": {
            "parent_recid": "s24n2-pkw51"
        }
    },
    "downloads": {
        "stat": "record-download",
        "params": {
            "recid": "5j71c-mr205"
        }
    },
    "downloads-all": {
        "stat": "record-download-all-versions",
        "params": {
            "parent_recid": "s24n2-pkw51"
        }
    }
}

As can be seen above, multiple queries can be performed with a single API call.
The top-level keys (views, views-all, downloads, and downloads-all) are arbitrary names for the queries and can be chosen freely.
For each query, the stat value defines which configured query to call and must refer to one of the names in current_app.config["STATS_QUERIES"].
The params will be supplied as keyword arguments to the query's q.run(...) method, which will obviously influence the results.
In our example, reasonable params would be: start_date, end_date, and recid (or parent_recid for the *-all-versions variants).

@max-moser Does the stats endpoint take access control into account? I.e. can I get the number of downloads for a restricted record that I don't have access to?

It looks great but I have questions and comments obviously :-)

It looks great but I have questions and comments obviously :-)

@kpsherva Lars comments to be discussed all together :)

@lnielsen I've added a very simple "deny all" policy on the statistics API endpoint (as opposed to the default "allow all" from invenio-stats), so there's no leaking of anything.
This means that the statistics are currently only available in the UI, but it shouldn't be too hard to fix up that policy s.t. it resolves the records and checks if the current identity has access to the (parent) record IDs specified for the queries.
In the current form, the statistics are fetched directly in the backend (via query objects from invenio-stats in the view function) and passed to the jinja templates.
If you don't have read access to the record, the view function won't be executed fully and thus you're not gonna get the statistics for records that you can't access.
The exception here is if there's a record with at least one restricted and one public version – the queries (and their results) don't take visibility of the "sibling" records into account and just give you the views for this version, as well as all versions.
In case there's exactly one restricted and one public version of the same record, figuring out how many views/downloads "the other version" has is a matter of simple subtraction.
TL;DR: Currently we only give out statistics on the UI landing pages, and there we do leak a bit of information about sibling versions.


postman-doc-gen/postman_doc_gen/postman_doc_gen.py  empty file

Is there a reason why postman_doc_gen.py it's empty? I see on the last commit the code was removed from this file.

Create a PR #25 for this

Reverted the last commit, files should be restored.


Add DDIM paper summary

[x] Non-Markovian Process
[x] Generative Process
[ ] Objective
[ ] Denoising Diffusion Implicit Models
[ ] Accelerated Generation Process

merging as paper summaries will be converted to notebooks


Updated file-type dependency

There is a critical security issue with the file-type dependency, which is solved by this commit.

Thank you for the PR. This fix has been included in the 1.0.0-beta.11 release


feat(UI): Display index names if present

Index names will now be visible.
Limitation: sticky index columns are disable in this case has it is a pain to manage absolute coordinates. This could be tackled in another PR.
https://github.com/user-attachments/assets/a55cc3a9-177f-4ad2-bcfc-44ff4090c536

Can the user resize the index column?

No the table layout is set to auto. I think it's the best compromise. Sizing columns needs that we switch to a fixed layout and implement our own table layout algorithm.

Is it possible to prevent line wrap? (see second table in the screenshot)

It is, but we chose with @augustebaum to let the browser do line breaks when the cell contains spaces. Note that there is a white space in the test data. If users contribute large amounts of words sentence it will then print a the a text block instead of a infinite line.
TL;DR; as you wish but I recommend not to disable word warp.


git commit with --amend won't run

I don't know why it's not happened again. Won't fix.

It's still happening...


Add ESPHome Mitsubishi HVAC | 7124.json

Recreated 1124.json for Broadlink into ESPHome.
Named the file 7124.json to keep with convention.
Tested OK.

Hi mSapik, I used ESPHome with IR receiver to find the Raw codes from my Mitsubishi AC and used the data to confirm the protocol as set here: https://www.analysir.com/blog/2015/01/06/reverse-engineering-mitsubishi-ac-infrared-protocol/.
There were some differences between that protocol and the one I shared, mainly to do with vane movement. analysir's protocol does not contain horizontal movement and Fan Only, possibly because older models do not contain those features. Byte 8's least significant nibble contains the data for horizontal vane movement which SmartIR cannot control, so this was left as "AUTO".  Byte 10, 11, 12, 13 are all 0x00 as it is only used for clock.

ping


Running the container from a Windows client causes the container to exit immediately

Trying to install the container from a Windows docker client causes an ERROR stating you must Accept the EULA.  Presumably -e does not modify the environment variables on a Windows client.

@bmmathe - Can you please clarify - are you trying to run a SQL on Linux container on Docker for Windows or a SQL on Windows container?

I'm using the sample located here: https://hub.docker.com/r/microsoft/mssql-server-linux/
My Docker host is Ubuntu running in Azure yet I'm running the docker commands from my local Windows 10 machine. I have my docker cli environment setup to point to the Linux host. All other docker run commands work with no problems but when I run "docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=' -p 1433:1433 -d microsoft/mssql-server-linux" the command exits. If I run docker ps -a I can see that the container only ran for a couple seconds. When I pipe the stdout and stderr out to the console (-a stdout -a stderr) I can see that the container issues an "ERROR: You must accept the EULA" comment.
To workaround this I spun up a different Ubuntu box in Azure and ran the same command from it pointing my docker cli to the same host and it worked with no problems.
I believe the issue is with the -e argument. The way it interacts with the command Environment Variables does not work in Windows.

My colleague just informed me that when running -e parameters in the Windows Docker CLI you must use double quotes instead of single ticks (at least when using CMD).

Thanks for finding this @bmmathe! I have added this to the README under Troubleshooting.

$ docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=abc@123" -p 1433:1433 -a stdin -a stdout -a stderr microsoft/mssql-server-linux <---
u get this
Configuring Microsoft(R) SQL Server(R)...

As i used -a stdin -a stout -a stderr I realized that there actually is a notification, why the container stopped/never started:

sqlservr: This program requires a machine with at least 3250 megabytes of memory.

So I just had to increase memory for docker and it run just fine.


Update AndroidManifest.xml

Make MainActivity "singleTask",otherwise there will be too much instance.

Looks good. Thank you!


Handle tricky implicit ranges

Description
I'm currently working on implicit date ranges like "today", "last week", and the like. For example, "today" begins at 0:0:0 today and ends at 0:0:0 tomorrow, exclusive, so that defines a range.
One way to detect those ranges in many cases is to find the first time field that is a default (1 for date fields, 0 for time fields) and then go up a level and add one unit of that. So for example with "today" you typically find that the first defaulted field is the hours (truncated to 0) and so you add a day (24h) to today and get tomorrow at 0:0:0. However, that fails in cases like when the user specifies Jan 2022 since Jan is month 1. They don't mean all of the year 2022. They mean the month of January in 2022.
So the resolution info has to come through somehow, though it's not currently available in the parser generated by RangeParser(). One way to solve the problem would be to have the datetime Parser() func make a parser returning a Range. Probably to make it more explicit, the Range would be changed to have a start time and a duration. The duration would only be used when the datetime is used as an implicit range.
That affects the API, though the change can be kept to a minimum. The result of Parser() can return a Range, so that is different. However, Parse() can still extract the time.Time and return that as before.
How do we do this in a way that keeps code changes and risk to a minimum? One way would be to embed the start time in the range so you can use it as a time, keeping a lot of code unchanged:
type Range struct {
    time.Time
    Duration time.Duration
}

func (r Range) Start() time.Time {
    return r.time.Time  // not sure about the exact syntax here
}

func (r Range) End() time.Time {
    return r.Start().Add(r.Duration)
}

Closed as of bbd41cc8c26fd2de660be64c2a710675e9fd5cb7.


header.menu.action.success not triggering

trying to catch the return from a header view (to reload the main view after changing settings) but wasn't able to make the $href success handler fire
demo: https://jasonbase.com/things/dmmb
the part that illustrates the bug:
        "action": {
            "type": "$href",
            "success": {
              "type": "$util.alert",
              "options": {
                "title": "This should fire",
                "description": "but it didnt"
              }
            }

Hello,
Not sure if you are still looking for a solution for this, but based on other answers I have seen, the success will fire when used in conjunction with $ok.
I was looking for a more general success/error on any $href that succeeds/fails. It does not work that way, however.
Hany


Question about cpu tamer scripts.

Why are there so many? Is there a difference on what they do/how well they work?
They all have the same description and it's hard for me to figure out by code alone if they do different stuff.

The main script (CPU Tamer by AnimationFrame) was created after the review of knoa's script "YouTube CPU Tamer".
That was the first attempt to help improving the YouTube smoothness that my PC was slow.
I am now using Macbook only so I no longer feel any slowness but just keep updating it.
Besides, I am now understanding more the related JS coding that might make the browser slow, so I have created other scripts to handle YouTube's js coding issue.
https://greasyfork.org/en/scripts/469878-youtube-super-fast-chat
https://greasyfork.org/en/scripts/473972-youtube-js-engine-tamer
(and one more for the chatroom but now it is still under developing)
Basically these scripts are already fixed the issues as much as possible. CPU Tamer Script might not be required.

youtube-cpu-tamer-by-animationframe.user.js

This is the main script. However, it might make the PC getting slower instead. The root cause could be that the PC don't have graphics acceleration.

youtube-cpu-tamer-dm.user.js

This is the second main CPU tamer. I received the possible feedbacks for people who feel bad in using youtube-cpu-tamer-by-animationframe. So this is 2nd main CPU tamer.
You can try and compare both. Sorry, I do not have a slow environment to do so.

youtube-cpu-tamer-io.user.js , youtube-cpu-tamer-vf1.user.js, youtube-cpu-tamer-vf2.user.js

These are just for testing. Don't install them.

youtube-live-chat-tamer.js

No use. Just an old file

Conclusion

If you think your PC is slow in watching YouTube. You might try to install. If it improves your environment, keep it. If it cannot improve or make it worse, uninstall it.

No further response. Close.


[WIP] Initial frontend work

Changes
This pull does a few things:

[x] Switches the templating engine to haml
[x] Gets npm-pipeline-rails installed and working
[x] Customize gulp setup with at least babel and eslint

I was originally going to also attempt to replicate the functionality of the prototype, but I think that would be too much for one pull.
Context

Quick demonstration of haml: http://haml.info/tutorial.html
Haml reference page: http://haml.info/docs/yardoc/file.REFERENCE.html
Prototype: https://jdteamacetabulum.github.io/Active-Learning/index.html
npm-pipeline-rails: https://github.com/rstacruz/npm-pipeline-rails

Testing
Create a new controller and see that the example CSS and Javascript in the gulp folder is being injected properly.
Previous discussions
N/A.
Pre-merge checklist

[x] Build succeeds locally and in CI
[ ] Proper documentation
[ ] Tests
[x] Git history cleaned up

I just realized the only thing you would need to do to make it work is run npm install but npm-pipeline-rails actually sets it up to do that automatically, so yeah, no additional instructions are actually needed.


testing file hierarchy

List of related issues or pull requests
Refs: #265 #267 #274
Describe the changes made in this pull request

repo is now the first branch in the file hierarchy under tests, because that is more meaningful than platform (#265). As a result, it is now easier to have tests implemented for the same scenario on all supported platforms. Additionally, describing the cases with human readable annotations and showing those as describe and it using pytest hooks is now more feasible (#266).
tests/repo0 is now the "null-scenario" and tests/repo1 is the "everything scenario". Refs #267
The local testing data directory output-files was renamed to snippets. Refs #274
Added directory frontend-files that contains files related to the mocked frontend of github, gitlab, etc; in particular index.html. Updated helper functions.
Updated repo1/github to have all Trues
added repo1/gitlab tests equivalent to repo1/github
Made mocked routes minimal for repo0 cases
Moved skip_unreachable decorator to tests/helpers
Replaced specific names for owner and repo with generic ones
There are now 268 passing tests, no failing ones; SonarCloud reports a code coverage of ~80.7%~ 78.2% after merge

Here is the new file structure for a given case:
.
├── github
│   ├── conftest.py
│   ├── frontend-files
│   │   └── index.html
│   ├── __init__.py
│   ├── snippets
│   │   └── cli-no-args.txt
│   ├── test_checker_*.py
│   ├── test_cli_*.py
│   └── test_repo_*.py
├── gitlab
│   ├── conftest.py
│   ├── frontend-files
│   │   └── index.html
│   ├── __init__.py
│   ├── snippets
│   │   └── cli-no-args.txt
│   ├── test_checker_*.py
│   ├── test_cli_*.py
│   └── test_repo_*.py
├── __init__.py
├── repo-files
│   ├── CITATION
│   ├── CITATION.cff
│   ├── codemeta.json
│   ├── .howfairis.yml
│   ├── README.rst
│   └── .zenodo.json
└── user-files
    ├── .howfairis-default.yml
    ├── .howfairis-emptyreasons.yml
    └── .howfairis-skipreasons.yml

Instructions to review the pull request
# in an activated virtual env with dev tools installed
pytest

Thanks for the feedback, I'll get right on it

Hi Faruk, I made the changes, can you confirm this is now good to merge? Thanks!


feat(cli): pass a context when nuxt.config exports fn

Types of changes

[ ] Bug fix (a non-breaking change which fixes an issue)
[x] New feature (a non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to change)

Description

Pass a context when nuxt.config exports a function. Context lists the command name (eg build, dev, start) and a dev boolean.

Note: using the term context might be confusing as this is ofc not the normal Nuxt context people are used to. Not sure how to call it differently though

Example usage:
// nuxt.config.js
export default ({ command, dev }) => {
  return {

  }
}

Checklist:

[x] My change requires a change to the documentation.
[ ] I have updated the documentation accordingly. (PR: #)
[x] I have added tests to cover my changes (if not applicable, please state why)
[ ] All new and existing tests are passing.

Codecov Report

Merging #6855 into dev will increase coverage by 0.01%.
The diff coverage is 100%.

@@            Coverage Diff             @@
##              dev    #6855      +/-   ##
==========================================
+ Coverage   64.75%   64.76%   +0.01%
==========================================
  Files          78       78
  Lines        2721     2722       +1
  Branches      708      708
==========================================
+ Hits         1762     1763       +1
  Misses        730      730
  Partials      229      229

Flag
Coverage Δ

#e2e
?

#unit
64.76% <100%> (+0.01%)
:arrow_up:

Impacted Files
Coverage Δ

packages/cli/src/utils/config.js
96.66% <100%> (ø)
:arrow_up:

packages/cli/src/command.js
99.01% <100%> (ø)
:arrow_up:

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 c9beac3...154fd73. Read the comment docs.


Add Spin Projection for TPSCI

In the ASCI papers, they add determinants needed for getting pure spin states. I assume this is just applying S2 to the state and collecting non-zeros. We should try to do this - especially since we already have all the parts working.

This needs some kind of iterative procedure as a single S2 application doesn't access the full set of configurations to spin complete


erb check lines starting with %

the sed is a workaround for fixing lines beginning with %
as -P argument is not given to erb - still checks the line
Example: sudoers file generated by an erb template,
which has entry based on the group membership

@dkerwin why don't you merge this?

Busy busy busy. Her you go

Brilliant :8ball:


Add Transcribe support

This adds support for all 8 resource types within the Transcribe AWS service.
 Would you happen to know how long those jobs run? and if we should be worried about cleaning them up once an account lease has expired?

Thank you for asking this. I thought these only took a few minutes, but after more thorough testing, it looks like they take about 30-50 min for the model to fully train. There is not a way to stop the model creation before issuing a delete command or any way to do a forced deletion with it in an IN_PROGRESS state. I will follow up with you on this...

I think we need to add logic to stop an in progress model similar to how AWS Comprehend model jobs are handled and then remove.

There's unfortunately no way to stop jobs in progress with any Transcribe command and the delete-language-model command does not support any type of force or stop parameter.

I think we need to add logic to stop an in progress model similar to how AWS Comprehend model jobs are handled and then remove.

There's unfortunately no way to stop jobs in progress with any Transcribe command and the delete-language-model command does not support any type of force or stop parameter.

Per your slack thread I agree with your assessment.  Looks good.
us-east-1 - TranscribeMedicalVocabulary - [LanguageCode: "en-US", LastModifiedTime: "2023-09-06T14:29:13Z", Name: "test-med-vocab-9f05901a7d6ab64ac886", State: "FAILED"] - removed
us-east-1 - TranscribeMedicalVocabulary - [LanguageCode: "en-US", LastModifiedTime: "2023-09-05T14:32:59Z", Name: "test-med-vocab-a3b39174b6ba8c8f18f9", State: "FAILED"] - removed
us-east-1 - TranscribeVocabulary - [LanguageCode: "en-US", LastModifiedTime: "2023-09-06T14:29:18Z", Name: "test-vocab-9f05901a7d6ab64ac886", State: "FAILED"] - removed
us-east-1 - TranscribeVocabulary - [LanguageCode: "en-US", LastModifiedTime: "2023-09-05T14:33:02Z", Name: "test-vocab-a3b39174b6ba8c8f18f9", State: "FAILED"] - removed
us-east-1 - TranscribeVocabularyFilter - [LanguageCode: "en-US", LastModifiedTime: "2023-09-05T14:33:02Z", Name: "test-vocab-filter-a3b39174b6ba8c8f18f9"] - removed
us-east-1 - TranscribeVocabularyFilter - [LanguageCode: "en-US", LastModifiedTime: "2023-09-06T14:29:20Z", Name: "test-vocab-filter-9f05901a7d6ab64ac886"] - removed
us-east-1 - TranscribeLanguageModel - [BaseModelName: "NarrowBand", CreateTime: "2023-09-06T14:29:00Z", LanguageCode: "en-US", LastModifiedTime: "2023-09-06T14:29:09Z", ModelStatus: "IN_PROGRESS", Name: "my-first-language-model-9f05901a7d6ab64ac886", UpgradeAvailability: "false"] - failed
us-east-1 - TranscribeLanguageModel - [BaseModelName: "NarrowBand", CreateTime: "2023-09-05T14:32:49Z", FailureReason: "You can't create a custom language model by only using this training data. Either specify additional tuning data or use multiple text files to provide your training data.", LanguageCode: "en-US", LastModifiedTime: "2023-09-05T15:10:39Z", ModelStatus: "FAILED", Name: "my-first-language-model-a3b39174b6ba8c8f18f9", UpgradeAvailability: "false"] - removed
us-east-1 - TranscribeMedicalTranscriptionJob - [CreationTime: "2023-09-06T14:29:08Z", FailureReason: "The audio sample rate 8000 Hz is not supported. Change the audio sample rate of your media file and try your request again.", InputType: "DICTATION", LanguageCode: "en-US", Name: "test-med-job-9f05901a7d6ab64ac886", OutputLocationType: "CUSTOMER_BUCKET", Specialty: "PRIMARYCARE", StartTime: "2023-09-06T14:29:09Z", Status: "FAILED"] - removed
us-east-1 - TranscribeMedicalTranscriptionJob - [CreationTime: "2023-09-05T14:32:56Z", FailureReason: "The audio sample rate 8000 Hz is not supported. Change the audio sample rate of your media file and try your request again.", InputType: "DICTATION", LanguageCode: "en-US", Name: "test-med-job-a3b39174b6ba8c8f18f9", OutputLocationType: "CUSTOMER_BUCKET", Specialty: "PRIMARYCARE", StartTime: "2023-09-05T14:32:56Z", Status: "FAILED"] - removed
us-east-1 - TranscribeCallAnalyticsJob - [CompletionTime: "2023-09-06T14:30:09Z", CreationTime: "2023-09-06T14:28:56Z", LanguageCode: "en-US", Name: "test-job-9f05901a7d6ab64ac886", StartTime: "2023-09-06T14:28:56Z", Status: "COMPLETED"] - removed
us-east-1 - TranscribeCallAnalyticsJob - [CompletionTime: "2023-09-05T14:34:00Z", CreationTime: "2023-09-05T14:32:47Z", LanguageCode: "en-US", Name: "test-job-a3b39174b6ba8c8f18f9", StartTime: "2023-09-05T14:32:47Z", Status: "COMPLETED"] - removed
us-east-1 - TranscribeTranscriptionJob - [CompletionTime: "2023-09-06T14:29:25Z", CreationTime: "2023-09-06T14:29:15Z", LanguageCode: "en-US", Name: "test-job-9f05901a7d6ab64ac886", StartTime: "2023-09-06T14:29:15Z", Status: "COMPLETED"] - removed
us-east-1 - TranscribeTranscriptionJob - [CompletionTime: "2023-09-05T14:33:10Z", CreationTime: "2023-09-05T14:33:00Z", LanguageCode: "en-US", Name: "test-job-a3b39174b6ba8c8f18f9", StartTime: "2023-09-05T14:33:00Z", Status: "COMPLETED"] - removed
us-east-1 - TranscribeCallAnalyticsCategory - [CreateTime: "2023-09-06T14:28:48Z", InputType: "POST_CALL", LastUpdateTime: "2023-09-06T14:28:48Z", Name: "test-category-9f05901a7d6ab64ac886"] - removed
us-east-1 - TranscribeCallAnalyticsCategory - [CreateTime: "2023-09-05T14:32:35Z", InputType: "POST_CALL", LastUpdateTime: "2023-09-05T14:32:35Z", Name: "test-category-a3b39174b6ba8c8f18f9"] - removed

Removal requested: 0 waiting, 1 failed, 0 skipped, 15 finished

Followed up after the model training failed.
Removal requested: 1 waiting, 0 failed, 0 skipped, 0 finished

us-east-1 - TranscribeLanguageModel - [BaseModelName: "NarrowBand", CreateTime: "2023-09-06T14:29:00Z", FailureReason: "You can't create a custom language model by only using this training data. Either specify additional tuning data or use multiple text files to provide your training data.", LanguageCode: "en-US", LastModifiedTime: "2023-09-06T15:03:36Z", ModelStatus: "FAILED", Name: "my-first-language-model-9f05901a7d6ab64ac886", UpgradeAvailability: "false"] - waiting

Removal requested: 1 waiting, 0 failed, 0 skipped, 0 finished

us-east-1 - TranscribeLanguageModel - [BaseModelName: "NarrowBand", CreateTime: "2023-09-06T14:29:00Z", FailureReason: "You can't create a custom language model by only using this training data. Either specify additional tuning data or use multiple text files to provide your training data.", LanguageCode: "en-US", LastModifiedTime: "2023-09-06T15:03:36Z", ModelStatus: "FAILED", Name: "my-first-language-model-9f05901a7d6ab64ac886", UpgradeAvailability: "false"] - removed

Removal requested: 0 waiting, 0 failed, 0 skipped, 1 finished

Nuke complete: 0 failed, 0 skipped, 1 finished.


Feature Request: Update response headers in zipkin-query (for zipkin-ui assets)

Please add/update response headers to include "Cache-Control" and/or "Expires" headers when serving zipkin-ui? static files. I see them being reloaded on every page/click.
Also seems like /8b55a822e72b8fd5e2ee069236f2d797.png which might be a favicon returns the following response header
Content-Type:"image/png;charset=utf-8"

This is an image, so no need for charset?

They're definitely supposed to be cached.
If you look at ZipkinQueryController, you could try doing something like this (pseudocode):
import com.twitter.conversions.time._ // To get the "10.minutes" syntax sugar
// ...
get("/:*") { request: Request =>
    val resp = response.ok.fileOrIndex(
    request.params("*"),
    "index.html"
    )

    resp.cacheControl = 10.minutes
    resp
  }

If it works, and you're in the mood for a PR... well... :wink:
About setting charset=utf-8 when the content type is image/png; that seems more like a bug in Finatra, so it should probably be filed as an issue there.

Should i open a separate bug on Last-Modified/If-Modified-Since being missing as well?

I would say they belong to the same issue.
In the long term, we should set something like 1 minute timeout on index.html, and 1 year timeout on the assets - given that we add hashes to the asset names. I think we can do that with webpack.

there's something to consider in the above logic, which is how to detect if we are serving the content of index.html or not. if we are just going on the path name, it is simpler.
resp.cacheControl =  if (isIndex) 365.days else 10.minutes

Let's go for the path name, but the opposite ;) no caching for api, 1 minute caching for index, 10 minutes for config, 1 year for everything else?

this is also hard to test, as ZipkinQueryServerFeatureTest doesn't have a classpath reference to the resources built by zipkin-ui. Ex. even if you set the following, it 404s
  override val server = new EmbeddedHttpServer(
    new ZipkinQueryServer(spanStore, dependencyStore), extraArgs = Seq(
      // Zipkin's web assets are under the path /zipkin-ui
      "-doc.root", "zipkin-ui",
      // We are using fake times, so make sure default lookback doesn't interfere
      "-zipkin.queryService.lookback", lookbackOverride.toString
    )
  )

opened #1062 with a work-in-progress. If anyone feels like adding commits, go for it!

#1062 is ready to go


fix: Thorchain integration4

This PR demonstrates the main changes needed for the Thorchain integration, however, it doesn't update the package path which means it's incompatible with thorchain, and any other project that also relies on btcsuite/btcd. Recommending my other PR thorchain-integration2.


feat: emit an event indicating that in-flight exit has finalized

Closes https://github.com/omgnetwork/plasma-contracts/issues/646

@kevsul @souradeep-das should we do this too?

@kevsul @souradeep-das should we do this too?


Replace deprecated actions-rs/toolchain usage

The actions-rs/toolchain GitHub action is no longer maintained. Switch over to using dtolnay/rust-toolchain in its stead.

Finally benchmark results show up properly on the summary page and are not longer burried by tons of deprecation messages.


Error lambda cost_buddy

Hello.
We carry out all the steps suggested on the page https://github.com/intuit/costBuddy once we finish the execution and finish successfully, we open GRAFANA to see the graphics nothing is perceived. When we go to see the record of the lambdas we see the following error:

thank you for your help.

Hi daviaro ,
Thanks for raising the issue. Can you please provide details.

Was this AWS account recently ?
Was CE(Cost Explorer) got enabled recently ?
is above error is during the first run of Lambda ?

Suggestion:
If CE was enabled in less than 24 hours than u wont see the data as AWS CE billing report will be updated only after 24 hours after CE is enabled for the first time.

Hello khilawar4
I answer point by point below:

Was this AWS account recently ?
Yes, this account is recent. We opened it on March 11.

Was CE(Cost Explorer) got enabled recently ?
We enable the CE the same day the account was opened.

is above error is during the first run of Lambda ?
This error occurs every time the file was loaded at 11 at night every day. Until we decided to stop everything because the grafana did not present anything and the error sent on the screen or that we sent at the beginning of the thread was presented.

Finally, I inform you that we are going to execute the process again from the beginning and I will inform you again of the results.
Thank a lot.

sure let me know how it goes.

Hello khilawar4!!
we execute the process again according to the guide and using fictitious accounts in the bills.xls file and we obtain the same result that I reported before. Below the screenshot:

If you need more information please let me know.
Thank you very much again.

hey david , can u check manually in the CE report from AWS console if there are some cost showing in CE itself. as per the exception , looks like in CE report , no cost is showing. It could be possible that there are no resources running in your AWS accounts to generate cost. please let me know once u see the CE report manually.
We can also try to join Zoom meeting or slack to help you troubleshoot the issue.

Hi daviaro
Do you need further assistance or can we close this issue.

Sorry Khilawar4. yes of course we review our account and as it is new it does not have cost information, so we assume that it is the reason for the error that has been occurring. We will continue evaluating and we will inform you if we manage to overcome the error. For now it is best to close the case.

thnks for your help

sure thx for the update.
Since there was no cost information available in CE api in user's aws account hence this issue was expected. We are closing this issue as there is no problem from code perspective.


Make bot wait for input "wait for chat route trigger"

Is there a way to make lita wait for input (e.g: yes/no) before proceeding to the next iteration of a process?

Can you clarify what you mean by "next iteration of a process?"

As an example: one of my bots polls open incidents and performs business logic to formulate the next automated action, then prods the user for confirmation.
Ideally I'd like the bot to be able to "send confirmation message", then treat the next message in the room as a response.
I guess I can do that with a chat route, but if there's an intrinsic variable for this it would be great.
Apologies if it's still not clear enough.

You can use lita-confirmation as a generic mechanism for requiring a user to confirm a command before it's actually executed. Will that do what you want?

Yeah I think that will work beautifully! 👍  Thanks and I apologize if the question was too basic


[cloud_firestore] Add support for Collection group queries

Dupe of https://github.com/FirebaseExtended/firebase-dart/issues/223

https://github.com/flutter/plugins/pull/1619

@ThinkDigitalRepair What you linked has nothing to do with Flutter.

@creativecreatorormaybenot. Oh

@awazgyawali thank you so much!


multivalue shap interaction values will come? > 2 players

multivalue shap interaction values will come? > 2 players. on scheduler ?

multi feature interaction values

@wanghai345 I don't understand what you are referring to, could you clarify please? Are you asking for support of higher interactions in shap?
@thatlittleboy CFC due to inactivity.

Closing for now due to inactivity and lack of detail. Please feel free to open a new issue with more details if you have a feature request.


Use live regions for add environment previews

Virtual and Conda environment pages both have previews on the right hand side that update based on input.
They need to use live regions so that narrator informs the user when they update.

This wasn't reported by the accessibility test pass, so we'll close for now.


Fix UnboundLocalError

When I try to use --noauth_local_webserver option, I'm receiving the exception:
"UnboundLocalError: local variable 'success' referenced before assignment"
Only a correct indentation was necessary.

Thanks! Likely messed up in #276.

Viewing https://api.github.com/repos/google/oauth2client/pulls/276/commits it seems the base for that PR was 043e066e54d00bd3f8c5a90d2cb83292f30f8ede
At that point, the indent matches the change you made:
https://github.com/google/oauth2client/blob/043e066e54d00bd3f8c5a90d2cb83292f30f8ede/oauth2client/tools.py#L175-L177

LGTM. I did a side-by-side to make sure no other indents were screwed up.

thanks :clap:

Thank you for finding!
(Hopefully once #212 is done we can be secure in the belief that there aren't lingering issues like this.)


Removing a dependency doesn't trigger lock

To-do

[ ] Write a changelog entry

Please check that this bug hasn't been reported before

[X] I searched here or here and couldn't find a similar issue.

Please confirm that this bug affects the latest version

[X] This bug affects version 0.0.0 of copier_python.

Please indicate which operating system(s) you are using

[X] Linux
[X] macOS
[X] Windows

Expected behavior
Removing a dependency should trigger a lock.
Current behaviour
It doesn't. Probably because we're only checking that all direct dependencies are in the lock.
Steps to reproduce
Remove any direct dependency and sync. The lock won't be triggered.
Possible solution
Also check that all direct dependencies in the lock are still direct dependencies, as well as with submodules.

Fixed in https://github.com/blakeNaccarato/copier-python/commit/1dc630c8b21dd35f02289dc14c77bfe01e2cd3f9, need to attach a changelog entry to this.


Cannot build in production

Thanks for a great plugin. Works perfectly locally.
I can even do ng build --prod locally and it works.
But when I push to Heroku and run ng build --prod there I get this error:
ERROR in Error encountered resolving symbol values statically. Could not resolve ng-autosize relative to /tmp/build_b603406cd4d5ef76bd2b93850c142424/src/app/pages/templates/templates.module.ts
You can see I have loaded the directive in a sub-module that is dynamically loaded on a particular route. If I load the directive in my app.module instead then the directive does not work (everything builds, even on heroku, but the directive never fires inside the component that is inside the templates.module).
I have a shared directives module - I also tried importing and exporting it there, which works. But when I deploy to Heroku I get the same resolving symbol error.
Angular 4.3.4
Angular-cli 1.3.0

It seems to be the same as this error, but that fix does not work (ie referencing it as 'ng-autosize/ng-autosize')

Fixed: I updated my package.json by adding this to the dependencies section:
"dependencies": {
...other deps here...
"ng-autosize": "1.0.1"
}


Main/SDL - Add troubleshooting keybinds/functions

The emulator logic is now separated from the loop in main. This allows for keybinds to perform troubleshooting functions. H toggles a complete pause, when paused J will do a single frame. L toggles an arbitrary delay to be better able to manually monitor memory or the debug output.

These will be helpful for debugging.
Can you also print some info to the console (or maybe even the screen) to tell the user they've hit one of these keys and what the state is?

I've been working on getting some additional output going in-program instead of console only, but that has become another rabbit hole as SDL doesn't handle text on its own. I've been working on getting Dear IMGUI functional in Jakt, but as usual I'm in over my head. Not sure if there's a better / preferred library to focus on. Maybe Qt given Andreas' background with it? Of course, that will be an even bigger rabbit hole than IMGUI.
Anyway, for now console output is in.

It'd be best to keep it all SDL, to keep the requirements as small as possible. We can leave that for later. I'm just thinking of something simple like drawing a little box and writing a message into it.

I was playing around with the emulator this morning and noticed that this PR slows it down quite a bit. Any ideas?


Cherry pick: Drop region if store state is Tombstone (#69)

Signed-off-by: leiysky<EMAIL_ADDRESS>

/cc @solotzg @hanfei1991


Change reservation unit search from Elastic to Postgres FTS

🛠 Changelog

Change reservation unit search from ElasticSearch to Postgres FTS and remove ElasticSearch from the project
Text search is now language-specific depending on the users preferred language, or request language for unauthenticated users
Additional "search terms" (="hakusanat") can be added to reservation units with the admin panel or via the GraphQL API to make sure reservation unit is shown using a specific search term regardless of the UI language (e.g. "omatoimisesti")
For speed, text search vectors are pre-calculated (for all languages) to the reservation units when relevant data changes. This is done with signals and a scheduled background job (needs to be scheduled when in production)
Additionally, we make a containment search (__icontains = LIKE) for reservation unit's name to allow postfix matching (e.g. "room" would match "workroom" or "bathroom"). This is ommitted for other fields for speed.
Search is now able to handle some different grammatical cases, but it's not 100% accurate

e.g. "pukimäki" does not match "pukinmäen" but "pukinmäessä" does

🧪 Test plan

Automated tests

🚧 Dependencies

None

🎫 Tickets

TILA-3046

Sounds very tasty.

If unit name happens to change in Toimipisterekisteri (a rare occurrence if ever), I guess that possibility can be conveniently taken care of by scheduling the background job so that it is run (at least) after the nightly TPR update task.

@vergama We need to have some "backup update" in place anyway since signals don't fire on bulk updates.


[0.26 Port] Don't rely on webpack polyfilling path

Cherry pick of !3719

We usually make changes in the release branch and port forward rather than backporting - but we neglected to ask "does this need to be backported?" in the code review for the original change. We should have. Lessons for the future.

We usually make changes in the release branch and port forward rather than backporting - but we neglected to ask "does this need to be backported?" in the code review for the original change. We should have. Lessons for the future.

I hadn't realized we already cut 0.27, so in my mental model I was ok with it coming in 0.27. Since I already backported to 0.27, I figured I'd do 0.26 as well.  But yeah, lessons for next time.

@christiango No worries - we're all still figuring all this out. :)


LDAP user sync does not work (here)

Gitea version (or commit ref): 1.4.0, 1.4.2,1.4.3,1.5.0RC2
Git version: 2.7.4-0ubuntu1.4
Operating system: Ubuntu Server 16.04.4 AMD64
Database (use [x]):

[ ] PostgreSQL
[x] MySQL
[ ] MSSQL
[ ] SQLite

Can you reproduce the bug at https://try.gitea.io:

[ ] Yes (provide example URL)
[x] No
[ ] Not relevant

Log gist:

Description
my auth setup includes

bind to a ms-AD unencrypted
with a RO userid
a user search base where the users are
a user filter pointing to a group in a completely different OU
user synchronisation activated (at least marked)

Things that work:

manually adding a user and authenticating them via LDAP. If a user is not member in the filter group, they can not login.

Things that do not work:

users in my filter group being automatically synchronized

Additionally all users authenticating via ldap get deactivated if I dare to execute a manual user synchronisation via web frontend.
Can anybody tell me what I am doing wrong?
Not sure if screenshots could help here but I can upload some on demand.
Thanks,
Claudio

@cklabautermann is this still a problem?

@lunny yes, unfortunately it still does not work. Can you help?
Thanks in advance


EKS Cluster credentials expiration

Credentials in EKS are based on creating a token that has a max life of 15 minutes. We need to consider whether we should be integrating at kubeconfig credentials, instead of ClientConfig(token,CA).
The kubeconfig integration would have the baggage of supporting gcloud auth, and aws iam authenticator binaries.
Alternatively, we could likely create service accounts that were long lived for the same purpose, but this seems less ideal.

Hi, we're working on programmatically creating and interacting with EKS clusters as well but using Python. Have you run into any 403 forbidden errors using the tokens? How are you handling the 15 minutes max life right now?

We aren't handling it right now explicitly. Certainly you can regenerate a token in the same way we generate tokens, and just make sure to get a new one before the old one expires.
https://github.com/crossplaneio/crossplane/blob/ecca498e3b2989ba201ad60770fce54eee571b79/pkg/clients/aws/eks/eks.go#L218-L229
This is what's done internally when you use the iam authenticator binary
https://github.com/kubernetes-sigs/aws-iam-authenticator/

I think we are relying on Sync interval to "re-generate" EKS credentials, which should "renew" the auth token.


Wechsel auf tar?


Ensure we support modeless dialogs/modals

Reference: https://www.carbondesignsystem.com/patterns/dialog-pattern#modeless-dialogs

That link doesn't seem to be pointing to a specific place in the page. Should it be https://www.carbondesignsystem.com/patterns/dialog-pattern/#non-modal-dialogs instead or can we close this?

That link doesn't seem to be pointing to a specific place in the page. Should it be https://www.carbondesignsystem.com/patterns/dialog-pattern/#non-modal-dialogs instead or can we close this?

Yeah, that link is the correct one, I guess they changed the title since the issue was created

Yeah, that link is the correct one, I guess they changed the title since the issue was created


Need a footer component for the home page of the website.

Contributors may take a look at the wireframe for the website's homepage here
Please implement the footer as mentioned in the wireframe. Also, add a button that takes the user back to the top of the page when clicked.

I can do it please issue me the task

@qwerty-rgb sure.
I expect you to go through Cpntributing.md and follow all instructions there for further communication. Thank you.

#35 pr request generated

@qwerty-rgb There are a few changes that are required. I have put up a comment in the pull request thread. Please take a look.

#37

can u tell me what is wrong with pr so i can resolve as resolving would be much easy

@qwerty-rgb he has made a comment in the PR thread please see there.
Also, looks like you have made only the footer? can you also make the top navigation component?

#48

#52


Communication between machines and the world outside the MIO event loop

Hello,
After reading the 3rd post about rotor, I had a quick look to check if it could fit my needs (rust implementation of nanomsg's scalability protocols) and it seems to be quite close. The only thing that I feel is missing is a way for a client outside the event loop to talk with the machines.
Modifying the tcp_echo_server as follow, one can manage to send a single message to the machine, but only once.
    let mut port : Option<Port<u8>> = None;
    let lst = TcpListener::bind(&"<IP_ADDRESS>:3000".parse().unwrap()).unwrap();
    let ok = handler.add_machine_with(&mut event_loop, |scope| {
        let (p, _) = scope.create_future();
        port = Some(p);
        Ok(Echo::new(lst, scope))
    }).is_ok();
    assert!(ok);
    event_loop.run(&mut handler).unwrap();

    if let Some(p) = port.take() {
        p.set(42);
    }

The way the event loop channel is hidden behind a oneshot port/future pair makes it impossible (as far as I can see) to send an arbitrary number of messages to the machine. Is there a way to send several messages that I didn't find out ?
Regards,
Benoît

Hi Benoît,
Yes, the Future/Port combination is limited. It should be possible to consume future, then send Port somewhere again for the next message. While it may work for some cases (like communicating to the pool of workers). It looks like too ugly, for many of them.
I have used to think that I could implement some super-trivial communication primitive in rotor itself and allow to build more primitives on top. "Future" is such a basic abstraction in python asyncio, and looks like similar to the Promise, which is the same for JavaScript. But it's not like that for Rust I think.
There are couple of alternatives though. I'm not sure which one (or multiple things) should be included in the core.
Do you have any ideas?
BTW, I'm interested in nanomsg protocols too, please keep me informed :)

Thanks for the super fast answer.
The first thing that comes to mind would be to make the Notify and Timeo enums generic :
pub enum Notify<T:Send> {
    Fsm(Token, T),
}

pub enum Timeo<T:Send> {
    Fsm(Token, T),
}

This would allow the client to use directly the MIO event loop channel, with the problem of adding two generic parameters almost everywhere (Handler, Scope etc). But then, to be composable, the machines would have to share the same Notify and Timeo generic type.

Regarding nanomsg rust implementation, the first rotor machine would be the equivalent of the zmq context, sockets would also be machines, and finally pipes would also be machines, performing the I/O work. In that design, some user facing structs (the zmq context and sockets) would send through the MIO event loop channel commands like 'create socket', 'connect', 'bind', 'set_option', 'send', 'recv' and a regular rust channel would be used by the machines to send the result of the commands back to the user facing structs.
So this is where something similar to a channel rather than a port/future pair would be required.
You can check the existing attempt here, but be warned: this is far from being as clean and readable as the rotor code.

the first rotor machine would be the equivalent of the zmq context, sockets would also be machines, and finally pipes would also be machines

While this design might be okay. I want to propose an alternative.
You may put a nanomsg context into a Context. Like this one or this one (the former is okay for settings, latter is useful if you want to store state there).
Socket story is a little bit more complicated:

Pull/Sub socket is just a state machine that receives a messages
Push/Pub sockets could be Arc<Mutex<>>-wrapped structure that allows you to send data directly into right pipe(s)
Rep socket should probably spawn a state machine on every request, so you can process requests simultaneously
Req socket is very similar to Push, but should return Future, that will receive a response

Just my 2cents, not sure if all that makes sense.

@blabaere
Okay. I have a little progress. Here is a "monitor" branch: https://github.com/tailhook/rotor/tree/monitor
Here is a test to demonstrate how does it work. The basic idea is that you create a pair of objects, each of them implement Monitor<T> trait. You can use it mostly as a bidirectional pipe by using Monitor::notify_peer and Monitor::consume methods. Except there is no actual pipe or queue. There is a type T which is accesible by Monitor::consume method.
While you can put queue(s) in T, there are more efficient patterns here. For example, you could put an actual socket to the T, and let other peer to write to the socket directly (sure, this should be encapsulated by carefully designed state machine).
The Future/Port thing is going to be deprecated.
This is just brief description of the abstraction. I'm going to write another article that describes the design in more comprehensive way. But it would be great if you could take an early look and let me know if that makes sense or not.
/cc @erikjohnston

I feel 'a bidirectional pipe' is really what is needed here, so I guess it is going the right direction.
After reading the example I tried to modify tcp_echo_server to use monitors, and couldn't get it to do what I wanted. To be a little bit more explicit, what I expect is something that would send values to the event loop channel, like it is currently doing, and another kind of channel for the 'inside to outside' communication. That is, with both blocking and non-blocking read functions.
The example modified:
extern crate mio;
extern crate rotor;

use std::io::{Write, stderr};
use std::error::Error;

use mio::{EventSet, PollOpt, TryRead, TryWrite};
use mio::tcp::{TcpListener, TcpStream};
use rotor::{Machine, Response, Scope, Monitor, Peer1Monitor};

struct Context;

#[derive(Debug, PartialEq, Eq, Clone, Copy)]
enum CmdAndEvt {
    Boot,
    Cmd(usize),
    Evt(usize)
}

enum Echo {
    Server(TcpListener, Peer1Monitor<CmdAndEvt>),
    Connection(TcpStream),
}

impl Echo {
    pub fn new(
        sock: TcpListener,
        scope: &mut Scope<Context>,
        mon: Peer1Monitor<CmdAndEvt>) -> Echo {
        scope.register(&sock, EventSet::readable(), PollOpt::edge()).unwrap();
        Echo::Server(sock, mon)
    }
    fn accept(self) -> Response<Echo, TcpStream> {
        match self {
            Echo::Server(sock, mon) => {
                match sock.accept() {
                    Ok(Some((conn, _))) => {
                        Response::spawn(Echo::Server(sock, mon), conn)
                    }
                    Ok(None) => {
                        Response::ok(Echo::Server(sock, mon))
                    }
                    Err(e) => {
                        writeln!(&mut stderr(), "Error: {}", e).ok();
                        Response::ok(Echo::Server(sock, mon))
                    }
                }
            }
            _ => unreachable!(),
        }
    }
}

impl Machine<Context> for Echo {
    type Seed = TcpStream;

    fn create(conn: TcpStream, scope: &mut Scope<Context>)
        -> Result<Self, Box<Error>>
    {
        scope.register(&conn, EventSet::readable(), PollOpt::level())
            .unwrap();
        Ok(Echo::Connection(conn))
    }

    fn ready(self, _events: EventSet, _scope: &mut Scope<Context>)
        -> Response<Self, TcpStream>
    {
        match self {
            me @ Echo::Server(..) => me.accept(),
            Echo::Connection(mut sock) => {
                let mut data = [0u8; 1024];
                match sock.try_read(&mut data) {
                    Err(e) => {
                        writeln!(&mut stderr(), "read: {}", e).ok();
                        Response::done()
                    }
                    Ok(Some(0)) => {
                        Response::done()
                    }
                    Ok(Some(x)) => {
                        match sock.try_write(&data[..x]) {
                            Ok(_) => {
                                // this is example so we don't care if not all
                                // (or none at all) bytes are written
                                Response::ok(Echo::Connection(sock))
                            }
                            Err(e) => {
                                writeln!(&mut stderr(), "write: {}", e).ok();
                                Response::done()
                            }
                        }
                    }
                    Ok(None) => {
                        Response::ok(Echo::Connection(sock))
                    }
                }
            }
        }
    }
    fn spawned(self, _scope: &mut Scope<Context>) -> Response<Self, TcpStream>
    {
        match self {
            me @ Echo::Server(..) => me.accept(),
            _ => unreachable!(),
        }
    }
    fn timeout(self, _scope: &mut Scope<Context>)
        -> Response<Self, TcpStream>
    {
        unreachable!();
    }
    fn wakeup(self, _scope: &mut Scope<Context>)
        -> Response<Self, TcpStream>
    {
        match self {
            Echo::Server(sock, mon) => {
                match mon.consume() {
                    Some(mut item) => {
                        println!("Echo::wakeup, consumed: {:?} !", *item);
                        *item = CmdAndEvt::Evt(666);
                    },
                    None => {
                        println!("Echo::wakeup, consume failed !");
                    }
                }

                Response::ok(Echo::Server(sock, mon))
            }
            _ => unreachable!()
        }
    }
}

fn main() {
    let mut event_loop = mio::EventLoop::new().unwrap();
    let mut handler = rotor::Handler::new(Context, &mut event_loop);
    let lst = TcpListener::bind(&"<IP_ADDRESS>:3000".parse().unwrap()).unwrap();
    let mut outer_pipe_end = None;
    let ok = handler.add_machine_with(&mut event_loop, |scope| {
        let (left_end, right_tok) = scope.create_monitor(CmdAndEvt::Boot);
        let right_end = match right_tok.connect(scope) {
            Ok(x) => Some(x),
            Err(_) => None
        };

        outer_pipe_end = right_end;
        Ok(Echo::new(lst, scope, left_end))
    }).is_ok();
    assert!(ok);
    println!("Waiting for the event loop to wake up ...");
    std::thread::spawn(move || event_loop.run(&mut handler).unwrap());
    std::thread::sleep(std::time::Duration::from_millis(500));
    println!("Finished waiting.");
    if let Some(pipe) = outer_pipe_end.take() {
        println!("outer_pipe_end is initialized.");

        loop {
            match pipe.consume() {
                Some(mut item) => {
                    println!("Read from pipe: {:?}", *item);
                    *item = CmdAndEvt::Cmd(42);
                },
                None => {
                    println!("Read from pipe failed !");
                    std::thread::sleep(std::time::Duration::from_millis(500));
                },
            }
        }
    } else {
        println!("outer_pipe_end is NOT initialized !");
    }
}

And the output:
Waiting for the event loop to wake up ...
Echo::wakeup, consumed: Boot !
Finished waiting.
outer_pipe_end is initialized.
Read from pipe failed !
Read from pipe failed !

Okay. Here is a fixed example:
https://gist.github.com/anonymous/452cbe6437256edeca9f
(sorry, I forgot to make notify_peer method public)
The blocking communication can be implemented via Condvar. The monitor abstraction is a thing similar to Arc<(Mutex<T>, Condvar)> in the documentation example. Except its notify_peer function wakes up a state machine inside the event loop. And there are actually two conditional variables inside. Hopefully, this makes things a bit more clear.
API is a little bit confusing at the moment, I'll try to fix it soon.

Well, after some thinking I've simplified it even more. Now we have
scope.notifier() that returns Notifier object. And notifier.wakeup() just wakes up a state machine (asynchronously) which initially called scope.notifier(). This is it. The notifier is Send+Sync+Clone.
This should be good enough to build abstractions on top. Note however, that spurious wakeups are possible and entirely normal on this level of abstraction.
The code is in current master along with few more upcoming changes (like removing futures and making context an associated type). I'm working on updating all the dependencies.
Let me know what you think.

I was about to write this:
I think this is the simplest feature possible, as low level as it can get and puts no additional constraint on rotor design. With this and the synchronization primitives availabe in Rust std (channel, or Arc + Mutex + Condvar) it should also be possible to build whatever one may need.
And then I noticed that Notifier::wakeup is consuming the notifier. I did a quick check and changing the signature from Notifier::wakeup(self) to Notifier::wakeup(&mut self) would make it what's described above ! What's the idea behind making the notifier usable only once ? Did I miss something ?

@blabaere sorry, that was a mistake. Pushed new version.

That was released in rotor 0.5.0. Looks fine so far.


absorb defi-wonderland/solhint-plugin features

The goal of this issue is to discuss the best way to include features defined in defi-wonderland's plugin in a way that doesn't make adoption by users of protofire/solhint significantly harder.
contract-data-order
status: nothing done yet, feedback needed
I think the behaviour of this rule could be part of ordering. Adding that
would be a small breaking change, but it's the perfect opportunity to do so
since I'm finalizing the spec for 4.0.0.
however, I'd like to consider a small change: only enforce constants are
above all other variables, since that'd never get in the way of storage layout
optimizations, where someone might squeeze an immutable address and a few
mutable timestamps/bitmasks together for all of them to fit in a single storage
slot. Then this behaviour can even be made part of the 'recommended' ruleset.
If that's a tough sell, then I could add the rule as-is but I'd be reticent to
making it recommended
part of this (enums vs struct ordering) is tracked in #112
interface-member-order
status: nothing done yet, feedback needed
This one is a bit more problematic than the above since the ordering defined by
it contradicts rather than refines the behaviour of ordering, which
requires:

struct/enums (doesnt care about order, #112)
events
errors

while this rule requires:

events
errors
enums
structs

While I agree that it makes perfect sense to have structs at the bottom since
they are usually the hardest definitions to read (of those four), adding that
change to ordering, one of the least controversial rules, would be the biggest
hurdle for users to migrate to this repository, since they'd have to re-order
their contracts (I guess I could make a fixer to make it easier tho, but the
fixer itself would be hard to implement).
would it be an okay compromise if ordering enforced the following instead?

enums
structs
events
errors

other alternatives would be:

making it a separate rule which contradicts ordering
making interface ordering different than for regular contracts, so this
breaking change would have a smaller impact

I'm open to input on this
non-state-vars-leading-underscore
status: nothing done yet, to be included (#114)
I believe this is a completely valid naming convention, although it'd contradict
private-vars-leading-underscore and the style guide. It wouldn't be in
solhint:recommended, but that's it.
wonder-var-name-mixedcase
status: nothing done yet, NOT to be included
I'm not sure I understand how this contradicts var-name-mixedcase, since the
latter disallows mutable variables in CapWords and snake_case, uppercase or not.
I believe this rule was created in the timespan where protofire/solhint was
unmantained and didn't skip immutable/constant variables in
var-name-mixedcase, so now it's obsolete. Please confirm this 🙃
also, bear in mind now {immutable,constant}-name-snakecase are now in the
recommended ruleset so this naming convention should be less of an issue.
struct-name-camelcase
status: covered by #109
enum-name-camelcase
status: covered by #109
immutable-name-snakecase
status: ported by protofire before the fork
re-implemented
aside: we also have const-name-snakecase. Do you think they should be merged?
import-statement-format
status: re-implemented as no-global-import
interface-starts-with-i
status: backported in #107
named-return-values
status: re-implemented/copied by protofire and backported in #56

Hey @juanpcapurro, great effort! ❤ Let me try to address some of the questions.
contract-data-order
Totally agree that it would be a nice addition to the ordering rule. If I'm not misinterpreting the suggestion, the rule should never get into the way of optimizations because constants and immutable variables are not stored in the state, rather they're a part of the contract's bytecode. Hence it only makes sense to declare them all together for readability reasons.
interface-member-order
Let me check this with the team. I personally think it's fine as we're looking after enforcing order in general, not particular ordering. The current state of the things contradicts the Solidity style guide a little. Allowing users to define the weights could also be an option that would let teams follow their own rules.
immutable-name-snakecase
Ideally this should be a part of a naming rule, the same way as all ordering is processed by one piece of logic. But since there is no such rule (yet?), I wouldn't merge the checks for constant and immutable variables.
👍🏻 to the rest, specifically the deprecation of wonder-var-name-mixedcase.

interface-member-order
I don't exactly recall the origin of our divergence with the style guide, I wouldn't personally be in favour of having a divergence between interface and contract tho (aka shouldn't we just drop this one @gas1cent ?)

contract-data-order
because constants and immutable variables are not stored in the state, rather
they're a part of the contract's bytecode.

oh you're right! I had the wrong idea that immutables were present in the state
but the compiler disallowed assignments to them outside of the constructor.
Thanks for forcing me to clear that up lol

Hence it only makes sense to declare them all together for readability reasons.

With the above in mind, I'll implement it like that, created issue #123 to track
it. If you consider it'd be a good time to also require public variables are
above private ones or something like that, let's discuss it there.

interface-member-order
Let me check this with the team. I personally think it's fine to change the
rule as we're looking after enforcing order in general, not particular
ordering. The current state of the things contradicts the Solidity style guide
a little.

alright, based on input from you and @drgorillamd above, I'll drop this rule.

Allowing users to define the weights could also be an option that would let
teams follow their own rules.

With this linter I'm inclined to make it a bit more opinionated with sane
defaults, similar to forge fmt, to make setting it up as simple as possible.
I'm not opposed to it though, and will implement it later down the line,
specially if there's demand for it. Added as #124, with low priority

immutable-name-snakecase

Ideally this should be a part of a naming rule, the same way as all ordering
is processed by one piece of logic. But since there is no such rule (yet?), I
wouldn't merge the checks for constant and immutable variables.

that seems reasonable, I'll keep it like it is for now
the main reasom making me reticent to implement a 'naming' rule is that
projects seem to have different conventions, especially around the use of
underscores as a sort of hungarian notation, ~and they'd want to disable just
part of the naming rule, which'd be awkward to do with options~.
immutable-name-snakecase and constant-name-snakecase are not controversial,
but the following are sources of contempt:

should underscores be allowed as suffixes to a variable to avoid name
collision? the style guide says so, and is allowed in all *-nam-mixedcase
rules, but in this linter it has historically been disallowed for
*-name-capwords rules, so modifying that would be a breaking change.
should underscores as preffixes to variables denote they're
non-external? or should they denote the variable is part of the state? the style
guide says the former, but many projects agree with the later, it being a good
way to tell apart state reads/writes when hunting for gas optimizations.

well, it might not be so nuanced after all, and it's desireable to have less rules
with simpler premises overall. created issue #125 to track it, but I'd like to
have more feedback by various projects on this before clumping all the
rules together.
thanks for your input @drgorillamd and @gas1cent
correct me if I missed something, but the only outstanding issues are with #114,
so we'll discuss it there.
After I finish implementing the changes described herein, I'll close this issue
and notify you both
Feel free to suggest anything else

all of the changes discussed above, plus the ones discussed in #114 are implemented and deployed in v4.0.0-rc01
I encourage you to semver-match against the release candidate (by setting ^4.0.0-rc01 as version in package.json) in the projects where you choose to use this linter, in order to get the new candidates as soon as they're published.
thanks @drgorillamd and @gas1cent for your input! I'll greatly appreciate any
feedback you have on this new version.


Can't get past uploading

Just gets stuck with Create greyed-out after clicking, no matter what host I choose. T__T

same issue here

started working again out of nowhere


Distorted bold text

Link to PDF file (or attach file here):
1.pdf
2.pdf
Configuration:

Web browser and its version: Google Chrome 54.0.2840.71 m
Operating system and its version: Windows 7
PDF.js version: 1.5.188
Is an extension:

Steps to reproduce the problem:

Open 1.pdf in pdf.js
Open 2.pdf in pdf.js (Order does not matter - may opening 1.pdf after 2.pdf).

What is the expected behavior? (add screenshot)
Both documents will be displayed well. (see 1 first.png and 2 first.png screenshots)
What went wrong? (add screenshot)
Distorted bold text. See screenshots 1 first.png, 2 second.png (or 2 first.png, 1 second.png if first opening was 1.pdf - this screenshots was taken after reboot browser).
1 first.png:

2 second.png:

1 second.png:

2 first.png:

Link to a viewer (if hosted on a site other than mozilla.github.io/pdf.js or as Firefox/Chrome extension):

Works for me, using PDF.js version 1.6.264 (which is the latest version as of this writing).
You can easily test this yourself with the demo viewer: http://mozilla.github.io/pdf.js/web/viewer.html.

PDF.js version: 1.5.188

This issue was fixed by PR #6571, and I'd thus suggest updating to a newer PDF.js version.
Closing as fixed.

I'm updated to a newer PDF.js version (1.6.264).
Got better: if first open 1.pdf - good, but if first open 2.pdf - the same situation :(

Please explain what do you mean by "open x.pdf in pdf.js" and the "order" in which pdfs are opened. It's not clear e.g. you are using open button or something else, or you are refreshing browser or not. Can you provide more detailed steps to reproduce?

"open x.pdf in pdf.js" - enter in browser address bar "http://localhost:8888/web/viewer.html?file=x.pdf".
Steps:

enter in browser address bar "http://localhost:8888/web/viewer.html?file=2.pdf"

in the same tab enter in browser address bar "http://localhost:8888/web/viewer.html?file=1.pdf"

It was possible to repeat? Plese tell me are you will fix this?

I think this is a duplicate of #7136.

You will not fix this?

Most likely the issue you're describing is the same as in #7136, so we're keeping tracking over there. No need to have two open issues for the same problem. The other issue is still open, so we will look into this more.

I think this is a duplicate of #7136.

Looks familiar. But it opens a different document/tab. I wonder if it's just Chrome specific and something is wrong with font caching.

It was possible to repeat? Plese tell me are you will fix this?

@Teir , is it Chrome specific?

@yurydelendik , yes, in Firefox/IE/Safari ok

I wonder if giving random doc number at https://github.com/mozilla/pdf.js/blob/master/src/display/api.js#L322 will fix the issue. If yes, Chrome somehow caching fonts by the their name between document loads.

Yes, it's helps!
Thank you!

We have a similar problem with bold text. In our file the text is always not bold. But only on some computers. (Firefox, PDF.js 1.4, 1.5, 1.6 beta).
Testing with your "1.pdf", the file randomly is bold/not bold.
Also we noticed, the PDF.js Demo on the mozilla page looks strange on this computers. (wrong font?)
At the moment we could "fix" the issue creating a new Firefox profile ("firefox -P"). Our testuser reinstalled all his stuff, plugins etc and till now PDF.js works as expected.
But we can not recreate a unknown number of Firefox profiles at our customers.
sidenote
On my personal Chrome, PDF.js embedded in an iframe, randomly sets cased letters. Only in bold lines making problems in the other Firefoxes. The cased letters are always the same, but occur randomly. It is possible to get rid of them with changing the zoom level, most of the time. A permanent fix is to set showPreviousViewOnLoad to false. But this also does not fix the bold issue.
Copy-paste the cased text into gedit works fine, also the html shows no case errors. Looks like an font issue.

I wonder if giving random doc number at https://github.com/mozilla/pdf.js/blob/master/src/display/api.js#L322 will fix the issue. If yes, Chrome somehow caching fonts by their name between document loads.

@yurydelendik can you update what line you're referring? I'm trying to find see if that will fix the random font corruptions I'm seeing occasionally and I think the master branch has been updated since your comment.

@tonyjin we generate unique document id, so you don't have to do it anymore.
can you see what documents with issue have in common (e.g. pdf generate, font types, or how they structured)? (you can use http://brendandahl.github.io/pdf.js.utils/browser/ to check font information) if you will have some additional info, can you create a different issue with findings?

Ok thanks - I will create a separate issue if I find more information. This one's difficult, happens super rarely on Chrome and disappears on reload - font/canvas/memory corruption?

@tonyjin maybe font loader reports that font is ready at wrong time. Trying disabling font loading api  https://github.com/mozilla/pdf.js/blob/master/src/display/font_loader.js#L316 -- see if old loading hack works better.


Feature/add api v2 support

WIP

@thebluber, could you explain me please? Why are we using methods by CamelCase for client. For example: client.NotificationBroadcast.create.


Rename persistentVolumes to something better

$subject, right now one of the suggestion is to rename it to:

volumeClaims
storage

Please comment for any better name.

+1 for volumeClaims - relatively short and it describes what it is

Examples need to be updated as well.


ci: merge staging to master

This is an automatic PR generated by the pipeline CI/CD. This will be automatically fast-forward merged if successful.

Pipeline Attempt on<PHONE_NUMBER> for 3ff744ae7727407f867665ab09ab882e91fb2196
https://gitlab.com/MatrixAI/open-source/js-ws/-/pipelines/1015320201

Pipeline Attempt on<PHONE_NUMBER> for 2a298306876b99e15c7fe317d4761af3ba8c4347
https://gitlab.com/MatrixAI/open-source/js-ws/-/pipelines/1015333134

Pipeline Succeeded on<PHONE_NUMBER> for 2a298306876b99e15c7fe317d4761af3ba8c4347
https://gitlab.com/MatrixAI/open-source/js-ws/-/pipelines/1015333134


Bug report: chili closes immediately after providing a response

Priority
(Low) Something is a little off
Description
Chili closes immediately after providing a response. It doesn't wait for the user to answer prompts, but instead closes.
Steps to reproduce
m365? "how can I upgrade my SPFx project?"

Expected results
Chili provides a response, waits for the user to answer prompts, and continues as instructed.
Actual results
Chili prints the output, the prompts and closes immediately
Diagnostics
No response
CLI for Microsoft 365 version
Latest from main
nodejs version
v20.11.0
Operating system (environment)
macOS
Shell
zsh
cli doctor
No response
Additional Info
No response

I think that it's the same issue as with the previous prompt issue, as we use the ora spinner there as well and we don't add the options when initializing the spinner, so should be an easy fix.

@waldekmastykarz Something that I noticed too when using the chili command is that the ora spinner also blocks the capability for all the prompts (after I added the discardstdin). So this is another thing that we'd have to research when fixing this. For example; when being prompted for the rating on macOS, it will only show the first two options, and the spinner will be in front of the third option.

on win + powershell seems to be working 'ok' 🤔

however I noticed a different also wrong behavior that the loader seems to be always present 🤔
https://github.com/pnp/cli-microsoft365/assets/58668583/9500db42-f9ef-42fd-8016-af6b33aa6910

however I noticed a different also wrong behavior that the loader seems to be always present 🤔

Let's create a separate issue for this. Good catch

however I noticed a different also wrong behavior that the loader seems to be always present 🤔

Let's create a separate issue for this. Good catch

That's the issue on why the Spinner is blocking the last prompt too.

@MathijsVerbeeck yes, that's why I think it's kinda connected
Will create a separate issue for that but I hope there will be a single fix for both things

Ok so two things:

We will have to change the initialization for the ora spinner so that we add discardStdin: false for macOS, I'd suggest that we initialize the ora object at the top of the code, and we just set the text dynamically before showing the spinner, so it will be something like this:

const spinner = ora({ discardStdin: false });
if (showSpinner) {
   spinner.text = 'Sending rating...';
   spinner.show();
}

The request that we are currently executing to call the rating endpoint from mendable is not working. It throws the following error:

I have checked the call that is currently being executed when we use the Mendable on the site from the CLI, but it seems that it is using a different endpoint, which is eRateMessage, the only difference being that the parameter api_key is named anon_key in this request. On their own documentation however, it still shows as if we should use api_key.
Message rating

In our code we are using the 10 endpoint, while Mendable docs state to use V1 endpoint. Does this make any difference? If not, I can reach out to the Mendable guys to ask which is the best approach here. We can always copy the request from the Mendable button on the site, but if it's not documented, I don't know if we can just use it.

Good catch 😲💪. I think double checking with them over Discord is totally fine 👍

In our code we are using the 10 endpoint, while Mendable docs state to use V1 endpoint. Does this make any difference? If not, I can reach out to the Mendable guys to ask which is the best approach here. We can always copy the request from the Mendable button on the site, but if it's not documented, I don't know if we can just use it.

it does not make a difference it seems

@nickscamara could you guide us in the right direction for this issue, please?
TL;DR: the request we're sending to rate responses is returning a 400 result. Same goes for the request listed in your docs.

@MathijsVerbeeck, I reached out to Mendable, they say we should use a server-key instead of an anon-key. Could you try this key, please? c532aaa5-9038-440c-85cd-17757d9275db

Can confirm that it works.

@pnp/cli-for-microsoft-365-maintainers Nick from Mendable told me that the server-key I gave Mathijs is more sensitive than the anon-key and we shouldn't expose it. I don't know if there is a way for us to not expose it in Chili...
Either we should:

Drop rating messages
Copy the request from the Mendable component on our docs site, which uses an anon-key if I'm not mistaken. Downside: that request is not documented.

I suggest we simplify and drop rating