diff --git a/README.md b/README.md index d8d8c70955a4c20c3e61007f16b9e38883f88951..02c0b2b47a488aeb5247818708bf2531582a947a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ --- -library_name: cactus-needle +library_name: cactus-compute pipeline_tag: text-generation license: apache-2.0 tags: @@ -11,114 +11,38 @@ tags: - webassembly --- -![Needle](assets/banner.svg) +![Needle 3](assets/banner.svg) -A foundation model for mobiles, wearables, robots, smart home, automotive and microcontrollers. The whole model is a single 8-29 MB file, and we trade general chat capacity to beat models 10x its size on mobile tool calls and match 2-3x bigger models on extraction. +# Needle 3 -Needle does three jobs, all of them on the device: - -- **Tool calls**: given the functions your app exposes, Needle picks the right ones and fills every argument from what the user said. Ask for two things and you get two calls in order; ask for something no tool covers and you get an empty list, not a guess. -- **Structured extraction**: declare a shape, hand over messy text, get typed fields back: an invoice, a booking, a notification, a form. The decode grammar guarantees the output parses, and extraction generalises to classification. -- **Text embedding**: the same model returns a vector for a sentence, so an app can search, match and route locally. - -The same engine also runs [Whistle](https://huggingface.co/Cactus-Compute/whistle), our 16.9 MB speech-to-text model in seven languages. Load `whistle.cact` beside `needle3.cact` and the one binary transcribes a clip on its own, or answers it against your tools in a single call and returns the calls and the transcript in one JSON object. - -## Model - -![Needle 3 at a glance](assets/model.svg) - -Needle 3 is a Laddered Simple Attention Network, our small-model recipe: a Monarch Hadamard MLP in place of the FFN, GQA attention with causal conv taps, engram n-gram memory read by gather, and multi-lane hyper-connections, trained so that every depth from 2 to 20 layers is a deployable model. Most of its parameters sit in the engram, so the 121M model does the arithmetic of a 50M one. The weights are compressed to CQ2-bit with Cactus Quants; a byte-level grammar compiled from your schemas constrains every token, and every response carries a calibrated confidence score from a learned head. The architecture diagram is on the [release page](https://cactuscompute.com/needle). The repo holds the 20-layer `needle3.cact`, the `needle3.safetensors` checkpoint to fine-tune, and an engine per platform. - -## Benchmarks - -Tool calling is exact-match accuracy on the full test splits, extraction is field micro-F1 on the full test splits. - -![Needle 3 against baselines on six benchmarks](assets/benchmarks.svg) - -The interactive frontier plot, the architecture and the fine-tuning results are at [cactuscompute.com/needle](https://cactuscompute.com/needle). +An on-device model for tool calling, structured extraction and text embeddings. +See the [Needle website](https://cactuscompute.com/needle) for model details, benchmarks and the browser demo. ## Get started ```sh -pip install cactus-needle +pip install -U cactus-compute ``` -Try it in the browser at [cactuscompute.com/needle](https://cactuscompute.com/needle); the Python package and the source are on [GitHub](https://github.com/cactus-compute/needle). - ```python -import needle +import cactus -@needle.tool +@cactus.tool def get_weather(city: str): "Get the current weather for a city." return {"city": city, "temp_c": 27, "sky": "clear"} -agent = needle.Needle(tools=[get_weather]) -print(agent.run("what's it like in Lagos right now?")["results"]) -# [{'city': 'Lagos', 'temp_c': 27, 'sky': 'clear'}] +with cactus.Cactus(tools=[get_weather]) as agent: + print(agent.run("What's the weather in Lagos?")["results"]) ``` -Every turn returns one JSON object with `function_calls`, the model's `reasoning` and a calibrated `confidence`; an off-topic request returns an empty list rather than a guess. The engine and the weights are fetched from this repo once and cached. +The package downloads and caches the engine and weights on first use. +This repository provides `needle3.cact` and `checkpoints/needle3.safetensors`. +[Runtime binaries and supported platforms](https://huggingface.co/Cactus-Compute/cactus) live in the Cactus repository. ## Guides -- [How to design tools for Needle 3](https://cactuscompute.com/blog/designing-tools-for-needle): one tool per action, names users would say, formats in descriptions, constraints in the grammar, triggers. -- [Leveraging Needle's confidence](https://cactuscompute.com/blog/needle-confidence): what the score measures, what the engine withholds, and routing on act, confirm or refuse. -- [Structured JSON extraction with Needle](https://cactuscompute.com/blog/structured-extraction-with-needle): the record as the only tool, typed results, classification with enums. -- [Fine-tuning Needle](https://cactuscompute.com/blog/finetuning-needle): the data format, the commands, reading the loss, sizing the dataset. -- [Needle Python docs](https://cactuscompute.com/blog/needle-python-docs): the API, the response shape, the behaviour contract, system facts, tool retrieval, offline devices, environments, the CLI. -- [What devices are supported on Needle](https://cactuscompute.com/blog/needle-supported-devices): every platform folder, the CLI runner, the C API, the browser, WASI, air-gapped setup. -- [The .cact format](https://cactuscompute.com/blog/cact-format): the file the engine maps and reads in place, Cactus Quants at 2.125 bits per weight, and how to parse it yourself. -- [Porting Needle 3](https://cactuscompute.com/blog/porting-needle): notes for writing your own runtime, the oracle to test against, the tensor order the container promises, the prompt on the wire, the ladder rule, retrieval with `needle_embed`. - -## Customisation - -Needle was designed to be customised. Its capacity is a ladder, and a subnetwork as small as 2 layers, fine-tuned on one product's tools, runs optimally on devices far smaller than the full model needs. Fine-tuning on DroidCall lifts every subnetwork by 18 to 36 points, and from 4 layers up the tuned subnetwork passes DeepSeek V4 Flash, starting at 29M parameters. - -![Every subnetwork before and after fine-tuning on DroidCall and on Mobile Actions](assets/finetune.svg) - -The Python package fine-tunes with LoRA on the frozen base at the full 20 layers, then `needle build [--layers N]` merges the adapter, slices any subnetwork from 2 to 20 layers and exports a 4-bit `.cact` that runs on the same engine. The 2-bit post-training and quantisation behind the shipped model, enriched with Cactus proprietary datasets, run on the [Cactus Platform](https://cactuscompute.com/dashboard). - -## Deploy - -Every platform folder in this repo holds an engine that loads `needle3.cact` at start. `needle build --platform [--layers N]` fetches the engine and header and puts the weights beside them at any depth, or download the folder here: - -![One engine per platform folder](assets/deploy.svg) - -```sh -./needle --model needle3.cact --tools tools.json --prompt "dim the living room to 30" -./needle --model needle3.cact --tools tools.json --serve - -# speech to text, live from a stream, and speech straight to tool calls -./needle --model whistle.cact --audio clip.wav -./needle --model whistle.cact --audio talk.wav --audio-stream -./needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav -``` - -Tool schemas share the model context with the system prompt and conversation. -`needle_init` returns the tokenized static-prefix length on success and fails -when that prefix does not fit the model context. In the C API, call -`needle_last_error()` after a negative return to get the measured prefix tokens -and context limit. Reduce tool descriptions/schema text, split large catalogues, -or declare more than five tools so Needle can keep only retrieved tools in the -per-turn prefix. At completion time, `max_new_tokens` also reserves context room, -so larger generation caps leave less space for the current turn and history. - -The [devices guide](https://cactuscompute.com/blog/needle-supported-devices) covers the runner flags, the C API, the WASI component and air-gapped setup. - -## Citation - -Needle 3 is built by the Cactus Compute team. If you use it in your work, please cite: - -```bibtex -@misc{needle3_2026, - title = {Needle: Foundation Tool-Calling Model for Tiny Devices}, - author = {Ndubuaku, Henry and Mosoyan, Karen and Mroz, Jakub and Cylich, Noah and - Kumar, Satyajit and Sandhu, Parkirat and Shemet, Roman and Lee, Justin H.}, - year = {2026}, - organization = {Cactus Compute, Inc.}, - howpublished = {\url{https://github.com/cactus-compute/needle}} -} -``` - -Reach out on founders@cactuscompute.com for partnerships, collaborations, synergies and deploying Needle in your product. +- [Python API](https://cactuscompute.com/blog/needle-python-docs) +- [Designing tools](https://cactuscompute.com/blog/designing-tools-for-needle) and [structured extraction](https://cactuscompute.com/blog/structured-extraction-with-needle) +- [Fine-tuning](https://cactuscompute.com/blog/finetuning-needle) +- [Source code](https://github.com/cactus-compute/cactus) diff --git a/android-arm64/libneedle.a b/android-arm64/libneedle.a deleted file mode 100644 index 21848d9ae7aaf423bbd437f2d4c1df90f7afe145..0000000000000000000000000000000000000000 --- a/android-arm64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7aa6de6132a22bf45f5e903425feb66f159ad46f47fa558921bc4fd02c3a2fa0 -size 2177676 diff --git a/android-arm64/needle b/android-arm64/needle deleted file mode 100644 index 498ea223f813bcce8dabba2b918aa5a706d67ef3..0000000000000000000000000000000000000000 --- a/android-arm64/needle +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02a044e15489e19fa9f4f1cd1d5943d39dc0eefc08e0ba99d36279daf2351d46 -size 1586416 diff --git a/android-arm64/needle.h b/android-arm64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/android-arm64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/android-armv7/libneedle.a b/android-armv7/libneedle.a deleted file mode 100644 index 94d8fb17c3c169ce9e3525f28c33a003b7986e98..0000000000000000000000000000000000000000 --- a/android-armv7/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f559a287b201c213e5c753d3cd1076a1849c73f94b445c85d11e4969422a135 -size 1700760 diff --git a/android-armv7/needle b/android-armv7/needle deleted file mode 100644 index 877e26661763259349379b9c0e93bb2e7cce81bf..0000000000000000000000000000000000000000 --- a/android-armv7/needle +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8de71d0a00538ff3a64c2023f9d27121148295e50d414de284ac86586336127f -size 967396 diff --git a/android-armv7/needle.h b/android-armv7/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/android-armv7/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/android-riscv64/libneedle.a b/android-riscv64/libneedle.a deleted file mode 100644 index 9be0a8e1080d78efe2ddc470ff73390680530468..0000000000000000000000000000000000000000 --- a/android-riscv64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8eb2313c04b113b774794cfe0aa5361ecdc6f17bc4930deebbb1b924a891a8e -size 5092414 diff --git a/android-riscv64/needle b/android-riscv64/needle deleted file mode 100644 index ff6278e75dba721f18242fd3cd76defa8351fc5c..0000000000000000000000000000000000000000 --- a/android-riscv64/needle +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7bdf932bd9eed6c2f49d5b83e6c3061766b49738ddfeb8a88b3d113b318630ab -size 1431792 diff --git a/android-riscv64/needle.h b/android-riscv64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/android-riscv64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/ios-arm64/libneedle.a b/ios-arm64/libneedle.a deleted file mode 100644 index 2c5f1a9309bb77057070ae1adb158cf7893cc81a..0000000000000000000000000000000000000000 --- a/ios-arm64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e931f1d52319c1396901f3a16244ea47776d18acbf28543b62da408de45158a -size 1501688 diff --git a/ios-arm64/needle.h b/ios-arm64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/ios-arm64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/ios-sim-arm64/libneedle.a b/ios-sim-arm64/libneedle.a deleted file mode 100644 index 7cf5c39dfc0f4a835be9464bd5e2c1b6a2841c9a..0000000000000000000000000000000000000000 --- a/ios-sim-arm64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75f836ada53fc55cd27a30e0edaea8bf5dcbcca6e30c9f0202fa192db20cea80 -size 1535472 diff --git a/ios-sim-arm64/needle.h b/ios-sim-arm64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/ios-sim-arm64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/linux-arm64/libneedle.a b/linux-arm64/libneedle.a deleted file mode 100644 index 67df3f0ebd4bcf89766344adcf3d178ae713f230..0000000000000000000000000000000000000000 --- a/linux-arm64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d54f0d83963c56eb79181929827c9f9ff405891d50cd12974c2b0f6485dd07af -size 2024824 diff --git a/linux-arm64/needle b/linux-arm64/needle deleted file mode 100644 index ddc7d82e1006695e82c7ccb0b4f76455b8d92940..0000000000000000000000000000000000000000 --- a/linux-arm64/needle +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7dd07f740763507edbca760dc7e7065b6da6b6bd6c3a05288ca974f14ce0fcb -size 1439720 diff --git a/linux-arm64/needle.h b/linux-arm64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/linux-arm64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/linux-armv7/libneedle.a b/linux-armv7/libneedle.a deleted file mode 100644 index 217656d33b5b847654cf2d4bdeb958af79114e59..0000000000000000000000000000000000000000 --- a/linux-armv7/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:972ce9802664307b681ef39dd86e0aa0164b4c3380d195476fe9e954b7804130 -size 1783478 diff --git a/linux-armv7/needle b/linux-armv7/needle deleted file mode 100644 index db4bc1b4885302be485642c65b7d2cadaed2ee5b..0000000000000000000000000000000000000000 --- a/linux-armv7/needle +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1200e2b2d5005f969c30f321df72f0eff24b51a2862059b666da3f2dfef9ad2f -size 1247772 diff --git a/linux-armv7/needle.h b/linux-armv7/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/linux-armv7/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/linux-mipsel/libneedle.a b/linux-mipsel/libneedle.a deleted file mode 100644 index bfa9e7d4a3cd001ee44b047b6281e6e947492574..0000000000000000000000000000000000000000 --- a/linux-mipsel/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f071b386e187b3b4905274f67e026d3ccecc3e2bebf7d49bd4d31616e593d6a -size 1689382 diff --git a/linux-mipsel/needle b/linux-mipsel/needle deleted file mode 100644 index 797935ed5b6532370eeb5accf0d73961fb26cac6..0000000000000000000000000000000000000000 --- a/linux-mipsel/needle +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3d6abd16a1ba41870c1e4a1134cf4ffc0060eb66e9181e180882008063fe549 -size 1745296 diff --git a/linux-mipsel/needle.h b/linux-mipsel/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/linux-mipsel/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/linux-riscv64/libneedle.a b/linux-riscv64/libneedle.a deleted file mode 100644 index 3ed778e11e923d1666236101346879f7d493bf92..0000000000000000000000000000000000000000 --- a/linux-riscv64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0bb8e19fae59b0f969c5fad999a020817f8d2081773329c9651f7701f9e4dfa -size 1939344 diff --git a/linux-riscv64/needle b/linux-riscv64/needle deleted file mode 100644 index bd7ade32150f0971138d0a461317f080d72eb2ad..0000000000000000000000000000000000000000 --- a/linux-riscv64/needle +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c87d816358cefbd12a2dd33ea8cc0767a9b361a1a1ed138eaf3006ed3845d5b2 -size 1186320 diff --git a/linux-riscv64/needle.h b/linux-riscv64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/linux-riscv64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/linux-x86_64/libneedle.a b/linux-x86_64/libneedle.a deleted file mode 100644 index b638a54cc52fa7b7bb2520b6ca9bfb83dcaaf397..0000000000000000000000000000000000000000 --- a/linux-x86_64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f281877e24fed2658187a32d9a26e74c32d4f273ac9a2b36180b3a6e85942da -size 2204068 diff --git a/linux-x86_64/needle b/linux-x86_64/needle deleted file mode 100644 index c38dcb9d99d877388d209a210b26c2d3282c65cc..0000000000000000000000000000000000000000 --- a/linux-x86_64/needle +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77cd35ee75c53df8532b397e11ed7cf94a45d89a9f14f50881fd9c68ba54a2d0 -size 1550176 diff --git a/linux-x86_64/needle.h b/linux-x86_64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/linux-x86_64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/macos-arm64/libneedle.a b/macos-arm64/libneedle.a deleted file mode 100644 index 86b4d6c8c7faaeda51efef5d6d6ac6e9c5aa4841..0000000000000000000000000000000000000000 --- a/macos-arm64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d1368a4a42a745aba055f310913c3ed6d929dee98a89dcb955b9032b2335700 -size 1534472 diff --git a/macos-arm64/needle b/macos-arm64/needle deleted file mode 100644 index 17898ce09bc34a7972210631528b865630ec745d..0000000000000000000000000000000000000000 --- a/macos-arm64/needle +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a480f7e01d1fcf9df2e6dbc29af29411406720a5c5cb73024fcd6d16aa25b60 -size 1107096 diff --git a/macos-arm64/needle.h b/macos-arm64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/macos-arm64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/python/cactus_needle-3.0.0-py3-none-macosx_11_0_arm64.whl b/python/cactus_needle-3.0.0-py3-none-macosx_11_0_arm64.whl deleted file mode 100644 index e2fcb42eccf09f88f2dddd40fa7b2fec8da8ac43..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.0-py3-none-macosx_11_0_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5c05efdd195c92effd8507d1259d6e509b9c5a8823939e67f2be4e83811b44b -size 376196 diff --git a/python/cactus_needle-3.0.0-py3-none-macosx_11_0_x86_64.whl b/python/cactus_needle-3.0.0-py3-none-macosx_11_0_x86_64.whl deleted file mode 100644 index 10abb0970be0e4d4c5730526502abeeb6be7c7b9..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.0-py3-none-macosx_11_0_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01c1d8874266013e32b539c7b154b811f8268a01e7ea992eea40e5e1d541c55a -size 430782 diff --git a/python/cactus_needle-3.0.0-py3-none-manylinux2014_aarch64.whl b/python/cactus_needle-3.0.0-py3-none-manylinux2014_aarch64.whl deleted file mode 100644 index 9f2057ba278ad7c458f7f6b866df65458ac25efd..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.0-py3-none-manylinux2014_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:653f41d440f14ad53cf0c4597fc9d960cbf059ae51a38ec0fb4f54a8873d5c0c -size 500887 diff --git a/python/cactus_needle-3.0.0-py3-none-manylinux2014_x86_64.whl b/python/cactus_needle-3.0.0-py3-none-manylinux2014_x86_64.whl deleted file mode 100644 index a11adf0acfe4821333890715991d1384f6dfc701..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.0-py3-none-manylinux2014_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1eae4b94675ae025ebdb380401e0d9cab1d1f6c34d4fe1251166f1ba2faf16e -size 530108 diff --git a/python/cactus_needle-3.0.0-py3-none-musllinux_1_2_aarch64.whl b/python/cactus_needle-3.0.0-py3-none-musllinux_1_2_aarch64.whl deleted file mode 100644 index 3836926312944453b048a65e7c13625eb6128467..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.0-py3-none-musllinux_1_2_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f826703197c3654ec426b3a2651057eb07496afb669c7d46f0aacf7844478a4 -size 500458 diff --git a/python/cactus_needle-3.0.0-py3-none-musllinux_1_2_x86_64.whl b/python/cactus_needle-3.0.0-py3-none-musllinux_1_2_x86_64.whl deleted file mode 100644 index 7738445794d8d537560552e3e320f74d903a15ea..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.0-py3-none-musllinux_1_2_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2b132474722ac032269782c2fa7ec459758ab43624843be4e3b16bf7cf7abee -size 530918 diff --git a/python/cactus_needle-3.0.0-py3-none-win_amd64.whl b/python/cactus_needle-3.0.0-py3-none-win_amd64.whl deleted file mode 100644 index b2fd14cb13040dd1b2a1834a0bb7a0c0a57e20d1..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.0-py3-none-win_amd64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06fde9731929f53a7033e57f037f9262f99a3cdc2758d8d7bffae91404fb8665 -size 547384 diff --git a/python/cactus_needle-3.0.0-py3-none-win_arm64.whl b/python/cactus_needle-3.0.0-py3-none-win_arm64.whl deleted file mode 100644 index f497b91506b54e8e81c307ed7b16ee96eb8e67c4..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.0-py3-none-win_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b1da56516304bbc2ba6ec819ab9e6f72aad2525f14d9327f15d2d5edc1f9423 -size 477839 diff --git a/python/cactus_needle-3.0.1-py3-none-macosx_11_0_arm64.whl b/python/cactus_needle-3.0.1-py3-none-macosx_11_0_arm64.whl deleted file mode 100644 index 33623ead2e7d80e96defb02729a55adca70c8127..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.1-py3-none-macosx_11_0_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:161c3aacfb6e54443925b389a69eb58a1861e60af19bbdf8f39d89992c5d7436 -size 387232 diff --git a/python/cactus_needle-3.0.1-py3-none-macosx_11_0_x86_64.whl b/python/cactus_needle-3.0.1-py3-none-macosx_11_0_x86_64.whl deleted file mode 100644 index 315976cb368a39dbc1398bd2e5edbdfe2dc5d62e..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.1-py3-none-macosx_11_0_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:941883e51fb2530706f1a115a0ea0062bb37501edaad8a6f08b85e12c4f5ca76 -size 431615 diff --git a/python/cactus_needle-3.0.1-py3-none-manylinux2014_aarch64.whl b/python/cactus_needle-3.0.1-py3-none-manylinux2014_aarch64.whl deleted file mode 100644 index 3136d56617a6437e55c7ede7f38066b9f0735cd5..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.1-py3-none-manylinux2014_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc0c550b64627ed20101d1ac6de736bf0d15fb592d649f24bacba4e7340fc3df -size 517746 diff --git a/python/cactus_needle-3.0.1-py3-none-manylinux2014_x86_64.whl b/python/cactus_needle-3.0.1-py3-none-manylinux2014_x86_64.whl deleted file mode 100644 index 6e1f4bf2613f528bf172bc201b9add76348699de..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.1-py3-none-manylinux2014_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05770ef9a85686583968ea15f62f9ad44217e078efdaa99559d3208bb8a369b0 -size 536871 diff --git a/python/cactus_needle-3.0.1-py3-none-musllinux_1_2_aarch64.whl b/python/cactus_needle-3.0.1-py3-none-musllinux_1_2_aarch64.whl deleted file mode 100644 index ac5eeceaedfaa27ada17707e0140a67fdb4cd5cc..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.1-py3-none-musllinux_1_2_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec307274ed14d8a11be448e1546d3a330704a8d76a96a2f99de12ca14ed8ee64 -size 517367 diff --git a/python/cactus_needle-3.0.1-py3-none-musllinux_1_2_x86_64.whl b/python/cactus_needle-3.0.1-py3-none-musllinux_1_2_x86_64.whl deleted file mode 100644 index 33e34a73ff845a49fa6d7210ddc4716925f8b1dd..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.1-py3-none-musllinux_1_2_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b2f5f560fcf8d2033c0ade7ea48d8f2f228cb17f53331bf844fcceb955440e0 -size 537929 diff --git a/python/cactus_needle-3.0.1-py3-none-win_amd64.whl b/python/cactus_needle-3.0.1-py3-none-win_amd64.whl deleted file mode 100644 index 7bfd09c93263dfc6b1d2c7add2df2df9994cad32..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.1-py3-none-win_amd64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d4467726814ab18d9ce32a8a5cc23d1198a2c0557c613a00bef738121903e2f -size 553581 diff --git a/python/cactus_needle-3.0.1-py3-none-win_arm64.whl b/python/cactus_needle-3.0.1-py3-none-win_arm64.whl deleted file mode 100644 index 0233062edd6c3dc4000ede12b0bd866c5420d228..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.1-py3-none-win_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfa6f8c15ca979bbe7c3e0579efdd8bf7b7afc75355e063cd00e6ac7732c9896 -size 493234 diff --git a/python/cactus_needle-3.0.2-py3-none-macosx_11_0_arm64.whl b/python/cactus_needle-3.0.2-py3-none-macosx_11_0_arm64.whl deleted file mode 100644 index 5b75f64910d829b650a0c956d1e71ab154c18b98..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.2-py3-none-macosx_11_0_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa6e730f3b3b46f103ba2bc1b268c402d497086030cce735846bee4d3abbf3d3 -size 387420 diff --git a/python/cactus_needle-3.0.2-py3-none-macosx_11_0_x86_64.whl b/python/cactus_needle-3.0.2-py3-none-macosx_11_0_x86_64.whl deleted file mode 100644 index cb9a771a3b139a35184a627466e1466545b831cf..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.2-py3-none-macosx_11_0_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cdec5cd39868f51204671cff18ca82d79de2809819f83284abade16088b1b779 -size 431850 diff --git a/python/cactus_needle-3.0.2-py3-none-manylinux2014_aarch64.whl b/python/cactus_needle-3.0.2-py3-none-manylinux2014_aarch64.whl deleted file mode 100644 index f7e93fedfaf374fa9c9b434886e1b92e30ea9088..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.2-py3-none-manylinux2014_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2d6d80d61e4492a633d7e7047b1c4b7b62325fa060b477107b007ac13e693f4 -size 518061 diff --git a/python/cactus_needle-3.0.2-py3-none-manylinux2014_x86_64.whl b/python/cactus_needle-3.0.2-py3-none-manylinux2014_x86_64.whl deleted file mode 100644 index bcdfd1c3b9767de026b9a6fe4922c4ba77c69d10..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.2-py3-none-manylinux2014_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2b8fb9ef216ee0cd286e18cc1e39f442d088e267c902ea95a00d2d2e3d0a7ef -size 537236 diff --git a/python/cactus_needle-3.0.2-py3-none-musllinux_1_2_aarch64.whl b/python/cactus_needle-3.0.2-py3-none-musllinux_1_2_aarch64.whl deleted file mode 100644 index 6fcb776efcf89d70cb086fe3950237eecc50e4c9..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.2-py3-none-musllinux_1_2_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:354983a45678d3ac6ac73b55145628be4ffc779bdc1920d83d346516344a776b -size 517651 diff --git a/python/cactus_needle-3.0.2-py3-none-musllinux_1_2_x86_64.whl b/python/cactus_needle-3.0.2-py3-none-musllinux_1_2_x86_64.whl deleted file mode 100644 index 9f7f12abe1c1c559ddb9b257193d6740e64787cc..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.2-py3-none-musllinux_1_2_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d24c5af3c01f02429ba908d69cfc57a80e029a43718f5f5790d7433f9e8e3f1b -size 538243 diff --git a/python/cactus_needle-3.0.2-py3-none-win_amd64.whl b/python/cactus_needle-3.0.2-py3-none-win_amd64.whl deleted file mode 100644 index 493e14006f533729182332a8125d575c824ea58a..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.2-py3-none-win_amd64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5468f63b33c145c23049501a8e78bf510bb70a408296afbe6b4c4136315529cb -size 553681 diff --git a/python/cactus_needle-3.0.2-py3-none-win_arm64.whl b/python/cactus_needle-3.0.2-py3-none-win_arm64.whl deleted file mode 100644 index 8a0a4b4d295027baae97a7be1c36c965921c4e56..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.0.2-py3-none-win_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d3896854982a7b8aaedf6251c7574a5b2c4937f1c5bcae58e571c000783c7c9 -size 493507 diff --git a/python/cactus_needle-3.1.0-py3-none-macosx_11_0_arm64.whl b/python/cactus_needle-3.1.0-py3-none-macosx_11_0_arm64.whl deleted file mode 100644 index b1d9ddbbec1d54c22bbe9a0bd00db244712b8d47..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.1.0-py3-none-macosx_11_0_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad1cba80ede4c058692370964eec4d881a1fdc80014f7210b2d13891bad7d1c6 -size 523657 diff --git a/python/cactus_needle-3.1.0-py3-none-macosx_11_0_x86_64.whl b/python/cactus_needle-3.1.0-py3-none-macosx_11_0_x86_64.whl deleted file mode 100644 index e8d622f2c93200da45d37f04d70442c9673fa481..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.1.0-py3-none-macosx_11_0_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31a90adbaa898ea65e92b370e80ba5830a346348022a913a8bb254ab7d20bad6 -size 575529 diff --git a/python/cactus_needle-3.1.0-py3-none-manylinux2014_aarch64.whl b/python/cactus_needle-3.1.0-py3-none-manylinux2014_aarch64.whl deleted file mode 100644 index fb67462c5449d3eef05934d484c543b8514ac20f..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.1.0-py3-none-manylinux2014_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2f30a1178856025ab4bf75ef75e1bf28b8d0552cdd5614f7d06cedc1f713606 -size 649611 diff --git a/python/cactus_needle-3.1.0-py3-none-manylinux2014_x86_64.whl b/python/cactus_needle-3.1.0-py3-none-manylinux2014_x86_64.whl deleted file mode 100644 index 8f4552bdcb14a003f11e958c25f09b3fb6ab29ff..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.1.0-py3-none-manylinux2014_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0fc2f682ef18525d4d18583081ac31c1f6f211abe6c0b3bee44811ed7e0347e -size 671203 diff --git a/python/cactus_needle-3.1.0-py3-none-musllinux_1_2_aarch64.whl b/python/cactus_needle-3.1.0-py3-none-musllinux_1_2_aarch64.whl deleted file mode 100644 index eaacfe4a494bda92ce1c1d7bce63ebaba8981439..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.1.0-py3-none-musllinux_1_2_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5e3c48b2c181d29117949f4f55c57cab8c3ccd08d782302b56489fde9c15f73 -size 649438 diff --git a/python/cactus_needle-3.1.0-py3-none-musllinux_1_2_x86_64.whl b/python/cactus_needle-3.1.0-py3-none-musllinux_1_2_x86_64.whl deleted file mode 100644 index 373a7c98733a0a209263a31936f20768ef7864c9..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.1.0-py3-none-musllinux_1_2_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:835ea0d5765704b65bfaf286e2e94aa2e6027b9494a18adf0fb845f2e3bc7a04 -size 672183 diff --git a/python/cactus_needle-3.1.0-py3-none-win_amd64.whl b/python/cactus_needle-3.1.0-py3-none-win_amd64.whl deleted file mode 100644 index 999a28c723480539ede597998a67e8fe36b85684..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.1.0-py3-none-win_amd64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f5fc86abfc50d551cdb237a34b501f36d82d4b6f5911ee7bec4e9532d44dd95 -size 683889 diff --git a/python/cactus_needle-3.1.0-py3-none-win_arm64.whl b/python/cactus_needle-3.1.0-py3-none-win_arm64.whl deleted file mode 100644 index 15a07c2b69fbda56c046f265f1eb6c0070e4cfab..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.1.0-py3-none-win_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39806d54910c207cd0ac5dc60009c8c5330072ef729711d74061faf0e99e7a6c -size 617795 diff --git a/python/cactus_needle-3.2.0-py3-none-macosx_11_0_arm64.whl b/python/cactus_needle-3.2.0-py3-none-macosx_11_0_arm64.whl deleted file mode 100644 index 949d8c69130a5cdebcdde9adc01285353c84c9af..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.2.0-py3-none-macosx_11_0_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b0887a43cd6e9a99009fabf35b231c11bb3a978ab8af94b8119b2eb76e19832 -size 535559 diff --git a/python/cactus_needle-3.2.0-py3-none-macosx_11_0_x86_64.whl b/python/cactus_needle-3.2.0-py3-none-macosx_11_0_x86_64.whl deleted file mode 100644 index 2be547ca5419584a5ecb7f27051fed23f06e10e8..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.2.0-py3-none-macosx_11_0_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2a60d538b138ecc5ac5a9b4d47ba8d078131d0af9e20e94cceb9329894d0f96 -size 588391 diff --git a/python/cactus_needle-3.2.0-py3-none-manylinux2014_aarch64.whl b/python/cactus_needle-3.2.0-py3-none-manylinux2014_aarch64.whl deleted file mode 100644 index d4b1a79ef0d38250a4d71f79041786652db41c84..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.2.0-py3-none-manylinux2014_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80871585c84a277eff24b43a9366958996be38f6f920c9d1f8a0d2a07f3ae51f -size 661328 diff --git a/python/cactus_needle-3.2.0-py3-none-manylinux2014_x86_64.whl b/python/cactus_needle-3.2.0-py3-none-manylinux2014_x86_64.whl deleted file mode 100644 index 3c681f708242d293debfb6cd90b7ed5a02cd578c..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.2.0-py3-none-manylinux2014_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e8a3bce4e52968ee14e8e9d47098e65ed06dd5b7c18cef3a7fa1375756736f9 -size 684813 diff --git a/python/cactus_needle-3.2.0-py3-none-musllinux_1_2_aarch64.whl b/python/cactus_needle-3.2.0-py3-none-musllinux_1_2_aarch64.whl deleted file mode 100644 index ab90c116fffa1ed4923c236b1ea06ea0b3b6bbb6..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.2.0-py3-none-musllinux_1_2_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:739dedd88473223720dd1fb8264cba6733d4bec39fec325bcfc0fb3c6c7df2bf -size 661083 diff --git a/python/cactus_needle-3.2.0-py3-none-musllinux_1_2_x86_64.whl b/python/cactus_needle-3.2.0-py3-none-musllinux_1_2_x86_64.whl deleted file mode 100644 index 21f70ed228beb0f6d5dc320c1836648b723108ba..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.2.0-py3-none-musllinux_1_2_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b91a479d0bb3a2d6a5b70e8b58db063ec5ae126c73a5e1a72dc9f9dd24e802fc -size 686017 diff --git a/python/cactus_needle-3.2.0-py3-none-win_amd64.whl b/python/cactus_needle-3.2.0-py3-none-win_amd64.whl deleted file mode 100644 index 1bffe39d2bf0fb50235a2ef8091f756deb98ccab..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.2.0-py3-none-win_amd64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bd41dc812a4b7e504f6ba294de65a363a51b031f154d24aac748b07249dc952 -size 696277 diff --git a/python/cactus_needle-3.2.0-py3-none-win_arm64.whl b/python/cactus_needle-3.2.0-py3-none-win_arm64.whl deleted file mode 100644 index dade91b3e0535fbc8906fbc1617d83c9a98aeb45..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.2.0-py3-none-win_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15000affa669b7e84e6303617312e04650a05e9c71e856bab075a0ad36ebe8cf -size 629797 diff --git a/python/cactus_needle-3.3.0-py3-none-macosx_11_0_arm64.whl b/python/cactus_needle-3.3.0-py3-none-macosx_11_0_arm64.whl deleted file mode 100644 index 7873379326a6c51e0b60305d9039cf23565c4252..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.0-py3-none-macosx_11_0_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b7e1ab53590fb10718f3e48197ac60160aab62a7d34ab3a2cdd4003f0438d04 -size 536882 diff --git a/python/cactus_needle-3.3.0-py3-none-macosx_11_0_x86_64.whl b/python/cactus_needle-3.3.0-py3-none-macosx_11_0_x86_64.whl deleted file mode 100644 index f2e4501b6e5028ca19d62de3c5bc973018258d65..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.0-py3-none-macosx_11_0_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b957061260b121c8f82a2d12a4a2e3162088c9688e40e0aa23010c23cdaaaafb -size 589916 diff --git a/python/cactus_needle-3.3.0-py3-none-manylinux2014_aarch64.whl b/python/cactus_needle-3.3.0-py3-none-manylinux2014_aarch64.whl deleted file mode 100644 index 9be346c8afdb379e13696e6bb2e4f567180f9803..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.0-py3-none-manylinux2014_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba5b381186036765f554ddd402d7757576c66a3d8ee4056661b33f1f78d5d5e5 -size 662839 diff --git a/python/cactus_needle-3.3.0-py3-none-manylinux2014_x86_64.whl b/python/cactus_needle-3.3.0-py3-none-manylinux2014_x86_64.whl deleted file mode 100644 index 0eaea41ba32e2d8710adee418246261b01065735..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.0-py3-none-manylinux2014_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33717a889ecc8d8bb59a1ba3982635176a66479cac61297242b86b9a1c94dc5b -size 686463 diff --git a/python/cactus_needle-3.3.0-py3-none-musllinux_1_2_aarch64.whl b/python/cactus_needle-3.3.0-py3-none-musllinux_1_2_aarch64.whl deleted file mode 100644 index a993da5be17b29b6eea2035e96e34472d658a7f7..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.0-py3-none-musllinux_1_2_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a6366bb08d97da4162335cd11645d245f65809d8bfd8519f77f6cb9d774b4e7 -size 662451 diff --git a/python/cactus_needle-3.3.0-py3-none-musllinux_1_2_x86_64.whl b/python/cactus_needle-3.3.0-py3-none-musllinux_1_2_x86_64.whl deleted file mode 100644 index 563f3b7ef3e9619a4774137d7aeab7eb1feef3a4..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.0-py3-none-musllinux_1_2_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec266d559b48bf0df5dafdb6039a934bce7da5613dc73a3ab3cd01e54e9e0185 -size 687548 diff --git a/python/cactus_needle-3.3.0-py3-none-win_amd64.whl b/python/cactus_needle-3.3.0-py3-none-win_amd64.whl deleted file mode 100644 index f2e00ea82ebc61c6d3c6f7a2ccdcc8dfcc2630d8..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.0-py3-none-win_amd64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa94edc26d1e746ab994acd1afad3bfdebabc177bd8d96e30c90cf76cb9862e5 -size 697557 diff --git a/python/cactus_needle-3.3.0-py3-none-win_arm64.whl b/python/cactus_needle-3.3.0-py3-none-win_arm64.whl deleted file mode 100644 index 08c2350f5129d43e3ac60b46801fd9bdbf908aa3..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.0-py3-none-win_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4210777ef91f877f0b5da3351583e52d962b62a972b3c4832d365ba965a50c1 -size 630949 diff --git a/python/cactus_needle-3.3.1-py3-none-macosx_11_0_arm64.whl b/python/cactus_needle-3.3.1-py3-none-macosx_11_0_arm64.whl deleted file mode 100644 index 33bc7de5cb8b141d44432fde310e73952b4953e7..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.1-py3-none-macosx_11_0_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19534f411ad71312031d6df5418d0e55b8d16075c28a217aef4b921349bdfb4a -size 538290 diff --git a/python/cactus_needle-3.3.1-py3-none-macosx_11_0_x86_64.whl b/python/cactus_needle-3.3.1-py3-none-macosx_11_0_x86_64.whl deleted file mode 100644 index 17f07bf040fe37da697dc0f48046ff12d3d0a778..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.1-py3-none-macosx_11_0_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e74ac1204ffe29d75db1215d889ad46c8add39e52042df22cd99c2e37855c273 -size 591609 diff --git a/python/cactus_needle-3.3.1-py3-none-manylinux2014_aarch64.whl b/python/cactus_needle-3.3.1-py3-none-manylinux2014_aarch64.whl deleted file mode 100644 index ebd2dc8e2c6cafbeed064f06a3543ae9d024dc01..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.1-py3-none-manylinux2014_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3128efab8a8cf9f8381a6ea38eee3db66d85746260489563513160940dcbaf63 -size 664725 diff --git a/python/cactus_needle-3.3.1-py3-none-manylinux2014_x86_64.whl b/python/cactus_needle-3.3.1-py3-none-manylinux2014_x86_64.whl deleted file mode 100644 index 3851dae09e60961b1e0c23da3a9717fc71609b37..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.1-py3-none-manylinux2014_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3de03a183f56e28f8f1945fbbc5048efca0699a7f3ed0d66a244ca7e30442c22 -size 688340 diff --git a/python/cactus_needle-3.3.1-py3-none-musllinux_1_2_aarch64.whl b/python/cactus_needle-3.3.1-py3-none-musllinux_1_2_aarch64.whl deleted file mode 100644 index d2cdd3d88e398d490c755e426e14d69f28d2dfaf..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.1-py3-none-musllinux_1_2_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5c73a77cdcdde4b614d8e618c0338d1c8c7be6e32f8d5b6c06f27ffa467ce66 -size 664325 diff --git a/python/cactus_needle-3.3.1-py3-none-musllinux_1_2_x86_64.whl b/python/cactus_needle-3.3.1-py3-none-musllinux_1_2_x86_64.whl deleted file mode 100644 index ed56a83d0904008ab385a7cca167f8375e9616a0..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.1-py3-none-musllinux_1_2_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d40a1253993426227095e5886294bf0baccace8ec3fce677bc3cc1deacc058a -size 689469 diff --git a/python/cactus_needle-3.3.1-py3-none-win_amd64.whl b/python/cactus_needle-3.3.1-py3-none-win_amd64.whl deleted file mode 100644 index e6f99f4970b35364a291d2491a602876979742ce..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.1-py3-none-win_amd64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e50c5fa983c8737de200d9e96af937dd8135371ca557fe8c7c9eb1adba39f5a -size 699518 diff --git a/python/cactus_needle-3.3.1-py3-none-win_arm64.whl b/python/cactus_needle-3.3.1-py3-none-win_arm64.whl deleted file mode 100644 index 765e057a497f2933587c129a7a9f6435e0b6b976..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.1-py3-none-win_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4387a5fbca30b4bd7da6b8bb7674a888c26d507f0da2723885f64e9a39f3f437 -size 632468 diff --git a/python/cactus_needle-3.3.2-py3-none-macosx_11_0_arm64.whl b/python/cactus_needle-3.3.2-py3-none-macosx_11_0_arm64.whl deleted file mode 100644 index 26858a4294a977d708eac3f6c4801418701beec2..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.2-py3-none-macosx_11_0_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9c411c39aaf46aa915634521ad95d482dd109164b8fb92d427ec78923202a8a -size 544104 diff --git a/python/cactus_needle-3.3.2-py3-none-macosx_11_0_x86_64.whl b/python/cactus_needle-3.3.2-py3-none-macosx_11_0_x86_64.whl deleted file mode 100644 index d02d08a767c097e42e44a650e5ebae66080c15a6..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.2-py3-none-macosx_11_0_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:697a3a1b8f0ad3cd478231a955e61913d0e8afd223b7faaad01ef3849fc5dd55 -size 571426 diff --git a/python/cactus_needle-3.3.2-py3-none-manylinux2014_aarch64.whl b/python/cactus_needle-3.3.2-py3-none-manylinux2014_aarch64.whl deleted file mode 100644 index 8d9a6ff6402d6f65527eec72deed4022c0b53d17..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.2-py3-none-manylinux2014_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b395560f7fa696d73aad5ced0cc091ee22f89e231ce79a2854f759fcdf3af69d -size 664916 diff --git a/python/cactus_needle-3.3.2-py3-none-manylinux2014_x86_64.whl b/python/cactus_needle-3.3.2-py3-none-manylinux2014_x86_64.whl deleted file mode 100644 index 962157c19b8b2fd3b9839d8b500b0501fddfccc3..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.2-py3-none-manylinux2014_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8948bb145e061f4243459dd900e3ce2353f63c4acb7ca6eca8cb85e15d292225 -size 688816 diff --git a/python/cactus_needle-3.3.2-py3-none-musllinux_1_2_aarch64.whl b/python/cactus_needle-3.3.2-py3-none-musllinux_1_2_aarch64.whl deleted file mode 100644 index d8878e48cb43a8d6da3f4f3cf258f31714242088..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.2-py3-none-musllinux_1_2_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0df22e61f4989da1e2e9463951180a3796eb914c2b1e045c1b417600bcdbea09 -size 664635 diff --git a/python/cactus_needle-3.3.2-py3-none-musllinux_1_2_x86_64.whl b/python/cactus_needle-3.3.2-py3-none-musllinux_1_2_x86_64.whl deleted file mode 100644 index 92a07da24995ad198ab19631921b86c6bbf644d2..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.2-py3-none-musllinux_1_2_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56ec08ce33ffd10ed48867cfb5f7f94825f10d3a150f7db6aeb514bbec32adc3 -size 689835 diff --git a/python/cactus_needle-3.3.2-py3-none-win_amd64.whl b/python/cactus_needle-3.3.2-py3-none-win_amd64.whl deleted file mode 100644 index d798261761bc69c1099ac6974a8108747e6aece7..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.2-py3-none-win_amd64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c99f8590a54e589db27fc4d2d1808ce4e2e46b17daf3738a014403caefedf9dc -size 700215 diff --git a/python/cactus_needle-3.3.2-py3-none-win_arm64.whl b/python/cactus_needle-3.3.2-py3-none-win_arm64.whl deleted file mode 100644 index 4deb36500e30b5cba5bcd99c1fa44ab1f3cd5ed7..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.2-py3-none-win_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b76b81fa6cb13136b7c5053120ee0fe9eba98fc417c20161c0be035359d57c3 -size 632713 diff --git a/python/cactus_needle-3.3.3-py3-none-macosx_11_0_arm64.whl b/python/cactus_needle-3.3.3-py3-none-macosx_11_0_arm64.whl deleted file mode 100644 index 9a869fa0ba9a2956d677f72aab6d1ede46b57be9..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.3-py3-none-macosx_11_0_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5538e045fb26f0b6f911102516582d4434fbfa38aa28e5c2f3eb990b92aaf8d -size 544605 diff --git a/python/cactus_needle-3.3.3-py3-none-macosx_11_0_x86_64.whl b/python/cactus_needle-3.3.3-py3-none-macosx_11_0_x86_64.whl deleted file mode 100644 index 8e038552a9a3558a28a979ba4980f326829a645c..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.3-py3-none-macosx_11_0_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:504b4e14dccff1d9a0591fcd78cc18063b99be396f6935a1c2b8189f0f8de89d -size 572094 diff --git a/python/cactus_needle-3.3.3-py3-none-manylinux2014_aarch64.whl b/python/cactus_needle-3.3.3-py3-none-manylinux2014_aarch64.whl deleted file mode 100644 index 02b11fdc5fee8cdd7e174d9e2755fd3dd8caf155..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.3-py3-none-manylinux2014_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cda9aa23eec3cc2cc6fea43ae5ba32b9d39a1487a198d8e2d86c1314dfe04873 -size 665786 diff --git a/python/cactus_needle-3.3.3-py3-none-manylinux2014_x86_64.whl b/python/cactus_needle-3.3.3-py3-none-manylinux2014_x86_64.whl deleted file mode 100644 index 46c137c330aebf1c9ae58c45cff088f6d87b1f87..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.3-py3-none-manylinux2014_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b909897e11cf4da9566df6370f8a63564693fbd6edeaac0b8678b71865d4dc24 -size 689201 diff --git a/python/cactus_needle-3.3.3-py3-none-musllinux_1_2_aarch64.whl b/python/cactus_needle-3.3.3-py3-none-musllinux_1_2_aarch64.whl deleted file mode 100644 index 97ab04e473af3e8adb44b87613b9493a436afd48..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.3-py3-none-musllinux_1_2_aarch64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a67c61a1712472ccb85ea94e7ce9817dff84c9cb6d5e0ebbac30b464b9a791db -size 665522 diff --git a/python/cactus_needle-3.3.3-py3-none-musllinux_1_2_x86_64.whl b/python/cactus_needle-3.3.3-py3-none-musllinux_1_2_x86_64.whl deleted file mode 100644 index 097673e381f824897e9b00128163d355edd88080..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.3-py3-none-musllinux_1_2_x86_64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f00d79500fac006f3c7a66f6a68cf60676e7026e26d5fa8108fce5691f43620d -size 690240 diff --git a/python/cactus_needle-3.3.3-py3-none-win_amd64.whl b/python/cactus_needle-3.3.3-py3-none-win_amd64.whl deleted file mode 100644 index b102d284f1202bff723672b71d400b767cc13c26..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.3-py3-none-win_amd64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6447b2be7426b7ff3b06360b15a90a8b7870e3fa2275023e20541d5e8d81bdb -size 700859 diff --git a/python/cactus_needle-3.3.3-py3-none-win_arm64.whl b/python/cactus_needle-3.3.3-py3-none-win_arm64.whl deleted file mode 100644 index c22b8e3c13f69173aca005dd49e256ffe657d919..0000000000000000000000000000000000000000 --- a/python/cactus_needle-3.3.3-py3-none-win_arm64.whl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92e4f0edc33f83cf2a67b878d74ec39ec2a2941f0fbbc7f5832c68301e81fb22 -size 633345 diff --git a/tvos-arm64/libneedle.a b/tvos-arm64/libneedle.a deleted file mode 100644 index 8db3e6d7ee593bff2c0748b2418ccab810f7233c..0000000000000000000000000000000000000000 --- a/tvos-arm64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1859f9cf4122ef14e17e4de3206f75866522f581dccef85c0d5a9a9b1b5ffe0a -size 1501688 diff --git a/tvos-arm64/needle.h b/tvos-arm64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/tvos-arm64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/wasm-component/needle.component.wasm b/wasm-component/needle.component.wasm deleted file mode 100644 index 3cce1cd985b934bbb1d2105e327f1afdc2b93f71..0000000000000000000000000000000000000000 --- a/wasm-component/needle.component.wasm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3094afd26ce0d3961267c1e2c1b6535bdfab5f4c9a32778b78a740bc0a1fef43 -size 4478225 diff --git a/wasm-component/needle.wit b/wasm-component/needle.wit deleted file mode 100644 index de3ad2bff5e4096e4d38415bea159eb01aace1f9..0000000000000000000000000000000000000000 --- a/wasm-component/needle.wit +++ /dev/null @@ -1,27 +0,0 @@ -package cactus:needle@3.0.0; - -interface engine { - record failure { - code: s32, - message: string, - } - - load: func(model: list) -> result<_, failure>; - init: func( - system-prompt: option, - tools-json: option, - tool-index-path: option, - ) -> result; - complete: func( - input: string, - max-new-tokens: u32, - ) -> result; - embed: func( - input: string, - ) -> result, failure>; - reset: func(); -} - -world needle { - export engine; -} diff --git a/wasm/needle.h b/wasm/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/wasm/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/wasm/needle.js b/wasm/needle.js deleted file mode 100644 index 12f403cf1f2aff48ad5ba0bda9672dac2303247d..0000000000000000000000000000000000000000 --- a/wasm/needle.js +++ /dev/null @@ -1,2 +0,0 @@ -var createNeedle=(()=>{var _scriptName=globalThis.document?.currentScript?.src;return async function(moduleArg={}){var Module=moduleArg;var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var programArgs=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};if(typeof __filename!="undefined"){_scriptName=__filename}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";function locateFile(path){return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("node:fs");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}programArgs=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var isFileURI=filename=>filename.startsWith("file://");class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["r"]();FS.ignorePermissions=false}function postRun(){}function abort(what){what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("needle.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP64;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU64;var HEAPU8;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);uncaughtExceptionCount++;abort()};var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(ENVIRONMENT_IS_NODE){var nodeCrypto=require("node:crypto");return view=>(nodeCrypto.randomFillSync(view),0)}return view=>(crypto.getRandomValues(view),0)};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var zeroMemory=(ptr,size)=>HEAPU8.fill(0,ptr,ptr+size);var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(ptr)zeroMemory(ptr,size);return ptr};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=MEMFS.emptyFileContents??=new Uint8Array(0)}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){return node.contents.subarray(0,node.usedBytes)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents.length;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity)newCapacity=Math.max(newCapacity,256);var oldContents=MEMFS.getFileDataAsTypedArray(node);node.contents=new Uint8Array(newCapacity);node.contents.set(oldContents)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;var oldContents=node.contents;node.contents=new Uint8Array(newSize);node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)));node.usedBytes=newSize},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack=""}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);buffer.set(contents.subarray(position,position+size),offset);return size},write(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HEAP8.buffer){canOwn=false}if(!length)return 0;var node=stream.node;node.mtime=node.ctime=Date.now();if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length}else{MEMFS.expandFileStorage(node,position+length);node.contents.set(buffer.subarray(offset,offset+length),position);node.usedBytes=Math.max(node.usedBytes,position+length)}return length},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}if(contents){if(position>0||position+length{if(typeof str!="string")return str;var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_fileDataToTypedArray=data=>{if(typeof data=="string"){data=intArrayFromString(data,true)}if(!data.subarray){data=new Uint8Array(data)}return data};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}};var addRunDependency=id=>{runDependencies++};var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}if(perms.includes("w")&&!(node.mode&146)){return 2}if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else if(FS.isDir(node.mode)){return 31}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}var mode=FS.flagsToPermissionString(flags);if(FS.isDir(node.mode)){if(mode!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,mode)},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);try{setattr(arg,attr)}catch(e){if(e instanceof RangeError){throw new FS.ErrnoError(22)}throw e}},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var setattr=FS.checkOpExists(node.node_ops.setattr,63);setattr(node,{atime,mtime})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=FS_modeStringToFlags(flags);if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags??0;opts.encoding=opts.encoding??"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags??577;var stream=FS.open(path,opts.flags,opts.mode);data=FS_fileDataToTypedArray(data);FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn);FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){data=FS_fileDataToTypedArray(data);FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}},createDevice(parent,name,input,output){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort(`invalid range (${from}, ${to}) or no bytes requested!`);if(to>datalength-1)abort(`only ${datalength} bytes available! programmer error!`);var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText??"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var SYSCALLS={currentUmask:18,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAPU32[buf>>2]=stat.dev;HEAPU32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAPU32[buf+12>>2]=stat.uid;HEAPU32[buf+16>>2]=stat.gid;HEAPU32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAPU32[buf+4>>2]=stats.bsize;HEAPU32[buf+60>>2]=stats.bsize;HEAP64[buf+8>>3]=BigInt(stats.blocks);HEAP64[buf+16>>3]=BigInt(stats.bfree);HEAP64[buf+24>>3]=BigInt(stats.bavail);HEAP64[buf+32>>3]=BigInt(stats.files);HEAP64[buf+40>>3]=BigInt(stats.ffree);HEAPU32[buf+48>>2]=stats.fsid;HEAPU32[buf+64>>2]=stats.flags;HEAPU32[buf+56>>2]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.subarray(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();var mask=289792;stream.flags=stream.flags&~mask|arg&mask;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21537:case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;if(flags&64){mode&=~SYSCALLS.currentUmask}return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(!flags){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{return-28}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function __munmap_js(addr,len,prot,flags,fd,offset){offset=bigintToI53Checked(offset);try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _emscripten_get_now=()=>performance.now();var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}var getHeapMax=()=>2147483648;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram;var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 22;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();{if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"]}Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["UTF8ToString"]=UTF8ToString;var _needle_last_error,_needle_init,_needle_reset,_needle_stream_transcribe_process,_needle_stream_transcribe_stop,_needle_transcribe,_needle_load,_needle_models,_needle_set_audio,_needle_complete,_needle_embed,_free,_malloc,_emscripten_builtin_memalign,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_needle_last_error=Module["_needle_last_error"]=wasmExports["s"];_needle_init=Module["_needle_init"]=wasmExports["t"];_needle_reset=Module["_needle_reset"]=wasmExports["u"];_needle_stream_transcribe_process=Module["_needle_stream_transcribe_process"]=wasmExports["v"];_needle_stream_transcribe_stop=Module["_needle_stream_transcribe_stop"]=wasmExports["w"];_needle_transcribe=Module["_needle_transcribe"]=wasmExports["x"];_needle_load=Module["_needle_load"]=wasmExports["y"];_needle_models=Module["_needle_models"]=wasmExports["z"];_needle_set_audio=Module["_needle_set_audio"]=wasmExports["A"];_needle_complete=Module["_needle_complete"]=wasmExports["B"];_needle_embed=Module["_needle_embed"]=wasmExports["C"];_free=Module["_free"]=wasmExports["D"];_malloc=Module["_malloc"]=wasmExports["E"];_emscripten_builtin_memalign=wasmExports["F"];__emscripten_stack_restore=wasmExports["G"];__emscripten_stack_alloc=wasmExports["H"];_emscripten_stack_get_current=wasmExports["I"];memory=wasmMemory=wasmExports["q"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={a:___cxa_throw,d:___syscall_fcntl64,i:___syscall_ioctl,p:___syscall_openat,n:___syscall_rmdir,o:___syscall_unlinkat,e:__abort_js,f:__munmap_js,l:_clock_time_get,m:_emscripten_resize_heap,j:_environ_get,k:_environ_sizes_get,b:_fd_close,h:_fd_read,g:_fd_seek,c:_fd_write};async function run(){preRun();if(runDependencies>0){await new Promise(resolve=>dependenciesFulfilled=resolve)}if(ABORT)return;initRuntime();postRun()}var wasmExports;wasmExports=await createWasm();await run(); -;return Module}})();if(typeof exports==="object"&&typeof module==="object"){module.exports=createNeedle;module.exports.default=createNeedle}else if(typeof define==="function"&&define["amd"])define([],()=>createNeedle); diff --git a/wasm/needle.wasm b/wasm/needle.wasm deleted file mode 100644 index 1b9d5986ca6d9909cd7d476f5132cdf95690e608..0000000000000000000000000000000000000000 --- a/wasm/needle.wasm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b73d09c17923bf81d6bdb82e19b3c343b8994f83d512ddec52eec9f6b029802 -size 930545 diff --git a/watchos-arm64/libneedle.a b/watchos-arm64/libneedle.a deleted file mode 100644 index 8def32307022b93f376834d69fb73a30457c0388..0000000000000000000000000000000000000000 --- a/watchos-arm64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f794e7996701ea83d98d0670c23aeb8c7a4519adc9526c1489f1e08046e12f9c -size 3011160 diff --git a/watchos-arm64/needle.h b/watchos-arm64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/watchos-arm64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/windows-arm64/libneedle.a b/windows-arm64/libneedle.a deleted file mode 100644 index ed3106171d80cf0af4cb2b60234de906b24c97a5..0000000000000000000000000000000000000000 --- a/windows-arm64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa4f3fc2ee6614bb34c42a06fd2f08b23c5c1b941c11612bff0947f66112edf4 -size 2129500 diff --git a/windows-arm64/needle.exe b/windows-arm64/needle.exe deleted file mode 100644 index ff9003d6c8afbb62c1bb1a4eece878c453a589fa..0000000000000000000000000000000000000000 --- a/windows-arm64/needle.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64a0e0d269fbc87e839551a5396575b604e77706e9ad18dd2969c30e97f752df -size 1359360 diff --git a/windows-arm64/needle.h b/windows-arm64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/windows-arm64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/windows-x86_64/libneedle.a b/windows-x86_64/libneedle.a deleted file mode 100644 index f2b4f37f92a0b9893bd90c3c4d090e2a181b8cce..0000000000000000000000000000000000000000 --- a/windows-x86_64/libneedle.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22d95a38f34c225a6af115c40069ea61360766479222862f1fea8b615ea7718a -size 2347552 diff --git a/windows-x86_64/needle.exe b/windows-x86_64/needle.exe deleted file mode 100644 index d0be7e1c78af8e9ee27db883a0159165c870fa8f..0000000000000000000000000000000000000000 --- a/windows-x86_64/needle.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d4bc1da8c51f5600f5c4f4bb4a92e0abe142fae7b69e695ccab93e6745c883d -size 1570816 diff --git a/windows-x86_64/needle.h b/windows-x86_64/needle.h deleted file mode 100644 index 170c4b9b51a6196a53e7be7ea11adbdbe7ad7f8c..0000000000000000000000000000000000000000 --- a/windows-x86_64/needle.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef NEEDLE_H -#define NEEDLE_H - -#ifndef NEEDLE_API -#define NEEDLE_API __attribute__((visibility("default"))) -#endif - -#define NEEDLE_TEXT 1 -#define NEEDLE_SPEECH 2 - -#ifdef __cplusplus -extern "C" { -#endif - -/* One process-global, non-thread-safe model per kind, text and speech. - Negative returns indicate failure; call needle_last_error() for the specific - reason. needle_load reads whichever kind the .cact holds and keeps the other, - so a build with both models takes one call per model. */ -NEEDLE_API int needle_load( - const unsigned char* cact, - unsigned long long n -); - -/* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */ -NEEDLE_API int needle_models(void); - -/* Last process-global error, owned by the runtime and valid until the next API call. */ -NEEDLE_API const char* needle_last_error(void); - -/* needle_init returns the tokenized static-prefix length on success. It can fail - when the system prompt plus statically-declared tools exceed the context - window, and reports the measured token count when it does. */ -NEEDLE_API int needle_init( - const char* system_prompt, - const char* tools_json, - const char* tool_index_path -); - -/* Answers text or speech: exactly one of input and pcm is non-null. Given pcm, - the engine transcribes the clip with the loaded speech model, answers the - transcript, and merges the speech fields into the same JSON object under an - audio_ prefix. needle_set_audio chooses how that transcription runs. */ -NEEDLE_API int needle_complete( - const char* input, - const float* pcm, - int samples, - int max_new_tokens, - char* out, - int out_capacity -); - -/* Language, keywords and word timestamps for the transcription needle_complete - runs for itself, with the meanings they have in needle_transcribe. The - strings are copied. Defaults: detect the language, no keywords, no times. */ -NEEDLE_API void needle_set_audio( - const char* language, - const char* keywords, - int word_timestamps -); - -NEEDLE_API void needle_reset(void); - -/* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the - number of tokens in the transcript. Up to 30 s runs as one pass; longer audio - runs as consecutive 30 s windows, each decoded once and cut at its last - sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or - "pl", or NULL to detect it. keywords is NULL or newline-separated words and - phrases for keyword biasing. out receives JSON with the transcript, the - language used, the milliseconds to the first token and the decoder's tokens - per second after it; silence and steady noise give an empty text and language: - {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0} - A non-zero word_timestamps adds each word with times in seconds: - "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */ -NEEDLE_API int needle_transcribe( - const float* pcm, - int samples, - const char* language, - const char* keywords, - int word_timestamps, - char* out, - int out_capacity -); - -/* Live transcription: appends 16 kHz mono float PCM, about one second at a - time, re-transcribes the buffered audio and commits the words two consecutive - passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in - needle_transcribe. out receives the words this call committed, with times in - seconds from the start of the stream, and the unconfirmed tail; returns the - number of words committed: - {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}], - "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */ -NEEDLE_API int needle_stream_transcribe_process( - const float* pcm, - int samples, - const char* language, - const char* keywords, - char* out, - int out_capacity -); - -/* Ends the stream: the tail becomes the committed words of out, and the next - needle_stream_transcribe_process starts a new stream. */ -NEEDLE_API int needle_stream_transcribe_stop( - char* out, - int out_capacity -); - -/* Embeds text or speech: exactly one of input and pcm is non-null. Text returns - the model's embedding dimension, speech one row of that width per 80 ms frame, - flattened. A null output returns the float count without computing. */ -NEEDLE_API int needle_embed( - const char* input, - const float* pcm, - int samples, - float* out, - int out_capacity -); - -#ifdef __cplusplus -} -#endif -#endif