From eeb01a3e6af12b5831adfd5942d86d8c1abc9438 Mon Sep 17 00:00:00 2001 From: Will Killian <2007799+willkill07@users.noreply.github.com> Date: Thu, 14 May 2026 14:31:52 -0400 Subject: [PATCH 1/9] fix: address outstanding sonar issues (#104) #### Overview Addresses the open Sonar maintainability findings reported on `release/0.2` by reducing Rust cognitive complexity and replacing duplicated Go test literals. - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details - Split observability doctor and plugin editor control-flow into smaller helper functions. - Split OpenAI Responses request encoding overlays into focused helper functions. - Added constants for duplicated Go observability test literals. #### Where should the reviewer start? Start with `crates/core/src/codec/openai_responses.rs`, then review the smaller CLI refactors in `crates/cli/src/doctor.rs` and `crates/cli/src/plugins.rs`. #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Relates to: none ## Summary by CodeRabbit * **Refactor** * Enhanced code organization in observability component checking, plugin configuration editing, and OpenAI response encoding for improved internal structure and maintainability. * **Tests** * Standardized error message formatting in observability plugin tests for improved consistency and clearer diagnostic output during test failures. [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NeMo-Flow/pull/104) Authors: - Will Killian (https://github.com/willkill07) Approvers: - Ajay Thorve (https://github.com/AjayThorve) URL: https://github.com/NVIDIA/NeMo-Flow/pull/104 --- crates/cli/src/doctor.rs | 70 ++++---- crates/cli/src/plugins.rs | 137 ++++++++++----- crates/core/src/codec/openai_responses.rs | 194 +++++++++++++--------- go/nemo_flow/observability_plugin_test.go | 20 ++- 4 files changed, 263 insertions(+), 158 deletions(-) diff --git a/crates/cli/src/doctor.rs b/crates/cli/src/doctor.rs index 1eded232..c21f149b 100644 --- a/crates/cli/src/doctor.rs +++ b/crates/cli/src/doctor.rs @@ -525,41 +525,55 @@ async fn collect_observability(gateway: &GatewayConfig) -> Vec { async fn collect_observability_component_checks(checks: &mut Vec, config: &Value) { for section in ["atof", "atif"] { - if section_enabled(config, section) { - let label = if section == "atof" { - "ATOF dir" - } else { - "ATIF dir" - }; - match section_output_directory(config, section) { - Some(path) => checks.push(check_directory(label, &path)), - None => checks.push(Check { - name: label, - status: Status::Info, - details: "enabled; using runtime default output directory".into(), - }), - } + if let Some(check) = observability_file_exporter_check(config, section) { + checks.push(check); } } for section in ["opentelemetry", "openinference"] { - if section_enabled(config, section) { - let label = if section == "opentelemetry" { - "OpenTelemetry endpoint" - } else { - "OpenInference endpoint" - }; - match section_endpoint(config, section) { - Some(endpoint) => checks.push(probe_http_named(label, &endpoint).await), - None => checks.push(Check { - name: label, - status: Status::Info, - details: "enabled; using exporter default endpoint".into(), - }), - } + if let Some(check) = observability_http_exporter_check(config, section).await { + checks.push(check); } } } +fn observability_file_exporter_check(config: &Value, section: &str) -> Option { + if !section_enabled(config, section) { + return None; + } + let label = if section == "atof" { + "ATOF dir" + } else { + "ATIF dir" + }; + Some(match section_output_directory(config, section) { + Some(path) => check_directory(label, &path), + None => Check { + name: label, + status: Status::Info, + details: "enabled; using runtime default output directory".into(), + }, + }) +} + +async fn observability_http_exporter_check(config: &Value, section: &str) -> Option { + if !section_enabled(config, section) { + return None; + } + let label = if section == "opentelemetry" { + "OpenTelemetry endpoint" + } else { + "OpenInference endpoint" + }; + Some(match section_endpoint(config, section) { + Some(endpoint) => probe_http_named(label, &endpoint).await, + None => Check { + name: label, + status: Status::Info, + details: "enabled; using exporter default endpoint".into(), + }, + }) +} + fn observability_component_config(plugin_value: &Value) -> Option<&Value> { plugin_value .get("components") diff --git a/crates/cli/src/plugins.rs b/crates/cli/src/plugins.rs index d92258c3..3def100e 100644 --- a/crates/cli/src/plugins.rs +++ b/crates/cli/src/plugins.rs @@ -463,28 +463,7 @@ fn edit_section( .ok_or_else(|| CliError::Config(format!("{} is not an editable section", section.name)))? .fields; loop { - let mut items = Vec::new(); - if section_has_enabled_toggle(section) { - let enabled = section_enabled(config, section).unwrap_or(false); - items.push(MenuItem::new(format!( - "Toggle section [{}]", - status_label(enabled) - ))); - } - for field in fields { - let configured = section_field_configured(config, section, *field)?; - items.push(MenuItem::new(format!( - "{} = {}", - configured_label(configured, field.name), - section_field_value(config, section, field.name)? - .map(|value| display_field_value(section, *field, &value)) - .or_else(|| default_field_value(section, *field) - .map(|value| format!("{} (default)", display_value(&value)))) - .unwrap_or_else(|| "(default)".to_string()) - ))); - } - items.push(MenuItem::new(shortcut_label("Reset section", "r"))); - items.push(MenuItem::new(shortcut_label("Back", "q"))); + let items = section_menu_items(config, section, fields)?; let selection = prompt_menu(theme, section.name, &items, 0)?; let selection = match selection { MenuResponse::Selected(selection) => selection, @@ -493,14 +472,7 @@ fn edit_section( continue; } MenuResponse::Shortcut(MenuShortcut::Reset, selected) => { - if reset_selected_field(config, section, fields, selected)? { - continue; - } - let reset_section_index = - usize::from(section_has_enabled_toggle(section)) + fields.len(); - if selected == reset_section_index { - reset_section(config, section); - } + reset_selected_item(config, section, fields, selected)?; continue; } MenuResponse::Shortcut(MenuShortcut::Clear, selected) => { @@ -516,24 +488,91 @@ fn edit_section( } MenuResponse::Cancel => return Ok(()), }; - let mut index = selection; - if section_has_enabled_toggle(section) { - if index == 0 { - toggle_section(config, section); - continue; - } - index -= 1; - } - if index < fields.len() { - edit_field(theme, config, section, &fields[index])?; - } else if index == fields.len() { - reset_section(config, section); - } else { + if !edit_selected_section_item(theme, config, section, fields, selection)? { return Ok(()); } } } +fn section_menu_items( + config: &ObservabilityConfig, + section: EditorFieldSpec, + fields: &[EditorFieldSpec], +) -> Result, CliError> { + let mut items = Vec::new(); + if section_has_enabled_toggle(section) { + let enabled = section_enabled(config, section).unwrap_or(false); + items.push(MenuItem::new(format!( + "Toggle section [{}]", + status_label(enabled) + ))); + } + for field in fields { + items.push(section_field_menu_item(config, section, *field)?); + } + items.push(MenuItem::new(shortcut_label("Reset section", "r"))); + items.push(MenuItem::new(shortcut_label("Back", "q"))); + Ok(items) +} + +fn section_field_menu_item( + config: &ObservabilityConfig, + section: EditorFieldSpec, + field: EditorFieldSpec, +) -> Result { + let configured = section_field_configured(config, section, field)?; + let value = section_field_value(config, section, field.name)? + .map(|value| display_field_value(section, field, &value)) + .or_else(|| { + default_field_value(section, field) + .map(|value| format!("{} (default)", display_value(&value))) + }) + .unwrap_or_else(|| "(default)".to_string()); + Ok(MenuItem::new(format!( + "{} = {}", + configured_label(configured, field.name), + value + ))) +} + +fn reset_selected_item( + config: &mut ObservabilityConfig, + section: EditorFieldSpec, + fields: &[EditorFieldSpec], + selected: usize, +) -> Result<(), CliError> { + if reset_selected_field(config, section, fields, selected)? { + return Ok(()); + } + if selected == reset_section_index(section, fields) { + reset_section(config, section); + } + Ok(()) +} + +fn edit_selected_section_item( + theme: &ColorfulTheme, + config: &mut ObservabilityConfig, + section: EditorFieldSpec, + fields: &[EditorFieldSpec], + selection: usize, +) -> Result { + if section_has_enabled_toggle(section) && selection == 0 { + toggle_section(config, section); + return Ok(true); + } + let index = selected_field_index(section, selection); + if let Some(field) = fields.get(index) { + edit_field(theme, config, section, field)?; + return Ok(true); + } + if index == fields.len() { + reset_section(config, section); + return Ok(true); + } + Ok(false) +} + fn edit_field( theme: &ColorfulTheme, config: &mut ObservabilityConfig, @@ -755,6 +794,18 @@ fn reset_selected_field( Ok(true) } +fn selected_field_index(section: EditorFieldSpec, selected: usize) -> usize { + let mut index = selected; + if section_has_enabled_toggle(section) { + index -= 1; + } + index +} + +fn reset_section_index(section: EditorFieldSpec, fields: &[EditorFieldSpec]) -> usize { + usize::from(section_has_enabled_toggle(section)) + fields.len() +} + fn section_has_enabled_toggle(section: EditorFieldSpec) -> bool { section.name != POLICY_SECTION && section diff --git a/crates/core/src/codec/openai_responses.rs b/crates/core/src/codec/openai_responses.rs index be82e8db..8d57951a 100644 --- a/crates/core/src/codec/openai_responses.rs +++ b/crates/core/src/codec/openai_responses.rs @@ -295,6 +295,118 @@ fn overlay_generation_params(obj: &mut serde_json::Map, params: &G } } +fn encode_openai_responses_input( + obj: &mut serde_json::Map, + annotated: &AnnotatedLlmRequest, +) -> Result<()> { + let (system_text, input_messages) = split_system_and_input_messages(&annotated.messages); + set_or_remove_string(obj, "instructions", system_text); + if let Some(raw_input_items) = annotated.extra.get(UNPARSED_INPUT_ITEMS_KEY) { + obj.insert("input".into(), raw_input_items.clone()); + } else { + insert_serialized(obj, "input", &input_messages, "input")?; + } + Ok(()) +} + +fn encode_openai_responses_tools( + obj: &mut serde_json::Map, + annotated: &AnnotatedLlmRequest, +) -> Result<()> { + if let Some(ref tools) = annotated.tools { + insert_serialized(obj, "tools", tools, "tools")?; + } + if let Some(ref tool_choice) = annotated.tool_choice { + insert_serialized(obj, "tool_choice", tool_choice, "tool_choice")?; + } + Ok(()) +} + +fn overlay_openai_responses_fields( + obj: &mut serde_json::Map, + annotated: &AnnotatedLlmRequest, +) { + if let Some(ref model) = annotated.model { + obj.insert("model".into(), Json::String(model.clone())); + } + overlay_openai_responses_json_fields(obj, annotated); + overlay_openai_responses_string_fields(obj, annotated); + overlay_openai_responses_bool_fields(obj, annotated); + overlay_openai_responses_u64_fields(obj, annotated); +} + +fn overlay_openai_responses_json_fields( + obj: &mut serde_json::Map, + annotated: &AnnotatedLlmRequest, +) { + for (key, value) in [ + ("truncation", &annotated.truncation), + ("reasoning", &annotated.reasoning), + ("include", &annotated.include), + ("metadata", &annotated.metadata), + ] { + if let Some(value) = value { + obj.insert(key.into(), value.clone()); + } + } +} + +fn overlay_openai_responses_string_fields( + obj: &mut serde_json::Map, + annotated: &AnnotatedLlmRequest, +) { + for (key, value) in [ + ("previous_response_id", &annotated.previous_response_id), + ("user", &annotated.user), + ("service_tier", &annotated.service_tier), + ] { + if let Some(value) = value { + obj.insert(key.into(), Json::String(value.clone())); + } + } +} + +fn overlay_openai_responses_bool_fields( + obj: &mut serde_json::Map, + annotated: &AnnotatedLlmRequest, +) { + for (key, value) in [ + ("store", annotated.store), + ("parallel_tool_calls", annotated.parallel_tool_calls), + ("stream", annotated.stream), + ] { + if let Some(value) = value { + obj.insert(key.into(), Json::Bool(value)); + } + } +} + +fn overlay_openai_responses_u64_fields( + obj: &mut serde_json::Map, + annotated: &AnnotatedLlmRequest, +) { + for (key, value) in [ + ("max_output_tokens", annotated.max_output_tokens), + ("max_tool_calls", annotated.max_tool_calls), + ("top_logprobs", annotated.top_logprobs), + ] { + if let Some(value) = value { + obj.insert(key.into(), Json::from(value)); + } + } +} + +fn merge_openai_responses_extra_fields( + obj: &mut serde_json::Map, + extra: &serde_json::Map, +) { + for (k, v) in extra { + if k != UNPARSED_INPUT_ITEMS_KEY { + obj.insert(k.clone(), v.clone()); + } + } +} + fn decode_openai_or_anthropic_tool_choice(value: &Json) -> Option { if let Ok(parsed) = serde_json::from_value::(value.clone()) { return Some(parsed); @@ -516,87 +628,13 @@ impl LlmCodec for OpenAIResponsesCodec { .as_object_mut() .ok_or_else(|| FlowError::Internal("original content is not an object".into()))?; - let (system_text, input_messages) = split_system_and_input_messages(&annotated.messages); - set_or_remove_string(obj, "instructions", system_text); - if let Some(raw_input_items) = annotated.extra.get(UNPARSED_INPUT_ITEMS_KEY) { - obj.insert("input".into(), raw_input_items.clone()); - } else { - insert_serialized(obj, "input", &input_messages, "input")?; - } - - // Overlay model if present. - if let Some(ref model) = annotated.model { - obj.insert("model".into(), Json::String(model.clone())); - } - - // Overlay generation params. + encode_openai_responses_input(obj, annotated)?; if let Some(ref params) = annotated.params { overlay_generation_params(obj, params); } - - // Overlay tools if present. - if let Some(ref tools) = annotated.tools { - insert_serialized(obj, "tools", tools, "tools")?; - } - - // Overlay tool_choice if present. - if let Some(ref tool_choice) = annotated.tool_choice { - insert_serialized(obj, "tool_choice", tool_choice, "tool_choice")?; - } - - if let Some(store) = annotated.store { - obj.insert("store".into(), Json::Bool(store)); - } - if let Some(ref previous_response_id) = annotated.previous_response_id { - obj.insert( - "previous_response_id".into(), - Json::String(previous_response_id.clone()), - ); - } - if let Some(ref truncation) = annotated.truncation { - obj.insert("truncation".into(), truncation.clone()); - } - if let Some(ref reasoning) = annotated.reasoning { - obj.insert("reasoning".into(), reasoning.clone()); - } - if let Some(ref include) = annotated.include { - obj.insert("include".into(), include.clone()); - } - if let Some(ref user) = annotated.user { - obj.insert("user".into(), Json::String(user.clone())); - } - if let Some(ref metadata) = annotated.metadata { - obj.insert("metadata".into(), metadata.clone()); - } - if let Some(ref service_tier) = annotated.service_tier { - obj.insert("service_tier".into(), Json::String(service_tier.clone())); - } - if let Some(parallel_tool_calls) = annotated.parallel_tool_calls { - obj.insert( - "parallel_tool_calls".into(), - Json::Bool(parallel_tool_calls), - ); - } - if let Some(max_output_tokens) = annotated.max_output_tokens { - obj.insert("max_output_tokens".into(), Json::from(max_output_tokens)); - } - if let Some(max_tool_calls) = annotated.max_tool_calls { - obj.insert("max_tool_calls".into(), Json::from(max_tool_calls)); - } - if let Some(top_logprobs) = annotated.top_logprobs { - obj.insert("top_logprobs".into(), Json::from(top_logprobs)); - } - if let Some(stream) = annotated.stream { - obj.insert("stream".into(), Json::Bool(stream)); - } - - // Merge extra fields back. - for (k, v) in &annotated.extra { - if k == UNPARSED_INPUT_ITEMS_KEY { - continue; - } - obj.insert(k.clone(), v.clone()); - } + encode_openai_responses_tools(obj, annotated)?; + overlay_openai_responses_fields(obj, annotated); + merge_openai_responses_extra_fields(obj, &annotated.extra); Ok(LlmRequest { headers: original.headers.clone(), diff --git a/go/nemo_flow/observability_plugin_test.go b/go/nemo_flow/observability_plugin_test.go index 34222fcb..8369db83 100644 --- a/go/nemo_flow/observability_plugin_test.go +++ b/go/nemo_flow/observability_plugin_test.go @@ -18,6 +18,8 @@ const ( FirstAgentName = "go-first-agent" NestedAgentName = "go-nested-agent" SecondAgentName = "go-second-agent" + fatalErrorFormat = "%s: %v" + failedSuffix = " failed" ) func TestObservabilityConfigHelpers(t *testing.T) { @@ -50,7 +52,7 @@ func TestObservabilityConfigHelpers(t *testing.T) { func TestObservabilityPluginAtofAndAtifFiles(t *testing.T) { if err := ClearPluginConfiguration(); err != nil { - t.Fatalf("%s: %v", ClearPluginConfigurationFailed, err) + t.Fatalf(fatalErrorFormat, ClearPluginConfigurationFailed, err) } t.Cleanup(func() { requireNoError(t, ClearPluginConfiguration(), ClearPluginConfigurationFailed) @@ -80,7 +82,7 @@ func TestObservabilityPluginAtofAndAtifFiles(t *testing.T) { t.Fatalf("unexpected diagnostics: %#v", report.Diagnostics) } if _, err := InitializePlugins(PluginConfig{Version: 1, Components: []PluginComponentSpec{ObservabilityComponent(config)}}); err != nil { - t.Fatalf("%s: %v", InitializePluginsFailed, err) + t.Fatalf(fatalErrorFormat, InitializePluginsFailed, err) } handle, err := PushScope("go-observability-agent", ScopeTypeAgent, WithInput(json.RawMessage(`{"agent":true}`))) @@ -94,7 +96,7 @@ func TestObservabilityPluginAtofAndAtifFiles(t *testing.T) { t.Fatalf("PopScope failed: %v", err) } if err := ClearPluginConfiguration(); err != nil { - t.Fatalf("%s: %v", ClearPluginConfigurationFailed, err) + t.Fatalf(fatalErrorFormat, ClearPluginConfigurationFailed, err) } jsonl := string(mustReadFile(t, filepath.Join(dir, eventsJSONLFilename))) @@ -183,7 +185,7 @@ func TestObservabilityPluginListKindIsAutomatic(t *testing.T) { func TestObservabilityAtifOpenAgentFlushesOnClear(t *testing.T) { if err := ClearPluginConfiguration(); err != nil { - t.Fatalf("%s: %v", ClearPluginConfigurationFailed, err) + t.Fatalf(fatalErrorFormat, ClearPluginConfigurationFailed, err) } t.Cleanup(func() { requireNoError(t, ClearPluginConfiguration(), ClearPluginConfigurationFailed) @@ -195,14 +197,14 @@ func TestObservabilityAtifOpenAgentFlushesOnClear(t *testing.T) { atif.OutputDirectory = dir config.Atif = &atif if _, err := InitializePlugins(PluginConfig{Version: 1, Components: []PluginComponentSpec{ObservabilityComponent(config)}}); err != nil { - t.Fatalf("%s: %v", InitializePluginsFailed, err) + t.Fatalf(fatalErrorFormat, InitializePluginsFailed, err) } handle, err := PushScope("go-open-agent", ScopeTypeAgent) if err != nil { t.Fatalf("PushScope failed: %v", err) } if err := ClearPluginConfiguration(); err != nil { - t.Fatalf("%s: %v", ClearPluginConfigurationFailed, err) + t.Fatalf(fatalErrorFormat, ClearPluginConfigurationFailed, err) } path := filepath.Join(dir, "nemo-flow-atif-"+handle.UUID()+".json") if _, err := os.Stat(path); err != nil { @@ -241,14 +243,14 @@ func EmitAgentTrajectory(t *testing.T, Label string, Name string) *ScopeHandle { func EmitAgentStart(t *testing.T, Label string, Name string) *ScopeHandle { t.Helper() Handle, Err := PushScope(Name, ScopeTypeAgent, WithInput(json.RawMessage(`{"agent":"`+Label+`"}`))) - requireNoError(t, Err, "PushScope "+Label+" failed") - requireNoError(t, EmitEvent("go-"+Label+"-mark", WithEventParent(Handle), WithEventData(json.RawMessage(`{"agent":"`+Label+`"}`))), "EmitEvent "+Label+" failed") + requireNoError(t, Err, "PushScope "+Label+failedSuffix) + requireNoError(t, EmitEvent("go-"+Label+"-mark", WithEventParent(Handle), WithEventData(json.RawMessage(`{"agent":"`+Label+`"}`))), "EmitEvent "+Label+failedSuffix) return Handle } func EmitAgentEnd(t *testing.T, Label string, Handle *ScopeHandle) { t.Helper() - requireNoError(t, PopScope(Handle, WithOutput(json.RawMessage(`{"done":true}`))), "PopScope "+Label+" failed") + requireNoError(t, PopScope(Handle, WithOutput(json.RawMessage(`{"done":true}`))), "PopScope "+Label+failedSuffix) } func TrajectoryFilePath(Dir string, Handle *ScopeHandle) string { From 61462923c9e86c21146c0605ca73954d04ad757a Mon Sep 17 00:00:00 2001 From: Will Killian <2007799+willkill07@users.noreply.github.com> Date: Thu, 14 May 2026 14:32:32 -0400 Subject: [PATCH 2/9] test: isolate CLI config override tests (#105) #### Overview Isolates CLI config override unit tests from developer-level NeMo Flow configuration discovered through the normal user config path. - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details - Adds a temp-scoped explicit config path helper for config tests that require no implicit user or project config discovery. - Updates the affected override tests to use that explicit path instead of relying on ambient process configuration. #### Where should the reviewer start? Start with `crates/cli/tests/coverage/config_tests.rs`, especially the tests around CLI plugin config overrides. #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Relates to: none ## Summary by CodeRabbit * **Tests** * Enhanced test infrastructure for configuration resolution by improving test isolation and setup processes. [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NeMo-Flow/pull/105) Authors: - Will Killian (https://github.com/willkill07) Approvers: - Ajay Thorve (https://github.com/AjayThorve) URL: https://github.com/NVIDIA/NeMo-Flow/pull/105 --- crates/cli/tests/coverage/config_tests.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/crates/cli/tests/coverage/config_tests.rs b/crates/cli/tests/coverage/config_tests.rs index 6876dbde..f7f8bc9b 100644 --- a/crates/cli/tests/coverage/config_tests.rs +++ b/crates/cli/tests/coverage/config_tests.rs @@ -16,6 +16,10 @@ fn config() -> GatewayConfig { } } +fn isolated_config_path(temp: &tempfile::TempDir) -> std::path::PathBuf { + temp.path().join("config.toml") +} + #[test] fn session_config_prefers_headers_and_parses_json() { let mut headers = HeaderMap::new(); @@ -607,7 +611,9 @@ openai_base_url = "http://file-openai" #[test] fn run_plugin_config_overrides_inherited_top_level_plugin_config() { + let temp = tempfile::tempdir().unwrap(); let server = ServerArgs { + config: Some(isolated_config_path(&temp)), plugin_config: Some(r#"{"components":["top-level"]}"#.into()), ..ServerArgs::default() }; @@ -633,8 +639,9 @@ fn run_plugin_config_overrides_inherited_top_level_plugin_config() { #[test] fn server_resolution_applies_all_server_overrides() { + let temp = tempfile::tempdir().unwrap(); let args = ServerArgs { - config: None, + config: Some(isolated_config_path(&temp)), bind: Some("127.0.0.1:0".parse().unwrap()), openai_base_url: Some("http://cli-openai".into()), anthropic_base_url: Some("http://cli-anthropic".into()), @@ -655,9 +662,10 @@ fn server_resolution_applies_all_server_overrides() { #[test] fn run_resolution_applies_all_run_overrides() { + let temp = tempfile::tempdir().unwrap(); let command = RunCommand { agent: Some(CodingAgent::Codex), - config: None, + config: Some(isolated_config_path(&temp)), openai_base_url: Some("http://run-openai".into()), anthropic_base_url: Some("http://run-anthropic".into()), session_metadata: Some(r#"{"team":"run"}"#.into()), From d8af67569917132978664613904eb3a07f1dbf66 Mon Sep 17 00:00:00 2001 From: Will Killian <2007799+willkill07@users.noreply.github.com> Date: Thu, 14 May 2026 14:35:53 -0400 Subject: [PATCH 3/9] chore: keep OpenClaw dependency in lockstep (#107) #### Overview Keep the OpenClaw plugin package dependency on `nemo-flow-node` aligned with the package version emitted by repository versioning and packaging workflows. - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details - Change `nemo-flow-openclaw` to depend on the exact checked-in `nemo-flow-node` version. - Add a `justfile` helper that updates package dependency versions in both `package.json` and `package-lock.json`. - Wire the dependency update into `set-version`, `package-node`, and `package-openclaw` so prerelease package builds keep the Node and OpenClaw versions together. - Align OpenClaw non-tag CI package version suffixing with the Node package workflow. Validation run: - `just set-version 0.2.0-alpha.20260514`, verified OpenClaw's `nemo-flow-node` dependency updated without dependency success logs, then restored with `just set-version 0.2.0`. - `npm install --workspace=nemo-flow-node --ignore-scripts` - `npm install --workspace=nemo-flow-openclaw --ignore-scripts` - `npm run typecheck --workspace=nemo-flow-openclaw` - `npm run pack:check --workspace=nemo-flow-openclaw` - `just --list` - `git diff --check` - Commit-time pre-commit hooks passed for the staged files. #### Where should the reviewer start? Start with `justfile`, especially the new package dependency version helper and its calls from `set_node_package_versions`, `package-node`, and `package-openclaw`. #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Relates to: none ## Summary by CodeRabbit ## Release Notes * **Chores** * Refined OpenClaw package versioning format for improved clarity * Pinned nemo-flow-node dependency to a stable version for enhanced reliability * Improved build and packaging tooling to ensure consistent dependency alignment [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NeMo-Flow/pull/107) Authors: - Will Killian (https://github.com/willkill07) Approvers: - https://github.com/Salonijain27 URL: https://github.com/NVIDIA/NeMo-Flow/pull/107 --- .github/workflows/ci_openclaw.yml | 2 +- integrations/openclaw/package.json | 2 +- justfile | 80 +++++++++++++++++++++++++++++- package-lock.json | 2 +- 4 files changed, 81 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci_openclaw.yml b/.github/workflows/ci_openclaw.yml index 5af12e35..068fd8b4 100644 --- a/.github/workflows/ci_openclaw.yml +++ b/.github/workflows/ci_openclaw.yml @@ -76,7 +76,7 @@ jobs: if [ "${{ inputs.ref_type }}" = "tag" ]; then version="${{ inputs.ref_name }}" else - version="${version}-${sha}" + version="${version}+${sha}" fi printf 'NEMO_FLOW_PACKAGE_VERSION=%s\n' "$version" >> "$GITHUB_ENV" diff --git a/integrations/openclaw/package.json b/integrations/openclaw/package.json index c25633dd..5e19ab5b 100644 --- a/integrations/openclaw/package.json +++ b/integrations/openclaw/package.json @@ -58,7 +58,7 @@ "openclaw": ">=2026.5.6" }, "dependencies": { - "nemo-flow-node": ">0.1.0 <1.0.0" + "nemo-flow-node": "0.2.0" }, "devDependencies": { "@types/node": "^20.19.0", diff --git a/justfile b/justfile index 24015536..ba13e668 100644 --- a/justfile +++ b/justfile @@ -313,6 +313,75 @@ try { NODE } +set_npm_package_dependency_version() { + local pkg_path="$1" + local lock_path="${2:-}" + local lock_package_path="$3" + local dependency_name="$4" + local version="$5" + + node - "$pkg_path" "$lock_path" "$lock_package_path" "$dependency_name" "$version" <<'NODE' +const fs = require('fs'); +const [pkgPath, lockPath, lockPackagePath, dependencyName, version] = process.argv.slice(2); + +function readJson(path) { + return JSON.parse(fs.readFileSync(path, 'utf8')); +} + +function writeJson(path, value) { + fs.writeFileSync(path, JSON.stringify(value, null, 2) + '\n'); +} + +function requireDependency(container, label) { + if ( + !container.dependencies || + !Object.prototype.hasOwnProperty.call(container.dependencies, dependencyName) + ) { + throw new Error(`${label} missing dependencies["${dependencyName}"]`); + } +} + +try { + const manifest = readJson(pkgPath); + requireDependency(manifest, pkgPath); + const manifestChanged = manifest.dependencies[dependencyName] !== version; + + let lock = null; + let lockChanged = false; + if (lockPath) { + lock = readJson(lockPath); + if (!lock.packages) { + throw new Error(`${lockPath} missing packages`); + } + const packageEntry = lock.packages[lockPackagePath]; + if (!packageEntry) { + throw new Error(`${lockPath} missing packages["${lockPackagePath}"]`); + } + requireDependency(packageEntry, `${lockPath} packages["${lockPackagePath}"]`); + lockChanged = packageEntry.dependencies[dependencyName] !== version; + } + + manifest.dependencies[dependencyName] = version; + if (lock) { + lock.packages[lockPackagePath].dependencies[dependencyName] = version; + } + + if (manifestChanged) { + writeJson(pkgPath, manifest); + } + + if (lockPath) { + if (lockChanged) { + writeJson(lockPath, lock); + } + } +} catch (error) { + console.error(`Error updating package dependency: ${error.message}`); + process.exit(1); +} +NODE +} + read_workspace_version() { local python_executable="" python_executable="$(uv_python_executable)" @@ -441,6 +510,7 @@ set_node_package_versions() { local version="$1" set_npm_package_version crates/node/package.json package-lock.json "$version" crates/node set_npm_package_version integrations/openclaw/package.json package-lock.json "$version" integrations/openclaw + set_npm_package_dependency_version integrations/openclaw/package.json package-lock.json integrations/openclaw nemo-flow-node "$version" } set_node_package_version() { @@ -992,10 +1062,12 @@ package-node: package_version="${version}+${sha}" echo "Non-release build: appending commit hash to version" set_npm_package_version crates/node/package.json package-lock.json "$package_version" crates/node + set_npm_package_dependency_version integrations/openclaw/package.json package-lock.json integrations/openclaw nemo-flow-node "$package_version" else package_version="{{ ref_name }}" echo "Using explicit version {{ ref_name }}" set_npm_package_version crates/node/package.json package-lock.json "$package_version" crates/node + set_npm_package_dependency_version integrations/openclaw/package.json package-lock.json integrations/openclaw nemo-flow-node "$package_version" fi build_args=(build) if is_true "{{ ci }}" && [[ "$(uname -s)" == "Linux" ]]; then @@ -1028,11 +1100,15 @@ package-openclaw: if [[ -z "{{ ref_name }}" ]]; then sha="$(head_git_sha)" version="$(read_npm_package_version integrations/openclaw/package.json)" + package_version="${version}+${sha}" echo "Non-release build: appending commit hash to version" - set_npm_package_version integrations/openclaw/package.json package-lock.json "${version}-${sha}" integrations/openclaw + set_npm_package_version integrations/openclaw/package.json package-lock.json "$package_version" integrations/openclaw + set_npm_package_dependency_version integrations/openclaw/package.json package-lock.json integrations/openclaw nemo-flow-node "$package_version" else + package_version="{{ ref_name }}" echo "Using explicit version {{ ref_name }}" - set_npm_package_version integrations/openclaw/package.json package-lock.json "{{ ref_name }}" integrations/openclaw + set_npm_package_version integrations/openclaw/package.json package-lock.json "$package_version" integrations/openclaw + set_npm_package_dependency_version integrations/openclaw/package.json package-lock.json integrations/openclaw nemo-flow-node "$package_version" fi npm install --workspace=nemo-flow-openclaw --ignore-scripts npm pack --workspace=nemo-flow-openclaw --pack-destination "$package_dir" diff --git a/package-lock.json b/package-lock.json index 2dbef428..1d778347 100644 --- a/package-lock.json +++ b/package-lock.json @@ -838,7 +838,7 @@ "version": "0.2.0", "license": "Apache-2.0", "dependencies": { - "nemo-flow-node": ">0.1.0 <1.0.0" + "nemo-flow-node": "0.2.0" }, "devDependencies": { "@types/node": "^20.19.0", From 8a291f1b74213d62a084fa9aa31546d99e3aa555 Mon Sep 17 00:00:00 2001 From: Will Killian <2007799+willkill07@users.noreply.github.com> Date: Thu, 14 May 2026 15:17:10 -0400 Subject: [PATCH 4/9] refactor: improve CLI coverage structure (#108) #### Overview Refactors the CLI coverage-heavy interactive setup/plugin editors so testable logic lives in focused helper modules, then adds coverage around the extracted behavior and related CLI paths. - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details - Split plugin config file handling and Observability editor state helpers out of `plugins.rs` into testable modules. - Split setup config/model/file helper logic out of `setup.rs` into `setup/model.rs`. - Added focused coverage for CLI setup, plugin editing models, doctor formatting/check helpers, completion install helpers, server gateway forwarding paths, and CLI smoke behavior. - Updated Codecov component reporting from Gateway Runtime to CLI, set the CLI target to 88%, and excluded only the remaining TTY prompt shells. - Added module guidance so future testable logic does not go back into the interactive prompt files. #### Where should the reviewer start? Start with `crates/cli/src/plugins.rs` and `crates/cli/src/setup.rs` to see the orchestration-only boundary, then review `crates/cli/src/plugins/editor_model.rs`, `crates/cli/src/plugins/config_io.rs`, and `crates/cli/src/setup/model.rs` for the extracted testable logic. Validation run locally: - `cargo fmt --all` - `cargo test -p nemo-flow-cli` with isolated `XDG_CONFIG_HOME` - `cargo clippy --workspace --all-targets -- -D warnings` - `just test-rust` with isolated `XDG_CONFIG_HOME` - `cargo llvm-cov --package nemo-flow-cli --summary-only ...` - commit hook pre-commit checks, including cargo fmt, cargo clippy, and cargo check #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Relates to: none ## Summary by CodeRabbit * **New Features** * Plugin config preview, validation, and safer save/merge behavior; clearer scope selection and Hermes hook handling in setup. * **Chores / Refactor** * Reorganized CLI internals into smaller, testable modules to make interactive editors and the setup wizard more reliable. * **Tests** * Added extensive CLI unit and integration tests covering agents, doctor, completions, plugin editor TTY behavior, setup flows, and gateway/server forwarding. * **Chores** * Updated Codecov to include CLI coverage and exclude interactive prompt loops. Signed-off-by: Will Killian --- codecov.yml | 10 +- crates/cli/src/plugins.rs | 549 +----------------- crates/cli/src/plugins/config_io.rs | 174 ++++++ crates/cli/src/plugins/editor_model.rs | 385 ++++++++++++ crates/cli/src/setup.rs | 502 ++-------------- crates/cli/src/setup/model.rs | 425 ++++++++++++++ crates/cli/tests/cli_tests.rs | 65 +++ .../coverage/completions_install_tests.rs | 48 ++ crates/cli/tests/coverage/doctor_tests.rs | 177 ++++++ crates/cli/tests/coverage/plugins_tests.rs | 198 +++++++ crates/cli/tests/coverage/server_tests.rs | 56 ++ crates/cli/tests/coverage/setup_tests.rs | 191 ++++++ 12 files changed, 1797 insertions(+), 983 deletions(-) create mode 100644 crates/cli/src/plugins/config_io.rs create mode 100644 crates/cli/src/plugins/editor_model.rs create mode 100644 crates/cli/src/setup/model.rs diff --git a/codecov.yml b/codecov.yml index 6b696fff..601bb877 100644 --- a/codecov.yml +++ b/codecov.yml @@ -54,13 +54,13 @@ component_management: threshold: 0.5% base: auto if_ci_failed: error - - component_id: gateway_runtime - name: Gateway Runtime + - component_id: cli + name: CLI paths: - "crates/cli/src" statuses: - type: project - target: 95% + target: 88% threshold: 0.5% base: auto if_ci_failed: error @@ -123,6 +123,10 @@ ignore: - "third_party/" - "**/tests/**" - "crates/cli/tests/" + # CLI TTY shells are exercised by smoke tests, but their prompt loops are + # intentionally split away from testable model modules. + - "crates/cli/src/plugins.rs" + - "crates/cli/src/setup.rs" - "**/tests-js/**" # The Node binding currently reports JS package coverage separately; exclude the # native Rust bridge until we have direct Rust-side coverage for this crate. diff --git a/crates/cli/src/plugins.rs b/crates/cli/src/plugins.rs index 3def100e..1d8c6e11 100644 --- a/crates/cli/src/plugins.rs +++ b/crates/cli/src/plugins.rs @@ -2,34 +2,29 @@ // SPDX-License-Identifier: Apache-2.0 //! Interactive plugin configuration editing. +//! +//! Keep this module focused on TTY and `dialoguer` orchestration. New testable plugin config +//! behavior should live in `plugins/config_io.rs` or `plugins/editor_model.rs`, with focused unit +//! tests, so Codecov does not depend on exercising interactive prompt loops. use std::io::IsTerminal; -use std::path::{Path, PathBuf}; +use std::path::Path; use console::{Key, Term, style}; use dialoguer::theme::ColorfulTheme; use dialoguer::{Input, Select}; use nemo_flow::config_editor::{EditorConfig, EditorFieldKind, EditorFieldSpec}; -use nemo_flow::observability::plugin_component::{OBSERVABILITY_PLUGIN_KIND, ObservabilityConfig}; -use nemo_flow::plugin::{ConfigPolicy, PluginComponentSpec, PluginConfig, validate_plugin_config}; -use serde::Serialize; -use serde::de::DeserializeOwned; -use serde_json::{Map, Value, json}; +use nemo_flow::observability::plugin_component::ObservabilityConfig; +use serde_json::{Value, json}; -use crate::config::{ - PluginsEditCommand, global_plugin_config_path, project_plugin_config_path, - user_plugin_config_path, -}; +use crate::config::PluginsEditCommand; use crate::error::CliError; -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -enum TargetScope { - User, - Project, - Global, -} +mod config_io; +mod editor_model; -const POLICY_SECTION: &str = "policy"; +use self::config_io::*; +use self::editor_model::*; #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum MenuShortcut { @@ -343,115 +338,6 @@ fn ensure_tty() -> Result<(), CliError> { Ok(()) } -fn target_scope(command: &PluginsEditCommand) -> Result { - let selected = [command.user, command.project, command.global] - .into_iter() - .filter(|selected| *selected) - .count(); - if selected > 1 { - return Err(CliError::Config( - "choose only one of --user, --project, or --global".into(), - )); - } - if command.project { - Ok(TargetScope::Project) - } else if command.global { - Ok(TargetScope::Global) - } else { - Ok(TargetScope::User) - } -} - -fn target_path(scope: TargetScope) -> Result { - match scope { - TargetScope::User => user_plugin_config_path().ok_or_else(|| { - CliError::Config( - "cannot determine user config directory; set HOME or XDG_CONFIG_HOME".into(), - ) - }), - TargetScope::Project => { - let cwd = std::env::current_dir()?; - Ok(project_plugin_config_path(&cwd)) - } - TargetScope::Global => Ok(global_plugin_config_path()), - } -} - -fn read_plugin_config(path: &Path) -> Result { - if !path.exists() { - return Ok(PluginConfig::default()); - } - let raw = std::fs::read_to_string(path)?; - let parsed = raw - .parse::() - .map(toml::Value::Table) - .map_err(|error| { - CliError::Config(format!( - "invalid plugin TOML in {}: {error}", - path.display() - )) - })?; - serde_json::from_value( - serde_json::to_value(parsed) - .map_err(|error| CliError::Config(format!("invalid plugin TOML shape: {error}")))?, - ) - .map_err(|error| CliError::Config(format!("invalid plugin config: {error}"))) -} - -fn write_plugin_config(path: &Path, config: &PluginConfig) -> Result<(), CliError> { - let mut value = serde_json::to_value(config) - .map_err(|error| CliError::Config(format!("could not serialize plugin config: {error}")))?; - prune_plugin_defaults(&mut value); - let toml_value: toml::Value = serde_json::from_value(value).map_err(|error| { - CliError::Config(format!("could not convert plugin config to TOML: {error}")) - })?; - let rendered = toml::to_string_pretty(&toml_value) - .map_err(|error| CliError::Config(format!("could not render plugin TOML: {error}")))?; - if let Some(parent) = path.parent() { - std::fs::create_dir_all(parent)?; - } - std::fs::write(path, rendered)?; - Ok(()) -} - -fn print_preview(config: &PluginConfig) -> Result<(), CliError> { - println!(); - println!( - "{} {}", - style("❯").green(), - style("plugins.toml preview").bold() - ); - println!("{}", style("─".repeat(58)).black().bright()); - let mut value = serde_json::to_value(config) - .map_err(|error| CliError::Config(format!("could not serialize plugin config: {error}")))?; - prune_plugin_defaults(&mut value); - let toml_value: toml::Value = serde_json::from_value(value).map_err(|error| { - CliError::Config(format!("could not convert plugin config to TOML: {error}")) - })?; - let rendered = toml::to_string_pretty(&toml_value) - .map_err(|error| CliError::Config(format!("could not render plugin TOML: {error}")))?; - print!("{rendered}"); - println!("{}", style("─".repeat(58)).black().bright()); - Ok(()) -} - -fn validate_config(config: &PluginConfig) -> Result<(), CliError> { - let report = validate_plugin_config(config); - if report.has_errors() { - let messages = report - .diagnostics - .into_iter() - .filter(|diagnostic| diagnostic.level == nemo_flow::plugin::DiagnosticLevel::Error) - .map(|diagnostic| diagnostic.message) - .collect::>() - .join("; "); - return Err(CliError::Config(format!( - "plugin validation failed: {messages}" - ))); - } - Ok(()) -} - fn edit_section( theme: &ColorfulTheme, config: &mut ObservabilityConfig, @@ -535,6 +421,14 @@ fn section_field_menu_item( ))) } +fn selected_field_index(section: EditorFieldSpec, selected: usize) -> usize { + selected - usize::from(section_has_enabled_toggle(section)) +} + +fn reset_section_index(section: EditorFieldSpec, fields: &[EditorFieldSpec]) -> usize { + usize::from(section_has_enabled_toggle(section)) + fields.len() +} + fn reset_selected_item( config: &mut ObservabilityConfig, section: EditorFieldSpec, @@ -699,409 +593,6 @@ fn prompt_value( } } -fn ensure_observability_component(config: &mut PluginConfig) -> Result<(), CliError> { - if !config - .components - .iter() - .any(|component| component.kind == OBSERVABILITY_PLUGIN_KIND) - { - config.components.push(PluginComponentSpec { - kind: OBSERVABILITY_PLUGIN_KIND.to_string(), - enabled: true, - config: observability_config_map(&ObservabilityConfig::default())?, - }); - } - Ok(()) -} - -fn component_enabled(config: &PluginConfig) -> bool { - observability_component(config) - .map(|component| component.enabled) - .unwrap_or(true) -} - -fn set_component_enabled(config: &mut PluginConfig, enabled: bool) { - if let Some(component) = observability_component_mut(config) { - component.enabled = enabled; - } -} - -fn component_observability_config(config: &PluginConfig) -> Result { - observability_component(config) - .map(|component| serde_json::from_value(Value::Object(component.config.clone()))) - .transpose() - .map_err(|error| CliError::Config(format!("invalid observability plugin config: {error}")))? - .ok_or_else(|| CliError::Config("observability plugin component is missing".into())) -} - -fn config_with_observability( - config: &PluginConfig, - observability: &ObservabilityConfig, -) -> Result { - let mut config = config.clone(); - store_observability_config(&mut config, observability)?; - Ok(config) -} - -fn store_observability_config( - config: &mut PluginConfig, - observability: &ObservabilityConfig, -) -> Result<(), CliError> { - if let Some(component) = observability_component_mut(config) { - merge_observability_editor_config( - &mut component.config, - observability_config_map(observability)?, - ); - } - Ok(()) -} - -fn ensure_section(config: &mut ObservabilityConfig, section: EditorFieldSpec) { - if let Ok(Some(Value::Object(_))) = section_value(config, section) { - return; - } - let Some(default) = section.default_value() else { - return; - }; - let _ = set_struct_field(config, section.name, default); -} - -fn toggle_section(config: &mut ObservabilityConfig, section: EditorFieldSpec) { - ensure_section(config, section); - let enabled = section_enabled(config, section).unwrap_or(false); - let _ = set_section_field(config, section, "enabled", json!(!enabled)); -} - -fn reset_section(config: &mut ObservabilityConfig, section: EditorFieldSpec) { - let value = section.default_value().unwrap_or_else(|| json!({})); - let _ = set_struct_field(config, section.name, value); -} - -fn reset_selected_field( - config: &mut ObservabilityConfig, - section: EditorFieldSpec, - fields: &[EditorFieldSpec], - selected: usize, -) -> Result { - let offset = usize::from(section_has_enabled_toggle(section)); - let Some(index) = selected.checked_sub(offset) else { - return Ok(false); - }; - let Some(field) = fields.get(index) else { - return Ok(false); - }; - remove_section_field(config, section, field.name)?; - Ok(true) -} - -fn selected_field_index(section: EditorFieldSpec, selected: usize) -> usize { - let mut index = selected; - if section_has_enabled_toggle(section) { - index -= 1; - } - index -} - -fn reset_section_index(section: EditorFieldSpec, fields: &[EditorFieldSpec]) -> usize { - usize::from(section_has_enabled_toggle(section)) + fields.len() -} - -fn section_has_enabled_toggle(section: EditorFieldSpec) -> bool { - section.name != POLICY_SECTION - && section - .schema() - .and_then(|schema| schema.field("enabled")) - .is_some_and(|field| field.kind == EditorFieldKind::Boolean) -} - -fn section_enabled(config: &ObservabilityConfig, section: EditorFieldSpec) -> Option { - section_value(config, section) - .ok() - .flatten() - .and_then(|section| section.get("enabled").cloned()) - .and_then(|enabled| enabled.as_bool()) -} - -fn section_configured(config: &ObservabilityConfig, section: EditorFieldSpec) -> bool { - let Ok(Some(value)) = section_value(config, section) else { - return false; - }; - if section.optional { - return true; - } - section - .default_value() - .as_ref() - .is_none_or(|default| default != &value) -} - -fn section_field_configured( - config: &ObservabilityConfig, - section: EditorFieldSpec, - field: EditorFieldSpec, -) -> Result { - let Some(value) = section_field_value(config, section, field.name)? else { - return Ok(false); - }; - if field.optional { - return Ok(true); - } - Ok(default_field_value(section, field) - .as_ref() - .is_none_or(|default| default != &value)) -} - -fn section_field_value( - config: &ObservabilityConfig, - section: EditorFieldSpec, - field: &str, -) -> Result, CliError> { - Ok(section_value(config, section)? - .and_then(|section| section.as_object().cloned()) - .and_then(|section| section.get(field).cloned())) -} - -fn section_value( - config: &ObservabilityConfig, - section: EditorFieldSpec, -) -> Result, CliError> { - let value = serde_json::to_value(config).map_err(serde_error)?; - Ok(value - .as_object() - .and_then(|config| config.get(section.name)) - .filter(|section| !section.is_null()) - .cloned()) -} - -fn set_section_field( - config: &mut ObservabilityConfig, - section: EditorFieldSpec, - field: &str, - value: Value, -) -> Result<(), CliError> { - ensure_section(config, section); - let mut object = serde_json::to_value(&*config).map_err(serde_error)?; - let config_object = ensure_object(&mut object); - let section_object = config_object - .entry(section.name) - .or_insert_with(|| section.default_value().unwrap_or_else(|| json!({}))); - ensure_object(section_object).insert(field.to_string(), value); - *config = serde_json::from_value(object).map_err(serde_error)?; - Ok(()) -} - -fn remove_section_field( - config: &mut ObservabilityConfig, - section: EditorFieldSpec, - field: &str, -) -> Result<(), CliError> { - let mut object = serde_json::to_value(&*config).map_err(serde_error)?; - if let Some(section_object) = object - .as_object_mut() - .and_then(|config| config.get_mut(section.name)) - .and_then(Value::as_object_mut) - { - section_object.remove(field); - } - *config = serde_json::from_value(object).map_err(serde_error)?; - Ok(()) -} - -fn set_struct_field(target: &mut T, field: &str, value: Value) -> Result<(), CliError> -where - T: Serialize + DeserializeOwned, -{ - let mut object = serde_json::to_value(&*target).map_err(serde_error)?; - ensure_object(&mut object).insert(field.to_string(), value); - *target = serde_json::from_value(object).map_err(serde_error)?; - Ok(()) -} - -fn observability_component(config: &PluginConfig) -> Option<&PluginComponentSpec> { - config - .components - .iter() - .find(|component| component.kind == OBSERVABILITY_PLUGIN_KIND) -} - -fn observability_component_mut(config: &mut PluginConfig) -> Option<&mut PluginComponentSpec> { - config - .components - .iter_mut() - .find(|component| component.kind == OBSERVABILITY_PLUGIN_KIND) -} - -fn ensure_object(value: &mut Value) -> &mut Map { - if !value.is_object() { - *value = json!({}); - } - value.as_object_mut().expect("value initialized as object") -} - -fn observability_config_map(config: &ObservabilityConfig) -> Result, CliError> { - let value = serde_json::to_value(config).map_err(serde_error)?; - match value { - Value::Object(map) => Ok(map), - _ => Err(CliError::Config( - "observability config must serialize to an object".into(), - )), - } -} - -fn merge_observability_editor_config( - existing: &mut Map, - edited: Map, -) { - merge_known_editor_object( - existing, - edited, - &observability_editor_fields_with_version(), - ObservabilityConfig::editor_schema(), - ); -} - -fn merge_known_editor_object( - existing: &mut Map, - edited: Map, - known_keys: &[&str], - schema: &nemo_flow::config_editor::EditorSchema, -) { - for key in known_keys { - let Some(edited_value) = edited.get(*key) else { - existing.remove(*key); - continue; - }; - if let Some(field) = schema.field(key) - && field.kind == EditorFieldKind::Section - && let Some(nested_schema) = field.schema() - && let (Some(existing_object), Some(edited_object)) = ( - existing.get_mut(*key).and_then(Value::as_object_mut), - edited_value.as_object(), - ) - { - merge_known_editor_object( - existing_object, - edited_object.clone(), - &nested_editor_keys(nested_schema), - nested_schema, - ); - continue; - } - existing.insert((*key).to_string(), edited_value.clone()); - } -} - -fn observability_editor_fields_with_version() -> Vec<&'static str> { - let mut keys = vec!["version"]; - keys.extend( - ObservabilityConfig::editor_schema() - .fields - .iter() - .map(|field| field.name), - ); - keys -} - -fn nested_editor_keys(schema: &nemo_flow::config_editor::EditorSchema) -> Vec<&'static str> { - schema.fields.iter().map(|field| field.name).collect() -} - -fn prune_plugin_defaults(value: &mut Value) { - let Some(object) = value.as_object_mut() else { - return; - }; - remove_default_field( - object, - "policy", - serde_json::to_value(ConfigPolicy::default()).expect("policy default serializes"), - ); - if let Some(components) = object.get_mut("components").and_then(Value::as_array_mut) { - for component in components { - if let Some(component) = component.as_object_mut() - && component.get("enabled") == Some(&Value::Bool(true)) - { - component.remove("enabled"); - } - } - } -} - -fn remove_default_field(object: &mut Map, key: &str, default: Value) { - let Some(value) = object.get_mut(key) else { - return; - }; - remove_matching_defaults(value, &default); - if value == &default || value.as_object().is_some_and(|value| value.is_empty()) { - object.remove(key); - } -} - -fn remove_matching_defaults(value: &mut Value, default: &Value) { - let (Some(value), Some(default)) = (value.as_object_mut(), default.as_object()) else { - return; - }; - let default_keys = default.keys().cloned().collect::>(); - for key in default_keys { - if value.get(&key) == default.get(&key) { - value.remove(&key); - } - } -} - -fn serde_error(error: serde_json::Error) -> CliError { - CliError::Config(format!("invalid plugin editor value: {error}")) -} - -fn display_field_value(section: EditorFieldSpec, field: EditorFieldSpec, value: &Value) -> String { - if default_field_value(section, field) - .as_ref() - .is_some_and(|default| default == value) - { - format!("{} (default)", display_value(value)) - } else { - display_value(value) - } -} - -fn default_field_value(section: EditorFieldSpec, field: EditorFieldSpec) -> Option { - section - .default_value() - .and_then(|section| section.as_object().cloned()) - .and_then(|section| section.get(field.name).cloned()) -} - -fn display_value(value: &Value) -> String { - match value { - Value::String(value) => value.clone(), - Value::Bool(value) => value.to_string(), - Value::Number(value) => value.to_string(), - _ => serde_json::to_string(value).unwrap_or_else(|_| "".to_string()), - } -} - -fn observability_summary(config: &PluginConfig, observability: &ObservabilityConfig) -> String { - let enabled_sections = ObservabilityConfig::editor_schema() - .fields - .iter() - .filter(|section| section.name != POLICY_SECTION) - .filter(|section| section_enabled(observability, **section).unwrap_or(false)) - .map(|section| section.label) - .collect::>(); - format!( - "component {}, sections {}", - if component_enabled(config) { - "enabled" - } else { - "disabled" - }, - if enabled_sections.is_empty() { - "none".into() - } else { - enabled_sections.join(", ") - } - ) -} - fn editor_error(err: dialoguer::Error) -> CliError { match err { dialoguer::Error::IO(io_err) diff --git a/crates/cli/src/plugins/config_io.rs b/crates/cli/src/plugins/config_io.rs new file mode 100644 index 00000000..ad31143a --- /dev/null +++ b/crates/cli/src/plugins/config_io.rs @@ -0,0 +1,174 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Testable plugin configuration file and validation helpers. + +use std::path::{Path, PathBuf}; + +use console::style; +use nemo_flow::plugin::{ConfigPolicy, PluginConfig, validate_plugin_config}; +use serde_json::{Map, Value}; + +use crate::config::{ + PluginsEditCommand, global_plugin_config_path, project_plugin_config_path, + user_plugin_config_path, +}; +use crate::error::CliError; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(super) enum TargetScope { + User, + Project, + Global, +} + +pub(super) fn target_scope(command: &PluginsEditCommand) -> Result { + let selected = [command.user, command.project, command.global] + .into_iter() + .filter(|selected| *selected) + .count(); + if selected > 1 { + return Err(CliError::Config( + "choose only one of --user, --project, or --global".into(), + )); + } + if command.project { + Ok(TargetScope::Project) + } else if command.global { + Ok(TargetScope::Global) + } else { + Ok(TargetScope::User) + } +} + +pub(super) fn target_path(scope: TargetScope) -> Result { + match scope { + TargetScope::User => user_plugin_config_path().ok_or_else(|| { + CliError::Config( + "cannot determine user config directory; set HOME or XDG_CONFIG_HOME".into(), + ) + }), + TargetScope::Project => { + let cwd = std::env::current_dir()?; + Ok(project_plugin_config_path(&cwd)) + } + TargetScope::Global => Ok(global_plugin_config_path()), + } +} + +pub(super) fn read_plugin_config(path: &Path) -> Result { + if !path.exists() { + return Ok(PluginConfig::default()); + } + let raw = std::fs::read_to_string(path)?; + let parsed = raw + .parse::() + .map(toml::Value::Table) + .map_err(|error| { + CliError::Config(format!( + "invalid plugin TOML in {}: {error}", + path.display() + )) + })?; + serde_json::from_value( + serde_json::to_value(parsed) + .map_err(|error| CliError::Config(format!("invalid plugin TOML shape: {error}")))?, + ) + .map_err(|error| CliError::Config(format!("invalid plugin config: {error}"))) +} + +pub(super) fn write_plugin_config(path: &Path, config: &PluginConfig) -> Result<(), CliError> { + let mut value = serde_json::to_value(config) + .map_err(|error| CliError::Config(format!("could not serialize plugin config: {error}")))?; + prune_plugin_defaults(&mut value); + let toml_value: toml::Value = serde_json::from_value(value).map_err(|error| { + CliError::Config(format!("could not convert plugin config to TOML: {error}")) + })?; + let rendered = toml::to_string_pretty(&toml_value) + .map_err(|error| CliError::Config(format!("could not render plugin TOML: {error}")))?; + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent)?; + } + std::fs::write(path, rendered)?; + Ok(()) +} + +pub(super) fn print_preview(config: &PluginConfig) -> Result<(), CliError> { + println!(); + println!( + "{} {}", + style("❯").green(), + style("plugins.toml preview").bold() + ); + println!("{}", style("─".repeat(58)).black().bright()); + let mut value = serde_json::to_value(config) + .map_err(|error| CliError::Config(format!("could not serialize plugin config: {error}")))?; + prune_plugin_defaults(&mut value); + let toml_value: toml::Value = serde_json::from_value(value).map_err(|error| { + CliError::Config(format!("could not convert plugin config to TOML: {error}")) + })?; + let rendered = toml::to_string_pretty(&toml_value) + .map_err(|error| CliError::Config(format!("could not render plugin TOML: {error}")))?; + print!("{rendered}"); + println!("{}", style("─".repeat(58)).black().bright()); + Ok(()) +} + +pub(super) fn validate_config(config: &PluginConfig) -> Result<(), CliError> { + let report = validate_plugin_config(config); + if report.has_errors() { + let messages = report + .diagnostics + .into_iter() + .filter(|diagnostic| diagnostic.level == nemo_flow::plugin::DiagnosticLevel::Error) + .map(|diagnostic| diagnostic.message) + .collect::>() + .join("; "); + return Err(CliError::Config(format!( + "plugin validation failed: {messages}" + ))); + } + Ok(()) +} + +pub(super) fn prune_plugin_defaults(value: &mut Value) { + let Some(object) = value.as_object_mut() else { + return; + }; + remove_default_field( + object, + "policy", + serde_json::to_value(ConfigPolicy::default()).expect("policy default serializes"), + ); + if let Some(components) = object.get_mut("components").and_then(Value::as_array_mut) { + for component in components { + if let Some(component) = component.as_object_mut() + && component.get("enabled") == Some(&Value::Bool(true)) + { + component.remove("enabled"); + } + } + } +} + +pub(super) fn remove_default_field(object: &mut Map, key: &str, default: Value) { + let Some(value) = object.get_mut(key) else { + return; + }; + remove_matching_defaults(value, &default); + if value == &default || value.as_object().is_some_and(|value| value.is_empty()) { + object.remove(key); + } +} + +pub(super) fn remove_matching_defaults(value: &mut Value, default: &Value) { + let (Some(value), Some(default)) = (value.as_object_mut(), default.as_object()) else { + return; + }; + let default_keys = default.keys().cloned().collect::>(); + for key in default_keys { + if value.get(&key) == default.get(&key) { + value.remove(&key); + } + } +} diff --git a/crates/cli/src/plugins/editor_model.rs b/crates/cli/src/plugins/editor_model.rs new file mode 100644 index 00000000..0e526a35 --- /dev/null +++ b/crates/cli/src/plugins/editor_model.rs @@ -0,0 +1,385 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Testable Observability plugin editor state helpers. + +use nemo_flow::config_editor::{EditorConfig, EditorFieldKind, EditorFieldSpec}; +use nemo_flow::observability::plugin_component::{OBSERVABILITY_PLUGIN_KIND, ObservabilityConfig}; +use nemo_flow::plugin::{PluginComponentSpec, PluginConfig}; +use serde::Serialize; +use serde::de::DeserializeOwned; +use serde_json::{Map, Value, json}; + +use crate::error::CliError; + +pub(super) const POLICY_SECTION: &str = "policy"; + +pub(super) fn ensure_observability_component(config: &mut PluginConfig) -> Result<(), CliError> { + if !config + .components + .iter() + .any(|component| component.kind == OBSERVABILITY_PLUGIN_KIND) + { + config.components.push(PluginComponentSpec { + kind: OBSERVABILITY_PLUGIN_KIND.to_string(), + enabled: true, + config: observability_config_map(&ObservabilityConfig::default())?, + }); + } + Ok(()) +} + +pub(super) fn component_enabled(config: &PluginConfig) -> bool { + observability_component(config) + .map(|component| component.enabled) + .unwrap_or(true) +} + +pub(super) fn set_component_enabled(config: &mut PluginConfig, enabled: bool) { + if let Some(component) = observability_component_mut(config) { + component.enabled = enabled; + } +} + +pub(super) fn component_observability_config( + config: &PluginConfig, +) -> Result { + observability_component(config) + .map(|component| serde_json::from_value(Value::Object(component.config.clone()))) + .transpose() + .map_err(|error| CliError::Config(format!("invalid observability plugin config: {error}")))? + .ok_or_else(|| CliError::Config("observability plugin component is missing".into())) +} + +pub(super) fn config_with_observability( + config: &PluginConfig, + observability: &ObservabilityConfig, +) -> Result { + let mut config = config.clone(); + store_observability_config(&mut config, observability)?; + Ok(config) +} + +pub(super) fn store_observability_config( + config: &mut PluginConfig, + observability: &ObservabilityConfig, +) -> Result<(), CliError> { + if let Some(component) = observability_component_mut(config) { + merge_observability_editor_config( + &mut component.config, + observability_config_map(observability)?, + ); + } + Ok(()) +} + +pub(super) fn ensure_section(config: &mut ObservabilityConfig, section: EditorFieldSpec) { + if let Ok(Some(Value::Object(_))) = section_value(config, section) { + return; + } + let Some(default) = section.default_value() else { + return; + }; + let _ = set_struct_field(config, section.name, default); +} + +pub(super) fn toggle_section(config: &mut ObservabilityConfig, section: EditorFieldSpec) { + ensure_section(config, section); + let enabled = section_enabled(config, section).unwrap_or(false); + let _ = set_section_field(config, section, "enabled", json!(!enabled)); +} + +pub(super) fn reset_section(config: &mut ObservabilityConfig, section: EditorFieldSpec) { + let value = section.default_value().unwrap_or_else(|| json!({})); + let _ = set_struct_field(config, section.name, value); +} + +pub(super) fn reset_selected_field( + config: &mut ObservabilityConfig, + section: EditorFieldSpec, + fields: &[EditorFieldSpec], + selected: usize, +) -> Result { + let offset = usize::from(section_has_enabled_toggle(section)); + let Some(index) = selected.checked_sub(offset) else { + return Ok(false); + }; + let Some(field) = fields.get(index) else { + return Ok(false); + }; + remove_section_field(config, section, field.name)?; + Ok(true) +} + +pub(super) fn section_has_enabled_toggle(section: EditorFieldSpec) -> bool { + section.name != POLICY_SECTION + && section + .schema() + .and_then(|schema| schema.field("enabled")) + .is_some_and(|field| field.kind == EditorFieldKind::Boolean) +} + +pub(super) fn section_enabled( + config: &ObservabilityConfig, + section: EditorFieldSpec, +) -> Option { + section_value(config, section) + .ok() + .flatten() + .and_then(|section| section.get("enabled").cloned()) + .and_then(|enabled| enabled.as_bool()) +} + +pub(super) fn section_configured(config: &ObservabilityConfig, section: EditorFieldSpec) -> bool { + let Ok(Some(value)) = section_value(config, section) else { + return false; + }; + if section.optional { + return true; + } + section + .default_value() + .as_ref() + .is_none_or(|default| default != &value) +} + +pub(super) fn section_field_configured( + config: &ObservabilityConfig, + section: EditorFieldSpec, + field: EditorFieldSpec, +) -> Result { + let Some(value) = section_field_value(config, section, field.name)? else { + return Ok(false); + }; + if field.optional { + return Ok(true); + } + Ok(default_field_value(section, field) + .as_ref() + .is_none_or(|default| default != &value)) +} + +pub(super) fn section_field_value( + config: &ObservabilityConfig, + section: EditorFieldSpec, + field: &str, +) -> Result, CliError> { + Ok(section_value(config, section)? + .and_then(|section| section.as_object().cloned()) + .and_then(|section| section.get(field).cloned())) +} + +pub(super) fn section_value( + config: &ObservabilityConfig, + section: EditorFieldSpec, +) -> Result, CliError> { + let value = serde_json::to_value(config).map_err(serde_error)?; + Ok(value + .as_object() + .and_then(|config| config.get(section.name)) + .filter(|section| !section.is_null()) + .cloned()) +} + +pub(super) fn set_section_field( + config: &mut ObservabilityConfig, + section: EditorFieldSpec, + field: &str, + value: Value, +) -> Result<(), CliError> { + ensure_section(config, section); + let mut object = serde_json::to_value(&*config).map_err(serde_error)?; + let config_object = ensure_object(&mut object); + let section_object = config_object + .entry(section.name) + .or_insert_with(|| section.default_value().unwrap_or_else(|| json!({}))); + ensure_object(section_object).insert(field.to_string(), value); + *config = serde_json::from_value(object).map_err(serde_error)?; + Ok(()) +} + +pub(super) fn remove_section_field( + config: &mut ObservabilityConfig, + section: EditorFieldSpec, + field: &str, +) -> Result<(), CliError> { + let mut object = serde_json::to_value(&*config).map_err(serde_error)?; + if let Some(section_object) = object + .as_object_mut() + .and_then(|config| config.get_mut(section.name)) + .and_then(Value::as_object_mut) + { + section_object.remove(field); + } + *config = serde_json::from_value(object).map_err(serde_error)?; + Ok(()) +} + +pub(super) fn set_struct_field(target: &mut T, field: &str, value: Value) -> Result<(), CliError> +where + T: Serialize + DeserializeOwned, +{ + let mut object = serde_json::to_value(&*target).map_err(serde_error)?; + ensure_object(&mut object).insert(field.to_string(), value); + *target = serde_json::from_value(object).map_err(serde_error)?; + Ok(()) +} + +pub(super) fn observability_component(config: &PluginConfig) -> Option<&PluginComponentSpec> { + config + .components + .iter() + .find(|component| component.kind == OBSERVABILITY_PLUGIN_KIND) +} + +pub(super) fn observability_component_mut( + config: &mut PluginConfig, +) -> Option<&mut PluginComponentSpec> { + config + .components + .iter_mut() + .find(|component| component.kind == OBSERVABILITY_PLUGIN_KIND) +} + +pub(super) fn ensure_object(value: &mut Value) -> &mut Map { + if !value.is_object() { + *value = json!({}); + } + value.as_object_mut().expect("value initialized as object") +} + +pub(super) fn observability_config_map( + config: &ObservabilityConfig, +) -> Result, CliError> { + let value = serde_json::to_value(config).map_err(serde_error)?; + match value { + Value::Object(map) => Ok(map), + _ => Err(CliError::Config( + "observability config must serialize to an object".into(), + )), + } +} + +pub(super) fn merge_observability_editor_config( + existing: &mut Map, + edited: Map, +) { + merge_known_editor_object( + existing, + edited, + &observability_editor_fields_with_version(), + ObservabilityConfig::editor_schema(), + ); +} + +pub(super) fn merge_known_editor_object( + existing: &mut Map, + edited: Map, + known_keys: &[&str], + schema: &nemo_flow::config_editor::EditorSchema, +) { + for key in known_keys { + let Some(edited_value) = edited.get(*key) else { + existing.remove(*key); + continue; + }; + if let Some(field) = schema.field(key) + && field.kind == EditorFieldKind::Section + && let Some(nested_schema) = field.schema() + && let (Some(existing_object), Some(edited_object)) = ( + existing.get_mut(*key).and_then(Value::as_object_mut), + edited_value.as_object(), + ) + { + merge_known_editor_object( + existing_object, + edited_object.clone(), + &nested_editor_keys(nested_schema), + nested_schema, + ); + continue; + } + existing.insert((*key).to_string(), edited_value.clone()); + } +} + +pub(super) fn observability_editor_fields_with_version() -> Vec<&'static str> { + let mut keys = vec!["version"]; + keys.extend( + ObservabilityConfig::editor_schema() + .fields + .iter() + .map(|field| field.name), + ); + keys +} + +pub(super) fn nested_editor_keys( + schema: &nemo_flow::config_editor::EditorSchema, +) -> Vec<&'static str> { + schema.fields.iter().map(|field| field.name).collect() +} + +pub(super) fn serde_error(error: serde_json::Error) -> CliError { + CliError::Config(format!("invalid plugin editor value: {error}")) +} + +pub(super) fn display_field_value( + section: EditorFieldSpec, + field: EditorFieldSpec, + value: &Value, +) -> String { + if default_field_value(section, field) + .as_ref() + .is_some_and(|default| default == value) + { + format!("{} (default)", display_value(value)) + } else { + display_value(value) + } +} + +pub(super) fn default_field_value( + section: EditorFieldSpec, + field: EditorFieldSpec, +) -> Option { + section + .default_value() + .and_then(|section| section.as_object().cloned()) + .and_then(|section| section.get(field.name).cloned()) +} + +pub(super) fn display_value(value: &Value) -> String { + match value { + Value::String(value) => value.clone(), + Value::Bool(value) => value.to_string(), + Value::Number(value) => value.to_string(), + _ => serde_json::to_string(value).unwrap_or_else(|_| "".to_string()), + } +} + +pub(super) fn observability_summary( + config: &PluginConfig, + observability: &ObservabilityConfig, +) -> String { + let enabled_sections = ObservabilityConfig::editor_schema() + .fields + .iter() + .filter(|section| section.name != POLICY_SECTION) + .filter(|section| section_enabled(observability, **section).unwrap_or(false)) + .map(|section| section.label) + .collect::>(); + format!( + "component {}, sections {}", + if component_enabled(config) { + "enabled" + } else { + "disabled" + }, + if enabled_sections.is_empty() { + "none".into() + } else { + enabled_sections.join(", ") + } + ) +} diff --git a/crates/cli/src/setup.rs b/crates/cli/src/setup.rs index c3efc49b..7f9038b4 100644 --- a/crates/cli/src/setup.rs +++ b/crates/cli/src/setup.rs @@ -6,282 +6,36 @@ //! Drives the required scope and agent prompts, then writes a `config.toml` to the chosen scope. Pure //! helpers (`detect_installed_agents`, `build_config`, `save_config`) are split out from the //! `dialoguer`-driven orchestrator so the data path can be unit-tested without a TTY. +//! +//! Keep this module focused on TTY and `dialoguer` orchestration. New testable setup behavior +//! should live in `setup/model.rs`, with focused unit tests, so Codecov does not depend on +//! exercising interactive prompt loops. use std::io::IsTerminal; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use dialoguer::theme::ColorfulTheme; use dialoguer::{Confirm, MultiSelect, Select}; -use toml_edit::{DocumentMut, Item, Table, value}; +use toml_edit::DocumentMut; use crate::config::CodingAgent; use crate::error::CliError; -use crate::installer::{hermes_hooks, hook_forward_command, merge_hermes_config}; - -/// Where the setup saves its output. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub(crate) enum ConfigScope { - /// `./.nemo-flow/config.toml` (walked-up workspace dir). - Project, - /// `~/.config/nemo-flow/config.toml` (or `$XDG_CONFIG_HOME/nemo-flow/config.toml`). - Global, - /// Both project and global; project takes precedence per merge order. - Both, -} - -impl ConfigScope { - fn label(self) -> &'static str { - match self { - Self::Project => "project ./.nemo-flow/config.toml (recommended)", - Self::Global => "global ~/.config/nemo-flow/config.toml", - Self::Both => "both project overrides global", - } - } -} - -/// Resolved answers from setup. Built either by `prompt_user` (interactive) or by tests. -#[derive(Debug, Clone)] -pub(crate) struct SetupAnswers { - pub scope: ConfigScope, - pub agents: Vec, - /// Path recorded under `[agents.hermes].hooks_path` when hermes is selected. Set by `run` - /// from `hermes_hooks_path_for_scope` so the wizard preview shows the file the launcher - /// will reference. `None` when hermes wasn't selected. - pub hermes_hooks_path: Option, -} - -/// Scans `$PATH` for the supported coding-agent binaries and returns the ones present. -/// -/// The lookup uses the same set of executable names that `CodingAgent::infer` already recognizes; -/// detection is pure and deterministic given a fixed PATH so it can be exercised in tests by -/// constructing a tempdir with stub binaries and pointing `$PATH` at it. -pub(crate) fn detect_installed_agents() -> Vec { - detect_installed_agents_in(std::env::var_os("PATH").as_deref()) -} - -pub(crate) fn detect_installed_agents_in(path_var: Option<&std::ffi::OsStr>) -> Vec { - let Some(path_var) = path_var else { - return Vec::new(); - }; - // Pairs of (CodingAgent, exec name to look for on $PATH). - let candidates = [ - (CodingAgent::ClaudeCode, "claude"), - (CodingAgent::Codex, "codex"), - (CodingAgent::Cursor, "cursor-agent"), - (CodingAgent::Hermes, "hermes"), - ]; - candidates - .into_iter() - .filter_map(|(agent, exec)| { - let found = std::env::split_paths(path_var).any(|dir| { - let candidate = dir.join(exec); - candidate.is_file() - }); - found.then_some(agent) - }) - .collect() -} - -/// Builds the TOML document that represents the setup's answers. Pure and testable. -/// -/// The shape mirrors the runtime model: agents live under `[agents.]`. -/// Sections are only emitted when the user opted into the corresponding behavior so the resulting -/// file stays minimal. -pub(crate) fn build_config(answers: &SetupAnswers) -> DocumentMut { - let mut doc = DocumentMut::new(); - - if let Some(agents_table) = build_agents_table(answers) { - doc["agents"] = Item::Table(agents_table); - } - - doc -} - -fn build_agents_table(answers: &SetupAnswers) -> Option { - if answers.agents.is_empty() { - return None; - } - - let mut agents_table = Table::new(); - for agent in &answers.agents { - let (key, command) = agent_key_and_command(*agent); - let mut agent_table = Table::new(); - agent_table["command"] = value(command); - if matches!(agent, CodingAgent::Hermes) - && let Some(path) = answers.hermes_hooks_path.as_deref() - { - agent_table["hooks_path"] = value(path.display().to_string()); - } - agents_table.insert(key, Item::Table(agent_table)); - } - Some(agents_table) -} - -/// Writes the setup's TOML document to the scope-appropriate path(s). -/// -/// When `merge_scope` is `Some(agent)`, an existing `config.toml` at the target path is parsed -/// and only the single `[agents.]` block owned by THIS wizard run is replaced. Other -/// `[agents.*]` blocks and hand-edited shared sections such as `[plugins]` are preserved when -/// omitted from the wizard output. When `merge_scope` is `None`, the file is overwritten outright -/// with the wizard's full output (the user explicitly chose which agents to include). -/// -/// Returns the list of paths written. `home` and `cwd` are explicit so tests can drive this with -/// tempdirs. -pub(crate) fn save_config( - doc: &DocumentMut, - scope: ConfigScope, - cwd: &Path, - home: &Path, - merge_scope: Option, -) -> Result, CliError> { - let mut written = Vec::new(); - if matches!(scope, ConfigScope::Project | ConfigScope::Both) { - let project_dir = cwd.join(".nemo-flow"); - std::fs::create_dir_all(&project_dir)?; - let path = project_dir.join("config.toml"); - write_or_merge(&path, doc, merge_scope)?; - written.push(path); - } - if matches!(scope, ConfigScope::Global | ConfigScope::Both) { - let global_dir = global_config_dir(home); - std::fs::create_dir_all(&global_dir)?; - let path = global_dir.join("config.toml"); - write_or_merge(&path, doc, merge_scope)?; - written.push(path); - } - Ok(written) -} -// Resolves the global nemo-flow config directory. Prefers `$XDG_CONFIG_HOME/nemo-flow` (matches -// `config::user_config_dir`), falling back to `/.config/nemo-flow`. Tests that pass a -// tempdir for `home` get hermetic paths unless they set XDG_CONFIG_HOME explicitly. -fn global_config_dir(home: &Path) -> PathBuf { - if let Some(base) = std::env::var_os("XDG_CONFIG_HOME") { - return PathBuf::from(base).join("nemo-flow"); - } - home.join(".config").join("nemo-flow") -} +mod model; -// Writes the wizard-built `doc` to `path`. When `merge_scope` is `Some(agent)` and the file -// already exists, preserves any `[agents.]` blocks while replacing the shared sections -// and the target agent's block. When `merge_scope` is `None`, just overwrites the file. -fn write_or_merge( - path: &Path, - doc: &DocumentMut, - merge_scope: Option, -) -> Result<(), CliError> { - let Some(agent) = merge_scope else { - std::fs::write(path, doc.to_string())?; - return Ok(()); - }; - if !path.exists() { - std::fs::write(path, doc.to_string())?; - return Ok(()); - } - let existing_raw = std::fs::read_to_string(path)?; - let mut existing: DocumentMut = existing_raw - .parse() - .map_err(|err| CliError::Config(format!("could not parse existing config: {err}")))?; - let agent_key = agent_key_and_command(agent).0; - // `plugins` is not wizard-owned (users may hand-edit it). Preserve on omission. - merge_section(&mut existing, doc, "plugins"); - merge_agents_entry(&mut existing, doc, agent_key); - std::fs::write(path, existing.to_string())?; - Ok(()) -} +pub(crate) use self::model::reset; +use self::model::{ + ConfigScope, SetupAnswers, agent_key_and_command, build_config, detect_installed_agents, + hermes_hook_targets, hermes_hooks_path_for_scope, home_dir, install_hermes_hooks, + preview_paths, read_existing_defaults, save_config, +}; -// Copies a top-level section from `src` into `dst`, replacing any existing entry under the same -// key. If `src` does not contain the section, the existing entry in `dst` is left as-is. -// Use for shared/hand-edited sections the wizard does not own. -fn merge_section(dst: &mut DocumentMut, src: &DocumentMut, key: &str) { - if let Some(item) = src.get(key) { - dst[key] = item.clone(); - } -} - -// Replaces the single `[agents.]` block in `dst` with the one from `src`. If `src` does -// not contain that block, the existing entry in `dst` is left as-is. -fn merge_agents_entry(dst: &mut DocumentMut, src: &DocumentMut, agent_key: &str) { - let Some(src_agent) = src - .get("agents") - .and_then(|item| item.as_table()) - .and_then(|table| table.get(agent_key)) - else { - return; - }; - // Defensive: if the existing config has `agents = "literal"` or `agents = [...]` (anything - // not a table) the original `.as_table_mut().unwrap()` panicked. Replace any non-table - // value with a fresh table so a malformed user file degrades to an overwrite, not a crash. - let needs_init = dst - .get("agents") - .is_none_or(|item| item.as_table().is_none()); - if needs_init { - dst["agents"] = Item::Table(Table::new()); - } - let agents_table = dst["agents"] - .as_table_mut() - .expect("agents key is a table after the init guard above"); - agents_table.insert(agent_key, src_agent.clone()); -} +#[cfg(test)] +use self::model::{Defaults, read_agents_from_doc, write_or_merge}; -/// Removes the project `config.toml` (or just one agent's block within it). -/// -/// `agent_hint = None` deletes the whole project config file. `agent_hint = Some(agent)` parses -/// the existing file and removes only `[agents.]`, leaving every other section intact. -/// In both cases this targets the *project* layer; global and system layers are left to direct -/// editing because they typically aren't owned by the wizard. -pub(crate) fn reset(agent_hint: Option) -> Result<(), CliError> { - let cwd = std::env::current_dir()?; - let path = cwd.join(".nemo-flow").join("config.toml"); - if !path.exists() { - println!(" No project config to reset at {}", path.display()); - return Ok(()); - } - match agent_hint { - None => { - std::fs::remove_file(&path)?; - println!(" ✓ Removed {}", path.display()); - println!(" Run `nemo-flow config` to set up again."); - } - Some(agent) => { - let agent_key = agent_key_and_command(agent).0; - let raw = std::fs::read_to_string(&path)?; - let mut doc: DocumentMut = raw.parse().map_err(|err| { - CliError::Config(format!("could not parse existing config: {err}")) - })?; - // Three reasons we have nothing to remove: no `[agents]` table at all, the `agents` - // key holds a non-table value, or the table is missing this specific agent's block. - // In every case we must report "nothing to reset" and skip the write — silently - // printing "✓ Removed" when nothing changed misleads the user about file state. - let Some(agents) = doc.get_mut("agents").and_then(Item::as_table_mut) else { - println!( - " No `[agents.{agent_key}]` block to reset in {}", - path.display() - ); - return Ok(()); - }; - if agents.remove(agent_key).is_none() { - println!( - " No `[agents.{agent_key}]` block to reset in {}", - path.display() - ); - return Ok(()); - } - // Remove the empty `[agents]` table itself so the file stays tidy when no agent - // entries remain. - if agents.is_empty() { - doc.remove("agents"); - } - std::fs::write(&path, doc.to_string())?; - println!(" ✓ Removed `[agents.{agent_key}]` from {}", path.display()); - } - } - Ok(()) -} +#[cfg(all(test, unix))] +use self::model::detect_installed_agents_in; -/// Drives the interactive setup. Returns the answers so callers can either save them or feed -/// the resulting config back into a launch path. Errors when stdin isn't a TTY so non-interactive -/// callers fall back to explicit flags instead of hanging on a prompt that nobody will see. /// /// When `agent_hint` is `Some`, the agent multi-select is skipped — the user already declared /// intent by typing `nemo-flow claude` (or another agent name), so respect that and only ask @@ -341,132 +95,47 @@ pub(crate) fn prompt_user( }) } -/// Returns the path the wizard will record under `[agents.hermes].hooks_path` and write hermes -/// hooks to. For `Both` scope, the project path wins (matches the config-merge precedence). For -/// `Global` scope, the home path wins. Returns `None` when hermes is not in the selection. -pub(crate) fn hermes_hooks_path_for_scope( - agents: &[CodingAgent], - scope: ConfigScope, - cwd: &Path, - home: &Path, -) -> Option { - if !agents.contains(&CodingAgent::Hermes) { - return None; - } - match scope { - ConfigScope::Project | ConfigScope::Both => Some(cwd.join(".hermes").join("config.yaml")), - ConfigScope::Global => Some(home.join(".hermes").join("config.yaml")), - } -} - -/// Writes/merges `.hermes/config.yaml` hook config for every scope-applicable location so hermes -/// fires `nemo-flow hook-forward hermes` on every hook event after setup. Idempotent: existing -/// hook entries are preserved and our generated groups are appended only when missing. +/// Top-level setup entry point used by `nemo-flow config` and the easy-path fallback. +/// Detects agents, prompts the user, writes the config, prints a final summary. /// -/// Returns the list of paths actually written so callers can surface them to the user. -pub(crate) fn install_hermes_hooks( - scope: ConfigScope, - cwd: &Path, - home: &Path, -) -> Result, CliError> { - let generated = hermes_hooks(&hook_forward_command("nemo-flow", CodingAgent::Hermes)); - let mut written = Vec::new(); - for path in hermes_hook_targets(scope, cwd, home) { - let existing = match std::fs::read_to_string(&path) { - Ok(raw) => raw, - Err(error) if error.kind() == std::io::ErrorKind::NotFound => String::new(), - Err(error) => return Err(CliError::Io(error)), - }; - let merged = merge_hermes_config(&existing, generated.clone())?; - if let Some(parent) = path.parent() { - std::fs::create_dir_all(parent)?; - } - std::fs::write(&path, merged)?; - written.push(path); - } - Ok(written) -} +/// `agent_hint` carries the agent the user typed on the easy path (`nemo-flow claude`); when +/// `Some`, the agent multi-select is skipped because intent is already declared. `None` from +/// `nemo-flow config` asks the full set so users can configure multiple agents at once. +pub(crate) async fn run(agent_hint: Option) -> Result<(), CliError> { + let detected = detect_installed_agents(); + let mut answers = prompt_user(&detected, agent_hint)?; -fn hermes_hook_targets(scope: ConfigScope, cwd: &Path, home: &Path) -> Vec { - let mut targets = Vec::new(); - if matches!(scope, ConfigScope::Project | ConfigScope::Both) { - targets.push(cwd.join(".hermes").join("config.yaml")); - } - if matches!(scope, ConfigScope::Global | ConfigScope::Both) { - targets.push(home.join(".hermes").join("config.yaml")); - } - targets -} + let cwd = std::env::current_dir()?; + let home = home_dir().ok_or_else(|| { + CliError::Config("cannot determine home directory (set $HOME or $USERPROFILE)".into()) + })?; + answers.hermes_hooks_path = + hermes_hooks_path_for_scope(&answers.agents, answers.scope, &cwd, &home); -/// Pre-filled wizard defaults read from an existing `config.toml`. When the file is missing or -/// unparseable the defaults are all-empty and the wizard behaves like a first-run setup. -#[derive(Debug, Clone, Default)] -struct Defaults { - scope: Option, - agents: Vec, -} + let doc = build_config(&answers); + let mut preview_paths = preview_paths(answers.scope, &cwd, &home); + preview_paths.extend( + hermes_hook_targets(answers.scope, &cwd, &home) + .into_iter() + .filter(|_| answers.agents.contains(&CodingAgent::Hermes)), + ); -impl Defaults { - fn has_any(&self) -> bool { - self.scope.is_some() || !self.agents.is_empty() + if !confirm_summary(&preview_paths, &doc)? { + return Err(CliError::Config("setup cancelled — no config saved".into())); } -} - -/// Reads the highest-precedence existing config file and derives wizard defaults from it. -/// Workspace config wins over global; if both exist, scope defaults to `Both`. Missing or -/// malformed files yield `None` (the wizard then behaves as if no config existed). -fn read_existing_defaults() -> Option { - let cwd = std::env::current_dir().ok()?; - let home = home_dir(); - - let workspace_path = cwd.join(".nemo-flow").join("config.toml"); - let global_path = home - .as_ref() - .map(|h| global_config_dir(h).join("config.toml")); - - let workspace_exists = workspace_path.exists(); - let global_exists = global_path.as_ref().is_some_and(|p| p.exists()); - - let read_doc = - |path: &Path| -> Option { std::fs::read_to_string(path).ok()?.parse().ok() }; - - let doc = match (workspace_exists, global_exists) { - (true, _) => read_doc(&workspace_path)?, - (false, true) => read_doc(global_path.as_ref()?)?, - (false, false) => return None, - }; - - let scope = match (workspace_exists, global_exists) { - (true, true) => Some(ConfigScope::Both), - (true, false) => Some(ConfigScope::Project), - (false, true) => Some(ConfigScope::Global), - (false, false) => None, - }; - - Some(Defaults { - scope, - agents: read_agents_from_doc(&doc), - }) -} -fn read_agents_from_doc(doc: &DocumentMut) -> Vec { - let Some(table) = doc.get("agents").and_then(|i| i.as_table()) else { - return Vec::new(); - }; - let mut found = Vec::new(); - for (key, _) in table.iter() { - let agent = match key { - "claude" => Some(CodingAgent::ClaudeCode), - "codex" => Some(CodingAgent::Codex), - "cursor" => Some(CodingAgent::Cursor), - "hermes" => Some(CodingAgent::Hermes), - _ => None, - }; - if let Some(agent) = agent { - found.push(agent); - } + let mut written = save_config(&doc, answers.scope, &cwd, &home, agent_hint)?; + if answers.agents.contains(&CodingAgent::Hermes) { + written.extend(install_hermes_hooks(answers.scope, &cwd, &home)?); } - found + println!(); + println!(" ✓ Saved:"); + for path in &written { + println!(" {}", path.display()); + } + println!(" Configure observability with `nemo-flow plugins edit`."); + println!(); + Ok(()) } fn print_codex_api_key_guide() { @@ -608,75 +277,6 @@ fn setup_error(err: dialoguer::Error) -> CliError { } } -fn agent_key_and_command(agent: CodingAgent) -> (&'static str, &'static str) { - match agent { - CodingAgent::ClaudeCode => ("claude", "claude"), - CodingAgent::Codex => ("codex", "codex"), - CodingAgent::Cursor => ("cursor", "cursor-agent"), - CodingAgent::Hermes => ("hermes", "hermes"), - } -} - -/// Top-level setup entry point used by `nemo-flow config` and the easy-path fallback. -/// Detects agents, prompts the user, writes the config, prints a final summary. -/// -/// `agent_hint` carries the agent the user typed on the easy path (`nemo-flow claude`); when -/// `Some`, the agent multi-select is skipped because intent is already declared. `None` from -/// `nemo-flow config` asks the full set so users can configure multiple agents at once. -pub(crate) async fn run(agent_hint: Option) -> Result<(), CliError> { - let detected = detect_installed_agents(); - let mut answers = prompt_user(&detected, agent_hint)?; - - let cwd = std::env::current_dir()?; - let home = home_dir().ok_or_else(|| { - CliError::Config("cannot determine home directory (set $HOME or $USERPROFILE)".into()) - })?; - answers.hermes_hooks_path = - hermes_hooks_path_for_scope(&answers.agents, answers.scope, &cwd, &home); - - let doc = build_config(&answers); - let mut preview_paths = preview_paths(answers.scope, &cwd, &home); - preview_paths.extend( - hermes_hook_targets(answers.scope, &cwd, &home) - .into_iter() - .filter(|_| answers.agents.contains(&CodingAgent::Hermes)), - ); - - if !confirm_summary(&preview_paths, &doc)? { - return Err(CliError::Config("setup cancelled — no config saved".into())); - } - - let mut written = save_config(&doc, answers.scope, &cwd, &home, agent_hint)?; - if answers.agents.contains(&CodingAgent::Hermes) { - written.extend(install_hermes_hooks(answers.scope, &cwd, &home)?); - } - println!(); - println!(" ✓ Saved:"); - for path in &written { - println!(" {}", path.display()); - } - println!(" Configure observability with `nemo-flow plugins edit`."); - println!(); - Ok(()) -} - -fn preview_paths(scope: ConfigScope, cwd: &Path, home: &Path) -> Vec { - let mut paths = Vec::new(); - if matches!(scope, ConfigScope::Project | ConfigScope::Both) { - paths.push(cwd.join(".nemo-flow").join("config.toml")); - } - if matches!(scope, ConfigScope::Global | ConfigScope::Both) { - paths.push(global_config_dir(home).join("config.toml")); - } - paths -} - -fn home_dir() -> Option { - std::env::var_os("HOME") - .or_else(|| std::env::var_os("USERPROFILE")) - .map(PathBuf::from) -} - #[cfg(test)] #[path = "../tests/coverage/setup_tests.rs"] mod tests; diff --git a/crates/cli/src/setup/model.rs b/crates/cli/src/setup/model.rs new file mode 100644 index 00000000..0fed3228 --- /dev/null +++ b/crates/cli/src/setup/model.rs @@ -0,0 +1,425 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Testable setup configuration model and file helpers. + +use std::path::{Path, PathBuf}; + +use toml_edit::{DocumentMut, Item, Table, value}; + +use crate::config::CodingAgent; +use crate::error::CliError; +use crate::installer::{hermes_hooks, hook_forward_command, merge_hermes_config}; + +/// Where the setup saves its output. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum ConfigScope { + /// `./.nemo-flow/config.toml` (walked-up workspace dir). + Project, + /// `~/.config/nemo-flow/config.toml` (or `$XDG_CONFIG_HOME/nemo-flow/config.toml`). + Global, + /// Both project and global; project takes precedence per merge order. + Both, +} + +impl ConfigScope { + pub(super) fn label(self) -> &'static str { + match self { + Self::Project => "project ./.nemo-flow/config.toml (recommended)", + Self::Global => "global ~/.config/nemo-flow/config.toml", + Self::Both => "both project overrides global", + } + } +} + +/// Resolved answers from setup. Built either by `prompt_user` (interactive) or by tests. +#[derive(Debug, Clone)] +pub(crate) struct SetupAnswers { + pub scope: ConfigScope, + pub agents: Vec, + /// Path recorded under `[agents.hermes].hooks_path` when hermes is selected. Set by `run` + /// from `hermes_hooks_path_for_scope` so the wizard preview shows the file the launcher + /// will reference. `None` when hermes wasn't selected. + pub hermes_hooks_path: Option, +} + +/// Scans `$PATH` for the supported coding-agent binaries and returns the ones present. +/// +/// The lookup uses the same set of executable names that `CodingAgent::infer` already recognizes; +/// detection is pure and deterministic given a fixed PATH so it can be exercised in tests by +/// constructing a tempdir with stub binaries and pointing `$PATH` at it. +pub(crate) fn detect_installed_agents() -> Vec { + detect_installed_agents_in(std::env::var_os("PATH").as_deref()) +} + +pub(crate) fn detect_installed_agents_in(path_var: Option<&std::ffi::OsStr>) -> Vec { + let Some(path_var) = path_var else { + return Vec::new(); + }; + // Pairs of (CodingAgent, exec name to look for on $PATH). + let candidates = [ + (CodingAgent::ClaudeCode, "claude"), + (CodingAgent::Codex, "codex"), + (CodingAgent::Cursor, "cursor-agent"), + (CodingAgent::Hermes, "hermes"), + ]; + candidates + .into_iter() + .filter_map(|(agent, exec)| { + let found = std::env::split_paths(path_var).any(|dir| { + let candidate = dir.join(exec); + candidate.is_file() + }); + found.then_some(agent) + }) + .collect() +} + +/// Builds the TOML document that represents the setup's answers. Pure and testable. +/// +/// The shape mirrors the runtime model: agents live under `[agents.]`. +/// Sections are only emitted when the user opted into the corresponding behavior so the resulting +/// file stays minimal. +pub(crate) fn build_config(answers: &SetupAnswers) -> DocumentMut { + let mut doc = DocumentMut::new(); + + if let Some(agents_table) = build_agents_table(answers) { + doc["agents"] = Item::Table(agents_table); + } + + doc +} + +pub(super) fn build_agents_table(answers: &SetupAnswers) -> Option
{ + if answers.agents.is_empty() { + return None; + } + + let mut agents_table = Table::new(); + for agent in &answers.agents { + let (key, command) = agent_key_and_command(*agent); + let mut agent_table = Table::new(); + agent_table["command"] = value(command); + if matches!(agent, CodingAgent::Hermes) + && let Some(path) = answers.hermes_hooks_path.as_deref() + { + agent_table["hooks_path"] = value(path.display().to_string()); + } + agents_table.insert(key, Item::Table(agent_table)); + } + Some(agents_table) +} + +/// Writes the setup's TOML document to the scope-appropriate path(s). +/// +/// When `merge_scope` is `Some(agent)`, an existing `config.toml` at the target path is parsed +/// and only the single `[agents.]` block owned by THIS wizard run is replaced. Other +/// `[agents.*]` blocks and hand-edited shared sections such as `[plugins]` are preserved when +/// omitted from the wizard output. When `merge_scope` is `None`, the file is overwritten outright +/// with the wizard's full output (the user explicitly chose which agents to include). +/// +/// Returns the list of paths written. `home` and `cwd` are explicit so tests can drive this with +/// tempdirs. +pub(crate) fn save_config( + doc: &DocumentMut, + scope: ConfigScope, + cwd: &Path, + home: &Path, + merge_scope: Option, +) -> Result, CliError> { + let mut written = Vec::new(); + if matches!(scope, ConfigScope::Project | ConfigScope::Both) { + let project_dir = cwd.join(".nemo-flow"); + std::fs::create_dir_all(&project_dir)?; + let path = project_dir.join("config.toml"); + write_or_merge(&path, doc, merge_scope)?; + written.push(path); + } + if matches!(scope, ConfigScope::Global | ConfigScope::Both) { + let global_dir = global_config_dir(home); + std::fs::create_dir_all(&global_dir)?; + let path = global_dir.join("config.toml"); + write_or_merge(&path, doc, merge_scope)?; + written.push(path); + } + Ok(written) +} + +// Resolves the global nemo-flow config directory. Prefers `$XDG_CONFIG_HOME/nemo-flow` (matches +// `config::user_config_dir`), falling back to `/.config/nemo-flow`. Tests that pass a +// tempdir for `home` get hermetic paths unless they set XDG_CONFIG_HOME explicitly. +pub(super) fn global_config_dir(home: &Path) -> PathBuf { + if let Some(base) = std::env::var_os("XDG_CONFIG_HOME") { + return PathBuf::from(base).join("nemo-flow"); + } + home.join(".config").join("nemo-flow") +} + +// Writes the wizard-built `doc` to `path`. When `merge_scope` is `Some(agent)` and the file +// already exists, preserves any `[agents.]` blocks while replacing the shared sections +// and the target agent's block. When `merge_scope` is `None`, just overwrites the file. +pub(super) fn write_or_merge( + path: &Path, + doc: &DocumentMut, + merge_scope: Option, +) -> Result<(), CliError> { + let Some(agent) = merge_scope else { + std::fs::write(path, doc.to_string())?; + return Ok(()); + }; + if !path.exists() { + std::fs::write(path, doc.to_string())?; + return Ok(()); + } + let existing_raw = std::fs::read_to_string(path)?; + let mut existing: DocumentMut = existing_raw + .parse() + .map_err(|err| CliError::Config(format!("could not parse existing config: {err}")))?; + let agent_key = agent_key_and_command(agent).0; + // `plugins` is not wizard-owned (users may hand-edit it). Preserve on omission. + merge_section(&mut existing, doc, "plugins"); + merge_agents_entry(&mut existing, doc, agent_key); + std::fs::write(path, existing.to_string())?; + Ok(()) +} + +// Copies a top-level section from `src` into `dst`, replacing any existing entry under the same +// key. If `src` does not contain the section, the existing entry in `dst` is left as-is. +// Use for shared/hand-edited sections the wizard does not own. +pub(super) fn merge_section(dst: &mut DocumentMut, src: &DocumentMut, key: &str) { + if let Some(item) = src.get(key) { + dst[key] = item.clone(); + } +} + +// Replaces the single `[agents.]` block in `dst` with the one from `src`. If `src` does +// not contain that block, the existing entry in `dst` is left as-is. +pub(super) fn merge_agents_entry(dst: &mut DocumentMut, src: &DocumentMut, agent_key: &str) { + let Some(src_agent) = src + .get("agents") + .and_then(|item| item.as_table()) + .and_then(|table| table.get(agent_key)) + else { + return; + }; + // Defensive: if the existing config has `agents = "literal"` or `agents = [...]` (anything + // not a table) the original `.as_table_mut().unwrap()` panicked. Replace any non-table + // value with a fresh table so a malformed user file degrades to an overwrite, not a crash. + let needs_init = dst + .get("agents") + .is_none_or(|item| item.as_table().is_none()); + if needs_init { + dst["agents"] = Item::Table(Table::new()); + } + let agents_table = dst["agents"] + .as_table_mut() + .expect("agents key is a table after the init guard above"); + agents_table.insert(agent_key, src_agent.clone()); +} + +/// Removes the project `config.toml` (or just one agent's block within it). +/// +/// `agent_hint = None` deletes the whole project config file. `agent_hint = Some(agent)` parses +/// the existing file and removes only `[agents.]`, leaving every other section intact. +/// In both cases this targets the *project* layer; global and system layers are left to direct +/// editing because they typically aren't owned by the wizard. +pub(crate) fn reset(agent_hint: Option) -> Result<(), CliError> { + let cwd = std::env::current_dir()?; + let path = cwd.join(".nemo-flow").join("config.toml"); + if !path.exists() { + println!(" No project config to reset at {}", path.display()); + return Ok(()); + } + match agent_hint { + None => { + std::fs::remove_file(&path)?; + println!(" ✓ Removed {}", path.display()); + println!(" Run `nemo-flow config` to set up again."); + } + Some(agent) => { + let agent_key = agent_key_and_command(agent).0; + let raw = std::fs::read_to_string(&path)?; + let mut doc: DocumentMut = raw.parse().map_err(|err| { + CliError::Config(format!("could not parse existing config: {err}")) + })?; + // Three reasons we have nothing to remove: no `[agents]` table at all, the `agents` + // key holds a non-table value, or the table is missing this specific agent's block. + // In every case we must report "nothing to reset" and skip the write — silently + // printing "✓ Removed" when nothing changed misleads the user about file state. + let Some(agents) = doc.get_mut("agents").and_then(Item::as_table_mut) else { + println!( + " No `[agents.{agent_key}]` block to reset in {}", + path.display() + ); + return Ok(()); + }; + if agents.remove(agent_key).is_none() { + println!( + " No `[agents.{agent_key}]` block to reset in {}", + path.display() + ); + return Ok(()); + } + // Remove the empty `[agents]` table itself so the file stays tidy when no agent + // entries remain. + if agents.is_empty() { + doc.remove("agents"); + } + std::fs::write(&path, doc.to_string())?; + println!(" ✓ Removed `[agents.{agent_key}]` from {}", path.display()); + } + } + Ok(()) +} + +/// Returns the Hermes hooks file path that should be recorded for the selected setup scope. +pub(crate) fn hermes_hooks_path_for_scope( + agents: &[CodingAgent], + scope: ConfigScope, + cwd: &Path, + home: &Path, +) -> Option { + if !agents.contains(&CodingAgent::Hermes) { + return None; + } + match scope { + ConfigScope::Project | ConfigScope::Both => Some(cwd.join(".hermes").join("config.yaml")), + ConfigScope::Global => Some(home.join(".hermes").join("config.yaml")), + } +} + +/// Writes/merges `.hermes/config.yaml` hook config for every scope-applicable location so hermes +/// fires `nemo-flow hook-forward hermes` on every hook event after setup. Idempotent: existing +/// hook entries are preserved and our generated groups are appended only when missing. +/// +/// Returns the list of paths actually written so callers can surface them to the user. +pub(crate) fn install_hermes_hooks( + scope: ConfigScope, + cwd: &Path, + home: &Path, +) -> Result, CliError> { + let generated = hermes_hooks(&hook_forward_command("nemo-flow", CodingAgent::Hermes)); + let mut written = Vec::new(); + for path in hermes_hook_targets(scope, cwd, home) { + let existing = match std::fs::read_to_string(&path) { + Ok(raw) => raw, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => String::new(), + Err(error) => return Err(CliError::Io(error)), + }; + let merged = merge_hermes_config(&existing, generated.clone())?; + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent)?; + } + std::fs::write(&path, merged)?; + written.push(path); + } + Ok(written) +} + +pub(super) fn hermes_hook_targets(scope: ConfigScope, cwd: &Path, home: &Path) -> Vec { + let mut targets = Vec::new(); + if matches!(scope, ConfigScope::Project | ConfigScope::Both) { + targets.push(cwd.join(".hermes").join("config.yaml")); + } + if matches!(scope, ConfigScope::Global | ConfigScope::Both) { + targets.push(home.join(".hermes").join("config.yaml")); + } + targets +} + +/// Pre-filled wizard defaults read from an existing `config.toml`. When the file is missing or +/// unparseable the defaults are all-empty and the wizard behaves like a first-run setup. +#[derive(Debug, Clone, Default)] +pub(super) struct Defaults { + pub(super) scope: Option, + pub(super) agents: Vec, +} + +impl Defaults { + pub(super) fn has_any(&self) -> bool { + self.scope.is_some() || !self.agents.is_empty() + } +} + +/// Reads the highest-precedence existing config file and derives wizard defaults from it. +/// Workspace config wins over global; if both exist, scope defaults to `Both`. Missing or +/// malformed files yield `None` (the wizard then behaves as if no config existed). +pub(super) fn read_existing_defaults() -> Option { + let cwd = std::env::current_dir().ok()?; + let home = home_dir(); + + let workspace_path = cwd.join(".nemo-flow").join("config.toml"); + let global_path = home + .as_ref() + .map(|h| global_config_dir(h).join("config.toml")); + + let workspace_exists = workspace_path.exists(); + let global_exists = global_path.as_ref().is_some_and(|p| p.exists()); + + let read_doc = + |path: &Path| -> Option { std::fs::read_to_string(path).ok()?.parse().ok() }; + + let doc = match (workspace_exists, global_exists) { + (true, _) => read_doc(&workspace_path)?, + (false, true) => read_doc(global_path.as_ref()?)?, + (false, false) => return None, + }; + + let scope = match (workspace_exists, global_exists) { + (true, true) => Some(ConfigScope::Both), + (true, false) => Some(ConfigScope::Project), + (false, true) => Some(ConfigScope::Global), + (false, false) => None, + }; + + Some(Defaults { + scope, + agents: read_agents_from_doc(&doc), + }) +} + +pub(super) fn read_agents_from_doc(doc: &DocumentMut) -> Vec { + let Some(table) = doc.get("agents").and_then(|i| i.as_table()) else { + return Vec::new(); + }; + let mut found = Vec::new(); + for (key, _) in table.iter() { + let agent = match key { + "claude" => Some(CodingAgent::ClaudeCode), + "codex" => Some(CodingAgent::Codex), + "cursor" => Some(CodingAgent::Cursor), + "hermes" => Some(CodingAgent::Hermes), + _ => None, + }; + if let Some(agent) = agent { + found.push(agent); + } + } + found +} + +pub(super) fn agent_key_and_command(agent: CodingAgent) -> (&'static str, &'static str) { + match agent { + CodingAgent::ClaudeCode => ("claude", "claude"), + CodingAgent::Codex => ("codex", "codex"), + CodingAgent::Cursor => ("cursor", "cursor-agent"), + CodingAgent::Hermes => ("hermes", "hermes"), + } +} + +pub(super) fn preview_paths(scope: ConfigScope, cwd: &Path, home: &Path) -> Vec { + let mut paths = Vec::new(); + if matches!(scope, ConfigScope::Project | ConfigScope::Both) { + paths.push(cwd.join(".nemo-flow").join("config.toml")); + } + if matches!(scope, ConfigScope::Global | ConfigScope::Both) { + paths.push(global_config_dir(home).join("config.toml")); + } + paths +} + +pub(super) fn home_dir() -> Option { + std::env::var_os("HOME") + .or_else(|| std::env::var_os("USERPROFILE")) + .map(PathBuf::from) +} diff --git a/crates/cli/tests/cli_tests.rs b/crates/cli/tests/cli_tests.rs index f692733f..503a2f63 100644 --- a/crates/cli/tests/cli_tests.rs +++ b/crates/cli/tests/cli_tests.rs @@ -32,6 +32,71 @@ fn cli_version_exits_successfully() { assert!(String::from_utf8_lossy(&output.stdout).contains("nemo-flow ")); } +#[test] +fn cli_agents_json_emits_supported_agent_shapes() { + let temp = tempfile::tempdir().unwrap(); + let output = Command::new(gateway_bin()) + .env("XDG_CONFIG_HOME", temp.path().join("xdg")) + .env("HOME", temp.path()) + .args(["agents", "--json"]) + .output() + .unwrap(); + + assert!(output.status.success()); + let parsed: serde_json::Value = serde_json::from_slice(&output.stdout).unwrap(); + let agents = parsed.as_array().unwrap(); + assert!(agents.iter().any(|agent| agent["name"] == "codex")); + assert!(agents.iter().all(|agent| agent["status"].is_string())); +} + +#[test] +fn cli_doctor_json_emits_versioned_report() { + let temp = tempfile::tempdir().unwrap(); + let output = Command::new(gateway_bin()) + .env("XDG_CONFIG_HOME", temp.path().join("xdg")) + .env("HOME", temp.path()) + .args(["doctor", "--json"]) + .output() + .unwrap(); + + assert!(output.status.success()); + let parsed: serde_json::Value = serde_json::from_slice(&output.stdout).unwrap(); + assert_eq!(parsed["schema_version"], 1); + assert!(parsed["environment"].is_object()); + assert!(parsed["configuration"].is_object()); + assert!(parsed["agents"].is_array()); +} + +#[test] +fn cli_completions_prints_script_for_requested_shell() { + let output = Command::new(gateway_bin()) + .args(["completions", "zsh"]) + .output() + .unwrap(); + + assert!(output.status.success()); + let stdout = String::from_utf8_lossy(&output.stdout); + assert!(stdout.contains("#compdef nemo-flow") || stdout.contains("_nemo-flow")); +} + +#[test] +fn cli_plugins_edit_requires_tty() { + let temp = tempfile::tempdir().unwrap(); + let output = Command::new(gateway_bin()) + .env("XDG_CONFIG_HOME", temp.path().join("xdg")) + .env("HOME", temp.path()) + .args(["plugins", "edit", "--user"]) + .output() + .unwrap(); + + assert!(!output.status.success()); + assert!( + String::from_utf8_lossy(&output.stderr).contains("requires a TTY"), + "stderr was:\n{}", + String::from_utf8_lossy(&output.stderr) + ); +} + #[test] fn cli_help_lists_easy_path_agent_shortcuts() { let output = Command::new(gateway_bin()).arg("--help").output().unwrap(); diff --git a/crates/cli/tests/coverage/completions_install_tests.rs b/crates/cli/tests/coverage/completions_install_tests.rs index 9e9bb677..807a59fc 100644 --- a/crates/cli/tests/coverage/completions_install_tests.rs +++ b/crates/cli/tests/coverage/completions_install_tests.rs @@ -4,9 +4,12 @@ use super::*; use std::ffi::OsString; use std::path::PathBuf; +use std::sync::Mutex; use clap_complete::Shell; +static ENV_LOCK: Mutex<()> = Mutex::new(()); + #[test] fn zsh_uses_zdotdir_when_set() { let path = completion_path( @@ -76,3 +79,48 @@ fn detect_shell_rejects_missing_shell_env() { let error = detect_shell(None).unwrap_err().to_string(); assert!(error.contains("$SHELL is not set"), "error was: {error}"); } + +#[test] +fn write_atomic_creates_target_and_removes_temp_file() { + let temp = tempfile::tempdir().unwrap(); + let target = temp.path().join("nemo-flow"); + + write_atomic(&target, b"complete -c nemo-flow").unwrap(); + + assert_eq!(std::fs::read(&target).unwrap(), b"complete -c nemo-flow"); + assert!(!target.with_file_name(".nemo-flow.tmp").exists()); +} + +#[test] +fn install_writes_detected_shell_completion() { + let _guard = ENV_LOCK.lock().unwrap(); + let temp = tempfile::tempdir().unwrap(); + let old_home = std::env::var_os("HOME"); + let old_zdotdir = std::env::var_os("ZDOTDIR"); + let old_shell = std::env::var_os("SHELL"); + + unsafe { + std::env::set_var("HOME", temp.path()); + std::env::remove_var("ZDOTDIR"); + std::env::set_var("SHELL", "/bin/zsh"); + } + + let path = install(None).unwrap(); + + restore_env("HOME", old_home); + restore_env("ZDOTDIR", old_zdotdir); + restore_env("SHELL", old_shell); + + assert_eq!(path, temp.path().join(".zfunc/_nemo-flow")); + let script = std::fs::read_to_string(path).unwrap(); + assert!(script.contains("nemo-flow")); +} + +fn restore_env(key: &str, value: Option) { + unsafe { + match value { + Some(value) => std::env::set_var(key, value), + None => std::env::remove_var(key), + } + } +} diff --git a/crates/cli/tests/coverage/doctor_tests.rs b/crates/cli/tests/coverage/doctor_tests.rs index baad81a7..0927a940 100644 --- a/crates/cli/tests/coverage/doctor_tests.rs +++ b/crates/cli/tests/coverage/doctor_tests.rs @@ -2,7 +2,46 @@ // SPDX-License-Identifier: Apache-2.0 use super::*; +use std::ffi::OsString; use std::path::PathBuf; +use std::sync::Mutex; + +static ENV_LOCK: Mutex<()> = Mutex::new(()); + +struct EnvScope { + values: Vec<(&'static str, Option)>, +} + +impl EnvScope { + fn set(values: &[(&'static str, Option<&std::ffi::OsStr>)]) -> Self { + let previous = values + .iter() + .map(|(key, _)| (*key, std::env::var_os(key))) + .collect::>(); + for (key, value) in values { + unsafe { + match value { + Some(value) => std::env::set_var(key, value), + None => std::env::remove_var(key), + } + } + } + Self { values: previous } + } +} + +impl Drop for EnvScope { + fn drop(&mut self) { + for (key, value) in self.values.drain(..) { + unsafe { + match value { + Some(value) => std::env::set_var(key, value), + None => std::env::remove_var(key), + } + } + } + } +} fn empty_report() -> DoctorReport { DoctorReport { @@ -235,6 +274,144 @@ fn check_dir_writable_does_not_create_missing_dir() { ); } +#[test] +fn layer_status_reports_missing_valid_invalid_and_non_directory_paths() { + let temp = tempfile::tempdir().unwrap(); + let missing = temp.path().join("missing.toml"); + assert_eq!(layer_status(&missing).status, Status::Info); + + let valid = temp.path().join("config.toml"); + std::fs::write(&valid, "[upstream]\nopenai_base_url = \"http://local\"\n").unwrap(); + let valid_layer = layer_status(&valid); + assert_eq!(valid_layer.status, Status::Pass); + assert!(valid_layer.active); + + let invalid = temp.path().join("invalid.toml"); + std::fs::write(&invalid, "[upstream\n").unwrap(); + let invalid_layer = layer_status(&invalid); + assert_eq!(invalid_layer.status, Status::Fail); + assert!(invalid_layer.details.contains("invalid TOML")); + + let dir = temp.path().join("config-dir"); + std::fs::create_dir(&dir).unwrap(); + let dir_layer = layer_status(&dir); + assert_eq!(dir_layer.status, Status::Fail); + assert!( + dir_layer.details.contains("unreadable") || dir_layer.details.contains("Is a directory") + ); +} + +#[test] +fn agent_helper_statuses_cover_configured_target_and_hook_paths() { + assert_eq!(command_executable("codex --full-auto"), "codex"); + assert_eq!(command_executable(""), ""); + assert_eq!( + agent_command_status(Some(std::path::Path::new("/bin/codex")), false, true), + Status::Warn + ); + assert_eq!(agent_command_status(None, true, false), Status::Fail); + assert_eq!( + combine_status(Status::Pass, Status::Warn, true), + Status::Warn + ); + assert_eq!( + combine_status(Status::Pass, Status::Warn, false), + Status::Pass + ); + + let mut agents = AgentConfigs::default(); + agents.hermes.hooks_path = Some(PathBuf::from("/tmp/hermes.yaml")); + assert!(agent_configured(CodingAgent::Hermes, &agents)); + assert_eq!(configured_agent_names(&agents), vec!["hermes".to_string()]); + + let temp = tempfile::tempdir().unwrap(); + let hook = temp.path().join("hooks.yaml"); + std::fs::write(&hook, "cmd: nemo-flow hook-forward hermes\n").unwrap(); + let (status, details) = hook_file_status(Ok(hook.clone()), CodingAgent::Hermes, true, "hooks"); + assert_eq!(status, Status::Pass); + assert!(details.contains(hook.to_str().unwrap())); + + std::fs::write(&hook, "cmd: custom\n").unwrap(); + let (status, details) = hook_file_status(Ok(hook.clone()), CodingAgent::Hermes, true, "hooks"); + assert_eq!(status, Status::Fail); + assert!(details.contains("missing NeMo Flow hook")); + let (status, _) = hook_file_status(Ok(hook), CodingAgent::Hermes, false, "hooks"); + assert_eq!(status, Status::Info); +} + +#[test] +fn collect_completions_reports_shell_specific_paths() { + let _guard = ENV_LOCK.lock().unwrap(); + let temp = tempfile::tempdir().unwrap(); + let zsh_completion = temp.path().join(".zfunc/_nemo-flow"); + std::fs::create_dir_all(zsh_completion.parent().unwrap()).unwrap(); + std::fs::write(&zsh_completion, "#compdef nemo-flow\n").unwrap(); + + let _env = EnvScope::set(&[("SHELL", Some(std::ffi::OsStr::new("/bin/zsh")))]); + let checks = collect_completions(Some(temp.path())); + assert_eq!(checks[0].status, Status::Pass); + assert!(checks[0].details.contains("_nemo-flow")); + + drop(_env); + let _env = EnvScope::set(&[("SHELL", Some(std::ffi::OsStr::new("/bin/fish")))]); + let checks = collect_completions(Some(temp.path())); + assert_eq!(checks[0].status, Status::Info); + assert!(checks[0].details.contains("nemo-flow.fish")); + + drop(_env); + let _env = EnvScope::set(&[("SHELL", None)]); + let checks = collect_completions(Some(temp.path())); + assert_eq!(checks[0].status, Status::Info); + assert!(checks[0].details.contains("no $SHELL")); +} + +#[test] +fn observability_component_helpers_cover_disabled_and_default_paths() { + let plugin = serde_json::json!({ + "version": 1, + "components": [{ + "kind": OBSERVABILITY_PLUGIN_KIND, + "enabled": true, + "config": { + "version": 1, + "atof": { "enabled": true }, + "openinference": { + "enabled": true, + "endpoint": "http://127.0.0.1:1" + } + } + }] + }); + let config = observability_component_config(&plugin).unwrap(); + assert!(section_enabled(config, "atof")); + assert_eq!(section_output_directory(config, "atof"), None); + assert_eq!( + section_endpoint(config, "openinference").as_deref(), + Some("http://127.0.0.1:1") + ); + assert!( + observability_component_config(&serde_json::json!({ + "components": [{ "kind": "other", "config": {} }] + })) + .is_none() + ); +} + +#[test] +fn check_directory_reports_pass_warn_and_fail() { + let temp = tempfile::tempdir().unwrap(); + let pass = check_directory("ATOF dir", temp.path()); + assert_eq!(pass.status, Status::Pass); + + let missing = check_directory("ATOF dir", &temp.path().join("missing")); + assert_eq!(missing.status, Status::Warn); + + let file = temp.path().join("file"); + std::fs::write(&file, "").unwrap(); + let fail = check_directory("ATOF dir", &file); + assert_eq!(fail.status, Status::Fail); +} + #[tokio::test] async fn collect_observability_warns_for_missing_atif_dir_without_creating_it() { let temp = tempfile::tempdir().unwrap(); diff --git a/crates/cli/tests/coverage/plugins_tests.rs b/crates/cli/tests/coverage/plugins_tests.rs index 3eda9d93..674fcd4e 100644 --- a/crates/cli/tests/coverage/plugins_tests.rs +++ b/crates/cli/tests/coverage/plugins_tests.rs @@ -2,6 +2,42 @@ // SPDX-License-Identifier: Apache-2.0 use super::*; +use crate::config::{global_plugin_config_path, project_plugin_config_path}; +use nemo_flow::observability::plugin_component::OBSERVABILITY_PLUGIN_KIND; +use nemo_flow::plugin::{ConfigPolicy, PluginComponentSpec, PluginConfig}; + +#[test] +fn target_scope_defaults_to_user_and_rejects_conflicts() { + assert_eq!( + target_scope(&PluginsEditCommand::default()).unwrap(), + TargetScope::User + ); + assert_eq!( + target_scope(&PluginsEditCommand { + project: true, + ..PluginsEditCommand::default() + }) + .unwrap(), + TargetScope::Project + ); + assert_eq!( + target_scope(&PluginsEditCommand { + global: true, + ..PluginsEditCommand::default() + }) + .unwrap(), + TargetScope::Global + ); + + let error = target_scope(&PluginsEditCommand { + user: true, + project: true, + ..PluginsEditCommand::default() + }) + .unwrap_err() + .to_string(); + assert!(error.contains("choose only one"), "error was: {error}"); +} #[test] fn typed_editor_model_contains_observability_sections() { @@ -156,3 +192,165 @@ fn editor_save_preserves_unknown_observability_fields() { assert_eq!(atof_config.get("filename"), Some(&json!("events.jsonl"))); assert!(!atof_config.contains_key("output_directory")); } + +#[test] +fn component_enablement_and_summary_track_config_state() { + let mut config = PluginConfig::default(); + ensure_observability_component(&mut config).unwrap(); + let mut observability = component_observability_config(&config).unwrap(); + + assert!(component_enabled(&config)); + assert_eq!( + observability_summary(&config, &observability), + "component enabled, sections none" + ); + + set_component_enabled(&mut config, false); + let atif = ObservabilityConfig::editor_schema().field("atif").unwrap(); + toggle_section(&mut observability, atif); + + assert!(!component_enabled(&config)); + assert_eq!( + observability_summary(&config, &observability), + "component disabled, sections ATIF" + ); +} + +#[test] +fn reset_selected_field_accounts_for_section_toggle_offset() { + let mut observability = ObservabilityConfig::default(); + let atof = ObservabilityConfig::editor_schema().field("atof").unwrap(); + let fields = atof.schema().unwrap().fields; + + set_section_field(&mut observability, atof, "output_directory", json!("logs")).unwrap(); + assert!( + section_field_value(&observability, atof, "output_directory") + .unwrap() + .is_some() + ); + + let output_directory_index = fields + .iter() + .position(|field| field.name == "output_directory") + .unwrap(); + assert!( + reset_selected_field(&mut observability, atof, fields, output_directory_index + 1,) + .unwrap() + ); + assert_eq!( + section_field_value(&observability, atof, "output_directory").unwrap(), + None + ); + assert!(!reset_selected_field(&mut observability, atof, fields, 0).unwrap()); +} + +#[test] +fn read_plugin_config_handles_missing_and_invalid_files() { + let temp = tempfile::tempdir().unwrap(); + let missing = temp.path().join("plugins.toml"); + let config = read_plugin_config(&missing).unwrap(); + assert!(config.components.is_empty()); + + std::fs::write(&missing, "components = [\n").unwrap(); + let error = read_plugin_config(&missing).unwrap_err().to_string(); + assert!(error.contains("invalid plugin TOML"), "error was: {error}"); +} + +#[test] +fn write_plugin_config_prunes_defaults_and_round_trips() { + let temp = tempfile::tempdir().unwrap(); + let path = temp.path().join("plugins.toml"); + let mut config = PluginConfig::default(); + ensure_observability_component(&mut config).unwrap(); + + write_plugin_config(&path, &config).unwrap(); + + let rendered = std::fs::read_to_string(&path).unwrap(); + assert!(rendered.contains("kind = \"observability\"")); + assert!(!rendered.contains("enabled = true")); + let round_tripped = read_plugin_config(&path).unwrap(); + assert_eq!(round_tripped.components.len(), 1); + assert_eq!(round_tripped.components[0].kind, OBSERVABILITY_PLUGIN_KIND); +} + +#[test] +fn prune_plugin_defaults_removes_default_policy_and_enabled_true_only() { + let mut value = json!({ + "version": 1, + "policy": ConfigPolicy::default(), + "components": [ + { "kind": "observability", "enabled": true, "config": {} }, + { "kind": "other", "enabled": false, "config": {} } + ] + }); + + prune_plugin_defaults(&mut value); + + let object = value.as_object().unwrap(); + assert!(!object.contains_key("policy")); + let components = object["components"].as_array().unwrap(); + assert!(!components[0].as_object().unwrap().contains_key("enabled")); + assert_eq!(components[1]["enabled"], json!(false)); +} + +#[test] +fn validate_config_reports_plugin_diagnostics() { + let config = PluginConfig { + components: vec![PluginComponentSpec { + kind: OBSERVABILITY_PLUGIN_KIND.to_string(), + enabled: true, + config: json!({ + "version": 1, + "atof": { + "enabled": true, + "mode": "not-a-mode" + } + }) + .as_object() + .unwrap() + .clone(), + }], + ..PluginConfig::default() + }; + + let error = validate_config(&config).unwrap_err().to_string(); + + assert!( + error.contains("plugin validation failed"), + "error was: {error}" + ); + assert!(error.contains("ATOF mode"), "error was: {error}"); +} + +#[test] +fn display_helpers_render_scalars_json_and_defaults() { + assert_eq!(display_value(&json!("logs")), "logs"); + assert_eq!(display_value(&json!(true)), "true"); + assert_eq!(display_value(&json!(7)), "7"); + assert_eq!(display_value(&json!({ "a": 1 })), r#"{"a":1}"#); + + let atof = ObservabilityConfig::editor_schema().field("atof").unwrap(); + let mode = atof.schema().unwrap().field("mode").unwrap(); + assert_eq!( + display_field_value(atof, mode, &json!("append")), + "append (default)" + ); + assert_eq!( + display_field_value(atof, mode, &json!("overwrite")), + "overwrite" + ); +} + +#[test] +fn target_path_resolves_project_and_global_without_user_env() { + let cwd = std::env::current_dir().unwrap(); + + assert_eq!( + target_path(TargetScope::Project).unwrap(), + project_plugin_config_path(&cwd) + ); + assert_eq!( + target_path(TargetScope::Global).unwrap(), + global_plugin_config_path() + ); +} diff --git a/crates/cli/tests/coverage/server_tests.rs b/crates/cli/tests/coverage/server_tests.rs index c058d041..c2e41136 100644 --- a/crates/cli/tests/coverage/server_tests.rs +++ b/crates/cli/tests/coverage/server_tests.rs @@ -693,6 +693,39 @@ async fn models_route_forwards_get_requests() { assert_eq!(body["authorization"], json!("Bearer test")); } +#[tokio::test] +async fn gateway_forwards_anthropic_count_tokens_without_llm_codec() { + let upstream = spawn_anthropic_upstream().await; + let mut config = test_config(); + config.anthropic_base_url = upstream.url(); + let app = router(config); + let response = app + .oneshot( + Request::builder() + .method("POST") + .uri("/v1/messages/count_tokens") + .header("content-type", "application/json") + .header("x-api-key", "sk-ant-test") + .body(Body::from( + json!({ + "model": "claude-test", + "messages": [{ "role": "user", "content": "hello" }] + }) + .to_string(), + )) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + let bytes = response.into_body().collect().await.unwrap().to_bytes(); + let body: Value = serde_json::from_slice(&bytes).unwrap(); + assert_eq!(body["path"], json!("/v1/messages/count_tokens")); + assert_eq!(body["x_api_key"], json!("sk-ant-test")); + assert_eq!(body["input_tokens"], json!(12)); +} + async fn wait_for_gateway(url: &str) { let client = reqwest::Client::new(); for _ in 0..50 { @@ -805,3 +838,26 @@ async fn spawn_models_upstream() -> TestServer { handle, } } + +async fn spawn_anthropic_upstream() -> TestServer { + async fn count_tokens(headers: HeaderMap, request: Request) -> impl IntoResponse { + Json(json!({ + "path": request.uri().path(), + "x_api_key": headers + .get("x-api-key") + .and_then(|value| value.to_str().ok()), + "input_tokens": 12 + })) + } + + let app = Router::new().route("/v1/messages/count_tokens", post(count_tokens)); + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let address = listener.local_addr().unwrap(); + let handle = tokio::spawn(async move { + axum::serve(listener, app).await.unwrap(); + }); + TestServer { + url: format!("http://{address}"), + handle, + } +} diff --git a/crates/cli/tests/coverage/setup_tests.rs b/crates/cli/tests/coverage/setup_tests.rs index f8d99015..ef41798e 100644 --- a/crates/cli/tests/coverage/setup_tests.rs +++ b/crates/cli/tests/coverage/setup_tests.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use super::*; +use std::path::PathBuf; use std::sync::{Mutex, OnceLock}; // Tests that exercise the global-config write path must run serially with respect to each other @@ -47,6 +48,29 @@ impl<'a> Drop for XdgScope<'a> { } } +struct CwdScope<'a> { + _guard: std::sync::MutexGuard<'a, ()>, + prev: PathBuf, +} + +impl<'a> CwdScope<'a> { + fn enter(path: &std::path::Path) -> Self { + let guard = xdg_env_lock().lock().unwrap_or_else(|e| e.into_inner()); + let prev = std::env::current_dir().unwrap(); + std::env::set_current_dir(path).unwrap(); + Self { + _guard: guard, + prev, + } + } +} + +impl<'a> Drop for CwdScope<'a> { + fn drop(&mut self) { + std::env::set_current_dir(&self.prev).unwrap(); + } +} + // Stub-binary detection relies on the Unix executable bit. Windows-side agent presence checks // use a different mechanism (e.g. `.exe` extension matching), so this lookup test is gated to // Unix to keep cross-platform CI green; covering the Windows code path is left to a separate @@ -241,6 +265,91 @@ fn build_config_emits_hooks_path_for_hermes_when_set() { assert!(rendered.contains(r#"hooks_path = "/tmp/proj/.hermes/config.yaml""#)); } +#[test] +fn config_scope_labels_are_user_facing_and_stable() { + assert!( + ConfigScope::Project + .label() + .contains(".nemo-flow/config.toml") + ); + assert!( + ConfigScope::Global + .label() + .contains(".config/nemo-flow/config.toml") + ); + assert!( + ConfigScope::Both + .label() + .contains("project overrides global") + ); +} + +#[test] +fn hermes_hook_paths_follow_selected_scope() { + let cwd = PathBuf::from("/workspace"); + let home = PathBuf::from("/home/user"); + let agents = [CodingAgent::Hermes]; + + assert_eq!( + hermes_hooks_path_for_scope(&agents, ConfigScope::Project, &cwd, &home), + Some(PathBuf::from("/workspace/.hermes/config.yaml")) + ); + assert_eq!( + hermes_hooks_path_for_scope(&agents, ConfigScope::Both, &cwd, &home), + Some(PathBuf::from("/workspace/.hermes/config.yaml")) + ); + assert_eq!( + hermes_hooks_path_for_scope(&agents, ConfigScope::Global, &cwd, &home), + Some(PathBuf::from("/home/user/.hermes/config.yaml")) + ); + assert_eq!( + hermes_hooks_path_for_scope(&[], ConfigScope::Project, &cwd, &home), + None + ); + assert_eq!( + hermes_hook_targets(ConfigScope::Both, &cwd, &home), + vec![ + PathBuf::from("/workspace/.hermes/config.yaml"), + PathBuf::from("/home/user/.hermes/config.yaml") + ] + ); +} + +#[test] +fn existing_defaults_detects_scope_and_agents_from_docs() { + let empty = Defaults::default(); + assert!(!empty.has_any()); + assert!( + Defaults { + scope: Some(ConfigScope::Project), + agents: vec![] + } + .has_any() + ); + assert!( + Defaults { + scope: None, + agents: vec![CodingAgent::Codex] + } + .has_any() + ); + + let doc: DocumentMut = r#" +[agents.claude] +command = "claude" + +[agents.codex] +command = "codex" + +[agents.unknown] +command = "custom" +"# + .parse() + .unwrap(); + let agents = read_agents_from_doc(&doc); + assert_eq!(agents, vec![CodingAgent::ClaudeCode, CodingAgent::Codex]); +} + #[test] fn install_hermes_hooks_writes_yaml_and_merges_existing() { let cwd = tempfile::tempdir().unwrap(); @@ -267,3 +376,85 @@ fn install_hermes_hooks_writes_yaml_and_merges_existing() { let home_yaml = std::fs::read_to_string(home.path().join(".hermes/config.yaml")).unwrap(); assert!(home_yaml.contains("nemo-flow hook-forward hermes")); } + +#[test] +fn write_or_merge_recovers_from_non_table_agents_value() { + let temp = tempfile::tempdir().unwrap(); + let path = temp.path().join("config.toml"); + std::fs::write( + &path, + r#" +agents = "not-a-table" + +[plugins] +enabled = true +"#, + ) + .unwrap(); + let doc = build_config(&SetupAnswers { + scope: ConfigScope::Project, + agents: vec![CodingAgent::Codex], + hermes_hooks_path: None, + }); + + write_or_merge(&path, &doc, Some(CodingAgent::Codex)).unwrap(); + + let merged = std::fs::read_to_string(path).unwrap(); + assert!(merged.contains("[agents.codex]")); + assert!(merged.contains(r#"command = "codex""#)); + assert!(merged.contains("[plugins]")); +} + +#[test] +fn reset_removes_whole_project_config_or_one_agent() { + let temp = tempfile::tempdir().unwrap(); + let _cwd = CwdScope::enter(temp.path()); + let config_dir = temp.path().join(".nemo-flow"); + std::fs::create_dir_all(&config_dir).unwrap(); + let path = config_dir.join("config.toml"); + std::fs::write( + &path, + r#" +[agents.claude] +command = "claude" + +[agents.codex] +command = "codex" +"#, + ) + .unwrap(); + + reset(Some(CodingAgent::ClaudeCode)).unwrap(); + + let scoped = std::fs::read_to_string(&path).unwrap(); + assert!(!scoped.contains("[agents.claude]")); + assert!(scoped.contains("[agents.codex]")); + + reset(None).unwrap(); + + assert!(!path.exists()); +} + +#[test] +fn reset_reports_missing_or_malformed_agent_blocks_without_rewriting() { + let temp = tempfile::tempdir().unwrap(); + let _cwd = CwdScope::enter(temp.path()); + let config_dir = temp.path().join(".nemo-flow"); + std::fs::create_dir_all(&config_dir).unwrap(); + let path = config_dir.join("config.toml"); + std::fs::write(&path, "agents = \"not-a-table\"\n").unwrap(); + + reset(Some(CodingAgent::Hermes)).unwrap(); + + assert_eq!( + std::fs::read_to_string(&path).unwrap(), + "agents = \"not-a-table\"\n" + ); + + std::fs::write(&path, "not valid toml = [\n").unwrap(); + let error = reset(Some(CodingAgent::Hermes)).unwrap_err().to_string(); + assert!( + error.contains("could not parse existing config"), + "error was: {error}" + ); +} From ab4b7122b20467a845a8fc9a6e39192c22af7934 Mon Sep 17 00:00:00 2001 From: Will Killian <2007799+willkill07@users.noreply.github.com> Date: Thu, 14 May 2026 15:57:33 -0400 Subject: [PATCH 5/9] ci: fold OpenClaw checks into Node workflow (#106) #### Overview Fold OpenClaw validation into the existing Node.js CI workflow as a conditional step, and make `just test-openclaw` run the live smoke coverage path. - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details - Add a `run_openclaw` input to the reusable Node.js workflow. - Run OpenClaw integration checks as a conditional step across the full Node test matrix. - Remove the separate OpenClaw workflow call and workflow file. - Keep OpenClaw package artifact creation inside the existing Node package job while leaving Node package steps gated by `run_package`. - Add the live smoke test path to `just test-openclaw` and document the target in contributor testing guidance. #### Where should the reviewer start? Start with `.github/workflows/ci_node.yml`, especially the conditional OpenClaw test step in the Node test job and the package-job gating. #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Relates to: none ## Summary by CodeRabbit * **Tests** * Added live-run OpenClaw smoke tests and a helper script to run them. * OpenClaw integration checks now run conditionally inside the Node.js test flow. * Test suites updated to use compiled test artifacts and adjusted import paths. * **Chores** * Removed standalone OpenClaw CI job; its checks and optional packaging were folded into the Node.js workflow and gated by inputs. * OpenClaw packaging and artifact upload are now conditional. * **Documentation** * Testing guide and integration README updated with live-test target and artifact locations. --- .github/workflows/ci.yaml | 16 +-- .github/workflows/ci_changes.yml | 4 +- .github/workflows/ci_node.yml | 83 +++++++++++++++- .github/workflows/ci_openclaw.yml | 97 ------------------- docs/contribute/testing-and-docs.md | 5 +- integrations/openclaw/README.md | 5 +- integrations/openclaw/package.json | 4 +- .../openclaw/scripts/check-pack-payload.mjs | 4 +- integrations/openclaw/scripts/test-live.mjs | 21 ++++ .../{src/__tests__ => test}/config.test.ts | 6 +- .../__tests__ => test}/failure-model.test.ts | 6 +- .../{src/__tests__ => test}/gateway-status.ts | 2 +- .../__tests__ => test}/hooks-backend.test.ts | 8 +- .../__tests__ => test}/live-smoke.test.ts | 4 +- .../__tests__ => test}/llm-replay.test.ts | 6 +- .../__tests__ => test}/tool-replay.test.ts | 6 +- integrations/openclaw/tsconfig.build.json | 2 +- integrations/openclaw/tsconfig.test.json | 6 ++ justfile | 12 ++- 19 files changed, 153 insertions(+), 144 deletions(-) delete mode 100644 .github/workflows/ci_openclaw.yml create mode 100644 integrations/openclaw/scripts/test-live.mjs rename integrations/openclaw/{src/__tests__ => test}/config.test.ts (99%) rename integrations/openclaw/{src/__tests__ => test}/failure-model.test.ts (94%) rename integrations/openclaw/{src/__tests__ => test}/gateway-status.ts (94%) rename integrations/openclaw/{src/__tests__ => test}/hooks-backend.test.ts (98%) rename integrations/openclaw/{src/__tests__ => test}/live-smoke.test.ts (98%) rename integrations/openclaw/{src/__tests__ => test}/llm-replay.test.ts (99%) rename integrations/openclaw/{src/__tests__ => test}/tool-replay.test.ts (97%) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0c85376e..5373de22 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -197,17 +197,7 @@ jobs: ref_type: ${{ github.ref_type }} ref_name: ${{ github.ref_name }} run_package: ${{ needs.ci_changes.outputs.run_node_package == 'true' }} - - ci_openclaw: - name: OpenClaw - needs: [prepare, ci_changes, ci_check] - uses: ./.github/workflows/ci_openclaw.yml - if: ${{ needs.ci_check.result == 'success' && needs.ci_changes.outputs.run_openclaw == 'true' }} - permissions: - contents: read - with: - ref_type: ${{ github.ref_type }} - ref_name: ${{ github.ref_name }} + run_openclaw: ${{ needs.ci_changes.outputs.run_openclaw == 'true' }} ci_python: name: Python @@ -247,7 +237,6 @@ jobs: - ci_rust - ci_go - ci_node - - ci_openclaw - ci_python - ci_wasm if: ${{ always() && !cancelled() && needs.prepare.result == 'success' && ! fromJSON(needs.prepare.outputs.has_skip_ci_label) }} @@ -263,7 +252,6 @@ jobs: RUST_RESULT: ${{ needs.ci_rust.result }} GO_RESULT: ${{ needs.ci_go.result }} NODE_RESULT: ${{ needs.ci_node.result }} - OPENCLAW_RESULT: ${{ needs.ci_openclaw.result }} PYTHON_RESULT: ${{ needs.ci_python.result }} WEBASSEMBLY_RESULT: ${{ needs.ci_wasm.result }} publish_docs: ${{ needs.prepare.outputs.publish_docs }} @@ -302,13 +290,11 @@ jobs: if [[ "$publish_packages" == "true" ]]; then require_success "Rust" "$RUST_RESULT" require_success "Node.js" "$NODE_RESULT" - require_success "OpenClaw" "$OPENCLAW_RESULT" require_success "Python" "$PYTHON_RESULT" require_success "WebAssembly" "$WEBASSEMBLY_RESULT" else allow_success_or_skipped "Rust" "$RUST_RESULT" allow_success_or_skipped "Node.js" "$NODE_RESULT" - allow_success_or_skipped "OpenClaw" "$OPENCLAW_RESULT" allow_success_or_skipped "Python" "$PYTHON_RESULT" allow_success_or_skipped "WebAssembly" "$WEBASSEMBLY_RESULT" fi diff --git a/.github/workflows/ci_changes.yml b/.github/workflows/ci_changes.yml index 5ead5d56..6785992a 100644 --- a/.github/workflows/ci_changes.yml +++ b/.github/workflows/ci_changes.yml @@ -76,9 +76,9 @@ jobs: run_dependencies: ${{ inputs.full_ci || steps.filter.outputs.dependencies == 'true' }} run_docs: ${{ (inputs.full_ci || startsWith(inputs.ref_name, 'pull-request/')) && (inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.shared == 'true' || steps.filter.outputs.docs == 'true') }} run_go: ${{ inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.shared == 'true' || steps.filter.outputs.go == 'true' }} - run_node: ${{ inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.shared == 'true' || steps.filter.outputs.node == 'true' }} + run_node: ${{ inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.shared == 'true' || steps.filter.outputs.node == 'true' || steps.filter.outputs.openclaw == 'true' }} run_node_package: ${{ inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.node_package == 'true' }} - run_openclaw: ${{ inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.shared == 'true' || steps.filter.outputs.openclaw == 'true' }} + run_openclaw: ${{ inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.shared == 'true' || steps.filter.outputs.node == 'true' || steps.filter.outputs.openclaw == 'true' }} run_python: ${{ inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.shared == 'true' || steps.filter.outputs.python == 'true' }} run_python_package: ${{ inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.python_package == 'true' }} run_rust: ${{ inputs.full_ci || steps.filter.outputs.ci == 'true' || steps.filter.outputs.shared == 'true' || steps.filter.outputs.rust == 'true' }} diff --git a/.github/workflows/ci_node.yml b/.github/workflows/ci_node.yml index 42ba4577..5ea89d1a 100644 --- a/.github/workflows/ci_node.yml +++ b/.github/workflows/ci_node.yml @@ -19,6 +19,11 @@ on: required: false default: true type: boolean + run_openclaw: + description: 'Whether to run OpenClaw integration checks' + required: false + default: false + type: boolean secrets: CODECOV_TOKEN: required: false @@ -90,6 +95,11 @@ jobs: working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} run: just --set ci true --set output_dir "${{ github.workspace }}" test-node + - name: Run OpenClaw integration checks + if: ${{ inputs.run_openclaw }} + working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} + run: just --set ci true test-openclaw + - name: Upload Node coverage to Codecov uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6 if: ${{ !startsWith(matrix.platform, 'windows') }} @@ -167,11 +177,13 @@ jobs: tool: just@${{ steps.ci-config.outputs.just_version }} - name: Create packaging output directory + if: ${{ inputs.run_package }} run: | set -e mkdir -p "${{ env.NEMO_FLOW_CI_WORKSPACE_TMP }}/npm" - name: Derive Node package version + if: ${{ inputs.run_package }} working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} run: | set -e @@ -185,6 +197,7 @@ jobs: printf 'NEMO_FLOW_PACKAGE_VERSION=%s\n' "$version" >> "$GITHUB_ENV" - name: Package Node + if: ${{ inputs.run_package }} working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} run: | set -e @@ -196,15 +209,83 @@ jobs: - name: Upload npm package artifact uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + if: ${{ inputs.run_package }} with: name: npm-${{ matrix.platform }} path: ${{ env.NEMO_FLOW_CI_WORKSPACE_TMP }}/npm/*.tgz if-no-files-found: error + PackageOpenClaw: + name: Package OpenClaw plugin + needs: [Test] + if: ${{ inputs.run_openclaw && !cancelled() && needs.Test.result == 'success' }} + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + + - name: Load CI tool versions + id: ci-config + uses: ./.github/actions/load-ci-tool-versions + + - uses: actions-rust-lang/setup-rust-toolchain@150fca883cd4034361b621bd4e6a9d34e5143606 # v1.15.4 + with: + cache: false + toolchain: ${{ steps.ci-config.outputs.rust_version }} + + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + with: + shared-key: nemo-flow-rust-openclaw-package-${{ runner.os }}-${{ runner.arch }}-${{ steps.ci-config.outputs.rust_version }} + workspaces: . -> target + cache-all-crates: true + cache-bin: false + save-if: false + + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6 + with: + node-version: ${{ steps.ci-config.outputs.node_version }} + + - uses: taiki-e/install-action@5939f3337e40968c39aa70f5ecb1417a92fb25a0 # v2.75.15 + with: + tool: just@${{ steps.ci-config.outputs.just_version }} + + - name: Derive OpenClaw package version + working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} + run: | + set -e + version="$(node -e 'const fs = require("fs"); const pkg = JSON.parse(fs.readFileSync("integrations/openclaw/package.json", "utf8")); if (!pkg.version) { throw new Error("integrations/openclaw/package.json missing version field"); } console.log(pkg.version);')" + sha="${GITHUB_SHA::8}" + if [ "${{ inputs.ref_type }}" = "tag" ]; then + version="${{ inputs.ref_name }}" + else + version="${version}+${sha}" + fi + printf 'NEMO_FLOW_OPENCLAW_PACKAGE_VERSION=%s\n' "$version" >> "$GITHUB_ENV" + + - name: Package OpenClaw plugin + working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} + run: | + set -euo pipefail + just \ + --set ci true \ + --set output_dir "${NEMO_FLOW_CI_WORKSPACE_TMP}" \ + --set ref_name "${NEMO_FLOW_OPENCLAW_PACKAGE_VERSION}" \ + package-openclaw + + - name: Upload OpenClaw plugin artifact + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: openclaw-npm + path: ${{ env.NEMO_FLOW_CI_WORKSPACE_TMP }}/openclaw/*.tgz + if-no-files-found: error + Consolidate: name: Consolidate needs: [Package] - if: ${{ !cancelled() && needs.Package.result == 'success' }} + if: ${{ inputs.run_package && !cancelled() && needs.Package.result == 'success' }} runs-on: ubuntu-latest timeout-minutes: 30 permissions: diff --git a/.github/workflows/ci_openclaw.yml b/.github/workflows/ci_openclaw.yml deleted file mode 100644 index 068fd8b4..00000000 --- a/.github/workflows/ci_openclaw.yml +++ /dev/null @@ -1,97 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -name: OpenClaw - -on: - workflow_call: - inputs: - ref_type: - description: 'The ref type from the triggering workflow' - required: true - type: string - ref_name: - description: 'The ref name from the triggering workflow' - required: true - type: string - -defaults: - run: - shell: bash - -env: - GH_TOKEN: "${{ github.token }}" - GIT_COMMIT: "${{ github.sha }}" - NEMO_FLOW_CI_WORKSPACE: "${{ github.workspace }}" - NEMO_FLOW_CI_WORKSPACE_TMP: "${{ github.workspace }}/ci/tmp" - UV_PYTHON_DOWNLOADS: never - -jobs: - Test: - name: Test - runs-on: ubuntu-latest - timeout-minutes: 30 - permissions: - contents: read - - steps: - - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - - - name: Load CI tool versions - id: ci-config - uses: ./.github/actions/load-ci-tool-versions - - - uses: actions-rust-lang/setup-rust-toolchain@150fca883cd4034361b621bd4e6a9d34e5143606 # v1.15.4 - with: - cache: false - toolchain: ${{ steps.ci-config.outputs.rust_version }} - - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 - with: - shared-key: nemo-flow-rust-${{ runner.os }}-${{ runner.arch }}-${{ steps.ci-config.outputs.rust_version }} - workspaces: . -> target - cache-all-crates: true - cache-bin: false - save-if: false - - - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6 - with: - node-version: ${{ steps.ci-config.outputs.node_version }} - - - uses: taiki-e/install-action@5939f3337e40968c39aa70f5ecb1417a92fb25a0 # v2.75.15 - with: - tool: just@${{ steps.ci-config.outputs.just_version }} - - - name: Run OpenClaw integration checks - working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} - run: just --set ci true test-openclaw - - - name: Derive OpenClaw package version - working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} - run: | - set -e - version="$(node -e 'const fs = require("fs"); const pkg = JSON.parse(fs.readFileSync("integrations/openclaw/package.json", "utf8")); if (!pkg.version) { throw new Error("integrations/openclaw/package.json missing version field"); } console.log(pkg.version);')" - sha="${GITHUB_SHA::8}" - if [ "${{ inputs.ref_type }}" = "tag" ]; then - version="${{ inputs.ref_name }}" - else - version="${version}+${sha}" - fi - printf 'NEMO_FLOW_PACKAGE_VERSION=%s\n' "$version" >> "$GITHUB_ENV" - - - name: Package OpenClaw plugin - working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} - run: | - set -euo pipefail - just \ - --set output_dir "${NEMO_FLOW_CI_WORKSPACE_TMP}" \ - --set ref_name "${NEMO_FLOW_PACKAGE_VERSION}" \ - package-openclaw - - - name: Upload OpenClaw plugin artifact - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 - with: - name: openclaw-npm - path: ${{ env.NEMO_FLOW_CI_WORKSPACE_TMP }}/openclaw/*.tgz - if-no-files-found: error diff --git a/docs/contribute/testing-and-docs.md b/docs/contribute/testing-and-docs.md index 634dd95c..a094c8a0 100644 --- a/docs/contribute/testing-and-docs.md +++ b/docs/contribute/testing-and-docs.md @@ -23,6 +23,7 @@ just ci=true test-rust just test-python just test-go just test-node +just test-openclaw just test-wasm ``` @@ -62,11 +63,13 @@ uv run pytest ### Node.js Run the Node.js validation loop when a change touches the NAPI binding or -JavaScript package surface. +JavaScript package surface. Run the OpenClaw target when Node changes can affect +the OpenClaw plugin or when touching `integrations/openclaw`. ```bash npm install --ignore-scripts npm test --workspace=nemo-flow-node +just test-openclaw ``` ## Documentation Checklist diff --git a/integrations/openclaw/README.md b/integrations/openclaw/README.md index d4ceae05..fdaa1c36 100644 --- a/integrations/openclaw/README.md +++ b/integrations/openclaw/README.md @@ -226,8 +226,9 @@ npm run pack:check --workspace=nemo-flow-openclaw `npm run build --workspace=nemo-flow-openclaw` emits production files under `integrations/openclaw/dist/`. Tests compile to -`integrations/openclaw/.test-dist/` so test artifacts do not enter the -installable package. +`integrations/openclaw/.test-dist/` from the sibling +`integrations/openclaw/test/` directory so test artifacts do not enter the +installable package or production source tree. The optional live smoke test requires a working installed `nemo-flow-node` binding: diff --git a/integrations/openclaw/package.json b/integrations/openclaw/package.json index 5e19ab5b..ce4fcb9d 100644 --- a/integrations/openclaw/package.json +++ b/integrations/openclaw/package.json @@ -51,8 +51,8 @@ "pack:check": "node scripts/check-pack-payload.mjs", "prepack": "npm run build", "typecheck": "tsc -p tsconfig.json --noEmit", - "test": "npm run build:test && node --test \".test-dist/src/__tests__/*.test.js\"", - "test:live": "npm run build:test && NEMO_FLOW_OPENCLAW_LIVE_SMOKE=1 node --test \".test-dist/src/__tests__/live-smoke.test.js\"" + "test": "npm run build:test && node --test \".test-dist/test/*.test.js\"", + "test:live": "npm run build:test && node scripts/test-live.mjs" }, "peerDependencies": { "openclaw": ">=2026.5.6" diff --git a/integrations/openclaw/scripts/check-pack-payload.mjs b/integrations/openclaw/scripts/check-pack-payload.mjs index 0e56d053..57a87716 100644 --- a/integrations/openclaw/scripts/check-pack-payload.mjs +++ b/integrations/openclaw/scripts/check-pack-payload.mjs @@ -82,7 +82,7 @@ const packInfo = JSON.parse(pack.stdout)[0]; assert(packInfo, "npm pack did not return package metadata"); const productionSources = walkFiles("src").filter( - (file) => file.endsWith(".ts") && !file.includes("/__tests__/") && !file.endsWith(".test.ts"), + (file) => file.endsWith(".ts") && !file.endsWith(".test.ts"), ); const packedFiles = new Set(packInfo.files.map((file) => normalizePackagePath(file.path))); const packageJson = JSON.parse(readFileSync(path.join(packageRoot, "package.json"), "utf8")); @@ -129,7 +129,7 @@ assert(packageJson.openclaw?.build?.openclawVersion, "openclaw.build.openclawVer assert(packageJson.openclaw?.build?.pluginSdkVersion, "openclaw.build.pluginSdkVersion is required"); for (const file of packedFiles) { - assert(!file.includes("__tests__"), `packed package includes test artifact ${file}`); + assert(!file.startsWith("test/"), `packed package includes test artifact ${file}`); assert(!file.startsWith(".test-dist/"), `packed package includes test output ${file}`); assert(!file.endsWith(".map"), `packed package includes source/declaration map ${file}`); } diff --git a/integrations/openclaw/scripts/test-live.mjs b/integrations/openclaw/scripts/test-live.mjs new file mode 100644 index 00000000..4407cce6 --- /dev/null +++ b/integrations/openclaw/scripts/test-live.mjs @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { spawnSync } from "node:child_process"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); + +const result = spawnSync(process.execPath, ["--test", ".test-dist/test/live-smoke.test.js"], { + cwd: packageRoot, + env: { + ...process.env, + NEMO_FLOW_OPENCLAW_LIVE_SMOKE: "1", + }, + stdio: "inherit", +}); + +process.exit(result.status ?? 1); diff --git a/integrations/openclaw/src/__tests__/config.test.ts b/integrations/openclaw/test/config.test.ts similarity index 99% rename from integrations/openclaw/src/__tests__/config.test.ts rename to integrations/openclaw/test/config.test.ts index 29ec6315..1817f108 100644 --- a/integrations/openclaw/src/__tests__/config.test.ts +++ b/integrations/openclaw/test/config.test.ts @@ -15,14 +15,14 @@ import { NEMO_FLOW_OPENCLAW_JSON_SCHEMA, nemoFlowConfigSchema, parseConfig, -} from "../config.js"; +} from "../src/config.js"; import { defaultNemoFlowModuleLoader, type NemoFlowModuleLoader, type NemoFlowModules, type NemoFlowRuntimeModule, -} from "../modules.js"; -import { registerNemoFlowPlugin } from "../runtime-state.js"; +} from "../src/modules.js"; +import { registerNemoFlowPlugin } from "../src/runtime-state.js"; import type { OpenClawPluginApi, PluginLogger } from "openclaw/plugin-sdk/plugin-entry"; import { callGatewayStatus, type TestGatewayMethodHandler } from "./gateway-status.js"; diff --git a/integrations/openclaw/src/__tests__/failure-model.test.ts b/integrations/openclaw/test/failure-model.test.ts similarity index 94% rename from integrations/openclaw/src/__tests__/failure-model.test.ts rename to integrations/openclaw/test/failure-model.test.ts index 424b7f46..6333da79 100644 --- a/integrations/openclaw/src/__tests__/failure-model.test.ts +++ b/integrations/openclaw/test/failure-model.test.ts @@ -7,9 +7,9 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; -import { parseConfig } from "../config.js"; -import { HookReplayBackend } from "../hooks-backend.js"; -import type { NemoFlowRuntimeModule } from "../modules.js"; +import { parseConfig } from "../src/config.js"; +import { HookReplayBackend } from "../src/hooks-backend.js"; +import type { NemoFlowRuntimeModule } from "../src/modules.js"; import type { PluginLogger } from "openclaw/plugin-sdk/plugin-entry"; describe("Replay failure model", () => { diff --git a/integrations/openclaw/src/__tests__/gateway-status.ts b/integrations/openclaw/test/gateway-status.ts similarity index 94% rename from integrations/openclaw/src/__tests__/gateway-status.ts rename to integrations/openclaw/test/gateway-status.ts index 2cc71b4e..85e6a628 100644 --- a/integrations/openclaw/src/__tests__/gateway-status.ts +++ b/integrations/openclaw/test/gateway-status.ts @@ -10,7 +10,7 @@ import assert from "node:assert/strict"; import type { OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry"; -import type { NemoFlowHealthSnapshot } from "../health.js"; +import type { NemoFlowHealthSnapshot } from "../src/health.js"; export type TestGatewayMethodHandler = Parameters[1]; diff --git a/integrations/openclaw/src/__tests__/hooks-backend.test.ts b/integrations/openclaw/test/hooks-backend.test.ts similarity index 98% rename from integrations/openclaw/src/__tests__/hooks-backend.test.ts rename to integrations/openclaw/test/hooks-backend.test.ts index 49f16ae0..c5ea603d 100644 --- a/integrations/openclaw/src/__tests__/hooks-backend.test.ts +++ b/integrations/openclaw/test/hooks-backend.test.ts @@ -7,10 +7,10 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; -import { parseConfig } from "../config.js"; -import { errorToJson, toJsonRecord } from "../hook-replay/marks.js"; -import { HookReplayBackend } from "../hooks-backend.js"; -import type { NemoFlowRuntimeModule } from "../modules.js"; +import { parseConfig } from "../src/config.js"; +import { errorToJson, toJsonRecord } from "../src/hook-replay/marks.js"; +import { HookReplayBackend } from "../src/hooks-backend.js"; +import type { NemoFlowRuntimeModule } from "../src/modules.js"; import type { PluginLogger } from "openclaw/plugin-sdk/plugin-entry"; describe("HookReplayBackend", () => { diff --git a/integrations/openclaw/src/__tests__/live-smoke.test.ts b/integrations/openclaw/test/live-smoke.test.ts similarity index 98% rename from integrations/openclaw/src/__tests__/live-smoke.test.ts rename to integrations/openclaw/test/live-smoke.test.ts index 3583def3..0cfbc0e8 100644 --- a/integrations/openclaw/src/__tests__/live-smoke.test.ts +++ b/integrations/openclaw/test/live-smoke.test.ts @@ -10,12 +10,12 @@ import * as os from "node:os"; import * as path from "node:path"; import { it } from "node:test"; -import { registerNemoFlowPlugin } from "../runtime-state.js"; +import { registerNemoFlowPlugin } from "../src/runtime-state.js"; import { defaultNemoFlowModuleLoader, type NemoFlowModuleLoader, type NemoFlowModules, -} from "../modules.js"; +} from "../src/modules.js"; import type { OpenClawPluginApi, PluginLogger } from "openclaw/plugin-sdk/plugin-entry"; import { callGatewayStatus, type TestGatewayMethodHandler } from "./gateway-status.js"; diff --git a/integrations/openclaw/src/__tests__/llm-replay.test.ts b/integrations/openclaw/test/llm-replay.test.ts similarity index 99% rename from integrations/openclaw/src/__tests__/llm-replay.test.ts rename to integrations/openclaw/test/llm-replay.test.ts index 24353d9c..601419b8 100644 --- a/integrations/openclaw/src/__tests__/llm-replay.test.ts +++ b/integrations/openclaw/test/llm-replay.test.ts @@ -7,9 +7,9 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; -import { parseConfig } from "../config.js"; -import { HookReplayBackend } from "../hooks-backend.js"; -import type { NemoFlowRuntimeModule } from "../modules.js"; +import { parseConfig } from "../src/config.js"; +import { HookReplayBackend } from "../src/hooks-backend.js"; +import type { NemoFlowRuntimeModule } from "../src/modules.js"; import type { PluginLogger } from "openclaw/plugin-sdk/plugin-entry"; describe("LLM replay", () => { diff --git a/integrations/openclaw/src/__tests__/tool-replay.test.ts b/integrations/openclaw/test/tool-replay.test.ts similarity index 97% rename from integrations/openclaw/src/__tests__/tool-replay.test.ts rename to integrations/openclaw/test/tool-replay.test.ts index 08c3a5aa..23b83fce 100644 --- a/integrations/openclaw/src/__tests__/tool-replay.test.ts +++ b/integrations/openclaw/test/tool-replay.test.ts @@ -7,9 +7,9 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; -import { parseConfig } from "../config.js"; -import { HookReplayBackend } from "../hooks-backend.js"; -import type { NemoFlowRuntimeModule } from "../modules.js"; +import { parseConfig } from "../src/config.js"; +import { HookReplayBackend } from "../src/hooks-backend.js"; +import type { NemoFlowRuntimeModule } from "../src/modules.js"; import type { PluginLogger } from "openclaw/plugin-sdk/plugin-entry"; describe("Tool replay", () => { diff --git a/integrations/openclaw/tsconfig.build.json b/integrations/openclaw/tsconfig.build.json index bb982554..5b2d5d34 100644 --- a/integrations/openclaw/tsconfig.build.json +++ b/integrations/openclaw/tsconfig.build.json @@ -8,7 +8,7 @@ "outDir": "dist" }, "exclude": [ - "src/__tests__/**", + "test/**", "src/**/*.test.ts", ".test-dist/**", "dist/**" diff --git a/integrations/openclaw/tsconfig.test.json b/integrations/openclaw/tsconfig.test.json index 2338c352..5c7a7c9e 100644 --- a/integrations/openclaw/tsconfig.test.json +++ b/integrations/openclaw/tsconfig.test.json @@ -10,5 +10,11 @@ "exclude": [ ".test-dist/**", "dist/**" + ], + "include": [ + "index.ts", + "src/**/*.ts", + "src/**/*.d.ts", + "test/**/*.ts" ] } diff --git a/justfile b/justfile index ba13e668..e16cf77c 100644 --- a/justfile +++ b/justfile @@ -988,6 +988,7 @@ test-openclaw: fi npm run typecheck --workspace=nemo-flow-openclaw npm test --workspace=nemo-flow-openclaw + npm run test:live --workspace=nemo-flow-openclaw npm run pack:check --workspace=nemo-flow-openclaw # --set [output_dir=] [ci=true|false] @@ -1088,7 +1089,7 @@ package-node: exit 1 fi -# --set [output_dir=] [ref_name=] +# --set [output_dir=] [ref_name=] [ci=true|false] package-openclaw: #!/usr/bin/env bash {{ bash_helpers }} @@ -1102,15 +1103,22 @@ package-openclaw: version="$(read_npm_package_version integrations/openclaw/package.json)" package_version="${version}+${sha}" echo "Non-release build: appending commit hash to version" + set_npm_package_version crates/node/package.json package-lock.json "$package_version" crates/node set_npm_package_version integrations/openclaw/package.json package-lock.json "$package_version" integrations/openclaw set_npm_package_dependency_version integrations/openclaw/package.json package-lock.json integrations/openclaw nemo-flow-node "$package_version" else package_version="{{ ref_name }}" echo "Using explicit version {{ ref_name }}" + set_npm_package_version crates/node/package.json package-lock.json "$package_version" crates/node set_npm_package_version integrations/openclaw/package.json package-lock.json "$package_version" integrations/openclaw set_npm_package_dependency_version integrations/openclaw/package.json package-lock.json integrations/openclaw nemo-flow-node "$package_version" fi - npm install --workspace=nemo-flow-openclaw --ignore-scripts + npm install --workspace=nemo-flow-node --workspace=nemo-flow-openclaw --ignore-scripts + if is_true "{{ ci }}"; then + npm run build-debug --workspace=nemo-flow-node + else + npm run build --workspace=nemo-flow-node + fi npm pack --workspace=nemo-flow-openclaw --pack-destination "$package_dir" shopt -s nullglob packages=("$package_dir"/*.tgz) From 9d5351a55cc14f6e4f040179a9aa7475e6ed0dd9 Mon Sep 17 00:00:00 2001 From: Will Killian <2007799+willkill07@users.noreply.github.com> Date: Thu, 14 May 2026 16:17:12 -0400 Subject: [PATCH 6/9] feat: update OpenClaw patch to use new config shape (#111) #### Overview This PR updates the OpenClaw patch to be aligned with `main` - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details #### Where should the reviewer start? #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Closes # --- .../0001-add-nemo-flow-integration.patch | 4525 +++++++---------- third_party/sources.lock | 2 +- 2 files changed, 1763 insertions(+), 2764 deletions(-) diff --git a/patches/openclaw/0001-add-nemo-flow-integration.patch b/patches/openclaw/0001-add-nemo-flow-integration.patch index 9a4b7a64..7d9f6c61 100644 --- a/patches/openclaw/0001-add-nemo-flow-integration.patch +++ b/patches/openclaw/0001-add-nemo-flow-integration.patch @@ -1,433 +1,12 @@ -diff --git a/package.json b/package.json -index 6fcb3c780b..5e549ef256 100644 ---- a/package.json -+++ b/package.json -@@ -1450,6 +1450,7 @@ - "optionalDependencies": { - "@discordjs/opus": "^0.10.0", - "@matrix-org/matrix-sdk-crypto-nodejs": "^0.4.0", -+ "nemo-flow-node": "file:../../crates/node", - "openshell": "0.1.0" - }, - "overrides": { -diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml -index 1524b0558d..4e2a8d48d1 100644 ---- a/pnpm-lock.yaml -+++ b/pnpm-lock.yaml -@@ -321,6 +321,9 @@ importers: - '@matrix-org/matrix-sdk-crypto-nodejs': - specifier: ^0.4.0 - version: 0.4.0 -+ nemo-flow-node: -+ specifier: file:../../crates/node -+ version: file:../../crates/node - openshell: - specifier: 0.1.0 - version: 0.1.0 -@@ -869,6 +872,12 @@ importers: - specifier: workspace:* - version: link:../.. - -+ extensions/nemo-flow: -+ optionalDependencies: -+ nemo-flow-node: -+ specifier: file:../../../../crates/node -+ version: file:../../crates/node -+ - extensions/nextcloud-talk: - devDependencies: - '@openclaw/plugin-sdk': -@@ -5984,6 +5993,10 @@ packages: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - -+ nemo-flow-node@file:../../crates/node: -+ resolution: {directory: ../../crates/node, type: directory} -+ engines: {node: '>=20.0.0'} -+ - netmask@2.1.0: - resolution: {integrity: sha512-z9sZrk6wyf8/NDKKqe+Tyl58XtgkYrV4kgt1O8xrzYvpl1LvPacPo0imMLHfpStk3kgCIq1ksJ2bmJn9hue2lQ==} - engines: {node: '>= 0.4.0'} -@@ -12840,6 +12853,9 @@ snapshots: - - negotiator@1.0.0: {} - -+ nemo-flow-node@file:../../crates/node: -+ optional: true -+ - netmask@2.1.0: {} - - node-addon-api@8.6.0: {} -diff --git a/src/agents/pi-embedded-runner/extra-params.ts b/src/agents/pi-embedded-runner/extra-params.ts -index 9d4ff6fe42..2dbd050b77 100644 ---- a/src/agents/pi-embedded-runner/extra-params.ts -+++ b/src/agents/pi-embedded-runner/extra-params.ts -@@ -4,6 +4,7 @@ import { streamSimple } from "@mariozechner/pi-ai"; - import type { SettingsManager } from "@mariozechner/pi-coding-agent"; - import type { ThinkLevel } from "../../auto-reply/thinking.js"; - import type { OpenClawConfig } from "../../config/types.openclaw.js"; -+import { wrapStreamFnWithAgentRuntimeMiddlewares } from "../../plugins/agent-runtime-middleware.js"; - import type { ProviderRuntimeModel } from "../../plugins/provider-runtime-model.types.js"; - import { - prepareProviderExtraParams as prepareProviderExtraParamsRuntime, -@@ -451,6 +452,11 @@ export function applyExtraParamsToAgent( - workspaceDir?: string, - model?: ProviderRuntimeModel, - agentDir?: string, -+ runtimeContext?: { -+ runId?: string; -+ sessionId?: string; -+ sessionKey?: string; -+ }, - ): { effectiveExtraParams: Record } { - const resolvedExtraParams = resolveExtraParams({ - cfg, -@@ -511,6 +517,17 @@ export function applyExtraParamsToAgent( - ...wrapperContext, - providerWrapperHandled, - }); -+ if (agent.streamFn) { -+ agent.streamFn = wrapStreamFnWithAgentRuntimeMiddlewares({ -+ provider, -+ modelId, -+ streamFn: agent.streamFn, -+ agentId, -+ runId: runtimeContext?.runId, -+ sessionId: runtimeContext?.sessionId, -+ sessionKey: runtimeContext?.sessionKey, -+ }); -+ } - - return { effectiveExtraParams }; - } -diff --git a/src/agents/pi-embedded-runner/run/attempt.ts b/src/agents/pi-embedded-runner/run/attempt.ts -index 032595ba5d..fed941f81d 100644 ---- a/src/agents/pi-embedded-runner/run/attempt.ts -+++ b/src/agents/pi-embedded-runner/run/attempt.ts -@@ -1081,6 +1081,11 @@ export async function runEmbeddedAttempt( - effectiveWorkspace, - params.model, - agentDir, -+ { -+ runId: params.runId, -+ sessionId: params.sessionId, -+ sessionKey: params.sessionKey, -+ }, - ); - const effectivePromptCacheRetention = resolveCacheRetention( - effectiveExtraParams, -diff --git a/src/agents/pi-tools.before-tool-call.ts b/src/agents/pi-tools.before-tool-call.ts -index 6f27346c46..bac6d778b9 100644 ---- a/src/agents/pi-tools.before-tool-call.ts -+++ b/src/agents/pi-tools.before-tool-call.ts -@@ -1,6 +1,7 @@ - import type { ToolLoopDetectionConfig } from "../config/types.tools.js"; - import type { SessionState } from "../logging/diagnostic-session-state.js"; - import { createSubsystemLogger } from "../logging/subsystem.js"; -+import { executeToolWithAgentRuntimeMiddlewares } from "../plugins/agent-runtime-middleware.js"; - import { getGlobalHookRunner } from "../plugins/hook-runner-global.js"; - import { copyPluginToolMeta } from "../plugins/tools.js"; - import { PluginApprovalResolutions, type PluginApprovalResolution } from "../plugins/types.js"; -@@ -410,26 +411,39 @@ export function wrapToolWithBeforeToolCallHook( - } - } - const normalizedToolName = normalizeToolName(toolName || "tool"); -- try { -- const result = await execute(toolCallId, outcome.params, signal, onUpdate); -- await recordLoopOutcome({ -- ctx, -- toolName: normalizedToolName, -- toolParams: outcome.params, -- toolCallId, -- result, -- }); -- return result; -- } catch (err) { -- await recordLoopOutcome({ -- ctx, -- toolName: normalizedToolName, -- toolParams: outcome.params, -- toolCallId, -- error: err, -- }); -- throw err; -- } -+ const executeFn = async (effectiveParams: unknown) => { -+ try { -+ const result = await execute(toolCallId, effectiveParams, signal, onUpdate); -+ await recordLoopOutcome({ -+ ctx, -+ toolName: normalizedToolName, -+ toolParams: effectiveParams, -+ toolCallId, -+ result, -+ }); -+ return result; -+ } catch (err) { -+ await recordLoopOutcome({ -+ ctx, -+ toolName: normalizedToolName, -+ toolParams: effectiveParams, -+ toolCallId, -+ error: err, -+ }); -+ throw err; -+ } -+ }; -+ -+ return await executeToolWithAgentRuntimeMiddlewares({ -+ agentId: ctx?.agentId, -+ sessionKey: ctx?.sessionKey, -+ sessionId: ctx?.sessionId, -+ runId: ctx?.runId, -+ toolName: normalizedToolName, -+ toolCallId, -+ params: outcome.params, -+ execute: executeFn, -+ }); - }, - }; - copyPluginToolMeta(tool, wrappedTool); -diff --git a/src/plugins/api-builder.ts b/src/plugins/api-builder.ts -index 1c95ea49da..d1e83a52e0 100644 ---- a/src/plugins/api-builder.ts -+++ b/src/plugins/api-builder.ts -@@ -28,6 +28,7 @@ export type BuildPluginApiParams = { - | "registerNodeHostCommand" - | "registerSecurityAuditCollector" - | "registerService" -+ | "registerAgentRuntimeMiddleware" - | "registerCliBackend" - | "registerTextTransforms" - | "registerConfigMigration" -@@ -71,6 +72,8 @@ const noopRegisterNodeHostCommand: OpenClawPluginApi["registerNodeHostCommand"] - const noopRegisterSecurityAuditCollector: OpenClawPluginApi["registerSecurityAuditCollector"] = - () => {}; - const noopRegisterService: OpenClawPluginApi["registerService"] = () => {}; -+const noopRegisterAgentRuntimeMiddleware: OpenClawPluginApi["registerAgentRuntimeMiddleware"] = -+ () => {}; - const noopRegisterCliBackend: OpenClawPluginApi["registerCliBackend"] = () => {}; - const noopRegisterTextTransforms: OpenClawPluginApi["registerTextTransforms"] = () => {}; - const noopRegisterConfigMigration: OpenClawPluginApi["registerConfigMigration"] = () => {}; -@@ -135,6 +138,8 @@ export function buildPluginApi(params: BuildPluginApiParams): OpenClawPluginApi - registerSecurityAuditCollector: - handlers.registerSecurityAuditCollector ?? noopRegisterSecurityAuditCollector, - registerService: handlers.registerService ?? noopRegisterService, -+ registerAgentRuntimeMiddleware: -+ handlers.registerAgentRuntimeMiddleware ?? noopRegisterAgentRuntimeMiddleware, - registerCliBackend: handlers.registerCliBackend ?? noopRegisterCliBackend, - registerTextTransforms: handlers.registerTextTransforms ?? noopRegisterTextTransforms, - registerConfigMigration: handlers.registerConfigMigration ?? noopRegisterConfigMigration, -diff --git a/src/plugins/loader.ts b/src/plugins/loader.ts -index fd60f4b1c9..03f206d1a4 100644 ---- a/src/plugins/loader.ts -+++ b/src/plugins/loader.ts -@@ -711,6 +711,7 @@ function createPluginRecord(params: { - gatewayMethods: [], - cliCommands: [], - services: [], -+ agentRuntimeMiddlewareIds: [], - commands: [], - httpRoutes: 0, - hookCount: 0, -diff --git a/src/plugins/registry-empty.ts b/src/plugins/registry-empty.ts -index d3fae089f9..d169638427 100644 ---- a/src/plugins/registry-empty.ts -+++ b/src/plugins/registry-empty.ts -@@ -30,6 +30,7 @@ export function createEmptyPluginRegistry(): PluginRegistry { - nodeHostCommands: [], - securityAuditCollectors: [], - services: [], -+ agentRuntimeMiddlewares: [], - commands: [], - conversationBindingResolvedHandlers: [], - diagnostics: [], -diff --git a/src/plugins/registry-types.ts b/src/plugins/registry-types.ts -index fbd62a77b4..9942f12f52 100644 ---- a/src/plugins/registry-types.ts -+++ b/src/plugins/registry-types.ts -@@ -23,6 +23,7 @@ import type { - OpenClawPluginCliCommandDescriptor, - OpenClawPluginCliRegistrar, - OpenClawPluginCommandDefinition, -+ OpenClawAgentRuntimeMiddleware, - OpenClawPluginGatewayRuntimeScopeSurface, - OpenClawPluginHttpRouteAuth, - OpenClawPluginHttpRouteHandler, -@@ -168,6 +169,14 @@ export type PluginServiceRegistration = { - rootDir?: string; - }; - -+export type AgentRuntimeMiddlewareRegistration = { -+ pluginId: string; -+ pluginName?: string; -+ middleware: OpenClawAgentRuntimeMiddleware; -+ source: string; -+ rootDir?: string; -+}; -+ - export type PluginReloadRegistration = { - pluginId: string; - pluginName?: string; -@@ -251,6 +260,7 @@ export type PluginRecord = { - gatewayMethods: string[]; - cliCommands: string[]; - services: string[]; -+ agentRuntimeMiddlewareIds: string[]; - commands: string[]; - httpRoutes: number; - hookCount: number; -@@ -290,6 +300,7 @@ export type PluginRegistry = { - nodeHostCommands?: PluginNodeHostCommandRegistration[]; - securityAuditCollectors?: PluginSecurityAuditCollectorRegistration[]; - services: PluginServiceRegistration[]; -+ agentRuntimeMiddlewares: AgentRuntimeMiddlewareRegistration[]; - commands: PluginCommandRegistration[]; - conversationBindingResolvedHandlers: PluginConversationBindingResolvedHandlerRegistration[]; - diagnostics: PluginDiagnostic[]; -diff --git a/src/plugins/registry.ts b/src/plugins/registry.ts -index f30fe80139..18085c99b5 100644 ---- a/src/plugins/registry.ts -+++ b/src/plugins/registry.ts -@@ -78,6 +78,7 @@ import type { - CliBackendPlugin, - ImageGenerationProviderPlugin, - MusicGenerationProviderPlugin, -+ OpenClawAgentRuntimeMiddleware, - OpenClawPluginApi, - OpenClawPluginChannelRegistration, - OpenClawPluginCliCommandDescriptor, -@@ -972,6 +973,43 @@ export function createPluginRegistry(registryParams: PluginRegistryParams) { - }); - }; - -+ const registerAgentRuntimeMiddleware = ( -+ record: PluginRecord, -+ middleware: OpenClawAgentRuntimeMiddleware, -+ ) => { -+ const id = middleware.id.trim(); -+ if (!id) { -+ pushDiagnostic({ -+ level: "error", -+ pluginId: record.id, -+ source: record.source, -+ message: "agent runtime middleware registration missing id", -+ }); -+ return; -+ } -+ const existing = registry.agentRuntimeMiddlewares.find((entry) => entry.middleware.id === id); -+ if (existing) { -+ pushDiagnostic({ -+ level: "error", -+ pluginId: record.id, -+ source: record.source, -+ message: `agent runtime middleware already registered: ${id} (${existing.pluginId})`, -+ }); -+ return; -+ } -+ record.agentRuntimeMiddlewareIds.push(id); -+ registry.agentRuntimeMiddlewares.push({ -+ pluginId: record.id, -+ pluginName: record.name, -+ middleware: { -+ ...middleware, -+ id, -+ }, -+ source: record.source, -+ rootDir: record.rootDir, -+ }); -+ }; -+ - const registerCommand = (record: PluginRecord, command: OpenClawPluginCommandDefinition) => { - const name = command.name.trim(); - if (!name) { -@@ -1177,6 +1215,8 @@ export function createPluginRegistry(registryParams: PluginRegistryParams) { - registerGatewayMethod: (method, handler, opts) => - registerGatewayMethod(record, method, handler, opts), - registerService: (service) => registerService(record, service), -+ registerAgentRuntimeMiddleware: (middleware) => -+ registerAgentRuntimeMiddleware(record, middleware), - registerCliBackend: (backend) => registerCliBackend(record, backend), - registerTextTransforms: (transforms) => registerTextTransforms(record, transforms), - registerReload: (registration) => registerReload(record, registration), -@@ -1437,6 +1477,7 @@ export function createPluginRegistry(registryParams: PluginRegistryParams) { - registerNodeHostCommand, - registerSecurityAuditCollector, - registerService, -+ registerAgentRuntimeMiddleware, - registerCommand, - registerHook, - registerTypedHook, -diff --git a/src/plugins/types.ts b/src/plugins/types.ts -index 77fd715a9b..b9ae242c81 100644 ---- a/src/plugins/types.ts -+++ b/src/plugins/types.ts -@@ -1844,6 +1844,36 @@ export type OpenClawPluginService = { - stop?: (ctx: OpenClawPluginServiceContext) => void | Promise; - }; - -+export type OpenClawAgentRuntimeToolExecuteContext = { -+ agentId?: string; -+ sessionKey?: string; -+ sessionId?: string; -+ runId?: string; -+ toolName: string; -+ toolCallId?: string; -+ params: unknown; -+ execute: (params: unknown) => Promise; -+}; -+ -+export type OpenClawAgentRuntimeStreamFnContext = { -+ provider: string; -+ modelId: string; -+ agentId?: string; -+ runId?: string; -+ sessionId?: string; -+ sessionKey?: string; -+ streamFn: StreamFn; -+}; -+ -+export type OpenClawAgentRuntimeMiddleware = { -+ id: string; -+ priority?: number; -+ wrapToolExecute?: ( -+ ctx: OpenClawAgentRuntimeToolExecuteContext, -+ ) => Promise | unknown; -+ wrapStreamFn?: (ctx: OpenClawAgentRuntimeStreamFnContext) => StreamFn | null | undefined; -+}; -+ - export type OpenClawPluginChannelRegistration = { - plugin: ChannelPlugin; - }; -@@ -1948,6 +1978,7 @@ export type OpenClawPluginApi = { - registerNodeHostCommand: (command: OpenClawPluginNodeHostCommand) => void; - registerSecurityAuditCollector: (collector: OpenClawPluginSecurityAuditCollector) => void; - registerService: (service: OpenClawPluginService) => void; -+ registerAgentRuntimeMiddleware: (middleware: OpenClawAgentRuntimeMiddleware) => void; - /** Register a text-only CLI backend used by the local CLI runner. */ - registerCliBackend: (backend: CliBackendPlugin) => void; - /** Register plugin-owned prompt/message compatibility text transforms. */ -diff --git a/test/helpers/plugins/plugin-api.ts b/test/helpers/plugins/plugin-api.ts -index df12b26f98..f1568a50be 100644 ---- a/test/helpers/plugins/plugin-api.ts -+++ b/test/helpers/plugins/plugin-api.ts -@@ -25,6 +25,7 @@ export function createTestPluginApi(api: TestPluginApiInput = {}): OpenClawPlugi - registerSecurityAuditCollector() {}, - registerConfigMigration() {}, - registerAutoEnableProbe() {}, -+ registerAgentRuntimeMiddleware() {}, - registerProvider() {}, - registerSpeechProvider() {}, - registerRealtimeTranscriptionProvider() {}, diff --git a/extensions/nemo-flow/README.md b/extensions/nemo-flow/README.md new file mode 100644 -index 0000000000..fde9211575 +index 00000000..5fbc09d9 --- /dev/null +++ b/extensions/nemo-flow/README.md -@@ -0,0 +1,51 @@ +@@ -0,0 +1,42 @@ +# NeMo Flow + -+OpenClaw plugin for NeMo Flow initialization, plugin configuration, codec-aware tool and LLM wrapping, and ATIF export. ++OpenClaw plugin for NeMo Flow plugin-host initialization and execution wrapping. + +## Install + @@ -444,28 +23,19 @@ index 0000000000..fde9211575 + "nemo-flow": { + "enabled": true, + "config": { -+ "wrapping": { -+ "tools": true, -+ "llm": true -+ }, -+ "atif": { -+ "enabled": true -+ }, -+ "codecs": { -+ "default": "auto", -+ "providers": { -+ "anthropic": "anthropic_messages" -+ }, -+ "models": { -+ "gpt-5*": "openai_responses" -+ } -+ }, -+ "nemoFlow": { -+ "pluginConfig": { -+ "version": 1, -+ "components": [] ++ "version": 1, ++ "components": [ ++ { ++ "kind": "observability", ++ "config": { ++ "version": 1, ++ "otel": { ++ "enabled": true, ++ "endpoint": "http://localhost:4318" ++ } ++ } + } -+ } ++ ] + } + } + } @@ -478,32 +48,23 @@ index 0000000000..fde9211575 +To test against a local checkout of `nemo-flow-node`, build the Node package first and then override the dependency to the local path from the OpenClaw workspace. diff --git a/extensions/nemo-flow/index.ts b/extensions/nemo-flow/index.ts new file mode 100644 -index 0000000000..9ff995b908 +index 00000000..77ae6b4d --- /dev/null +++ b/extensions/nemo-flow/index.ts -@@ -0,0 +1,147 @@ +@@ -0,0 +1,92 @@ +import { definePluginEntry, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; ++import { NEMO_FLOW_PLUGIN_CONFIG_JSON_SCHEMA, resolveNemoFlowPluginConfig } from "./src/config.js"; +import { -+ NEMO_FLOW_PLUGIN_CONFIG_JSON_SCHEMA, -+ resolveNemoFlowPluginConfig, -+} from "./src/config.js"; -+import { -+ endNemoFlowSession, + executeToolWithNemoFlow, + initializeNemoFlowGateway, + shutdownNemoFlowGateway, -+ startNemoFlowSession, + wrapStreamFnWithNemoFlow, +} from "./src/runtime.js"; + +const nemoFlowConfigSchema = { + safeParse(value: unknown) { + try { -+ resolveNemoFlowPluginConfig(value, { -+ stateDir: ".openclaw", -+ resolvePath: (input) => input, -+ }); -+ return { success: true, data: value }; ++ return { success: true, data: resolveNemoFlowPluginConfig(value) }; + } catch (error) { + return { + success: false, @@ -515,36 +76,13 @@ index 0000000000..9ff995b908 + }, + jsonSchema: NEMO_FLOW_PLUGIN_CONFIG_JSON_SCHEMA, + uiHints: { -+ enabled: { -+ label: "Enabled", -+ help: "Enable NeMo Flow tool and LLM wrapping for this gateway.", -+ }, -+ "atif.enabled": { -+ label: "ATIF Export", -+ help: "Export one ATIF trajectory JSON file per session.", -+ }, -+ "atif.outputDir": { -+ label: "ATIF Output Dir", -+ help: "Directory for exported ATIF files. Defaults under the OpenClaw state dir.", -+ }, -+ "telemetry.otel.enabled": { -+ label: "OpenTelemetry", -+ help: "Enable OTLP trace export through the NeMo Flow OpenTelemetry subscriber.", -+ advanced: true, -+ }, -+ "telemetry.openInference.enabled": { -+ label: "OpenInference", -+ help: "Enable OpenInference OTLP export through the NeMo Flow subscriber.", -+ advanced: true, ++ components: { ++ label: "Components", ++ help: "NeMo Flow plugin-host components to activate.", + }, -+ "codecs.default": { -+ label: "Default Codec", -+ help: "Use auto-detection or force one provider payload codec for unmatched models.", -+ advanced: true, -+ }, -+ "nemoFlow.pluginConfig": { -+ label: "Plugin Config", -+ help: "Optional raw NeMo Flow plugin config document.", ++ policy: { ++ label: "Policy", ++ help: "Optional NeMo Flow plugin-host validation policy.", + advanced: true, + }, + }, @@ -553,20 +91,44 @@ index 0000000000..9ff995b908 +export default definePluginEntry({ + id: "nemo-flow", + name: "NeMo Flow", -+ description: "Tool and LLM execution wrapping for NeMo Flow tracing, plugins, and ATIF export.", ++ description: "Tool and streaming LLM execution wrapping through NeMo Flow plugins.", + configSchema: nemoFlowConfigSchema, + register(api: OpenClawPluginApi) { -+ const config = resolveNemoFlowPluginConfig(api.pluginConfig, { -+ stateDir: api.runtime.state.resolveStateDir(), -+ resolvePath: api.resolvePath, -+ agentName: "openclaw", -+ agentVersion: api.version ?? "unknown", ++ const config = resolveNemoFlowPluginConfig(api.pluginConfig); ++ ++ api.registerService({ ++ id: "nemo-flow-runtime", ++ async start() { ++ await initializeNemoFlowGateway({ ++ logger: api.logger, ++ config, ++ }); ++ }, ++ async stop() { ++ await shutdownNemoFlowGateway({ ++ logger: api.logger, ++ }); ++ }, + }); + -+ api.registerAgentRuntimeMiddleware({ -+ id: "nemo-flow", -+ priority: 100, -+ wrapToolExecute: async (ctx) => ++ api.registerAgentStreamingLlmMiddleware( ++ (ctx) => ++ wrapStreamFnWithNemoFlow({ ++ logger: api.logger, ++ config, ++ provider: ctx.provider, ++ modelId: ctx.modelId, ++ agentId: ctx.agentId, ++ runId: ctx.runId, ++ sessionId: ctx.sessionId, ++ sessionKey: ctx.sessionKey, ++ streamFn: ctx.streamFn, ++ }), ++ { runtimes: ["pi"], priority: 100 }, ++ ); ++ ++ api.registerAgentToolCallMiddleware( ++ async (ctx) => + await executeToolWithNemoFlow({ + logger: api.logger, + config, @@ -578,271 +140,103 @@ index 0000000000..9ff995b908 + agentId: ctx.agentId, + execute: ctx.execute, + }), -+ wrapStreamFn: (ctx) => { -+ const wrapped = async (model, context, options) => { -+ const streamFn = await wrapStreamFnWithNemoFlow({ -+ logger: api.logger, -+ config, -+ provider: ctx.provider, -+ modelId: ctx.modelId, -+ agentId: ctx.agentId, -+ runId: ctx.runId, -+ sessionId: ctx.sessionId, -+ sessionKey: ctx.sessionKey, -+ streamFn: ctx.streamFn, -+ }); -+ return streamFn(model, context, options); -+ }; -+ return wrapped; -+ }, -+ }); -+ -+ api.on("gateway_start", async () => { -+ await initializeNemoFlowGateway({ -+ logger: api.logger, -+ config, -+ }); -+ }); -+ -+ api.on("gateway_stop", async () => { -+ await shutdownNemoFlowGateway({ -+ logger: api.logger, -+ }); -+ }); -+ -+ api.on("session_start", async (event) => { -+ await startNemoFlowSession({ -+ logger: api.logger, -+ config, -+ sessionId: event.sessionId, -+ sessionKey: event.sessionKey, -+ }); -+ }); -+ -+ api.on("session_end", async (event) => { -+ await endNemoFlowSession({ -+ logger: api.logger, -+ config, -+ sessionId: event.sessionId, -+ sessionKey: event.sessionKey, -+ }); -+ }); ++ { runtimes: ["pi"], priority: 100 }, ++ ); + }, +}); diff --git a/extensions/nemo-flow/openclaw.plugin.json b/extensions/nemo-flow/openclaw.plugin.json new file mode 100644 -index 0000000000..f664a964af +index 00000000..620bdef1 --- /dev/null +++ b/extensions/nemo-flow/openclaw.plugin.json -@@ -0,0 +1,194 @@ +@@ -0,0 +1,70 @@ +{ + "id": "nemo-flow", + "name": "NeMo Flow", -+ "description": "NeMo Flow tracing, plugin initialization, codec-aware tool/LLM wrapping, and ATIF export.", ++ "description": "NeMo Flow plugin-host initialization and execution wrapping for OpenClaw.", ++ "contracts": { ++ "agentStreamingLlmMiddleware": ["pi"], ++ "agentToolCallMiddleware": ["pi"] ++ }, + "configSchema": { + "type": "object", + "additionalProperties": false, ++ "required": ["version", "components"], + "properties": { -+ "enabled": { -+ "type": "boolean" -+ }, -+ "wrapping": { -+ "type": "object", -+ "additionalProperties": false, -+ "properties": { -+ "tools": { -+ "type": "boolean" -+ }, -+ "llm": { -+ "type": "boolean" -+ } -+ } -+ }, -+ "scopeIsolation": { -+ "type": "string", -+ "enum": ["per_session"] -+ }, -+ "atif": { -+ "type": "object", -+ "additionalProperties": false, -+ "properties": { -+ "enabled": { -+ "type": "boolean" -+ }, -+ "outputDir": { -+ "type": "string" -+ }, -+ "agentName": { -+ "type": "string" -+ }, -+ "agentVersion": { -+ "type": "string" -+ } -+ } ++ "version": { ++ "type": "number", ++ "enum": [1] + }, -+ "telemetry": { -+ "type": "object", -+ "additionalProperties": false, -+ "properties": { -+ "otel": { -+ "type": "object", -+ "additionalProperties": false, -+ "properties": { -+ "enabled": { -+ "type": "boolean" -+ }, -+ "transport": { -+ "type": "string" -+ }, -+ "endpoint": { -+ "type": "string" -+ }, -+ "headers": { -+ "type": "object" -+ }, -+ "resourceAttributes": { -+ "type": "object" -+ }, -+ "serviceName": { -+ "type": "string" -+ }, -+ "serviceNamespace": { -+ "type": "string" -+ }, -+ "serviceVersion": { -+ "type": "string" -+ }, -+ "instrumentationScope": { -+ "type": "string" -+ }, -+ "timeoutMillis": { -+ "type": "number" -+ } -+ } -+ }, -+ "openInference": { -+ "type": "object", -+ "additionalProperties": false, -+ "properties": { -+ "enabled": { -+ "type": "boolean" -+ }, -+ "transport": { -+ "type": "string" -+ }, -+ "endpoint": { -+ "type": "string" -+ }, -+ "headers": { -+ "type": "object" -+ }, -+ "resourceAttributes": { -+ "type": "object" -+ }, -+ "serviceName": { -+ "type": "string" -+ }, -+ "serviceNamespace": { -+ "type": "string" -+ }, -+ "serviceVersion": { -+ "type": "string" -+ }, -+ "instrumentationScope": { -+ "type": "string" -+ }, -+ "timeoutMillis": { -+ "type": "number" -+ } ++ "components": { ++ "type": "array", ++ "items": { ++ "type": "object", ++ "additionalProperties": false, ++ "required": ["kind"], ++ "properties": { ++ "kind": { ++ "type": "string", ++ "minLength": 1 ++ }, ++ "enabled": { ++ "type": "boolean" ++ }, ++ "config": { ++ "type": "object", ++ "additionalProperties": true + } + } + } + }, -+ "codecs": { ++ "policy": { + "type": "object", + "additionalProperties": false, + "properties": { -+ "default": { ++ "unknown_component": { + "type": "string", -+ "enum": ["auto", "none", "openai_chat", "openai_responses", "anthropic_messages"] ++ "enum": ["ignore", "warn", "error"] + }, -+ "providers": { -+ "type": "object", -+ "additionalProperties": { -+ "type": "string", -+ "enum": ["none", "openai_chat", "openai_responses", "anthropic_messages"] -+ } ++ "unknown_field": { ++ "type": "string", ++ "enum": ["ignore", "warn", "error"] + }, -+ "models": { -+ "type": "object", -+ "additionalProperties": { -+ "type": "string", -+ "enum": ["none", "openai_chat", "openai_responses", "anthropic_messages"] -+ } -+ } -+ } -+ }, -+ "nemoFlow": { -+ "type": "object", -+ "additionalProperties": false, -+ "properties": { -+ "pluginConfig": { -+ "type": "object", -+ "additionalProperties": true ++ "unsupported_value": { ++ "type": "string", ++ "enum": ["ignore", "warn", "error"] + } + } + } + } + }, + "uiHints": { -+ "enabled": { -+ "label": "Enabled", -+ "help": "Enable NeMo Flow wrapping for this gateway." -+ }, -+ "atif.enabled": { -+ "label": "ATIF Export", -+ "help": "Write one exported ATIF JSON trajectory per session." -+ }, -+ "atif.outputDir": { -+ "label": "ATIF Output Dir", -+ "help": "Optional output directory for exported trajectories." -+ }, -+ "telemetry.otel.enabled": { -+ "label": "OpenTelemetry", -+ "help": "Enable OTLP export through the NeMo Flow OpenTelemetry subscriber.", -+ "advanced": true -+ }, -+ "telemetry.openInference.enabled": { -+ "label": "OpenInference", -+ "help": "Enable OTLP export through the NeMo Flow OpenInference subscriber.", -+ "advanced": true -+ }, -+ "codecs.default": { -+ "label": "Default Codec", -+ "help": "Use auto-detection or force a fallback request codec.", -+ "advanced": true ++ "components": { ++ "label": "Components", ++ "help": "NeMo Flow plugin-host components to activate." + }, -+ "nemoFlow.pluginConfig": { -+ "label": "Plugin Config", -+ "help": "Optional raw NeMo Flow plugin config document.", ++ "policy": { ++ "label": "Policy", ++ "help": "Optional NeMo Flow plugin-host validation policy.", + "advanced": true + } + } +} diff --git a/extensions/nemo-flow/package.json b/extensions/nemo-flow/package.json new file mode 100644 -index 0000000000..c0d1212778 +index 00000000..a322441f --- /dev/null +++ b/extensions/nemo-flow/package.json -@@ -0,0 +1,19 @@ +@@ -0,0 +1,22 @@ +{ + "name": "@openclaw/nemo-flow", + "version": "2026.3.14", -+ "description": "OpenClaw NeMo Flow tracing, plugin config, and ATIF export integration", ++ "description": "OpenClaw NeMo Flow plugin-host and execution middleware integration", + "type": "module", + "optionalDependencies": { + "nemo-flow-node": "file:../../../../crates/node" + }, ++ "devDependencies": { ++ "openclaw": "workspace:*" ++ }, + "openclaw": { + "extensions": [ + "./index.ts" @@ -856,173 +250,86 @@ index 0000000000..c0d1212778 +} diff --git a/extensions/nemo-flow/src/config.ts b/extensions/nemo-flow/src/config.ts new file mode 100644 -index 0000000000..c974002a80 +index 00000000..c2924575 --- /dev/null +++ b/extensions/nemo-flow/src/config.ts -@@ -0,0 +1,369 @@ -+import path from "node:path"; +@@ -0,0 +1,171 @@ ++export type NemoFlowPluginComponentConfig = Record; + -+export type NemoFlowCodecName = -+ | "auto" -+ | "none" -+ | "openai_chat" -+ | "openai_responses" -+ | "anthropic_messages"; ++export type NemoFlowPluginComponent = { ++ kind: string; ++ enabled?: boolean; ++ config?: NemoFlowPluginComponentConfig; ++}; + -+export type NemoFlowPluginConfig = { -+ enabled: boolean; -+ wrapping: { -+ tools: boolean; -+ llm: boolean; -+ }; -+ scopeIsolation: "per_session"; -+ atif: { -+ enabled: boolean; -+ outputDir: string; -+ agentName: string; -+ agentVersion: string; -+ }; -+ telemetry: { -+ otel: { -+ enabled: boolean; -+ transport?: string; -+ endpoint?: string; -+ headers?: Record; -+ resourceAttributes?: Record; -+ serviceName?: string; -+ serviceNamespace?: string; -+ serviceVersion?: string; -+ instrumentationScope?: string; -+ timeoutMillis?: number; -+ }; -+ openInference: { -+ enabled: boolean; -+ transport?: string; -+ endpoint?: string; -+ headers?: Record; -+ resourceAttributes?: Record; -+ serviceName?: string; -+ serviceNamespace?: string; -+ serviceVersion?: string; -+ instrumentationScope?: string; -+ timeoutMillis?: number; -+ }; -+ }; -+ codecs: { -+ default: NemoFlowCodecName; -+ providers: Record>; -+ models: Record>; -+ }; -+ nemoFlow: { -+ pluginConfig: Record; -+ }; ++export type NemoFlowPluginPolicy = { ++ unknown_component?: "ignore" | "warn" | "error"; ++ unknown_field?: "ignore" | "warn" | "error"; ++ unsupported_value?: "ignore" | "warn" | "error"; ++}; ++ ++export type NemoFlowPluginConfig = { ++ version: 1; ++ components: NemoFlowPluginComponent[]; ++ policy?: NemoFlowPluginPolicy; +}; + -+type ResolveConfigOptions = { -+ stateDir?: string; -+ resolvePath?: (input: string) => string; -+ agentName?: string; -+ agentVersion?: string; ++const UNSUPPORTED_WRAPPER_FIELDS = new Set([ ++ "enabled", ++ "backend", ++ "capture", ++ "correlation", ++ "plugins", ++ "nemoFlow", ++ "atif", ++ "telemetry", ++]); ++ ++export const DEFAULT_NEMO_FLOW_PLUGIN_CONFIG: NemoFlowPluginConfig = { ++ version: 1, ++ components: [], +}; + +export const NEMO_FLOW_PLUGIN_CONFIG_JSON_SCHEMA = { + type: "object", + additionalProperties: false, ++ required: ["version", "components"], + properties: { -+ enabled: { type: "boolean", default: true }, -+ wrapping: { -+ type: "object", -+ additionalProperties: false, -+ properties: { -+ tools: { type: "boolean", default: true }, -+ llm: { type: "boolean", default: true }, -+ }, -+ }, -+ scopeIsolation: { -+ type: "string", -+ enum: ["per_session"], -+ default: "per_session", -+ }, -+ atif: { -+ type: "object", -+ additionalProperties: false, -+ properties: { -+ enabled: { type: "boolean", default: true }, -+ outputDir: { type: "string" }, -+ agentName: { type: "string" }, -+ agentVersion: { type: "string" }, -+ }, ++ version: { ++ type: "number", ++ enum: [1], + }, -+ telemetry: { -+ type: "object", -+ additionalProperties: false, -+ properties: { -+ otel: { -+ type: "object", -+ additionalProperties: false, -+ properties: { -+ enabled: { type: "boolean", default: false }, -+ transport: { type: "string" }, -+ endpoint: { type: "string" }, -+ headers: { type: "object" }, -+ resourceAttributes: { type: "object" }, -+ serviceName: { type: "string" }, -+ serviceNamespace: { type: "string" }, -+ serviceVersion: { type: "string" }, -+ instrumentationScope: { type: "string" }, -+ timeoutMillis: { type: "number", minimum: 1 }, -+ }, -+ }, -+ openInference: { -+ type: "object", -+ additionalProperties: false, -+ properties: { -+ enabled: { type: "boolean", default: false }, -+ transport: { type: "string" }, -+ endpoint: { type: "string" }, -+ headers: { type: "object" }, -+ resourceAttributes: { type: "object" }, -+ serviceName: { type: "string" }, -+ serviceNamespace: { type: "string" }, -+ serviceVersion: { type: "string" }, -+ instrumentationScope: { type: "string" }, -+ timeoutMillis: { type: "number", minimum: 1 }, ++ components: { ++ type: "array", ++ items: { ++ type: "object", ++ additionalProperties: false, ++ required: ["kind"], ++ properties: { ++ kind: { type: "string", minLength: 1 }, ++ enabled: { type: "boolean" }, ++ config: { ++ type: "object", ++ additionalProperties: true, + }, + }, + }, + }, -+ codecs: { ++ policy: { + type: "object", + additionalProperties: false, + properties: { -+ default: { ++ unknown_component: { + type: "string", -+ enum: ["auto", "none", "openai_chat", "openai_responses", "anthropic_messages"], -+ default: "auto", -+ }, -+ providers: { -+ type: "object", -+ additionalProperties: { -+ type: "string", -+ enum: ["none", "openai_chat", "openai_responses", "anthropic_messages"], -+ }, ++ enum: ["ignore", "warn", "error"], + }, -+ models: { -+ type: "object", -+ additionalProperties: { -+ type: "string", -+ enum: ["none", "openai_chat", "openai_responses", "anthropic_messages"], -+ }, ++ unknown_field: { ++ type: "string", ++ enum: ["ignore", "warn", "error"], + }, -+ }, -+ }, -+ nemoFlow: { -+ type: "object", -+ additionalProperties: false, -+ properties: { -+ pluginConfig: { -+ type: "object", -+ additionalProperties: true, ++ unsupported_value: { ++ type: "string", ++ enum: ["ignore", "warn", "error"], + }, + }, + }, @@ -1030,494 +337,177 @@ index 0000000000..c974002a80 +} as const; + +function asRecord(value: unknown, label: string): Record { -+ if (value === undefined) { -+ return {}; -+ } + if (!value || typeof value !== "object" || Array.isArray(value)) { + throw new Error(`${label} must be an object`); + } + return value as Record; +} + -+function asBoolean(value: unknown, label: string, fallback: boolean): boolean { -+ if (value === undefined) { -+ return fallback; -+ } -+ if (typeof value !== "boolean") { -+ throw new Error(`${label} must be a boolean`); ++function rejectUnsupportedWrapperFields(record: Record): void { ++ for (const key of Object.keys(record)) { ++ if (UNSUPPORTED_WRAPPER_FIELDS.has(key)) { ++ throw new Error( ++ `nemo-flow config.${key} is no longer supported; configure NeMo Flow components at the plugin config root`, ++ ); ++ } + } -+ return value; +} + -+function asOptionalString(value: unknown, label: string): string | undefined { -+ if (value === undefined || value === null || value === "") { ++function validatePolicy(value: unknown): NemoFlowPluginPolicy | undefined { ++ if (value === undefined) { + return undefined; + } -+ if (typeof value !== "string") { -+ throw new Error(`${label} must be a string`); ++ const policy = asRecord(value, "policy"); ++ const normalized: NemoFlowPluginPolicy = {}; ++ for (const key of Object.keys(policy)) { ++ if (key !== "unknown_component" && key !== "unknown_field" && key !== "unsupported_value") { ++ throw new Error(`policy.${key} is not supported`); ++ } ++ const raw = policy[key]; ++ if (raw !== "ignore" && raw !== "warn" && raw !== "error") { ++ throw new Error(`policy.${key} must be one of ignore, warn, or error`); ++ } ++ normalized[key] = raw; + } -+ return value; ++ return normalized; +} + -+function asOptionalNumber(value: unknown, label: string): number | undefined { -+ if (value === undefined || value === null || value === "") { -+ return undefined; -+ } -+ if (typeof value !== "number" || !Number.isFinite(value)) { -+ throw new Error(`${label} must be a finite number`); ++function validateComponents(value: unknown): NemoFlowPluginComponent[] { ++ if (!Array.isArray(value)) { ++ throw new Error("components must be an array"); + } -+ return value; -+} -+ -+function isCodecName(value: unknown): value is Exclude { -+ return ( -+ value === "none" || -+ value === "openai_chat" || -+ value === "openai_responses" || -+ value === "anthropic_messages" -+ ); ++ return value.map((rawComponent, index) => { ++ const component = asRecord(rawComponent, `components[${index}]`); ++ for (const key of Object.keys(component)) { ++ if (key !== "kind" && key !== "enabled" && key !== "config") { ++ throw new Error(`components[${index}].${key} is not supported`); ++ } ++ } ++ if (typeof component.kind !== "string" || component.kind.trim().length === 0) { ++ throw new Error(`components[${index}].kind must be a non-empty string`); ++ } ++ if (component.enabled !== undefined && typeof component.enabled !== "boolean") { ++ throw new Error(`components[${index}].enabled must be a boolean`); ++ } ++ const config = ++ component.config === undefined ++ ? undefined ++ : asRecord(component.config, `components[${index}].config`); ++ return { ++ kind: component.kind.trim(), ++ ...(component.enabled !== undefined ? { enabled: component.enabled } : {}), ++ ...(config ? { config } : {}), ++ }; ++ }); +} + -+function asCodecDefault(value: unknown): NemoFlowCodecName { -+ if (value === undefined) { -+ return "auto"; ++export function resolveNemoFlowPluginConfig(value: unknown): NemoFlowPluginConfig { ++ if (value === undefined || value === null) { ++ return { ...DEFAULT_NEMO_FLOW_PLUGIN_CONFIG, components: [] }; + } -+ if ( -+ value !== "auto" && -+ value !== "none" && -+ value !== "openai_chat" && -+ value !== "openai_responses" && -+ value !== "anthropic_messages" -+ ) { -+ throw new Error("codecs.default must be a supported codec name"); -+ } -+ return value; -+} + -+function asCodecMap( -+ value: unknown, -+ label: string, -+): Record> { -+ const record = asRecord(value, label); -+ const normalized: Record> = {}; -+ for (const [key, rawValue] of Object.entries(record)) { -+ if (!isCodecName(rawValue)) { -+ throw new Error(`${label}.${key} must be a supported codec name`); -+ } -+ normalized[key] = rawValue; -+ } -+ return normalized; -+} ++ const record = asRecord(value, "nemo-flow config"); ++ rejectUnsupportedWrapperFields(record); + -+function asOptionalRecord(value: unknown, label: string): Record | undefined { -+ if (value === undefined) { -+ return undefined; ++ for (const key of Object.keys(record)) { ++ if (key !== "version" && key !== "components" && key !== "policy") { ++ throw new Error(`nemo-flow config.${key} is not supported`); ++ } + } -+ return asRecord(value, label); -+} + -+function resolveOutputDir( -+ rawOutputDir: unknown, -+ stateDir: string, -+ resolvePath: (input: string) => string, -+): string { -+ const outputDir = asOptionalString(rawOutputDir, "atif.outputDir"); -+ if (!outputDir) { -+ return path.join(stateDir, "plugins", "nemo-flow", "atif"); ++ if (record.version !== 1) { ++ throw new Error("version must be 1"); + } -+ return path.isAbsolute(outputDir) ? outputDir : resolvePath(outputDir); -+} -+ -+export function resolveNemoFlowPluginConfig( -+ rawValue: unknown, -+ options: ResolveConfigOptions = {}, -+): NemoFlowPluginConfig { -+ const raw = asRecord(rawValue, "nemo-flow plugin config"); -+ const wrapping = asRecord(raw.wrapping, "wrapping"); -+ const atif = asRecord(raw.atif, "atif"); -+ const telemetry = asRecord(raw.telemetry, "telemetry"); -+ const otel = asRecord(telemetry.otel, "telemetry.otel"); -+ const openInference = asRecord(telemetry.openInference, "telemetry.openInference"); -+ const codecs = asRecord(raw.codecs, "codecs"); -+ const nemoFlow = asRecord(raw.nemoFlow, "nemoFlow"); -+ const stateDir = options.stateDir ?? ".openclaw"; -+ const resolvePath = options.resolvePath ?? ((input: string) => input); -+ const agentName = options.agentName ?? "openclaw"; -+ const agentVersion = options.agentVersion ?? "unknown"; + + return { -+ enabled: asBoolean(raw.enabled, "enabled", true), -+ wrapping: { -+ tools: asBoolean(wrapping.tools, "wrapping.tools", true), -+ llm: asBoolean(wrapping.llm, "wrapping.llm", true), -+ }, -+ scopeIsolation: "per_session", -+ atif: { -+ enabled: asBoolean(atif.enabled, "atif.enabled", true), -+ outputDir: resolveOutputDir(atif.outputDir, stateDir, resolvePath), -+ agentName: asOptionalString(atif.agentName, "atif.agentName") ?? agentName, -+ agentVersion: asOptionalString(atif.agentVersion, "atif.agentVersion") ?? agentVersion, -+ }, -+ telemetry: { -+ otel: { -+ enabled: asBoolean(otel.enabled, "telemetry.otel.enabled", false), -+ transport: asOptionalString(otel.transport, "telemetry.otel.transport"), -+ endpoint: asOptionalString(otel.endpoint, "telemetry.otel.endpoint"), -+ headers: asOptionalRecord(otel.headers, "telemetry.otel.headers"), -+ resourceAttributes: asOptionalRecord( -+ otel.resourceAttributes, -+ "telemetry.otel.resourceAttributes", -+ ), -+ serviceName: asOptionalString(otel.serviceName, "telemetry.otel.serviceName"), -+ serviceNamespace: asOptionalString( -+ otel.serviceNamespace, -+ "telemetry.otel.serviceNamespace", -+ ), -+ serviceVersion: asOptionalString(otel.serviceVersion, "telemetry.otel.serviceVersion"), -+ instrumentationScope: asOptionalString( -+ otel.instrumentationScope, -+ "telemetry.otel.instrumentationScope", -+ ), -+ timeoutMillis: asOptionalNumber(otel.timeoutMillis, "telemetry.otel.timeoutMillis"), -+ }, -+ openInference: { -+ enabled: asBoolean(openInference.enabled, "telemetry.openInference.enabled", false), -+ transport: asOptionalString( -+ openInference.transport, -+ "telemetry.openInference.transport", -+ ), -+ endpoint: asOptionalString(openInference.endpoint, "telemetry.openInference.endpoint"), -+ headers: asOptionalRecord(openInference.headers, "telemetry.openInference.headers"), -+ resourceAttributes: asOptionalRecord( -+ openInference.resourceAttributes, -+ "telemetry.openInference.resourceAttributes", -+ ), -+ serviceName: asOptionalString( -+ openInference.serviceName, -+ "telemetry.openInference.serviceName", -+ ), -+ serviceNamespace: asOptionalString( -+ openInference.serviceNamespace, -+ "telemetry.openInference.serviceNamespace", -+ ), -+ serviceVersion: asOptionalString( -+ openInference.serviceVersion, -+ "telemetry.openInference.serviceVersion", -+ ), -+ instrumentationScope: asOptionalString( -+ openInference.instrumentationScope, -+ "telemetry.openInference.instrumentationScope", -+ ), -+ timeoutMillis: asOptionalNumber( -+ openInference.timeoutMillis, -+ "telemetry.openInference.timeoutMillis", -+ ), -+ }, -+ }, -+ codecs: { -+ default: asCodecDefault(codecs.default), -+ providers: asCodecMap(codecs.providers, "codecs.providers"), -+ models: asCodecMap(codecs.models, "codecs.models"), -+ }, -+ nemoFlow: { -+ pluginConfig: -+ (asOptionalRecord(nemoFlow.pluginConfig, "nemoFlow.pluginConfig") as Record) ?? -+ { -+ version: 1, -+ components: [], -+ }, -+ }, ++ version: 1, ++ components: validateComponents(record.components), ++ ...(record.policy !== undefined ? { policy: validatePolicy(record.policy) } : {}), + }; +} diff --git a/extensions/nemo-flow/src/runtime.test.ts b/extensions/nemo-flow/src/runtime.test.ts new file mode 100644 -index 0000000000..7076506aba +index 00000000..96b5555d --- /dev/null +++ b/extensions/nemo-flow/src/runtime.test.ts -@@ -0,0 +1,253 @@ +@@ -0,0 +1,66 @@ +import { describe, expect, it } from "vitest"; +import { resolveNemoFlowPluginConfig } from "./config.js"; -+import { -+ buildCodecFinalResponse, -+ buildProviderRequestContent, -+ detectCodecName, -+ ensureChatStreamUsageInclude, -+} from "./runtime.js"; + +describe("nemo-flow config", () => { -+ it("applies defaults and resolves the ATIF output directory", () => { -+ const config = resolveNemoFlowPluginConfig( -+ {}, -+ { -+ stateDir: "/tmp/openclaw-state", -+ resolvePath: (input) => `/abs/${input}`, -+ agentVersion: "1.2.3", -+ }, -+ ); -+ -+ expect(config.enabled).toBe(true); -+ expect(config.atif.outputDir).toBe("/tmp/openclaw-state/plugins/nemo-flow/atif"); -+ expect(config.atif.agentName).toBe("openclaw"); -+ expect(config.atif.agentVersion).toBe("1.2.3"); -+ }); -+}); -+ -+describe("nemo-flow codec selection", () => { -+ const config = resolveNemoFlowPluginConfig({ -+ codecs: { -+ default: "auto", -+ providers: { -+ openai: "openai_chat", -+ }, -+ models: { -+ "claude-*": "anthropic_messages", -+ }, -+ }, -+ }); -+ -+ it("prefers model overrides over provider overrides", () => { -+ const codec = detectCodecName({ -+ provider: "openai", -+ modelId: "claude-opus-4.6", -+ requestContent: { messages: [] }, -+ config, -+ }); -+ -+ expect(codec).toBe("anthropic_messages"); -+ }); -+ -+ it("detects responses payloads automatically", () => { -+ const codec = detectCodecName({ -+ provider: "openai", -+ modelId: "gpt-5.4", -+ requestContent: { instructions: "Be concise", input: [] }, -+ config, -+ }); -+ -+ expect(codec).toBe("openai_responses"); -+ }); -+}); -+ -+describe("nemo-flow request/response helpers", () => { -+ it("builds OpenAI Responses request content from system and user messages", () => { -+ const content = buildProviderRequestContent({ -+ codecName: "openai_responses", -+ model: { id: "gpt-5.4" }, -+ context: { -+ messages: [ -+ { role: "system", content: [{ type: "text", text: "System prompt" }] }, -+ { role: "user", content: [{ type: "text", text: "Hello" }] }, -+ ], -+ }, -+ }); -+ -+ expect(content).toEqual({ -+ model: "gpt-5.4", -+ instructions: "System prompt", -+ input: [{ role: "user", content: "Hello" }], ++ it("defaults to an empty NeMo Flow plugin-host config", () => { ++ expect(resolveNemoFlowPluginConfig(undefined)).toEqual({ ++ version: 1, ++ components: [], + }); + }); + -+ it("builds codec-shaped final responses from collected chunks", () => { -+ const response = buildCodecFinalResponse({ -+ codecName: "openai_chat", -+ model: { id: "gpt-5.4" }, -+ chunks: [ -+ { type: "text", text: "Hello" }, -+ { type: "text", text: " world" }, -+ { stopReason: "stop" }, -+ ], -+ }); -+ -+ expect(response).toEqual({ -+ object: "chat.completion", -+ model: "gpt-5.4", -+ choices: [ -+ { -+ index: 0, -+ finish_reason: "stop", -+ message: { -+ role: "assistant", -+ content: "Hello world", ++ it("accepts the hoisted plugin-host config shape", () => { ++ expect( ++ resolveNemoFlowPluginConfig({ ++ version: 1, ++ components: [ ++ { ++ kind: "observability", ++ enabled: true, ++ config: { ++ version: 1, ++ endpoint: "http://localhost:4318", ++ }, + }, ++ ], ++ policy: { ++ unknown_component: "warn", + }, -+ ], -+ }); -+ }); -+}); -+describe("nemo-flow stream chunk usage extraction", () => { -+ it("extracts usage from top-level record.usage (OpenAI chat SSE terminal)", () => { -+ const response = buildCodecFinalResponse({ -+ codecName: "openai_chat", -+ model: { id: "gpt-5" }, -+ chunks: [ -+ { type: "text", text: "hi" }, -+ { type: "text", text: " there" }, -+ { usage: { prompt_tokens: 10, completion_tokens: 3, total_tokens: 13 } }, -+ ], -+ }); -+ expect((response as { usage?: unknown }).usage).toEqual({ -+ prompt_tokens: 10, -+ completion_tokens: 3, -+ total_tokens: 13, -+ }); -+ }); -+ -+ it("extracts usage nested under record.partial (pi-ai text_end event)", () => { -+ const response = buildCodecFinalResponse({ -+ codecName: "openai_chat", -+ model: { id: "gpt-5" }, -+ chunks: [ -+ { type: "text", text: "hi" }, ++ }), ++ ).toEqual({ ++ version: 1, ++ components: [ + { -+ type: "text_end", -+ partial: { -+ usage: { input: 10, output: 3, totalTokens: 13 }, ++ kind: "observability", ++ enabled: true, ++ config: { ++ version: 1, ++ endpoint: "http://localhost:4318", + }, + }, + ], ++ policy: { ++ unknown_component: "warn", ++ }, + }); -+ expect((response as { usage?: unknown }).usage).toEqual({ -+ prompt_tokens: 10, -+ completion_tokens: 3, -+ total_tokens: 13, -+ }); -+ }); -+ -+ it("extracts usage nested under record.message (pi-ai message_end event)", () => { -+ const response = buildCodecFinalResponse({ -+ codecName: "openai_chat", -+ model: { id: "gpt-5" }, -+ chunks: [ -+ { type: "text", text: "hi" }, -+ { message: { usage: { input_tokens: 10, output_tokens: 3 } } }, -+ ], -+ }); -+ expect((response as { usage?: unknown }).usage).toEqual({ -+ prompt_tokens: 10, -+ completion_tokens: 3, -+ total_tokens: 13, -+ }); -+ }); -+ -+ it("omits usage when no chunk carries token counts", () => { -+ const response = buildCodecFinalResponse({ -+ codecName: "openai_chat", -+ model: { id: "gpt-5" }, -+ chunks: [{ type: "text", text: "hi" }], -+ }); -+ expect((response as { usage?: unknown }).usage).toBeUndefined(); -+ }); -+ -+ it("rejects non-numeric usage fields", () => { -+ const response = buildCodecFinalResponse({ -+ codecName: "openai_chat", -+ model: { id: "gpt-5" }, -+ chunks: [ -+ { type: "text", text: "hi" }, -+ { usage: { prompt_tokens: "10", completion_tokens: null } }, -+ ], -+ }); -+ expect((response as { usage?: unknown }).usage).toBeUndefined(); -+ }); -+}); -+ -+describe("ensureChatStreamUsageInclude (onPayload stream_options injection)", () => { -+ it("injects stream_options.include_usage on a streaming OpenAI Chat body", () => { -+ const body: Record = { -+ model: "gpt-4o", -+ messages: [{ role: "user", content: "hi" }], -+ stream: true, -+ }; -+ ensureChatStreamUsageInclude(body); -+ expect(body.stream_options).toEqual({ include_usage: true }); -+ }); -+ -+ it("preserves caller-provided stream_options (including opt-outs)", () => { -+ const optOut: Record = { -+ model: "gpt-4o", -+ messages: [{ role: "user", content: "hi" }], -+ stream: true, -+ stream_options: { include_usage: false }, -+ }; -+ ensureChatStreamUsageInclude(optOut); -+ expect(optOut.stream_options).toEqual({ include_usage: false }); -+ -+ const customOpts: Record = { -+ model: "gpt-4o", -+ messages: [{ role: "user", content: "hi" }], -+ stream: true, -+ stream_options: { include_usage: true, some_extra: 1 }, -+ }; -+ ensureChatStreamUsageInclude(customOpts); -+ expect(customOpts.stream_options).toEqual({ include_usage: true, some_extra: 1 }); -+ }); -+ -+ it("skips non-streaming Chat bodies (stream !== true)", () => { -+ const body: Record = { -+ model: "gpt-4o", -+ messages: [{ role: "user", content: "hi" }], -+ }; -+ ensureChatStreamUsageInclude(body); -+ expect(body.stream_options).toBeUndefined(); -+ -+ const explicitFalse: Record = { -+ model: "gpt-4o", -+ messages: [{ role: "user", content: "hi" }], -+ stream: false, -+ }; -+ ensureChatStreamUsageInclude(explicitFalse); -+ expect(explicitFalse.stream_options).toBeUndefined(); + }); + -+ it("skips OpenAI Responses bodies (uses input, not messages)", () => { -+ const responsesBody: Record = { -+ model: "gpt-4o", -+ input: "hi", -+ stream: true, -+ }; -+ ensureChatStreamUsageInclude(responsesBody); -+ expect(responsesBody.stream_options).toBeUndefined(); -+ }); -+ -+ it("is safe on null, undefined, arrays, and primitives", () => { -+ expect(() => ensureChatStreamUsageInclude(null)).not.toThrow(); -+ expect(() => ensureChatStreamUsageInclude(undefined)).not.toThrow(); -+ expect(() => ensureChatStreamUsageInclude([])).not.toThrow(); -+ expect(() => ensureChatStreamUsageInclude("string")).not.toThrow(); -+ expect(() => ensureChatStreamUsageInclude(42)).not.toThrow(); ++ it.each([ ++ "enabled", ++ "backend", ++ "capture", ++ "correlation", ++ "plugins", ++ "nemoFlow", ++ "atif", ++ "telemetry", ++ ])("rejects old wrapper field %s", (field) => { ++ expect(() => ++ resolveNemoFlowPluginConfig({ ++ version: 1, ++ components: [], ++ [field]: {}, ++ }), ++ ).toThrow(`config.${field} is no longer supported`); + }); +}); diff --git a/extensions/nemo-flow/src/runtime.ts b/extensions/nemo-flow/src/runtime.ts new file mode 100644 +index 00000000..9642147e --- /dev/null +++ b/extensions/nemo-flow/src/runtime.ts -@@ -0,0 +1,1530 @@ -+import fs from "node:fs/promises"; -+import path from "node:path"; -+import type { StreamFn } from "@mariozechner/pi-agent-core"; -+import { extractTextFromChatContent } from "../../../src/shared/chat-content.js"; -+import type { NemoFlowCodecName, NemoFlowPluginConfig } from "./config.js"; +@@ -0,0 +1,479 @@ ++import type { AgentStreamingLlmMiddlewareContext } from "openclaw/plugin-sdk/core"; ++import type { NemoFlowPluginConfig } from "./config.js"; + +type JsonRecord = Record; -+ -+type ModelLike = { -+ id?: string; -+ provider?: string; -+ api?: string; -+}; -+ -+type ContextLike = { -+ systemPrompt?: string; -+ messages?: unknown[]; -+ tools?: unknown[]; -+}; -+ -+type StreamOptionsLike = { -+ headers?: Record; -+ onPayload?: (payload: unknown, model: unknown) => unknown; -+ [key: string]: unknown; -+}; ++type StreamFn = AgentStreamingLlmMiddlewareContext["streamFn"]; + +type StreamLike = AsyncIterable & { + result?: () => Promise; @@ -1526,19 +516,6 @@ new file mode 100644 +type NemoFlowScopeHandle = unknown; +type NemoFlowScopeStack = unknown; + -+type NemoFlowCodec = { -+ decode: (value: unknown) => unknown; -+ encode: (value: unknown) => unknown; -+ decodeResponse?: (value: unknown) => unknown; -+}; -+ -+type NemoFlowSubscriber = { -+ register: (name: string) => void; -+ deregister: (name: string) => boolean; -+ forceFlush?: () => void; -+ shutdown?: () => void; -+}; -+ +type NemoFlowBindings = { + createScopeStack: () => NemoFlowScopeStack; + setThreadScopeStack: (stack: NemoFlowScopeStack) => void; @@ -1571,36 +548,17 @@ new file mode 100644 + data?: unknown, + metadata?: unknown, + modelName?: string | null, -+ codecDecode?: ((value: unknown) => unknown) | null, -+ codecEncode?: ((value: unknown) => unknown) | null, -+ responseCodecDecode?: ((value: unknown) => unknown) | null, + ) => Promise<{ next: () => Promise }>; -+ AtifExporter: new ( -+ sessionId: string, -+ agentName: string, -+ agentVersion: string, -+ modelName?: string | null, -+ ) => { -+ register: (name: string) => void; -+ deregister: (name: string) => boolean; -+ exportJson: () => string; -+ clear: () => void; -+ }; -+ OpenTelemetrySubscriber: new (config?: Record) => NemoFlowSubscriber; -+ OpenInferenceSubscriber: new (config?: Record) => NemoFlowSubscriber; ++ pushStreamChunk: (streamId: number, chunk: unknown) => boolean; ++ endStream: (streamId: number) => void; + ScopeType: { + Agent: number; + }; -+ OpenAIChatCodec: new () => NemoFlowCodec; -+ OpenAIResponsesCodec: new () => NemoFlowCodec; -+ AnthropicMessagesCodec: new () => NemoFlowCodec; -+ pushStreamChunk: (streamId: number, chunk: unknown) => boolean; -+ endStream: (streamId: number) => void; +}; + +type NemoFlowPluginHost = { -+ defaultConfig: () => Record; -+ validate: (config: Record) => { ++ defaultConfig: () => NemoFlowPluginConfig; ++ validate: (config: NemoFlowPluginConfig) => { + diagnostics?: Array<{ + level?: string; + code?: string; @@ -1608,7 +566,7 @@ new file mode 100644 + message?: string; + }>; + }; -+ initialize: (config: Record) => Promise; ++ initialize: (config: NemoFlowPluginConfig) => Promise; + clear: () => void; +}; + @@ -1623,1008 +581,161 @@ new file mode 100644 + pluginHost: NemoFlowPluginHost; +}; + -+type SessionExporterState = { -+ exporter: InstanceType; -+ registrationName: string; -+}; -+ -+type BenchmarkIdentifiers = { -+ benchmark_session_id: string; -+ benchmark_run_id: string; -+ benchmark_task_id: string; -+}; -+ -+const TOOL_ATTR_LOCAL = 0b01; -+const LLM_ATTR_STREAMING = 0b10; -+ +type RuntimeState = { + modules?: NemoFlowModules; + loadPromise?: Promise; + initPromise?: Promise; + initialized: boolean; ++ activeConfig?: NemoFlowPluginConfig; + unavailableReason?: string; + unavailableLogged: boolean; + sessionScopes: Map; + sessionRootScopes: Map; -+ sessionExporters: Map; -+ telemetrySubscribers: Array<{ name: string; subscriber: NemoFlowSubscriber }>; +}; + ++const TOOL_ATTR_LOCAL = 0b01; ++const LLM_ATTR_STREAMING = 0b10; ++ +const state: RuntimeState = { + initialized: false, + unavailableLogged: false, + sessionScopes: new Map(), + sessionRootScopes: new Map(), -+ sessionExporters: new Map(), -+ telemetrySubscribers: [], +}; + +function asRecord(value: unknown): JsonRecord { -+ return value && typeof value === "object" && !Array.isArray(value) -+ ? (value as JsonRecord) -+ : {}; -+} -+ -+function asArray(value: unknown): unknown[] { -+ return Array.isArray(value) ? value : []; ++ return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {}; +} + -+function messageRole(message: unknown): string { -+ const role = asRecord(message).role; -+ return typeof role === "string" ? role : "user"; ++function normalizeJsonObject(value: unknown): JsonRecord { ++ return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {}; +} + -+function normalizeContentText(content: unknown): string | null { -+ return extractTextFromChatContent(content, { -+ joinWith: "\n", -+ normalizeText: (text) => text.trim(), -+ }); -+} -+ -+function normalizeMessageText(message: unknown): string | null { -+ return normalizeContentText(asRecord(message).content); ++async function loadModules(): Promise { ++ try { ++ const [bindingsModule, pluginHostModule] = await Promise.all([ ++ import("nemo-flow-node"), ++ import("nemo-flow-node/plugin"), ++ ]); ++ return { ++ bindings: bindingsModule as unknown as NemoFlowBindings, ++ pluginHost: pluginHostModule as unknown as NemoFlowPluginHost, ++ }; ++ } catch (error) { ++ state.unavailableReason = String(error); ++ return null; ++ } +} + -+function normalizeOptionalString(value: unknown): string | undefined { -+ if (typeof value !== "string") { -+ return undefined; ++async function ensureModules(logger: Logger): Promise { ++ if (state.modules) { ++ return state.modules; ++ } ++ if (!state.loadPromise) { ++ state.loadPromise = loadModules(); + } -+ const trimmed = value.trim(); -+ return trimmed.length > 0 ? trimmed : undefined; ++ const modules = await state.loadPromise; ++ if (modules) { ++ state.modules = modules; ++ return modules; ++ } ++ if (!state.unavailableLogged) { ++ logger.warn( ++ `nemo-flow unavailable; execution wrapping disabled (${state.unavailableReason ?? "unknown error"})`, ++ ); ++ state.unavailableLogged = true; ++ } ++ return null; +} + -+function joinPromptSegments(segments: Array): string | undefined { -+ const normalized = segments -+ .map((segment) => normalizeOptionalString(segment)) -+ .filter((segment): segment is string => !!segment); -+ return normalized.length > 0 ? normalized.join("\n\n") : undefined; ++function logPluginDiagnostics( ++ logger: Logger, ++ diagnostics: Array<{ level?: string; code?: string; field?: string; message?: string }> = [], ++): boolean { ++ let hasErrors = false; ++ for (const diagnostic of diagnostics) { ++ const summary = [diagnostic.code, diagnostic.field, diagnostic.message] ++ .filter(Boolean) ++ .join(" "); ++ if (diagnostic.level === "error") { ++ hasErrors = true; ++ logger.warn(`nemo-flow host config error: ${summary}`); ++ continue; ++ } ++ logger.info(`nemo-flow host config warning: ${summary}`); ++ } ++ return hasErrors; +} + -+function systemMessageTexts(messages: unknown[]): string[] { -+ return messages -+ .filter((message) => messageRole(message) === "system") -+ .map((message) => normalizeMessageText(message)) -+ .filter((value): value is string => !!value); ++export function getNemoFlowRuntimeStatus(): { ++ initialized: boolean; ++ wrappingActive: boolean; ++ unavailableReason?: string; ++} { ++ return { ++ initialized: state.initialized, ++ wrappingActive: state.initialized, ++ ...(state.unavailableReason ? { unavailableReason: state.unavailableReason } : {}), ++ }; +} + -+function toolName(tool: unknown): string { -+ const name = asRecord(tool).name; -+ return typeof name === "string" ? name : ""; ++export async function initializeNemoFlowGateway(params: { ++ logger: Logger; ++ config: NemoFlowPluginConfig; ++}): Promise { ++ const modules = await ensureModules(params.logger); ++ if (!modules) { ++ return false; ++ } ++ if (state.initialized && state.activeConfig === params.config) { ++ return true; ++ } ++ if (!state.initPromise) { ++ state.initPromise = (async () => { ++ const report = modules.pluginHost.validate(params.config); ++ if (logPluginDiagnostics(params.logger, report?.diagnostics)) { ++ return false; ++ } ++ try { ++ await modules.pluginHost.initialize(params.config); ++ state.initialized = true; ++ state.activeConfig = params.config; ++ return true; ++ } catch (error) { ++ params.logger.warn(`nemo-flow initialization failed; wrapping disabled (${String(error)})`); ++ return false; ++ } ++ })(); ++ } ++ return await state.initPromise; +} + -+function toolDescription(tool: unknown): string | undefined { -+ const description = asRecord(tool).description; -+ return typeof description === "string" ? description : undefined; -+} -+ -+function toolParameters(tool: unknown): JsonRecord { -+ return asRecord(asRecord(tool).parameters); -+} -+ -+function buildOpenAIChatTools(tools: unknown[]): JsonRecord[] { -+ return tools.map((tool) => { -+ const description = toolDescription(tool); -+ return { -+ type: "function", -+ function: { -+ name: toolName(tool), -+ ...(description ? { description } : {}), -+ parameters: toolParameters(tool), -+ }, -+ }; -+ }); -+} -+ -+function buildOpenAIResponsesTools(tools: unknown[]): JsonRecord[] { -+ return tools.map((tool) => { -+ const description = toolDescription(tool); -+ return { -+ type: "function", -+ name: toolName(tool), -+ ...(description ? { description } : {}), -+ parameters: toolParameters(tool), -+ }; -+ }); -+} -+ -+function buildAnthropicTools(tools: unknown[]): JsonRecord[] { -+ return tools.map((tool) => { -+ const parameters = toolParameters(tool); -+ const description = toolDescription(tool); -+ return { -+ name: toolName(tool), -+ ...(description ? { description } : {}), -+ input_schema: { -+ type: "object", -+ properties: asRecord(parameters.properties), -+ required: Array.isArray(parameters.required) ? parameters.required : [], -+ }, -+ }; -+ }); -+} -+ -+export function buildOpenClawContextContent(params: { -+ model: ModelLike; -+ context: ContextLike; -+ options?: StreamOptionsLike; -+}): JsonRecord { -+ const messages = asArray(params.context.messages); -+ const systemPrompt = normalizeOptionalString(params.context.systemPrompt); -+ const tools = asArray(params.context.tools); -+ const toolChoice = params.options?.toolChoice; -+ -+ return { -+ model: params.model.id ?? "", -+ ...(systemPrompt ? { systemPrompt } : {}), -+ messages: messages.map((message) => ({ -+ role: messageRole(message), -+ content: normalizeMessageText(message) ?? "", -+ })), -+ ...(tools.length > 0 -+ ? { -+ tools: tools.map((tool) => ({ -+ name: toolName(tool), -+ ...(toolDescription(tool) ? { description: toolDescription(tool) } : {}), -+ parameters: toolParameters(tool), -+ })), -+ } -+ : {}), -+ ...(toolChoice !== undefined ? { toolChoice } : {}), -+ }; -+} -+ -+export function buildLlmSpanMetadata(params: { -+ provider: string; -+ codecName: Exclude; -+ model: ModelLike; -+ context: ContextLike; -+ options?: StreamOptionsLike; -+ providerRequest: JsonRecord; -+ sessionId?: string; -+}): JsonRecord { -+ return { -+ provider: params.provider, -+ codec: params.codecName, -+ ...buildBenchmarkSpanMetadata(params.sessionId), -+ openclaw_context: buildOpenClawContextContent({ -+ model: params.model, -+ context: params.context, -+ options: params.options, -+ }), -+ provider_request: params.providerRequest, -+ }; -+} -+ -+export function parseBenchmarkIdentifiers(sessionId?: string): BenchmarkIdentifiers | undefined { -+ const normalizedSessionId = normalizeOptionalString(sessionId); -+ if (!normalizedSessionId || !normalizedSessionId.startsWith("pb-")) { -+ return undefined; -+ } -+ -+ const payload = normalizedSessionId.slice(3); -+ const benchmarkMatch = payload.match(/^(\d{4}(?:-\d+)?)-(.+)$/); -+ if (!benchmarkMatch) { -+ return undefined; -+ } -+ -+ const [, benchmarkRunId, benchmarkTaskId] = benchmarkMatch; -+ const normalizedTaskId = normalizeOptionalString(benchmarkTaskId); -+ if (!normalizedTaskId) { -+ return undefined; -+ } -+ -+ return { -+ benchmark_session_id: normalizedSessionId, -+ benchmark_run_id: benchmarkRunId, -+ benchmark_task_id: normalizedTaskId, -+ }; -+} -+ -+export function buildBenchmarkSpanMetadata(sessionId?: string): JsonRecord { -+ return parseBenchmarkIdentifiers(sessionId) ?? {}; -+} -+ -+function createGlobMatcher(pattern: string): RegExp { -+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&"); -+ const regex = `^${escaped.replace(/\*/g, ".*").replace(/\?/g, ".")}$`; -+ return new RegExp(regex, "i"); -+} -+ -+function findCodecOverride( -+ overrides: Record>, -+ key: string, -+): Exclude | undefined { -+ for (const [pattern, codec] of Object.entries(overrides)) { -+ if (createGlobMatcher(pattern).test(key)) { -+ return codec; -+ } -+ } -+ return undefined; -+} -+ -+export function detectCodecName(params: { -+ provider: string; -+ modelId: string; -+ model?: ModelLike; -+ requestContent: unknown; -+ config: NemoFlowPluginConfig; -+}): Exclude { -+ const modelOverride = findCodecOverride(params.config.codecs.models, params.modelId); -+ if (modelOverride) { -+ return modelOverride; -+ } -+ const modelApi = typeof params.model?.api === "string" ? params.model.api : undefined; -+ if ( -+ modelApi === "openai-responses" || -+ modelApi === "openai-codex-responses" || -+ modelApi === "azure-openai-responses" -+ ) { -+ return "openai_responses"; -+ } -+ if (modelApi === "anthropic-messages") { -+ return "anthropic_messages"; -+ } -+ const content = asRecord(params.requestContent); -+ if (content.input !== undefined || content.instructions !== undefined) { -+ return "openai_responses"; -+ } -+ const providerOverride = params.config.codecs.providers[params.provider]; -+ if (providerOverride) { -+ return providerOverride; -+ } -+ if (params.provider === "anthropic") { -+ return "anthropic_messages"; -+ } -+ if (content.messages !== undefined) { -+ return "openai_chat"; -+ } -+ return params.config.codecs.default === "auto" ? "none" : params.config.codecs.default; -+} -+ -+function safeJsonParse(text: string): unknown { -+ try { -+ return JSON.parse(text); -+ } catch { -+ return {}; -+ } -+} -+ -+function piaiToolCallsToOpenAI(content: unknown[]): JsonRecord[] { -+ const toolCalls: JsonRecord[] = []; -+ for (const block of content) { -+ const b = asRecord(block); -+ if (b.type === "toolCall" || b.type === "tool_call") { -+ toolCalls.push({ -+ id: typeof b.id === "string" ? b.id : "", -+ type: "function", -+ function: { -+ name: typeof b.name === "string" ? b.name : "", -+ arguments: -+ typeof b.arguments === "string" -+ ? b.arguments -+ : JSON.stringify(b.arguments ?? {}), -+ }, -+ }); -+ } -+ } -+ return toolCalls; -+} -+ -+function toOpenAIChatMessage(message: unknown): JsonRecord { -+ const record = asRecord(message); -+ const role = messageRole(message); -+ -+ // tool-result messages (pi-ai role "toolResult" -> OpenAI role "tool") -+ if (role === "toolResult" || role === "tool") { -+ return { -+ role: "tool", -+ tool_call_id: typeof record.toolCallId === "string" ? record.toolCallId -+ : typeof record.tool_call_id === "string" ? record.tool_call_id -+ : "", -+ content: normalizeMessageText(record) ?? "", -+ }; -+ } -+ -+ // assistant messages may contain tool calls in content array -+ if (role === "assistant" && Array.isArray(record.content)) { -+ const toolCalls = piaiToolCallsToOpenAI(record.content); -+ const text = normalizeMessageText(record); -+ const result: JsonRecord = { role: "assistant", content: text ?? "" }; -+ if (toolCalls.length > 0) result.tool_calls = toolCalls; -+ return result; -+ } -+ -+ // user / system / plain assistant -+ return { -+ role, -+ content: normalizeMessageText(record) ?? "", -+ }; -+} -+ -+function toAnthropicMessage(message: unknown): JsonRecord { -+ const record = asRecord(message); -+ const rawRole = messageRole(message); -+ -+ // tool-result messages -> Anthropic tool_result content block inside a user message -+ if (rawRole === "toolResult" || rawRole === "tool") { -+ return { -+ role: "user", -+ content: [{ -+ type: "tool_result", -+ tool_use_id: typeof record.toolCallId === "string" ? record.toolCallId -+ : typeof record.tool_call_id === "string" ? record.tool_call_id -+ : typeof record.tool_use_id === "string" ? record.tool_use_id -+ : "", -+ content: normalizeMessageText(record) ?? "", -+ }], -+ }; -+ } -+ -+ // assistant messages with tool calls -> Anthropic content blocks -+ if (rawRole === "assistant" && Array.isArray(record.content)) { -+ const content: unknown[] = []; -+ const text = normalizeMessageText(record); -+ if (text) content.push({ type: "text", text }); -+ for (const block of record.content as unknown[]) { -+ const b = asRecord(block); -+ if (b.type === "toolCall" || b.type === "tool_call" || b.type === "tool_use") { -+ content.push({ -+ type: "tool_use", -+ id: typeof b.id === "string" ? b.id : "", -+ name: typeof b.name === "string" ? b.name : "", -+ input: typeof b.arguments === "string" -+ ? safeJsonParse(b.arguments as string) -+ : (b.arguments ?? b.input ?? {}), -+ }); -+ } -+ } -+ if (content.length > 0) return { role: "assistant", content }; -+ return { role: "assistant", content: text ?? "" }; -+ } -+ -+ const role = rawRole === "assistant" ? "assistant" : "user"; -+ return { role, content: normalizeMessageText(message) ?? "" }; -+} -+ -+function toResponsesInputItem(message: unknown): JsonRecord[] { -+ const record = asRecord(message); -+ const role = messageRole(message); -+ -+ // tool-result -> function_call_output item -+ if (role === "toolResult" || role === "tool") { -+ return [{ -+ type: "function_call_output", -+ call_id: typeof record.toolCallId === "string" ? record.toolCallId -+ : typeof record.tool_call_id === "string" ? record.tool_call_id -+ : "", -+ output: normalizeMessageText(record) ?? "", -+ }]; -+ } -+ -+ // assistant with tool calls -> message item + function_call items -+ if (role === "assistant" && Array.isArray(record.content)) { -+ const items: JsonRecord[] = []; -+ const text = normalizeMessageText(record); -+ if (text) { -+ items.push({ type: "message", role: "assistant", content: [{ type: "output_text", text }] }); -+ } -+ for (const block of record.content as unknown[]) { -+ const b = asRecord(block); -+ if (b.type === "toolCall" || b.type === "tool_call") { -+ items.push({ -+ type: "function_call", -+ call_id: typeof b.id === "string" ? b.id : "", -+ name: typeof b.name === "string" ? b.name : "", -+ arguments: -+ typeof b.arguments === "string" -+ ? b.arguments -+ : JSON.stringify(b.arguments ?? {}), -+ }); -+ } -+ } -+ if (items.length > 0) return items; -+ } -+ -+ return [{ role, content: normalizeMessageText(message) ?? "" }]; -+} -+ -+export function buildProviderRequestContent(params: { -+ codecName: Exclude; -+ model: ModelLike; -+ context: ContextLike; -+ options?: StreamOptionsLike; -+}): JsonRecord { -+ const messages = asArray(params.context.messages); -+ const systemMessages = messages.filter((message) => messageRole(message) === "system"); -+ const nonSystemMessages = messages.filter((message) => messageRole(message) !== "system"); -+ const tools = asArray(params.context.tools); -+ const systemPrompt = joinPromptSegments([ -+ params.context.systemPrompt, -+ ...systemMessageTexts(messages), -+ ]); -+ const toolChoice = params.options?.toolChoice; -+ -+ switch (params.codecName) { -+ case "openai_chat": { -+ const request: JsonRecord = { -+ model: params.model.id ?? "", -+ messages: [ -+ ...(systemPrompt ? [{ role: "system", content: systemPrompt }] : []), -+ ...messages.map((message) => toOpenAIChatMessage(message)), -+ ], -+ }; -+ if (tools.length > 0) { -+ request.tools = buildOpenAIChatTools(tools); -+ if (toolChoice !== undefined) { -+ request.tool_choice = toolChoice; -+ } -+ } -+ return request; -+ } -+ case "openai_responses": { -+ const request: JsonRecord = { -+ model: params.model.id ?? "", -+ ...(systemPrompt ? { instructions: systemPrompt } : {}), -+ input: nonSystemMessages.flatMap((message) => toResponsesInputItem(message)), -+ }; -+ if (tools.length > 0) { -+ request.tools = buildOpenAIResponsesTools(tools); -+ if (toolChoice !== undefined) { -+ request.tool_choice = toolChoice; -+ } -+ } -+ return request; -+ } -+ case "anthropic_messages": { -+ const request: JsonRecord = { -+ model: params.model.id ?? "", -+ ...(systemPrompt ? { system: systemPrompt } : {}), -+ messages: nonSystemMessages.map((message) => toAnthropicMessage(message)), -+ }; -+ if (tools.length > 0) { -+ request.tools = buildAnthropicTools(tools); -+ if (toolChoice !== undefined) { -+ request.tool_choice = -+ typeof toolChoice === "string" ? { type: toolChoice } : toolChoice; -+ } -+ } -+ return request; -+ } -+ case "none": -+ default: -+ return { -+ model: params.model.id ?? "", -+ messages: [ -+ ...(systemPrompt ? [{ role: "system", content: systemPrompt }] : []), -+ ...messages.map((message) => ({ -+ role: messageRole(message), -+ content: normalizeMessageText(message) ?? "", -+ })), -+ ], -+ }; -+ } -+} -+ -+function buildCodecRequestContent(params: { -+ codecName: Exclude; -+ model: ModelLike; -+ context: ContextLike; -+ options?: StreamOptionsLike; -+}): JsonRecord { -+ const request = buildProviderRequestContent(params); -+ if (params.codecName !== "openai_responses") { -+ return request; -+ } -+ const tools = asArray(params.context.tools); -+ if (tools.length === 0) { -+ return request; -+ } -+ return { -+ ...request, -+ tools: buildOpenAIChatTools(tools), -+ }; -+} -+ -+type AggregatedStreamOutput = { -+ text: string; -+ toolCalls: unknown[]; -+ stopReason?: string; -+ usage?: JsonRecord; -+}; -+ -+function pickUsageFromChunk(record: JsonRecord): JsonRecord | undefined { -+ // Streaming usage may appear in several shapes depending on where we -+ // intercept the stream: -+ // record.usage : raw SSE chunk from an OpenAI-compatible API -+ // (terminal chunk when stream_options.include_usage -+ // is true) -+ // record.partial.usage : pi-ai text_end event carrying the interim -+ // message object with its usage block -+ // record.message.usage : pi-ai message_end event (terminal message) -+ // record.response.usage : OpenAI Responses API envelope -+ // -+ // Only one of these carries the authoritative token counts for any given -+ // chunk; we search in order and take the first populated shape. -+ const raw = -+ record.usage ?? -+ (record.partial && asRecord(record.partial).usage) ?? -+ (record.message && asRecord(record.message).usage) ?? -+ (record.response && asRecord(record.response).usage); -+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined; -+ const u = raw as JsonRecord; -+ const num = (v: unknown): number | undefined => -+ typeof v === 'number' && Number.isFinite(v) ? v : undefined; -+ // Key aliases observed across providers/libraries: -+ // OpenAI Chat prompt_tokens / completion_tokens / total_tokens -+ // OpenAI Responses input_tokens / output_tokens / total_tokens -+ // Pi-ai normalized input / output / totalTokens -+ // The camelCase promptTokens/completionTokens/... variants are kept for -+ // defensive matching; no provider currently emits them but stripping -+ // would be a behavioral change we scope out of this fix. -+ const prompt = -+ num(u.prompt_tokens) ?? num(u.promptTokens) ?? -+ num(u.input_tokens) ?? num(u.inputTokens) ?? num(u.input); -+ const completion = -+ num(u.completion_tokens) ?? num(u.completionTokens) ?? -+ num(u.output_tokens) ?? num(u.outputTokens) ?? num(u.output); -+ const total = num(u.total_tokens) ?? num(u.totalTokens); -+ if (prompt === undefined && completion === undefined && total === undefined) return undefined; -+ const out: JsonRecord = {}; -+ if (prompt !== undefined) out.prompt_tokens = prompt; -+ if (completion !== undefined) out.completion_tokens = completion; -+ out.total_tokens = total !== undefined ? total : (prompt ?? 0) + (completion ?? 0); -+ return out; -+} -+ -+function normalizeToolCall(chunk: JsonRecord): unknown | null { -+ if (chunk.toolCall !== undefined) { -+ return chunk.toolCall; -+ } -+ if (chunk.tool_call !== undefined) { -+ return chunk.tool_call; -+ } -+ if (chunk.toolCalls !== undefined) { -+ return chunk.toolCalls; -+ } -+ if (chunk.tool_calls !== undefined) { -+ return chunk.tool_calls; -+ } -+ if (chunk.function_call !== undefined) { -+ return chunk.function_call; -+ } -+ if (chunk.functionCall !== undefined) { -+ return chunk.functionCall; -+ } -+ if ( -+ (chunk.type === "tool_call" || chunk.type === "tool-call" || chunk.type === "tool_use") && -+ (chunk.name !== undefined || chunk.id !== undefined) -+ ) { -+ return chunk; -+ } -+ return null; -+} -+ -+function textFromChunk(chunk: JsonRecord): string | null { -+ if (typeof chunk.text === "string") { -+ return chunk.text; -+ } -+ if (typeof chunk.delta === "string") { -+ return chunk.delta; -+ } -+ if (typeof chunk.content === "string") { -+ return chunk.content; -+ } -+ if (Array.isArray(chunk.content)) { -+ const text = normalizeContentText(chunk.content); -+ if (text) { -+ return text; -+ } -+ } -+ if (chunk.message) { -+ return normalizeMessageText(chunk.message); -+ } -+ return null; -+} -+ -+function aggregateStreamChunks(chunks: unknown[]): AggregatedStreamOutput { -+ if (process.env.NEMOFLOW_DEBUG_TOKENS === '1') { -+ process.stderr.write('[NEMOFLOW_DEBUG] aggregateStreamChunks chunks=' + chunks.length + '\n'); -+ for (const c of chunks.slice(-3)) { -+ try { process.stderr.write('[NEMOFLOW_DEBUG] chunk=' + JSON.stringify(c).slice(0, 600) + '\n'); } catch {} -+ } -+ } -+ const texts: string[] = []; -+ const toolCalls: unknown[] = []; -+ let stopReason: string | undefined; -+ let usage: JsonRecord | undefined; -+ -+ for (const chunk of chunks) { -+ const record = asRecord(chunk); -+ const text = textFromChunk(record); -+ if (text) { -+ texts.push(text); -+ } -+ const toolCall = normalizeToolCall(record); -+ if (toolCall !== null) { -+ if (Array.isArray(toolCall)) { -+ toolCalls.push(...toolCall); -+ } else { -+ toolCalls.push(toolCall); -+ } -+ } -+ const chunkStopReason = record.stopReason ?? record.stop_reason ?? record.finish_reason; -+ if (typeof chunkStopReason === "string" && chunkStopReason) { -+ stopReason = chunkStopReason; -+ } -+ const maybeUsage = pickUsageFromChunk(record); -+ if (maybeUsage) { -+ usage = maybeUsage; -+ } -+ } -+ -+ return { -+ text: texts.join(""), -+ toolCalls, -+ stopReason, -+ usage, -+ }; -+} -+ -+export function buildCodecFinalResponse(params: { -+ codecName: Exclude; -+ model: ModelLike; -+ chunks: unknown[]; -+}): JsonRecord { -+ const aggregated = aggregateStreamChunks(params.chunks); -+ const model = params.model.id ?? ""; -+ -+ switch (params.codecName) { -+ case "openai_chat": -+ return { -+ object: "chat.completion", -+ model, -+ choices: [ -+ { -+ index: 0, -+ finish_reason: aggregated.stopReason ?? "stop", -+ message: { -+ role: "assistant", -+ content: aggregated.text, -+ ...(aggregated.toolCalls.length > 0 ? { tool_calls: aggregated.toolCalls } : {}), -+ }, -+ }, -+ ], -+ ...(aggregated.usage ? { usage: aggregated.usage } : {}), -+ }; -+ case "openai_responses": { -+ const output: unknown[] = []; -+ if (aggregated.text) { -+ output.push({ -+ type: "message", -+ role: "assistant", -+ content: [ -+ { -+ type: "output_text", -+ text: aggregated.text, -+ }, -+ ], -+ }); -+ } -+ for (const toolCall of aggregated.toolCalls) { -+ output.push({ -+ type: "function_call", -+ ...asRecord(toolCall), -+ }); -+ } -+ return { -+ model, -+ status: "completed", -+ output, -+ ...(aggregated.usage ? { usage: aggregated.usage } : {}), -+ }; -+ } -+ case "anthropic_messages": { -+ const content: unknown[] = []; -+ if (aggregated.text) { -+ content.push({ type: "text", text: aggregated.text }); -+ } -+ for (const toolCall of aggregated.toolCalls) { -+ content.push({ -+ type: "tool_use", -+ ...asRecord(toolCall), -+ }); -+ } -+ return { -+ model, -+ role: "assistant", -+ type: "message", -+ content, -+ stop_reason: aggregated.stopReason ?? "end_turn", -+ ...(aggregated.usage ? { usage: aggregated.usage } : {}), -+ }; -+ } -+ case "none": -+ default: -+ return { -+ model, -+ text: aggregated.text, -+ toolCalls: aggregated.toolCalls, -+ stopReason: aggregated.stopReason ?? "stop", -+ }; -+ } -+} -+ -+function mergeRecord(target: JsonRecord, patch: JsonRecord): void { -+ for (const [key, value] of Object.entries(patch)) { -+ if ( -+ value && -+ typeof value === "object" && -+ !Array.isArray(value) && -+ target[key] && -+ typeof target[key] === "object" && -+ !Array.isArray(target[key]) -+ ) { -+ mergeRecord(target[key] as JsonRecord, value as JsonRecord); -+ continue; -+ } -+ target[key] = value; -+ } -+} -+ -+/** -+ * Ensures a streaming OpenAI Chat Completions request body carries -+ * `stream_options.include_usage: true` so the provider emits a terminal -+ * SSE chunk with token counts. -+ * -+ * Rationale: pi-ai only sets `stream_options` when the model's compat -+ * declares `supportsUsageInStreaming`. For providers like NVIDIA Inference -+ * Hub / NIM / vLLM (proxies to the OpenAI Chat API), OpenClaw's detector -+ * defaults this to `false`, so no `stream_options` is ever sent and the -+ * provider never emits its terminal usage chunk. Without this fix every -+ * OpenInference/Phoenix LLM span shows zero tokens. -+ * -+ * Scope: Only mutates payloads that look like OpenAI Chat Completions -+ * requests (shape check: `messages` is an array, `stream === true`). -+ * Anthropic Messages bodies never reach this hook (pi-ai's Anthropic -+ * provider does not invoke `onPayload`). OpenAI Responses bodies are -+ * skipped because they use `input` instead of `messages`. -+ * -+ * Respects caller intent: if `stream_options` is already present (even -+ * a deliberate `{ include_usage: false }` opt-out), it is left alone. -+ * -+ * Exported for direct unit testing; also called from -+ * `applyAnnotatedRequestToOptions`'s `onPayload` wrapper. -+ */ -+export function ensureChatStreamUsageInclude(payload: unknown): void { -+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) { -+ return; -+ } -+ const p = payload as JsonRecord; -+ if ( -+ Array.isArray(p.messages) && -+ p.stream === true && -+ p.stream_options === undefined -+ ) { -+ p.stream_options = { include_usage: true }; -+ } -+} -+ -+function applyAnnotatedRequestToOptions(params: { -+ request: unknown; -+ payloadContent?: JsonRecord; -+ mergePayload?: boolean; -+ options: StreamOptionsLike | undefined; -+ model: ModelLike; -+}): StreamOptionsLike { -+ const request = asRecord(params.request); -+ const requestHeaders = asRecord(request.headers); -+ const requestContent = params.payloadContent ?? asRecord(request.content); -+ const originalOnPayload = params.options?.onPayload; -+ -+ return { -+ ...params.options, -+ headers: { -+ ...params.options?.headers, -+ ...Object.fromEntries( -+ Object.entries(requestHeaders).filter( -+ (entry): entry is [string, string] => typeof entry[1] === "string", -+ ), -+ ), -+ }, -+ onPayload: (payload, modelArg) => { -+ if ( -+ params.mergePayload !== false && -+ payload && -+ typeof payload === "object" && -+ !Array.isArray(payload) -+ ) { -+ // Exclude messages/input from the merge: buildProviderRequestContent -+ // produces a text-only snapshot for telemetry that strips tool_calls -+ // and tool_call_id. Merging it into the real payload would overwrite -+ // the full conversation history that OpenClaw already built correctly. -+ const { messages, input, ...rest } = requestContent; -+ mergeRecord(payload as JsonRecord, rest); -+ } -+ ensureChatStreamUsageInclude(payload); -+ return originalOnPayload?.(payload, modelArg ?? params.model); -+ }, -+ }; -+} -+ -+function codecFromName( -+ modules: NemoFlowModules, -+ codecName: Exclude, -+): NemoFlowCodec | null { -+ switch (codecName) { -+ case "openai_chat": -+ return new modules.bindings.OpenAIChatCodec(); -+ case "openai_responses": -+ return new modules.bindings.OpenAIResponsesCodec(); -+ case "anthropic_messages": -+ return new modules.bindings.AnthropicMessagesCodec(); -+ case "none": -+ default: -+ return null; -+ } -+} -+ -+function defaultHostedConfig(pluginHost: NemoFlowPluginHost): Record { -+ try { -+ return pluginHost.defaultConfig(); -+ } catch { -+ return { version: 1, components: [] }; -+ } -+} -+ -+async function loadModules(): Promise { -+ try { -+ const [bindingsModule, pluginHostModule] = await Promise.all([ -+ import("nemo-flow-node"), -+ import("nemo-flow-node/plugin"), -+ ]); -+ return { -+ bindings: bindingsModule as unknown as NemoFlowBindings, -+ pluginHost: pluginHostModule as unknown as NemoFlowPluginHost, -+ }; -+ } catch (error) { -+ state.unavailableReason = String(error); -+ return null; -+ } -+} -+ -+async function ensureModules(logger: Logger): Promise { -+ if (state.modules) { -+ return state.modules; -+ } -+ if (!state.loadPromise) { -+ state.loadPromise = loadModules(); -+ } -+ const modules = await state.loadPromise; -+ if (modules) { -+ state.modules = modules; -+ return modules; -+ } -+ if (!state.unavailableLogged) { -+ logger.warn( -+ `nemo-flow unavailable; execution wrapping disabled (${state.unavailableReason ?? "unknown error"})`, -+ ); -+ state.unavailableLogged = true; -+ } -+ return null; -+} -+ -+function logPluginDiagnostics( -+ logger: Logger, -+ diagnostics: Array<{ level?: string; code?: string; field?: string; message?: string }> = [], -+): boolean { -+ let hasErrors = false; -+ for (const diagnostic of diagnostics) { -+ const summary = [diagnostic.code, diagnostic.field, diagnostic.message].filter(Boolean).join(" "); -+ if (diagnostic.level === "error") { -+ hasErrors = true; -+ logger.warn(`nemo-flow host config error: ${summary}`); -+ continue; -+ } -+ logger.info(`nemo-flow host config warning: ${summary}`); ++export async function shutdownNemoFlowGateway(params: { logger: Logger }): Promise { ++ try { ++ state.modules?.pluginHost.clear(); ++ } catch (error) { ++ params.logger.warn(`nemo-flow shutdown failed (${String(error)})`); + } -+ return hasErrors; -+} -+ -+function stopTelemetry(): void { -+ for (const entry of state.telemetrySubscribers.splice(0)) { -+ try { -+ entry.subscriber.deregister(entry.name); -+ } catch { -+ // ignore -+ } -+ try { -+ entry.subscriber.forceFlush?.(); -+ } catch { -+ // ignore -+ } ++ for (const rootHandle of state.sessionRootScopes.values()) { + try { -+ entry.subscriber.shutdown?.(); ++ state.modules?.bindings.popScope(rootHandle); + } catch { -+ // ignore ++ // ignore cleanup errors + } + } -+} -+ -+function registerTelemetry( -+ modules: NemoFlowModules, -+ config: NemoFlowPluginConfig, -+): void { -+ stopTelemetry(); -+ -+ if (config.telemetry.otel.enabled) { -+ const subscriber = new modules.bindings.OpenTelemetrySubscriber(config.telemetry.otel); -+ const name = "openclaw.nemo-flow.otel"; -+ subscriber.register(name); -+ state.telemetrySubscribers.push({ name, subscriber }); -+ } -+ -+ if (config.telemetry.openInference.enabled) { -+ const subscriber = new modules.bindings.OpenInferenceSubscriber(config.telemetry.openInference); -+ const name = "openclaw.nemo-flow.openinference"; -+ subscriber.register(name); -+ state.telemetrySubscribers.push({ name, subscriber }); -+ } ++ state.sessionRootScopes.clear(); ++ state.sessionScopes.clear(); ++ state.initialized = false; ++ state.activeConfig = undefined; ++ state.initPromise = undefined; +} + +async function ensureInitialized( + logger: Logger, + config: NemoFlowPluginConfig, +): Promise { -+ const modules = await ensureModules(logger); -+ if (!modules) { -+ return null; -+ } -+ if (state.initialized) { -+ return modules; -+ } -+ if (!state.initPromise) { -+ state.initPromise = (async () => { -+ const hostConfig = -+ Object.keys(config.nemoFlow.hostConfig).length > 0 -+ ? config.nemoFlow.hostConfig -+ : defaultHostedConfig(modules.pluginHost); -+ const report = modules.pluginHost.validate(hostConfig); -+ if (logPluginDiagnostics(logger, report?.diagnostics)) { -+ return false; -+ } -+ try { -+ await modules.pluginHost.initialize(hostConfig); -+ registerTelemetry(modules, config); -+ state.initialized = true; -+ return true; -+ } catch (error) { -+ logger.warn(`nemo-flow initialization failed; wrapping disabled (${String(error)})`); -+ return false; -+ } -+ })(); -+ } -+ const initialized = await state.initPromise; -+ return initialized ? modules : null; ++ const initialized = await initializeNemoFlowGateway({ logger, config }); ++ return initialized ? (state.modules ?? null) : null; +} + +function sessionScopeKey(sessionId?: string, sessionKey?: string): string { @@ -2641,165 +752,66 @@ new file mode 100644 + return stack; +} + -+let exitHandlerRegistered = false; -+ -+function registerExitHandler(): void { -+ if (exitHandlerRegistered) { -+ return; -+ } -+ exitHandlerRegistered = true; -+ process.on("beforeExit", () => { -+ for (const [key, rootHandle] of state.sessionRootScopes) { -+ if (state.modules) { -+ popScope(state.modules, rootHandle); -+ } -+ state.sessionRootScopes.delete(key); -+ } -+ stopTelemetry(); -+ }); -+} -+ +function ensureSessionRootScope( + modules: NemoFlowModules, + stack: NemoFlowScopeStack, + sessionId?: string, + sessionKey?: string, -+): void { ++) { + const key = sessionScopeKey(sessionId, sessionKey); -+ if (!state.sessionRootScopes.has(key)) { ++ let rootHandle = state.sessionRootScopes.get(key); ++ if (!rootHandle) { + modules.bindings.setThreadScopeStack(stack); -+ const rootHandle = pushAgentScope(modules, sessionId ?? "__openclaw__", { -+ sessionId: sessionId ?? "__openclaw__", -+ ...buildBenchmarkSpanMetadata(sessionId), -+ }); ++ rootHandle = modules.bindings.pushScope("openclaw.agent", modules.bindings.ScopeType.Agent); + state.sessionRootScopes.set(key, rootHandle); -+ registerExitHandler(); + } ++ return rootHandle; +} + -+function pushAgentScope( -+ modules: NemoFlowModules, -+ name: string, -+ data?: Record, -+): NemoFlowScopeHandle { -+ return modules.bindings.pushScope( -+ name, -+ modules.bindings.ScopeType.Agent, -+ null, -+ null, -+ data ?? null, -+ null, -+ ); -+} -+ -+function popScope(modules: NemoFlowModules, handle: NemoFlowScopeHandle | null): void { -+ if (!handle) { -+ return; -+ } -+ try { -+ modules.bindings.popScope(handle); -+ } catch { -+ // ignore -+ } -+} -+ -+export async function initializeNemoFlowGateway(params: { -+ logger: Logger; -+ config: NemoFlowPluginConfig; -+}): Promise { -+ if (!params.config.enabled) { -+ return; -+ } -+ await ensureInitialized(params.logger, params.config); ++function withSessionScope(modules: NemoFlowModules, sessionId?: string, sessionKey?: string): void { ++ const stack = ensureSessionScope(modules, sessionId, sessionKey); ++ ensureSessionRootScope(modules, stack, sessionId, sessionKey); ++ modules.bindings.setThreadScopeStack(stack); +} + -+export async function shutdownNemoFlowGateway(params: { -+ logger: Logger; -+}): Promise { -+ void params.logger; -+ stopTelemetry(); -+ for (const entry of state.sessionExporters.values()) { -+ try { -+ entry.exporter.deregister(entry.registrationName); -+ } catch { -+ // ignore -+ } -+ } -+ state.sessionExporters.clear(); -+ state.sessionScopes.clear(); -+ if (state.modules && state.initialized) { -+ try { -+ state.modules.pluginHost.clear(); -+ } catch { -+ // ignore -+ } -+ } -+ state.initialized = false; -+ state.initPromise = undefined; ++function buildLlmRequest(params: { ++ provider: string; ++ modelId: string; ++ model: unknown; ++ context: unknown; ++ options: unknown; ++}) { ++ const options = asRecord(params.options); ++ const headers = normalizeJsonObject(options.headers); ++ return { ++ headers, ++ content: { ++ provider: params.provider, ++ model: params.modelId, ++ modelInfo: normalizeJsonObject(params.model), ++ context: params.context ?? null, ++ options, ++ }, ++ }; +} + -+export async function startNemoFlowSession(params: { -+ logger: Logger; -+ config: NemoFlowPluginConfig; -+ sessionId: string; -+ sessionKey?: string; -+}): Promise { -+ if (!params.config.enabled) { -+ return; -+ } -+ const modules = await ensureInitialized(params.logger, params.config); -+ if (!modules) { -+ return; -+ } -+ ensureSessionScope(modules, params.sessionId, params.sessionKey); -+ if (!params.config.atif.enabled || state.sessionExporters.has(params.sessionId)) { -+ return; -+ } -+ const exporter = new modules.bindings.AtifExporter( -+ params.sessionId, -+ params.config.atif.agentName, -+ params.config.atif.agentVersion, -+ null, -+ ); -+ const registrationName = `openclaw.nemo-flow.atif.${params.sessionId}`; -+ exporter.register(registrationName); -+ state.sessionExporters.set(params.sessionId, { -+ exporter, -+ registrationName, -+ }); ++function applyRequestToStreamCall(params: { ++ request: unknown; ++ context: unknown; ++ options: unknown; ++}): { context: unknown; options: unknown } { ++ const request = asRecord(params.request); ++ const content = asRecord(request.content); ++ return { ++ context: content.context ?? params.context, ++ options: content.options ?? params.options, ++ }; +} + -+export async function endNemoFlowSession(params: { -+ logger: Logger; -+ config: NemoFlowPluginConfig; -+ sessionId: string; -+ sessionKey?: string; -+}): Promise { -+ const exporterState = state.sessionExporters.get(params.sessionId); -+ if (exporterState && params.config.atif.enabled) { -+ try { -+ await fs.mkdir(params.config.atif.outputDir, { recursive: true }); -+ const targetPath = path.join(params.config.atif.outputDir, `${params.sessionId}.json`); -+ await fs.writeFile(targetPath, exporterState.exporter.exportJson(), "utf8"); -+ params.logger.info(`nemo-flow exported ATIF to ${targetPath}`); -+ } catch (error) { -+ params.logger.warn(`nemo-flow ATIF export failed (${String(error)})`); -+ } -+ try { -+ exporterState.exporter.deregister(exporterState.registrationName); -+ } catch { -+ // ignore -+ } -+ exporterState.exporter.clear(); -+ state.sessionExporters.delete(params.sessionId); -+ } -+ const key = sessionScopeKey(params.sessionId, params.sessionKey); -+ const rootHandle = state.sessionRootScopes.get(key); -+ if (rootHandle && state.modules) { -+ popScope(state.modules, rootHandle); -+ state.sessionRootScopes.delete(key); -+ } -+ state.sessionScopes.delete(key); ++function buildFinalStreamResponse(chunks: unknown[]): unknown { ++ return { ++ chunks, ++ }; +} + +export async function executeToolWithNemoFlow(params: { @@ -2813,17 +825,12 @@ new file mode 100644 + agentId?: string; + execute: (args: unknown) => Promise; +}): Promise { -+ if (!params.config.enabled || !params.config.wrapping.tools) { -+ return await params.execute(params.args); -+ } + const modules = await ensureInitialized(params.logger, params.config); + if (!modules) { + return await params.execute(params.args); + } + -+ const stack = ensureSessionScope(modules, params.sessionId, params.sessionKey); -+ ensureSessionRootScope(modules, stack, params.sessionId, params.sessionKey); -+ modules.bindings.setThreadScopeStack(stack); ++ withSessionScope(modules, params.sessionId, params.sessionKey); + + return await modules.bindings.toolCallExecuteAsync( + params.toolName, @@ -2832,11 +839,16 @@ new file mode 100644 + null, + TOOL_ATTR_LOCAL, + null, -+ buildBenchmarkSpanMetadata(params.sessionId), ++ { ++ ...(params.runId && { runId: params.runId }), ++ ...(params.agentId && { agentId: params.agentId }), ++ ...(params.sessionId && { sessionId: params.sessionId }), ++ ...(params.sessionKey && { sessionKey: params.sessionKey }), ++ }, + ); +} + -+export async function wrapStreamFnWithNemoFlow(params: { ++export function wrapStreamFnWithNemoFlow(params: { + logger: Logger; + config: NemoFlowPluginConfig; + provider: string; @@ -2846,375 +858,631 @@ new file mode 100644 + sessionId?: string; + sessionKey?: string; + streamFn: StreamFn; -+}): Promise { -+ if (!params.config.enabled || !params.config.wrapping.llm) { -+ return params.streamFn; -+ } -+ const modules = await ensureInitialized(params.logger, params.config); -+ if (!modules) { -+ return params.streamFn; -+ } -+ -+ const wrapped: StreamFn = (model, context, options) => { -+ const initialContent = buildProviderRequestContent({ -+ codecName: "none", -+ model: model as ModelLike, -+ context: context as ContextLike, -+ options, -+ }); -+ const codecName = detectCodecName({ -+ provider: params.provider, -+ modelId: params.modelId, -+ model: model as ModelLike, -+ requestContent: initialContent, -+ config: params.config, -+ }); -+ const codec = codecFromName(modules, codecName); -+ const providerRequest = buildProviderRequestContent({ -+ codecName, -+ model: model as ModelLike, -+ context: context as ContextLike, -+ options, -+ }); -+ const codecRequest = buildCodecRequestContent({ -+ codecName, -+ model: model as ModelLike, -+ context: context as ContextLike, -+ options, -+ }); -+ const request = { -+ headers: options?.headers ?? {}, -+ content: codecRequest, -+ }; -+ const metadata = buildLlmSpanMetadata({ -+ provider: params.provider, -+ codecName, -+ model: model as ModelLike, -+ context: context as ContextLike, -+ options, -+ providerRequest, -+ sessionId: params.sessionId, -+ }); -+ const stack = ensureSessionScope(modules, params.sessionId, params.sessionKey); -+ ensureSessionRootScope(modules, stack, params.sessionId, params.sessionKey); -+ modules.bindings.setThreadScopeStack(stack); ++}): StreamFn { ++ const wrapped: StreamFn = (( ++ model: Parameters[0], ++ context: Parameters[1], ++ options: Parameters[2], ++ ) => { ++ const stream = (async () => { ++ const modules = await ensureInitialized(params.logger, params.config); ++ if (!modules) { ++ return params.streamFn(model, context, options) as unknown as StreamLike; ++ } + -+ let underlyingStreamPromise: Promise | null = null; -+ const collectedChunks: unknown[] = []; -+ let iterated = false; -+ let completed = false; -+ let completePromiseResolve: (() => void) | null = null; -+ let completePromiseReject: ((error: unknown) => void) | null = null; -+ const completePromise = new Promise((resolve, reject) => { -+ completePromiseResolve = resolve; -+ completePromiseReject = reject; -+ }); ++ withSessionScope(modules, params.sessionId, params.sessionKey); + -+ const llmStreamPromise = modules.bindings.llmStreamCallExecute( -+ params.provider, -+ request, -+ (wrapper: Record) => { -+ const streamId = wrapper.__nemo_flow_stream_id as number; -+ const annotatedRequest = wrapper.__nemo_flow_native; -+ const effectiveOptions = applyAnnotatedRequestToOptions({ -+ request: annotatedRequest, -+ payloadContent: providerRequest, -+ mergePayload: codecName !== "openai_responses", -+ options: options as StreamOptionsLike | undefined, -+ model: model as ModelLike, -+ }); -+ const streamResult = params.streamFn( -+ model, -+ context, -+ effectiveOptions, -+ ) as unknown as StreamLike | Promise; -+ underlyingStreamPromise = Promise.resolve(streamResult); -+ -+ underlyingStreamPromise -+ .then(async (stream) => { -+ try { -+ for await (const chunk of stream as AsyncIterable) { -+ const chunkJson = -+ chunk != null && typeof chunk === "object" ? chunk : { value: chunk }; -+ modules.bindings.pushStreamChunk(streamId, chunkJson); ++ const request = buildLlmRequest({ ++ provider: params.provider, ++ modelId: params.modelId, ++ model, ++ context, ++ options, ++ }); ++ let underlyingStreamPromise: Promise | null = null; ++ const collectedChunks: unknown[] = []; ++ ++ const llmStreamPromise = modules.bindings.llmStreamCallExecute( ++ params.provider, ++ request, ++ (rawWrapper: unknown) => { ++ const wrapper = asRecord(rawWrapper); ++ const streamId = wrapper.__nemo_flow_stream_id as number; ++ const effective = applyRequestToStreamCall({ ++ request: wrapper.__nemo_flow_native ?? request, ++ context, ++ options, ++ }); ++ underlyingStreamPromise = Promise.resolve( ++ params.streamFn( ++ model, ++ effective.context as Parameters[1], ++ effective.options as Parameters[2], ++ ) as unknown as StreamLike, ++ ); ++ ++ underlyingStreamPromise ++ .then(async (source) => { ++ try { ++ for await (const chunk of source as AsyncIterable) { ++ const chunkJson = ++ chunk != null && typeof chunk === "object" ? chunk : { value: chunk }; ++ modules.bindings.pushStreamChunk(streamId, chunkJson); ++ } ++ } finally { ++ modules.bindings.endStream(streamId); + } -+ } finally { ++ }) ++ .catch(() => { + modules.bindings.endStream(streamId); -+ } -+ }) -+ .catch(() => { -+ modules.bindings.endStream(streamId); -+ }); -+ -+ return null; -+ }, -+ (chunk) => { -+ collectedChunks.push(chunk); -+ return null; -+ }, -+ () => -+ buildCodecFinalResponse({ -+ codecName, -+ model: model as ModelLike, -+ chunks: collectedChunks, -+ }), -+ null, -+ LLM_ATTR_STREAMING, -+ null, -+ metadata, -+ params.modelId, -+ codec ? codec.decode.bind(codec) : null, -+ codec -+ ? (bundled: Record) => -+ codec.encode(bundled.annotated, bundled.original) -+ : null, -+ codec?.decodeResponse ? codec.decodeResponse.bind(codec) : null, -+ ); ++ }); + -+ const ensureConsumed = async () => { -+ if (completed) { -+ return; -+ } -+ const llmStream = await llmStreamPromise; -+ try { -+ while ((await llmStream.next()) !== null) { -+ // discard -+ } -+ completed = true; -+ completePromiseResolve?.(); -+ } catch (error) { -+ completed = true; -+ completePromiseReject?.(error); -+ throw error; -+ } -+ }; ++ return null; ++ }, ++ (chunk) => { ++ collectedChunks.push(chunk); ++ return null; ++ }, ++ () => buildFinalStreamResponse(collectedChunks), ++ null, ++ LLM_ATTR_STREAMING, ++ null, ++ { ++ ...(params.runId && { runId: params.runId }), ++ ...(params.agentId && { agentId: params.agentId }), ++ ...(params.sessionId && { sessionId: params.sessionId }), ++ ...(params.sessionKey && { sessionKey: params.sessionKey }), ++ }, ++ params.modelId, ++ ); + -+ return { -+ async *[Symbol.asyncIterator]() { ++ let iterated = false; ++ let completed = false; ++ const consume = async function* () { + if (iterated) { + throw new Error("nemo-flow wrapped stream already consumed"); + } + iterated = true; + const llmStream = await llmStreamPromise; -+ try { -+ while (true) { -+ const chunk = await llmStream.next(); -+ if (chunk === null) { -+ break; -+ } -+ yield chunk; ++ while (true) { ++ const chunk = await llmStream.next(); ++ if (chunk === null) { ++ break; + } -+ completed = true; -+ completePromiseResolve?.(); -+ } catch (error) { -+ completed = true; -+ completePromiseReject?.(error); -+ throw error; ++ yield chunk; + } ++ completed = true; ++ }; ++ ++ return { ++ async *[Symbol.asyncIterator]() { ++ yield* consume(); ++ }, ++ result: async () => { ++ if (!completed) { ++ for await (const chunk of consume()) { ++ void chunk; ++ // drain stream so NeMo Flow finalizers run before result() resolves ++ } ++ } ++ const underlying = await underlyingStreamPromise; ++ return await underlying?.result?.(); ++ }, ++ } as StreamLike; ++ })(); ++ ++ return { ++ async *[Symbol.asyncIterator]() { ++ const resolved = await stream; ++ yield* resolved; + }, -+ result: async () => { -+ await ensureConsumed(); -+ await completePromise; -+ const underlyingStream = await underlyingStreamPromise; -+ return await underlyingStream?.result?.(); -+ }, -+ } as StreamLike; -+ }; ++ result: async () => await (await stream).result?.(), ++ } as unknown as ReturnType; ++ }) as StreamFn; + + return wrapped; +} -diff --git a/src/plugins/agent-runtime-middleware.test.ts b/src/plugins/agent-runtime-middleware.test.ts +diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml +index 48b6819d..c03718ab 100644 +--- a/pnpm-lock.yaml ++++ b/pnpm-lock.yaml +@@ -997,6 +997,16 @@ importers: + specifier: workspace:* + version: link:../../packages/plugin-sdk + ++ extensions/nemo-flow: ++ optionalDependencies: ++ nemo-flow-node: ++ specifier: file:../../../../crates/node ++ version: file:../../crates/node ++ devDependencies: ++ openclaw: ++ specifier: workspace:* ++ version: link:../.. ++ + extensions/memory-wiki: + dependencies: + typebox: +@@ -6433,6 +6443,10 @@ packages: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + ++ nemo-flow-node@file:../../crates/node: ++ resolution: {directory: ../../crates/node, type: directory} ++ engines: {node: '>=20.0.0'} ++ + netmask@2.1.1: + resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} + engines: {node: '>= 0.4.0'} +@@ -13446,6 +13460,9 @@ snapshots: + + negotiator@1.0.0: {} + ++ nemo-flow-node@file:../../crates/node: ++ optional: true ++ + netmask@2.1.1: {} + + node-addon-api@8.7.0: {} +diff --git a/src/agents/pi-embedded-runner/run/attempt.ts b/src/agents/pi-embedded-runner/run/attempt.ts +index bc741295..a022eae4 100644 +--- a/src/agents/pi-embedded-runner/run/attempt.ts ++++ b/src/agents/pi-embedded-runner/run/attempt.ts +@@ -26,6 +26,7 @@ import { formatErrorMessage } from "../../../infra/errors.js"; + import { resolveHeartbeatSummaryForAgent } from "../../../infra/heartbeat-summary.js"; + import { getMachineDisplayName } from "../../../infra/machine-name.js"; + import { MAX_IMAGE_BYTES } from "../../../media/constants.js"; ++import { wrapStreamFnWithAgentStreamingLlmMiddlewares } from "../../../plugins/agent-streaming-llm-middleware.js"; + import { listRegisteredPluginAgentPromptGuidance } from "../../../plugins/command-registry-state.js"; + import { getCurrentPluginMetadataSnapshot } from "../../../plugins/current-plugin-metadata-snapshot.js"; + import { buildAgentHookContextChannelFields } from "../../../plugins/hook-agent-context.js"; +@@ -2436,6 +2437,16 @@ export async function runEmbeddedAttempt( + (error) => idleTimeoutTrigger?.(error), + ); + } ++ activeSession.agent.streamFn = wrapStreamFnWithAgentStreamingLlmMiddlewares({ ++ provider: params.provider, ++ modelId: params.modelId, ++ model: params.model, ++ agentId: sessionAgentId, ++ ...(params.sessionKey && { sessionKey: params.sessionKey }), ++ ...(params.sessionId && { sessionId: params.sessionId }), ++ runId: params.runId, ++ streamFn: activeSession.agent.streamFn, ++ }); + let diagnosticModelCallSeq = 0; + activeSession.agent.streamFn = wrapStreamFnWithDiagnosticModelCallEvents( + activeSession.agent.streamFn, +diff --git a/src/agents/pi-tools.before-tool-call.ts b/src/agents/pi-tools.before-tool-call.ts +index 399e603e..f877821f 100644 +--- a/src/agents/pi-tools.before-tool-call.ts ++++ b/src/agents/pi-tools.before-tool-call.ts +@@ -15,6 +15,7 @@ import { + } from "../infra/diagnostic-trace-context.js"; + import type { SessionState } from "../logging/diagnostic-session-state.js"; + import { createSubsystemLogger } from "../logging/subsystem.js"; ++import { executeToolWithAgentToolCallMiddlewares } from "../plugins/agent-tool-call-middleware.js"; + import { getGlobalHookRunner } from "../plugins/hook-runner-global.js"; + import { deriveToolParams } from "../plugins/host-tool-param-parsers.js"; + import { copyPluginToolMeta } from "../plugins/tools.js"; +@@ -743,7 +744,16 @@ export function wrapToolWithBeforeToolCallHook( + }); + const startedAt = Date.now(); + try { +- const result = await execute(toolCallId, outcome.params, signal, onUpdate); ++ const result = await executeToolWithAgentToolCallMiddlewares({ ++ agentId: ctx?.agentId, ++ ...(ctx?.sessionKey && { sessionKey: ctx.sessionKey }), ++ ...(ctx?.sessionId && { sessionId: ctx.sessionId }), ++ ...(ctx?.runId && { runId: ctx.runId }), ++ toolName: normalizedToolName, ++ ...(toolCallId && { toolCallId }), ++ params: outcome.params, ++ execute: async (nextParams) => await execute(toolCallId, nextParams, signal, onUpdate), ++ }); + const durationMs = Date.now() - startedAt; + await recordLoopOutcome({ + ctx, +diff --git a/src/gateway/test-helpers.plugin-registry.ts b/src/gateway/test-helpers.plugin-registry.ts +index a6cc60e5..9a80028b 100644 +--- a/src/gateway/test-helpers.plugin-registry.ts ++++ b/src/gateway/test-helpers.plugin-registry.ts +@@ -25,6 +25,8 @@ function createStubPluginRegistry(): PluginRegistry { + webSearchProviders: [], + migrationProviders: [], + codexAppServerExtensionFactories: [], ++ agentStreamingLlmMiddlewares: [], ++ agentToolCallMiddlewares: [], + agentToolResultMiddlewares: [], + memoryEmbeddingProviders: [], + textTransforms: [], +diff --git a/src/plugin-sdk/core.ts b/src/plugin-sdk/core.ts +index 9e09bd8e..26da458a 100644 +--- a/src/plugin-sdk/core.ts ++++ b/src/plugin-sdk/core.ts +@@ -39,6 +39,14 @@ import { + export type { + AgentHarness, + AnyAgentTool, ++ AgentStreamingLlmMiddleware, ++ AgentStreamingLlmMiddlewareContext, ++ AgentStreamingLlmMiddlewareOptions, ++ AgentStreamingLlmMiddlewareRuntime, ++ AgentToolCallMiddleware, ++ AgentToolCallMiddlewareContext, ++ AgentToolCallMiddlewareOptions, ++ AgentToolCallMiddlewareRuntime, + MediaUnderstandingProviderPlugin, + OpenClawPluginApi, + OpenClawPluginCommandDefinition, +diff --git a/src/plugin-sdk/plugin-entry.ts b/src/plugin-sdk/plugin-entry.ts +index c5f01102..fea09e4b 100644 +--- a/src/plugin-sdk/plugin-entry.ts ++++ b/src/plugin-sdk/plugin-entry.ts +@@ -2,7 +2,15 @@ import type { OpenClawConfig } from "../config/types.openclaw.js"; + import { emptyPluginConfigSchema } from "../plugins/config-schema.js"; + import type { + AnyAgentTool, ++ AgentStreamingLlmMiddleware, ++ AgentStreamingLlmMiddlewareContext, ++ AgentStreamingLlmMiddlewareOptions, ++ AgentStreamingLlmMiddlewareRuntime, + AgentHarness, ++ AgentToolCallMiddleware, ++ AgentToolCallMiddlewareContext, ++ AgentToolCallMiddlewareOptions, ++ AgentToolCallMiddlewareRuntime, + MediaUnderstandingProviderPlugin, + MigrationApplyResult, + MigrationDetection, +@@ -119,7 +127,15 @@ import { createCachedLazyValueGetter } from "./lazy-value.js"; + + export type { + AnyAgentTool, ++ AgentStreamingLlmMiddleware, ++ AgentStreamingLlmMiddlewareContext, ++ AgentStreamingLlmMiddlewareOptions, ++ AgentStreamingLlmMiddlewareRuntime, + AgentHarness, ++ AgentToolCallMiddleware, ++ AgentToolCallMiddlewareContext, ++ AgentToolCallMiddlewareOptions, ++ AgentToolCallMiddlewareRuntime, + MediaUnderstandingProviderPlugin, + MigrationApplyResult, + MigrationDetection, +diff --git a/src/plugin-sdk/plugin-test-api.ts b/src/plugin-sdk/plugin-test-api.ts +index a0f560cd..dcb14113 100644 +--- a/src/plugin-sdk/plugin-test-api.ts ++++ b/src/plugin-sdk/plugin-test-api.ts +@@ -54,6 +54,8 @@ export function createTestPluginApi(api: TestPluginApiInput = {}): OpenClawPlugi + registerAgentHarness() {}, + registerCodexAppServerExtensionFactory() {}, + registerAgentToolResultMiddleware() {}, ++ registerAgentStreamingLlmMiddleware() {}, ++ registerAgentToolCallMiddleware() {}, + registerDetachedTaskRuntime() {}, + registerSessionExtension() {}, + enqueueNextTurnInjection: async (injection) => ({ +diff --git a/src/plugins/agent-execution-middleware.test.ts b/src/plugins/agent-execution-middleware.test.ts new file mode 100644 -index 0000000000..35ed731909 +index 00000000..811efec3 --- /dev/null -+++ b/src/plugins/agent-runtime-middleware.test.ts -@@ -0,0 +1,140 @@ -+import { afterEach, describe, expect, it } from "vitest"; ++++ b/src/plugins/agent-execution-middleware.test.ts +@@ -0,0 +1,186 @@ ++import type { StreamFn } from "@earendil-works/pi-agent-core"; ++import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; ++import { wrapStreamFnWithAgentStreamingLlmMiddlewares } from "./agent-streaming-llm-middleware.js"; ++import { executeToolWithAgentToolCallMiddlewares } from "./agent-tool-call-middleware.js"; +import { initializeGlobalHookRunner, resetGlobalHookRunner } from "./hook-runner-global.js"; -+import { -+ executeToolWithAgentRuntimeMiddlewares, -+ wrapStreamFnWithAgentRuntimeMiddlewares, -+} from "./agent-runtime-middleware.js"; -+import { createEmptyPluginRegistry } from "./registry.js"; ++import { createEmptyPluginRegistry } from "./registry-empty.js"; + -+afterEach(() => { -+ resetGlobalHookRunner(); -+}); ++describe("agent execution middleware", () => { ++ beforeEach(() => { ++ resetGlobalHookRunner(); ++ }); ++ ++ afterEach(() => { ++ resetGlobalHookRunner(); ++ }); + -+describe("agent-runtime-middleware", () => { -+ it("applies higher priority tool middleware outermost", async () => { -+ const calls: string[] = []; ++ it("wraps streaming LLM execution in priority order", async () => { + const registry = createEmptyPluginRegistry(); -+ registry.agentRuntimeMiddlewares.push( ++ const seenContexts: unknown[] = []; ++ const baseStreamFn: StreamFn = ((_model, context) => { ++ seenContexts.push(context); ++ return { ++ async *[Symbol.asyncIterator]() { ++ yield { type: "text", text: "ok" }; ++ }, ++ }; ++ }) as StreamFn; ++ ++ registry.agentStreamingLlmMiddlewares.push( + { + pluginId: "low", -+ middleware: { -+ id: "low", -+ priority: 10, -+ wrapToolExecute: async (ctx) => { -+ calls.push("low:before"); -+ const result = await ctx.execute(ctx.params); -+ calls.push("low:after"); -+ return result; -+ }, -+ }, ++ pluginName: "Low", ++ rawHandler: (ctx) => ctx.streamFn, ++ handler: (ctx) => ++ ((model, context, options) => ++ ctx.streamFn( ++ model, ++ { ++ ...(context as object), ++ order: [...((context as { order?: string[] }).order ?? []), "low"], ++ }, ++ options, ++ )) as StreamFn, ++ runtimes: ["pi"], ++ priority: 5, + source: "test", + }, + { + pluginId: "high", -+ middleware: { -+ id: "high", -+ priority: 100, -+ wrapToolExecute: async (ctx) => { -+ calls.push("high:before"); -+ const result = await ctx.execute(ctx.params); -+ calls.push("high:after"); -+ return result; -+ }, -+ }, ++ pluginName: "High", ++ rawHandler: (ctx) => ctx.streamFn, ++ handler: (ctx) => ++ ((model, context, options) => ++ ctx.streamFn( ++ model, ++ { ++ ...(context as object), ++ order: [...((context as { order?: string[] }).order ?? []), "high"], ++ }, ++ options, ++ )) as StreamFn, ++ runtimes: ["pi"], ++ priority: 50, + source: "test", + }, + ); + initializeGlobalHookRunner(registry); + -+ const result = await executeToolWithAgentRuntimeMiddlewares({ -+ toolName: "demo", -+ params: { ok: true }, -+ execute: async () => { -+ calls.push("execute"); -+ return { done: true }; -+ }, -+ }); -+ -+ expect(result).toEqual({ done: true }); -+ expect(calls).toEqual([ -+ "high:before", -+ "low:before", -+ "execute", -+ "low:after", -+ "high:after", -+ ]); -+ }); -+ -+ it("falls back to the original tool execute when middleware throws before delegating", async () => { -+ const registry = createEmptyPluginRegistry(); -+ registry.agentRuntimeMiddlewares.push({ -+ pluginId: "broken", -+ middleware: { -+ id: "broken", -+ wrapToolExecute: async () => { -+ throw new Error("boom"); -+ }, -+ }, -+ source: "test", -+ }); -+ initializeGlobalHookRunner(registry); -+ -+ const result = await executeToolWithAgentRuntimeMiddlewares({ -+ toolName: "demo", -+ params: { ok: true }, -+ execute: async () => ({ fallback: true }), ++ const wrapped = wrapStreamFnWithAgentStreamingLlmMiddlewares({ ++ provider: "openai", ++ modelId: "gpt-test", ++ streamFn: baseStreamFn, + }); ++ for await (const chunk of wrapped({} as never, {}, {} as never) as AsyncIterable) { ++ void chunk; ++ // drain ++ } + -+ expect(result).toEqual({ fallback: true }); ++ expect(seenContexts).toEqual([{ order: ["high", "low"] }]); + }); + -+ it("applies higher priority stream middleware outermost", () => { -+ const order: string[] = []; ++ it("lets tool-call middleware rewrite params and wrap execution", async () => { + const registry = createEmptyPluginRegistry(); -+ registry.agentRuntimeMiddlewares.push( ++ const baseExecute = vi.fn(async (params: unknown) => ({ params })); ++ registry.agentToolCallMiddlewares.push( + { + pluginId: "low", -+ middleware: { -+ id: "low", -+ priority: 5, -+ wrapStreamFn: (ctx) => (_model, _context, _options) => { -+ order.push("low:before"); -+ const result = ctx.streamFn({} as never, {} as never, undefined) as { -+ marker?: string; -+ }; -+ order.push("low:after"); -+ return { ...result, marker: `${result.marker ?? ""}L` }; -+ }, -+ }, ++ pluginName: "Low", ++ rawHandler: async (ctx) => await ctx.execute(ctx.params), ++ handler: async (ctx) => ++ await ctx.execute({ ++ ...(ctx.params as object), ++ low: true, ++ }), ++ runtimes: ["pi"], ++ priority: 5, + source: "test", + }, + { + pluginId: "high", -+ middleware: { -+ id: "high", -+ priority: 50, -+ wrapStreamFn: (ctx) => (_model, _context, _options) => { -+ order.push("high:before"); -+ const result = ctx.streamFn({} as never, {} as never, undefined) as { -+ marker?: string; -+ }; -+ order.push("high:after"); -+ return { ...result, marker: `${result.marker ?? ""}H` }; -+ }, -+ }, ++ pluginName: "High", ++ rawHandler: async (ctx) => await ctx.execute(ctx.params), ++ handler: async (ctx) => ++ await ctx.execute({ ++ ...(ctx.params as object), ++ high: true, ++ }), ++ runtimes: ["pi"], ++ priority: 50, + source: "test", + }, + ); + initializeGlobalHookRunner(registry); + -+ const wrapped = wrapStreamFnWithAgentRuntimeMiddlewares({ -+ provider: "openai", -+ modelId: "gpt-5.4", -+ streamFn: () => ({ marker: "" }) as never, ++ await expect( ++ executeToolWithAgentToolCallMiddlewares({ ++ toolName: "demo", ++ params: { original: true }, ++ execute: baseExecute, ++ }), ++ ).resolves.toEqual({ ++ params: { ++ original: true, ++ high: true, ++ low: true, ++ }, ++ }); ++ expect(baseExecute).toHaveBeenCalledWith({ ++ original: true, ++ high: true, ++ low: true, ++ }); ++ }); ++ ++ it("lets tool-call middleware block execution", async () => { ++ const registry = createEmptyPluginRegistry(); ++ const baseExecute = vi.fn(async () => ({ executed: true })); ++ registry.agentToolCallMiddlewares.push({ ++ pluginId: "blocker", ++ pluginName: "Blocker", ++ rawHandler: () => ({ blocked: true }), ++ handler: () => ({ blocked: true }), ++ runtimes: ["pi"], ++ priority: 10, ++ source: "test", ++ }); ++ initializeGlobalHookRunner(registry); ++ ++ await expect( ++ executeToolWithAgentToolCallMiddlewares({ ++ toolName: "demo", ++ params: {}, ++ execute: baseExecute, ++ }), ++ ).resolves.toEqual({ blocked: true }); ++ expect(baseExecute).not.toHaveBeenCalled(); ++ }); ++ ++ it("lets tool-call middleware throw without running the tool", async () => { ++ const registry = createEmptyPluginRegistry(); ++ const baseExecute = vi.fn(async () => ({ executed: true })); ++ registry.agentToolCallMiddlewares.push({ ++ pluginId: "thrower", ++ pluginName: "Thrower", ++ rawHandler: () => { ++ throw new Error("blocked"); ++ }, ++ handler: () => { ++ throw new Error("blocked"); ++ }, ++ runtimes: ["pi"], ++ priority: 10, ++ source: "test", + }); -+ const result = wrapped({} as never, {} as never, undefined) as { marker: string }; ++ initializeGlobalHookRunner(registry); + -+ expect(result.marker).toBe("LH"); -+ expect(order).toEqual(["high:before", "low:before", "low:after", "high:after"]); ++ await expect( ++ executeToolWithAgentToolCallMiddlewares({ ++ toolName: "demo", ++ params: {}, ++ execute: baseExecute, ++ }), ++ ).rejects.toThrow("blocked"); ++ expect(baseExecute).not.toHaveBeenCalled(); + }); +}); -diff --git a/src/plugins/agent-runtime-middleware.ts b/src/plugins/agent-runtime-middleware.ts +diff --git a/src/plugins/agent-streaming-llm-middleware-types.ts b/src/plugins/agent-streaming-llm-middleware-types.ts +new file mode 100644 +index 00000000..e081bea6 +--- /dev/null ++++ b/src/plugins/agent-streaming-llm-middleware-types.ts +@@ -0,0 +1,25 @@ ++import type { StreamFn } from "@earendil-works/pi-agent-core"; ++import type { ProviderRuntimeModel } from "./provider-runtime-model.types.js"; ++ ++export type AgentStreamingLlmMiddlewareRuntime = "pi"; ++ ++export type AgentStreamingLlmMiddlewareContext = { ++ runtime: AgentStreamingLlmMiddlewareRuntime; ++ provider: string; ++ modelId: string; ++ model?: ProviderRuntimeModel; ++ agentId?: string; ++ sessionId?: string; ++ sessionKey?: string; ++ runId?: string; ++ streamFn: StreamFn; ++}; ++ ++export type AgentStreamingLlmMiddleware = ( ++ ctx: AgentStreamingLlmMiddlewareContext, ++) => StreamFn | null | undefined; ++ ++export type AgentStreamingLlmMiddlewareOptions = { ++ runtimes?: AgentStreamingLlmMiddlewareRuntime[]; ++ priority?: number; ++}; +diff --git a/src/plugins/agent-streaming-llm-middleware.ts b/src/plugins/agent-streaming-llm-middleware.ts new file mode 100644 -index 0000000000..462f858cb2 +index 00000000..b085cab3 --- /dev/null -+++ b/src/plugins/agent-runtime-middleware.ts -@@ -0,0 +1,91 @@ -+import type { StreamFn } from "@mariozechner/pi-agent-core"; ++++ b/src/plugins/agent-streaming-llm-middleware.ts +@@ -0,0 +1,104 @@ ++import type { StreamFn } from "@earendil-works/pi-agent-core"; +import { createSubsystemLogger } from "../logging/subsystem.js"; -+import { getGlobalPluginRegistry } from "./hook-runner-global.js"; +import type { -+ OpenClawAgentRuntimeMiddleware, -+ OpenClawAgentRuntimeStreamFnContext, -+ OpenClawAgentRuntimeToolExecuteContext, -+} from "./types.js"; ++ AgentStreamingLlmMiddleware, ++ AgentStreamingLlmMiddlewareContext, ++ AgentStreamingLlmMiddlewareOptions, ++ AgentStreamingLlmMiddlewareRuntime, ++} from "./agent-streaming-llm-middleware-types.js"; ++import { getGlobalPluginRegistry } from "./hook-runner-global.js"; + -+const log = createSubsystemLogger("plugins/agent-runtime-middleware"); ++const log = createSubsystemLogger("plugins/agent-streaming-llm-middleware"); ++ ++export const AGENT_STREAMING_LLM_MIDDLEWARE_RUNTIMES = [ ++ "pi", ++] as const satisfies AgentStreamingLlmMiddlewareRuntime[]; ++ ++const AGENT_STREAMING_LLM_MIDDLEWARE_RUNTIME_SET = new Set( ++ AGENT_STREAMING_LLM_MIDDLEWARE_RUNTIMES, ++); ++ ++function normalizeAgentStreamingLlmMiddlewareRuntime( ++ runtime: string, ++): AgentStreamingLlmMiddlewareRuntime | undefined { ++ const normalized = runtime.trim().toLowerCase(); ++ return AGENT_STREAMING_LLM_MIDDLEWARE_RUNTIME_SET.has(normalized) ++ ? (normalized as AgentStreamingLlmMiddlewareRuntime) ++ : undefined; ++} ++ ++export function normalizeAgentStreamingLlmMiddlewareRuntimes( ++ options?: AgentStreamingLlmMiddlewareOptions, ++): AgentStreamingLlmMiddlewareRuntime[] { ++ const requested = options?.runtimes; ++ if (!requested || requested.length === 0) { ++ return [...AGENT_STREAMING_LLM_MIDDLEWARE_RUNTIMES]; ++ } ++ const normalized: AgentStreamingLlmMiddlewareRuntime[] = []; ++ for (const runtime of requested) { ++ const value = normalizeAgentStreamingLlmMiddlewareRuntime(runtime); ++ if (value && !normalized.includes(value)) { ++ normalized.push(value); ++ } ++ } ++ return normalized; ++} + -+function listMiddlewares(): OpenClawAgentRuntimeMiddleware[] { -+ const registry = getGlobalPluginRegistry(); -+ if (!registry?.agentRuntimeMiddlewares?.length) { -+ return []; ++export function normalizeAgentStreamingLlmMiddlewareRuntimeIds( ++ runtimes: readonly string[] | undefined, ++): AgentStreamingLlmMiddlewareRuntime[] { ++ const normalized: AgentStreamingLlmMiddlewareRuntime[] = []; ++ for (const runtime of runtimes ?? []) { ++ const value = normalizeAgentStreamingLlmMiddlewareRuntime(runtime); ++ if (value && !normalized.includes(value)) { ++ normalized.push(value); ++ } + } -+ return registry.agentRuntimeMiddlewares -+ .map((entry) => entry.middleware) -+ .slice() -+ .sort((a, b) => { -+ const priorityDelta = (a.priority ?? 0) - (b.priority ?? 0); -+ if (priorityDelta !== 0) { -+ return priorityDelta; -+ } -+ return a.id.localeCompare(b.id); -+ }); ++ return normalized; ++} ++ ++function listAgentStreamingLlmMiddlewares( ++ runtime: AgentStreamingLlmMiddlewareRuntime, ++): Array<{ handler: AgentStreamingLlmMiddleware; priority: number; pluginId: string }> { ++ return ( ++ getGlobalPluginRegistry() ++ ?.agentStreamingLlmMiddlewares?.filter((entry) => entry.runtimes.includes(runtime)) ++ .map((entry) => ({ ++ handler: entry.handler, ++ priority: entry.priority ?? 0, ++ pluginId: entry.pluginId, ++ })) ++ .sort((left, right) => { ++ const priorityDelta = left.priority - right.priority; ++ return priorityDelta === 0 ? left.pluginId.localeCompare(right.pluginId) : priorityDelta; ++ }) ?? [] ++ ); +} + -+export function wrapStreamFnWithAgentRuntimeMiddlewares( -+ params: OpenClawAgentRuntimeStreamFnContext, ++export function wrapStreamFnWithAgentStreamingLlmMiddlewares( ++ params: Omit & { ++ runtime?: AgentStreamingLlmMiddlewareRuntime; ++ }, +): StreamFn { ++ const runtime = params.runtime ?? "pi"; + let current = params.streamFn; + -+ for (const middleware of listMiddlewares()) { -+ if (!middleware.wrapStreamFn) { -+ continue; -+ } ++ for (const entry of listAgentStreamingLlmMiddlewares(runtime)) { + try { -+ const next = middleware.wrapStreamFn({ ++ const next = entry.handler({ + ...params, ++ runtime, + streamFn: current, + }); + if (next) { @@ -3222,56 +1490,787 @@ index 0000000000..462f858cb2 + } + } catch (error) { + log.warn( -+ `agent runtime stream middleware failed: id=${middleware.id} error=${String(error)}`, ++ `agent streaming LLM middleware failed: plugin=${entry.pluginId} error=${String(error)}`, + ); + } + } + + return current; +} +diff --git a/src/plugins/agent-tool-call-middleware-types.ts b/src/plugins/agent-tool-call-middleware-types.ts +new file mode 100644 +index 00000000..e569e1be +--- /dev/null ++++ b/src/plugins/agent-tool-call-middleware-types.ts +@@ -0,0 +1,22 @@ ++export type AgentToolCallMiddlewareRuntime = "pi"; + -+export async function executeToolWithAgentRuntimeMiddlewares( -+ params: OpenClawAgentRuntimeToolExecuteContext, -+): Promise { -+ let execute = params.execute; ++export type AgentToolCallMiddlewareContext = { ++ runtime: AgentToolCallMiddlewareRuntime; ++ agentId?: string; ++ sessionId?: string; ++ sessionKey?: string; ++ runId?: string; ++ toolName: string; ++ toolCallId?: string; ++ params: unknown; ++ execute: (params: unknown) => Promise; ++}; + -+ for (const middleware of listMiddlewares()) { -+ if (!middleware.wrapToolExecute) { -+ continue; ++export type AgentToolCallMiddleware = ( ++ ctx: AgentToolCallMiddlewareContext, ++) => Promise | unknown; ++ ++export type AgentToolCallMiddlewareOptions = { ++ runtimes?: AgentToolCallMiddlewareRuntime[]; ++ priority?: number; ++}; +diff --git a/src/plugins/agent-tool-call-middleware.ts b/src/plugins/agent-tool-call-middleware.ts +new file mode 100644 +index 00000000..bba3bd30 +--- /dev/null ++++ b/src/plugins/agent-tool-call-middleware.ts +@@ -0,0 +1,107 @@ ++import { createSubsystemLogger } from "../logging/subsystem.js"; ++import type { ++ AgentToolCallMiddleware, ++ AgentToolCallMiddlewareContext, ++ AgentToolCallMiddlewareOptions, ++ AgentToolCallMiddlewareRuntime, ++} from "./agent-tool-call-middleware-types.js"; ++import { getGlobalPluginRegistry } from "./hook-runner-global.js"; ++ ++const log = createSubsystemLogger("plugins/agent-tool-call-middleware"); ++ ++export const AGENT_TOOL_CALL_MIDDLEWARE_RUNTIMES = [ ++ "pi", ++] as const satisfies AgentToolCallMiddlewareRuntime[]; ++ ++const AGENT_TOOL_CALL_MIDDLEWARE_RUNTIME_SET = new Set(AGENT_TOOL_CALL_MIDDLEWARE_RUNTIMES); ++ ++function normalizeAgentToolCallMiddlewareRuntime( ++ runtime: string, ++): AgentToolCallMiddlewareRuntime | undefined { ++ const normalized = runtime.trim().toLowerCase(); ++ return AGENT_TOOL_CALL_MIDDLEWARE_RUNTIME_SET.has(normalized) ++ ? (normalized as AgentToolCallMiddlewareRuntime) ++ : undefined; ++} ++ ++export function normalizeAgentToolCallMiddlewareRuntimes( ++ options?: AgentToolCallMiddlewareOptions, ++): AgentToolCallMiddlewareRuntime[] { ++ const requested = options?.runtimes; ++ if (!requested || requested.length === 0) { ++ return [...AGENT_TOOL_CALL_MIDDLEWARE_RUNTIMES]; ++ } ++ const normalized: AgentToolCallMiddlewareRuntime[] = []; ++ for (const runtime of requested) { ++ const value = normalizeAgentToolCallMiddlewareRuntime(runtime); ++ if (value && !normalized.includes(value)) { ++ normalized.push(value); ++ } ++ } ++ return normalized; ++} ++ ++export function normalizeAgentToolCallMiddlewareRuntimeIds( ++ runtimes: readonly string[] | undefined, ++): AgentToolCallMiddlewareRuntime[] { ++ const normalized: AgentToolCallMiddlewareRuntime[] = []; ++ for (const runtime of runtimes ?? []) { ++ const value = normalizeAgentToolCallMiddlewareRuntime(runtime); ++ if (value && !normalized.includes(value)) { ++ normalized.push(value); + } ++ } ++ return normalized; ++} ++ ++function listAgentToolCallMiddlewares( ++ runtime: AgentToolCallMiddlewareRuntime, ++): Array<{ handler: AgentToolCallMiddleware; priority: number; pluginId: string }> { ++ return ( ++ getGlobalPluginRegistry() ++ ?.agentToolCallMiddlewares?.filter((entry) => entry.runtimes.includes(runtime)) ++ .map((entry) => ({ ++ handler: entry.handler, ++ priority: entry.priority ?? 0, ++ pluginId: entry.pluginId, ++ })) ++ .sort((left, right) => { ++ const priorityDelta = left.priority - right.priority; ++ return priorityDelta === 0 ? left.pluginId.localeCompare(right.pluginId) : priorityDelta; ++ }) ?? [] ++ ); ++} ++ ++export async function executeToolWithAgentToolCallMiddlewares( ++ params: Omit & { ++ runtime?: AgentToolCallMiddlewareRuntime; ++ }, ++): Promise { ++ const runtime = params.runtime ?? "pi"; ++ let execute = params.execute; + ++ for (const entry of listAgentToolCallMiddlewares(runtime)) { + const priorExecute = execute; + execute = async (nextParams) => { -+ let delegated = false; + const next = async (effectiveParams: unknown) => { -+ delegated = true; + return await priorExecute(effectiveParams); + }; + + try { -+ return await middleware.wrapToolExecute({ ++ return await entry.handler({ + ...params, ++ runtime, + params: nextParams, + execute: next, + }); + } catch (error) { -+ log.warn(`agent runtime tool middleware failed: id=${middleware.id} error=${String(error)}`); -+ if (delegated) { -+ throw error; -+ } -+ return await priorExecute(nextParams); ++ log.warn( ++ `agent tool-call middleware failed: plugin=${entry.pluginId} error=${String(error)}`, ++ ); ++ throw error; + } + }; + } + + return await execute(params.params); +} -diff --git a/uv.lock b/uv.lock -new file mode 100644 -index 0000000000..7518fc90bf ---- /dev/null -+++ b/uv.lock -@@ -0,0 +1,3 @@ -+version = 1 -+revision = 3 -+requires-python = ">=3.12" +diff --git a/src/plugins/api-builder.ts b/src/plugins/api-builder.ts +index a2256a50..1efdbfe9 100644 +--- a/src/plugins/api-builder.ts ++++ b/src/plugins/api-builder.ts +@@ -56,6 +56,8 @@ export type BuildPluginApiParams = { + | "registerAgentHarness" + | "registerCodexAppServerExtensionFactory" + | "registerAgentToolResultMiddleware" ++ | "registerAgentStreamingLlmMiddleware" ++ | "registerAgentToolCallMiddleware" + | "registerSessionExtension" + | "enqueueNextTurnInjection" + | "registerTrustedToolPolicy" +@@ -134,6 +136,10 @@ const noopRegisterCodexAppServerExtensionFactory: OpenClawPluginApi["registerCod + () => {}; + const noopRegisterAgentToolResultMiddleware: OpenClawPluginApi["registerAgentToolResultMiddleware"] = + () => {}; ++const noopRegisterAgentStreamingLlmMiddleware: OpenClawPluginApi["registerAgentStreamingLlmMiddleware"] = ++ () => {}; ++const noopRegisterAgentToolCallMiddleware: OpenClawPluginApi["registerAgentToolCallMiddleware"] = ++ () => {}; + const noopRegisterSessionExtension: OpenClawPluginApi["registerSessionExtension"] = () => {}; + const noopEnqueueNextTurnInjection: OpenClawPluginApi["enqueueNextTurnInjection"] = async ( + injection, +@@ -246,6 +252,10 @@ export function buildPluginApi(params: BuildPluginApiParams): OpenClawPluginApi + handlers.registerCodexAppServerExtensionFactory ?? noopRegisterCodexAppServerExtensionFactory, + registerAgentToolResultMiddleware: + handlers.registerAgentToolResultMiddleware ?? noopRegisterAgentToolResultMiddleware, ++ registerAgentStreamingLlmMiddleware: ++ handlers.registerAgentStreamingLlmMiddleware ?? noopRegisterAgentStreamingLlmMiddleware, ++ registerAgentToolCallMiddleware: ++ handlers.registerAgentToolCallMiddleware ?? noopRegisterAgentToolCallMiddleware, + registerSessionExtension: handlers.registerSessionExtension ?? noopRegisterSessionExtension, + enqueueNextTurnInjection: handlers.enqueueNextTurnInjection ?? noopEnqueueNextTurnInjection, + registerTrustedToolPolicy: handlers.registerTrustedToolPolicy ?? noopRegisterTrustedToolPolicy, +diff --git a/src/plugins/captured-registration.test.ts b/src/plugins/captured-registration.test.ts +index 5213faae..fd7d6a51 100644 +--- a/src/plugins/captured-registration.test.ts ++++ b/src/plugins/captured-registration.test.ts +@@ -85,6 +85,14 @@ describe("captured plugin registration", () => { + api.registerAgentToolResultMiddleware(() => undefined, { + runtimes: ["codex"], + }); ++ api.registerAgentStreamingLlmMiddleware((ctx) => ctx.streamFn, { ++ runtimes: ["pi"], ++ priority: 10, ++ }); ++ api.registerAgentToolCallMiddleware(async (ctx) => await ctx.execute(ctx.params), { ++ runtimes: ["pi"], ++ priority: 20, ++ }); + }, + }); + +@@ -103,6 +111,12 @@ describe("captured plugin registration", () => { + expect(captured.textTransforms[0]?.input).toHaveLength(1); + expect(captured.agentToolResultMiddlewares).toHaveLength(1); + expect(captured.agentToolResultMiddlewares[0]?.runtimes).toEqual(["codex"]); ++ expect(captured.agentStreamingLlmMiddlewares).toHaveLength(1); ++ expect(captured.agentStreamingLlmMiddlewares[0]?.runtimes).toEqual(["pi"]); ++ expect(captured.agentStreamingLlmMiddlewares[0]?.priority).toBe(10); ++ expect(captured.agentToolCallMiddlewares).toHaveLength(1); ++ expect(captured.agentToolCallMiddlewares[0]?.runtimes).toEqual(["pi"]); ++ expect(captured.agentToolCallMiddlewares[0]?.priority).toBe(20); + expect(captured.api.registerMemoryEmbeddingProvider).toBeTypeOf("function"); + }); + +diff --git a/src/plugins/captured-registration.ts b/src/plugins/captured-registration.ts +index edcec6aa..ef949ecf 100644 +--- a/src/plugins/captured-registration.ts ++++ b/src/plugins/captured-registration.ts +@@ -1,4 +1,14 @@ + import type { OpenClawConfig } from "../config/types.openclaw.js"; ++import type { ++ AgentStreamingLlmMiddleware, ++ AgentStreamingLlmMiddlewareOptions, ++} from "./agent-streaming-llm-middleware-types.js"; ++import { normalizeAgentStreamingLlmMiddlewareRuntimes } from "./agent-streaming-llm-middleware.js"; ++import type { ++ AgentToolCallMiddleware, ++ AgentToolCallMiddlewareOptions, ++} from "./agent-tool-call-middleware-types.js"; ++import { normalizeAgentToolCallMiddlewareRuntimes } from "./agent-tool-call-middleware.js"; + import type { + AgentToolResultMiddleware, + AgentToolResultMiddlewareOptions, +@@ -17,7 +27,11 @@ import type { + PluginTrustedToolPolicyRegistration, + } from "./host-hooks.js"; + import type { MemoryEmbeddingProviderAdapter } from "./memory-embedding-providers.js"; +-import type { PluginAgentToolResultMiddlewareRegistration } from "./registry-types.js"; ++import type { ++ PluginAgentStreamingLlmMiddlewareRegistration, ++ PluginAgentToolCallMiddlewareRegistration, ++ PluginAgentToolResultMiddlewareRegistration, ++} from "./registry-types.js"; + import type { PluginRuntime } from "./runtime/types.js"; + import type { + AnyAgentTool, +@@ -57,6 +71,8 @@ export type CapturedPluginRegistration = { + textTransforms: PluginTextTransformRegistration[]; + codexAppServerExtensionFactories: CodexAppServerExtensionFactory[]; + agentToolResultMiddlewares: PluginAgentToolResultMiddlewareRegistration[]; ++ agentStreamingLlmMiddlewares: PluginAgentStreamingLlmMiddlewareRegistration[]; ++ agentToolCallMiddlewares: PluginAgentToolCallMiddlewareRegistration[]; + speechProviders: SpeechProviderPlugin[]; + realtimeTranscriptionProviders: RealtimeTranscriptionProviderPlugin[]; + realtimeVoiceProviders: RealtimeVoiceProviderPlugin[]; +@@ -94,6 +110,8 @@ export function createCapturedPluginRegistration(params?: { + const textTransforms: PluginTextTransformRegistration[] = []; + const codexAppServerExtensionFactories: CodexAppServerExtensionFactory[] = []; + const agentToolResultMiddlewares: PluginAgentToolResultMiddlewareRegistration[] = []; ++ const agentStreamingLlmMiddlewares: PluginAgentStreamingLlmMiddlewareRegistration[] = []; ++ const agentToolCallMiddlewares: PluginAgentToolCallMiddlewareRegistration[] = []; + const speechProviders: SpeechProviderPlugin[] = []; + const realtimeTranscriptionProviders: RealtimeTranscriptionProviderPlugin[] = []; + const realtimeVoiceProviders: RealtimeVoiceProviderPlugin[] = []; +@@ -134,6 +152,8 @@ export function createCapturedPluginRegistration(params?: { + textTransforms, + codexAppServerExtensionFactories, + agentToolResultMiddlewares, ++ agentStreamingLlmMiddlewares, ++ agentToolCallMiddlewares, + speechProviders, + realtimeTranscriptionProviders, + realtimeVoiceProviders, +@@ -218,6 +238,36 @@ export function createCapturedPluginRegistration(params?: { + source: pluginSource, + }); + }, ++ registerAgentStreamingLlmMiddleware( ++ handler: AgentStreamingLlmMiddleware, ++ options?: AgentStreamingLlmMiddlewareOptions, ++ ) { ++ const runtimes = normalizeAgentStreamingLlmMiddlewareRuntimes(options); ++ agentStreamingLlmMiddlewares.push({ ++ pluginId, ++ pluginName, ++ rawHandler: handler, ++ handler, ++ runtimes, ++ priority: options?.priority, ++ source: pluginSource, ++ }); ++ }, ++ registerAgentToolCallMiddleware( ++ handler: AgentToolCallMiddleware, ++ options?: AgentToolCallMiddlewareOptions, ++ ) { ++ const runtimes = normalizeAgentToolCallMiddlewareRuntimes(options); ++ agentToolCallMiddlewares.push({ ++ pluginId, ++ pluginName, ++ rawHandler: handler, ++ handler, ++ runtimes, ++ priority: options?.priority, ++ source: pluginSource, ++ }); ++ }, + registerCliBackend(backend: CliBackendPlugin) { + cliBackends.push(backend); + }, +diff --git a/src/plugins/hook-registry.types.ts b/src/plugins/hook-registry.types.ts +index dc53765f..679f48ce 100644 +--- a/src/plugins/hook-registry.types.ts ++++ b/src/plugins/hook-registry.types.ts +@@ -1,5 +1,9 @@ + import type { HookEntry } from "../hooks/types.js"; + import type { PluginHookRegistration as TypedPluginHookRegistration } from "./hook-types.js"; ++import type { ++ PluginAgentStreamingLlmMiddlewareRegistration, ++ PluginAgentToolCallMiddlewareRegistration, ++} from "./registry-types.js"; + + export type PluginLegacyHookRegistration = { + pluginId: string; +@@ -19,4 +23,6 @@ export type GlobalHookRunnerRegistry = HookRunnerRegistry & { + id: string; + status: "loaded" | "disabled" | "error"; + }>; ++ agentStreamingLlmMiddlewares?: PluginAgentStreamingLlmMiddlewareRegistration[]; ++ agentToolCallMiddlewares?: PluginAgentToolCallMiddlewareRegistration[]; + }; +diff --git a/src/plugins/hooks.test-helpers.ts b/src/plugins/hooks.test-helpers.ts +index 59e98655..3bea1a85 100644 +--- a/src/plugins/hooks.test-helpers.ts ++++ b/src/plugins/hooks.test-helpers.ts +@@ -44,6 +44,8 @@ export function createMockPluginRegistry( + webSearchProviders: [], + migrationProviders: [], + codexAppServerExtensionFactories: [], ++ agentStreamingLlmMiddlewares: [], ++ agentToolCallMiddlewares: [], + agentToolResultMiddlewares: [], + memoryEmbeddingProviders: [], + agentHarnesses: [], +diff --git a/src/plugins/loader.ts b/src/plugins/loader.ts +index 6a63be71..afd4e280 100644 +--- a/src/plugins/loader.ts ++++ b/src/plugins/loader.ts +@@ -358,6 +358,8 @@ type PluginRegistrySnapshot = { + migrationProviders: PluginRegistry["migrationProviders"]; + codexAppServerExtensionFactories: PluginRegistry["codexAppServerExtensionFactories"]; + agentToolResultMiddlewares: PluginRegistry["agentToolResultMiddlewares"]; ++ agentStreamingLlmMiddlewares: PluginRegistry["agentStreamingLlmMiddlewares"]; ++ agentToolCallMiddlewares: PluginRegistry["agentToolCallMiddlewares"]; + memoryEmbeddingProviders: PluginRegistry["memoryEmbeddingProviders"]; + agentHarnesses: PluginRegistry["agentHarnesses"]; + httpRoutes: PluginRegistry["httpRoutes"]; +@@ -401,6 +403,8 @@ function snapshotPluginRegistry(registry: PluginRegistry): PluginRegistrySnapsho + migrationProviders: [...registry.migrationProviders], + codexAppServerExtensionFactories: [...registry.codexAppServerExtensionFactories], + agentToolResultMiddlewares: [...registry.agentToolResultMiddlewares], ++ agentStreamingLlmMiddlewares: [...registry.agentStreamingLlmMiddlewares], ++ agentToolCallMiddlewares: [...registry.agentToolCallMiddlewares], + memoryEmbeddingProviders: [...registry.memoryEmbeddingProviders], + agentHarnesses: [...registry.agentHarnesses], + httpRoutes: [...registry.httpRoutes], +@@ -443,6 +447,8 @@ function restorePluginRegistry(registry: PluginRegistry, snapshot: PluginRegistr + registry.migrationProviders = snapshot.arrays.migrationProviders; + registry.codexAppServerExtensionFactories = snapshot.arrays.codexAppServerExtensionFactories; + registry.agentToolResultMiddlewares = snapshot.arrays.agentToolResultMiddlewares; ++ registry.agentStreamingLlmMiddlewares = snapshot.arrays.agentStreamingLlmMiddlewares; ++ registry.agentToolCallMiddlewares = snapshot.arrays.agentToolCallMiddlewares; + registry.memoryEmbeddingProviders = snapshot.arrays.memoryEmbeddingProviders; + registry.agentHarnesses = snapshot.arrays.agentHarnesses; + registry.httpRoutes = snapshot.arrays.httpRoutes; +diff --git a/src/plugins/manifest-registry.ts b/src/plugins/manifest-registry.ts +index 11e63e68..9f97b1f8 100644 +--- a/src/plugins/manifest-registry.ts ++++ b/src/plugins/manifest-registry.ts +@@ -287,6 +287,8 @@ function mergeManifestContracts( + for (const key of [ + "embeddedExtensionFactories", + "agentToolResultMiddleware", ++ "agentStreamingLlmMiddleware", ++ "agentToolCallMiddleware", + "externalAuthProviders", + "memoryEmbeddingProviders", + "speechProviders", +diff --git a/src/plugins/manifest.ts b/src/plugins/manifest.ts +index e94eb8d8..f94d89a7 100644 +--- a/src/plugins/manifest.ts ++++ b/src/plugins/manifest.ts +@@ -396,6 +396,8 @@ export type PluginManifest = { + export type PluginManifestContracts = { + embeddedExtensionFactories?: string[]; + agentToolResultMiddleware?: string[]; ++ agentStreamingLlmMiddleware?: string[]; ++ agentToolCallMiddleware?: string[]; + /** + * Provider ids whose external auth profile hook can contribute runtime-only + * credentials. Declaring this lets auth-store overlays load only the owning +@@ -791,6 +793,8 @@ function normalizeManifestContracts(value: unknown): PluginManifestContracts | u + + const embeddedExtensionFactories = normalizeTrimmedStringList(value.embeddedExtensionFactories); + const agentToolResultMiddleware = normalizeTrimmedStringList(value.agentToolResultMiddleware); ++ const agentStreamingLlmMiddleware = normalizeTrimmedStringList(value.agentStreamingLlmMiddleware); ++ const agentToolCallMiddleware = normalizeTrimmedStringList(value.agentToolCallMiddleware); + const externalAuthProviders = normalizeTrimmedStringList(value.externalAuthProviders); + const memoryEmbeddingProviders = normalizeTrimmedStringList(value.memoryEmbeddingProviders); + const speechProviders = normalizeTrimmedStringList(value.speechProviders); +@@ -811,6 +815,8 @@ function normalizeManifestContracts(value: unknown): PluginManifestContracts | u + const contracts = { + ...(embeddedExtensionFactories.length > 0 ? { embeddedExtensionFactories } : {}), + ...(agentToolResultMiddleware.length > 0 ? { agentToolResultMiddleware } : {}), ++ ...(agentStreamingLlmMiddleware.length > 0 ? { agentStreamingLlmMiddleware } : {}), ++ ...(agentToolCallMiddleware.length > 0 ? { agentToolCallMiddleware } : {}), + ...(externalAuthProviders.length > 0 ? { externalAuthProviders } : {}), + ...(memoryEmbeddingProviders.length > 0 ? { memoryEmbeddingProviders } : {}), + ...(speechProviders.length > 0 ? { speechProviders } : {}), +diff --git a/src/plugins/registry-empty.ts b/src/plugins/registry-empty.ts +index 1bbddd8f..15793c02 100644 +--- a/src/plugins/registry-empty.ts ++++ b/src/plugins/registry-empty.ts +@@ -24,6 +24,8 @@ export function createEmptyPluginRegistry(): PluginRegistry { + migrationProviders: [], + codexAppServerExtensionFactories: [], + agentToolResultMiddlewares: [], ++ agentStreamingLlmMiddlewares: [], ++ agentToolCallMiddlewares: [], + memoryEmbeddingProviders: [], + agentHarnesses: [], + gatewayHandlers: {}, +diff --git a/src/plugins/registry-types.ts b/src/plugins/registry-types.ts +index 027ce092..91e92853 100644 +--- a/src/plugins/registry-types.ts ++++ b/src/plugins/registry-types.ts +@@ -4,6 +4,14 @@ import type { OperatorScope } from "../gateway/operator-scopes.js"; + import type { GatewayRequestHandlers } from "../gateway/server-methods/types.js"; + import type { HookEntry } from "../hooks/types.js"; + import type { JsonSchemaObject } from "../shared/json-schema.types.js"; ++import type { ++ AgentStreamingLlmMiddleware, ++ AgentStreamingLlmMiddlewareRuntime, ++} from "./agent-streaming-llm-middleware-types.js"; ++import type { ++ AgentToolCallMiddleware, ++ AgentToolCallMiddlewareRuntime, ++} from "./agent-tool-call-middleware-types.js"; + import type { + AgentToolResultMiddleware, + AgentToolResultMiddlewareRuntime, +@@ -209,6 +217,26 @@ export type PluginAgentToolResultMiddlewareRegistration = { + source: string; + rootDir?: string; + }; ++export type PluginAgentStreamingLlmMiddlewareRegistration = { ++ pluginId: string; ++ pluginName?: string; ++ rawHandler: AgentStreamingLlmMiddleware; ++ handler: AgentStreamingLlmMiddleware; ++ runtimes: AgentStreamingLlmMiddlewareRuntime[]; ++ priority?: number; ++ source: string; ++ rootDir?: string; ++}; ++export type PluginAgentToolCallMiddlewareRegistration = { ++ pluginId: string; ++ pluginName?: string; ++ rawHandler: AgentToolCallMiddleware; ++ handler: AgentToolCallMiddleware; ++ runtimes: AgentToolCallMiddlewareRuntime[]; ++ priority?: number; ++ source: string; ++ rootDir?: string; ++}; + export type PluginAgentHarnessRegistration = { + pluginId: string; + pluginName?: string; +@@ -441,6 +469,8 @@ export type PluginRegistry = { + migrationProviders: PluginMigrationProviderRegistration[]; + codexAppServerExtensionFactories: PluginCodexAppServerExtensionFactoryRegistration[]; + agentToolResultMiddlewares: PluginAgentToolResultMiddlewareRegistration[]; ++ agentStreamingLlmMiddlewares: PluginAgentStreamingLlmMiddlewareRegistration[]; ++ agentToolCallMiddlewares: PluginAgentToolCallMiddlewareRegistration[]; + memoryEmbeddingProviders: PluginMemoryEmbeddingProviderRegistration[]; + agentHarnesses: PluginAgentHarnessRegistration[]; + gatewayHandlers: GatewayRequestHandlers; +diff --git a/src/plugins/registry.ts b/src/plugins/registry.ts +index 51364ce2..1dac1eaa 100644 +--- a/src/plugins/registry.ts ++++ b/src/plugins/registry.ts +@@ -42,6 +42,16 @@ import { + } from "../tasks/detached-task-runtime-state.js"; + import { resolveUserPath } from "../utils.js"; + import { emitPluginAgentEvent } from "./agent-event-emission.js"; ++import type { AgentStreamingLlmMiddleware } from "./agent-streaming-llm-middleware-types.js"; ++import { ++ normalizeAgentStreamingLlmMiddlewareRuntimeIds, ++ normalizeAgentStreamingLlmMiddlewareRuntimes, ++} from "./agent-streaming-llm-middleware.js"; ++import type { AgentToolCallMiddleware } from "./agent-tool-call-middleware-types.js"; ++import { ++ normalizeAgentToolCallMiddlewareRuntimeIds, ++ normalizeAgentToolCallMiddlewareRuntimes, ++} from "./agent-tool-call-middleware.js"; + import type { AgentToolResultMiddleware } from "./agent-tool-result-middleware-types.js"; + import { + normalizeAgentToolResultMiddlewareRuntimeIds, +@@ -201,6 +211,8 @@ export type { + PluginConversationBindingResolvedHandlerRegistration, + PluginHookRegistration, + PluginAgentHarnessRegistration, ++ PluginAgentStreamingLlmMiddlewareRegistration, ++ PluginAgentToolCallMiddlewareRegistration, + PluginMemoryEmbeddingProviderRegistration, + PluginNodeHostCommandRegistration, + PluginProviderRegistration, +@@ -526,6 +538,156 @@ export function createPluginRegistry(registryParams: PluginRegistryParams) { + }); + }; + ++ const registerAgentStreamingLlmMiddleware = ( ++ record: PluginRecord, ++ handler: Parameters[0], ++ options: Parameters[1], ++ ) => { ++ if (record.origin !== "bundled") { ++ pushDiagnostic({ ++ level: "error", ++ pluginId: record.id, ++ source: record.source, ++ message: "only bundled plugins can register agent streaming LLM middleware", ++ }); ++ return; ++ } ++ if (typeof (handler as unknown) !== "function") { ++ pushDiagnostic({ ++ level: "error", ++ pluginId: record.id, ++ source: record.source, ++ message: "agent streaming LLM middleware must be a function", ++ }); ++ return; ++ } ++ const runtimes = normalizeAgentStreamingLlmMiddlewareRuntimes(options); ++ if (runtimes.length === 0) { ++ pushDiagnostic({ ++ level: "error", ++ pluginId: record.id, ++ source: record.source, ++ message: "agent streaming LLM middleware must target at least one supported runtime", ++ }); ++ return; ++ } ++ const declared = normalizeAgentStreamingLlmMiddlewareRuntimeIds( ++ record.contracts?.agentStreamingLlmMiddleware, ++ ); ++ const missing = runtimes.filter((runtime) => !declared.includes(runtime)); ++ if (missing.length > 0) { ++ pushDiagnostic({ ++ level: "error", ++ pluginId: record.id, ++ source: record.source, ++ message: `plugin must declare contracts.agentStreamingLlmMiddleware for: ${missing.join(", ")}`, ++ }); ++ return; ++ } ++ const existing = registry.agentStreamingLlmMiddlewares.find( ++ (entry) => entry.pluginId === record.id && entry.rawHandler === handler, ++ ); ++ if (existing) { ++ existing.runtimes = [...new Set([...existing.runtimes, ...runtimes])]; ++ existing.priority = options?.priority ?? existing.priority; ++ return; ++ } ++ const safeHandler: AgentStreamingLlmMiddleware = (ctx) => { ++ try { ++ return handler(ctx); ++ } catch (error) { ++ registryParams.logger.warn( ++ `[plugins] agent streaming LLM middleware failed for ${record.id}`, ++ ); ++ throw error; ++ } ++ }; ++ registry.agentStreamingLlmMiddlewares.push({ ++ pluginId: record.id, ++ pluginName: record.name, ++ rawHandler: handler, ++ handler: safeHandler, ++ runtimes, ++ priority: options?.priority, ++ source: record.source, ++ rootDir: record.rootDir, ++ }); ++ }; ++ ++ const registerAgentToolCallMiddleware = ( ++ record: PluginRecord, ++ handler: Parameters[0], ++ options: Parameters[1], ++ ) => { ++ if (record.origin !== "bundled") { ++ pushDiagnostic({ ++ level: "error", ++ pluginId: record.id, ++ source: record.source, ++ message: "only bundled plugins can register agent tool-call middleware", ++ }); ++ return; ++ } ++ if (typeof (handler as unknown) !== "function") { ++ pushDiagnostic({ ++ level: "error", ++ pluginId: record.id, ++ source: record.source, ++ message: "agent tool-call middleware must be a function", ++ }); ++ return; ++ } ++ const runtimes = normalizeAgentToolCallMiddlewareRuntimes(options); ++ if (runtimes.length === 0) { ++ pushDiagnostic({ ++ level: "error", ++ pluginId: record.id, ++ source: record.source, ++ message: "agent tool-call middleware must target at least one supported runtime", ++ }); ++ return; ++ } ++ const declared = normalizeAgentToolCallMiddlewareRuntimeIds( ++ record.contracts?.agentToolCallMiddleware, ++ ); ++ const missing = runtimes.filter((runtime) => !declared.includes(runtime)); ++ if (missing.length > 0) { ++ pushDiagnostic({ ++ level: "error", ++ pluginId: record.id, ++ source: record.source, ++ message: `plugin must declare contracts.agentToolCallMiddleware for: ${missing.join(", ")}`, ++ }); ++ return; ++ } ++ const existing = registry.agentToolCallMiddlewares.find( ++ (entry) => entry.pluginId === record.id && entry.rawHandler === handler, ++ ); ++ if (existing) { ++ existing.runtimes = [...new Set([...existing.runtimes, ...runtimes])]; ++ existing.priority = options?.priority ?? existing.priority; ++ return; ++ } ++ const safeHandler: AgentToolCallMiddleware = async (ctx) => { ++ try { ++ return await handler(ctx); ++ } catch (error) { ++ registryParams.logger.warn(`[plugins] agent tool-call middleware failed for ${record.id}`); ++ throw error; ++ } ++ }; ++ registry.agentToolCallMiddlewares.push({ ++ pluginId: record.id, ++ pluginName: record.name, ++ rawHandler: handler, ++ handler: safeHandler, ++ runtimes, ++ priority: options?.priority, ++ source: record.source, ++ rootDir: record.rootDir, ++ }); ++ }; ++ + const registerTool = ( + record: PluginRecord, + tool: AnyAgentTool | OpenClawPluginToolFactory, +@@ -2644,6 +2806,12 @@ export function createPluginRegistry(registryParams: PluginRegistryParams) { + registerAgentToolResultMiddleware: (handler, options) => { + registerAgentToolResultMiddleware(record, handler, options); + }, ++ registerAgentStreamingLlmMiddleware: (handler, options) => { ++ registerAgentStreamingLlmMiddleware(record, handler, options); ++ }, ++ registerAgentToolCallMiddleware: (handler, options) => { ++ registerAgentToolCallMiddleware(record, handler, options); ++ }, + registerSessionExtension: (extension) => registerSessionExtension(record, extension), + enqueueNextTurnInjection: (injection) => { + if (params.hookPolicy?.allowPromptInjection === false) { +@@ -2979,6 +3147,8 @@ export function createPluginRegistry(registryParams: PluginRegistryParams) { + registerNodeHostCommand, + registerSecurityAuditCollector, + registerService, ++ registerAgentStreamingLlmMiddleware, ++ registerAgentToolCallMiddleware, + registerCommand, + registerSessionExtension, + registerTrustedToolPolicy, +diff --git a/src/plugins/status.test-helpers.ts b/src/plugins/status.test-helpers.ts +index 1d8cc62a..c9df3f96 100644 +--- a/src/plugins/status.test-helpers.ts ++++ b/src/plugins/status.test-helpers.ts +@@ -144,6 +144,8 @@ export function createPluginLoadResult( + webSearchProviders: [], + migrationProviders: [], + codexAppServerExtensionFactories: [], ++ agentStreamingLlmMiddlewares: [], ++ agentToolCallMiddlewares: [], + agentToolResultMiddlewares: [], + memoryEmbeddingProviders: [], + textTransforms: [], +diff --git a/src/plugins/types.ts b/src/plugins/types.ts +index 8dbec0b9..52d4ee8b 100644 +--- a/src/plugins/types.ts ++++ b/src/plugins/types.ts +@@ -80,6 +80,14 @@ import type { + } from "../tts/provider-types.js"; + import type { VideoGenerationProvider } from "../video-generation/types.js"; + import type { WizardPrompter } from "../wizard/prompts.js"; ++import type { ++ AgentStreamingLlmMiddleware, ++ AgentStreamingLlmMiddlewareOptions, ++} from "./agent-streaming-llm-middleware-types.js"; ++import type { ++ AgentToolCallMiddleware, ++ AgentToolCallMiddlewareOptions, ++} from "./agent-tool-call-middleware-types.js"; + import type { + AgentToolResultMiddleware, + AgentToolResultMiddlewareOptions, +@@ -177,6 +185,18 @@ export type { + AgentToolResultMiddlewareRuntime, + OpenClawAgentToolResult, + } from "./agent-tool-result-middleware-types.js"; ++export type { ++ AgentStreamingLlmMiddleware, ++ AgentStreamingLlmMiddlewareContext, ++ AgentStreamingLlmMiddlewareOptions, ++ AgentStreamingLlmMiddlewareRuntime, ++} from "./agent-streaming-llm-middleware-types.js"; ++export type { ++ AgentToolCallMiddleware, ++ AgentToolCallMiddlewareContext, ++ AgentToolCallMiddlewareOptions, ++ AgentToolCallMiddlewareRuntime, ++} from "./agent-tool-call-middleware-types.js"; + export type { + PluginConversationBinding, + PluginConversationBindingRequestParams, +@@ -2694,6 +2714,22 @@ export type OpenClawPluginApi = { + handler: AgentToolResultMiddleware, + options?: AgentToolResultMiddlewareOptions, + ) => void; ++ /** ++ * Register runtime-neutral streaming LLM middleware. Declare ++ * `contracts.agentStreamingLlmMiddleware` for every targeted runtime. ++ */ ++ registerAgentStreamingLlmMiddleware: ( ++ handler: AgentStreamingLlmMiddleware, ++ options?: AgentStreamingLlmMiddlewareOptions, ++ ) => void; ++ /** ++ * Register runtime-neutral tool-call middleware. Declare ++ * `contracts.agentToolCallMiddleware` for every targeted runtime. ++ */ ++ registerAgentToolCallMiddleware: ( ++ handler: AgentToolCallMiddleware, ++ options?: AgentToolCallMiddlewareOptions, ++ ) => void; + /** + * Register plugin-owned session state that can be projected into Gateway session rows. + * @deprecated Use `api.session.state.registerSessionExtension(...)`. +diff --git a/src/test-utils/channel-plugins.ts b/src/test-utils/channel-plugins.ts +index 00857196..8fdd2e19 100644 +--- a/src/test-utils/channel-plugins.ts ++++ b/src/test-utils/channel-plugins.ts +@@ -38,6 +38,8 @@ export const createTestRegistry = (channels: TestChannelRegistration[] = []): Pl + webSearchProviders: [], + migrationProviders: [], + codexAppServerExtensionFactories: [], ++ agentStreamingLlmMiddlewares: [], ++ agentToolCallMiddlewares: [], + agentToolResultMiddlewares: [], + memoryEmbeddingProviders: [], + textTransforms: [], diff --git a/third_party/sources.lock b/third_party/sources.lock index 18934d66..17ee3d11 100644 --- a/third_party/sources.lock +++ b/third_party/sources.lock @@ -22,7 +22,7 @@ [submodule "third_party/openclaw"] path = third_party/openclaw url = https://github.com/openclaw/openclaw - commit = 769908ec3f713ecde067eb8c8aa54d8f57217aff + commit = 83d7ab0d362fdb50922c4875a0cad8e02ec9a344 [submodule "third_party/langgraph"] path = third_party/langgraph From 5c88adb05eee22b459abb8f78e868ba57ec2227f Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Thu, 14 May 2026 22:51:10 +0000 Subject: [PATCH 7/9] feat: Add Deep Agents integration (#90) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### Overview * Primary entry point for end-users is the `add_nemo_flow_integration` method, which adds NeMo Flow middleware to the agent and subagents (if any). * Emit a mark when skills are loaded and HITL events * `langgraph` is promoted from a transitive dep to a direct-dep in the `langchain` extra since `python/nemo_flow/integrations/langchain/_serialization.py` now imports from `langgraph` * Adds work-around for installing OpenSSL on Windows-Arm CI runners - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details #### Where should the reviewer start? #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Closes # ## Summary by CodeRabbit * **New Features** * Deep Agents integration: observability for agent runs, tool calls, filesystem/sandbox operations, human-in-the-loop events, backend instrumentation, and middleware marks. * **Documentation** * Added Deep Agents integration README with setup, usage, and observed-event examples. * **Tests** * New integration and end-to-end tests covering middleware, backend instrumentation, sandbox behavior, and HITL flows; added shared test fixture. * **Chores** * Added optional Deep Agents dependency group and regenerated third‑party attributions/licenses. * **CI** * Updated CI and dev sync steps to include Deep Agents extras and platform-specific setup. [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NeMo-Flow/pull/90) Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Will Killian (https://github.com/willkill07) - https://github.com/Salonijain27 URL: https://github.com/NVIDIA/NeMo-Flow/pull/90 --- .github/workflows/ci_check.yml | 1 + .github/workflows/ci_python.yml | 17 + ATTRIBUTIONS-Python.md | 1215 +++++++++++++++-- docs/getting-started/python/deepagents.md | 120 ++ docs/getting-started/python/index.md | 9 +- docs/integrate-frameworks/about.md | 6 +- justfile | 4 +- pyproject.toml | 6 + .../integrations/deepagents/__init__.py | 113 ++ .../integrations/deepagents/_events.py | 62 + .../integrations/deepagents/callbacks.py | 92 ++ .../integrations/deepagents/middleware.py | 67 + .../integrations/langchain/_serialization.py | 24 +- .../integrations/langchain/callbacks.py | 2 +- python/nemo_flow/typed.py | 5 + python/tests/conftest.py | 30 + .../deepagents/test_deepagents_integration.py | 256 ++++ .../integrations/langchain/test_callbacks.py | 55 + .../integrations/langchain/test_middleware.py | 2 +- .../langgraph/test_langgraph_integration.py | 14 - uv.lock | 479 ++++++- 21 files changed, 2452 insertions(+), 127 deletions(-) create mode 100644 docs/getting-started/python/deepagents.md create mode 100644 python/nemo_flow/integrations/deepagents/__init__.py create mode 100644 python/nemo_flow/integrations/deepagents/_events.py create mode 100644 python/nemo_flow/integrations/deepagents/callbacks.py create mode 100644 python/nemo_flow/integrations/deepagents/middleware.py create mode 100644 python/tests/conftest.py create mode 100644 python/tests/integrations/deepagents/test_deepagents_integration.py diff --git a/.github/workflows/ci_check.yml b/.github/workflows/ci_check.yml index 544fa75a..291567f1 100644 --- a/.github/workflows/ci_check.yml +++ b/.github/workflows/ci_check.yml @@ -109,6 +109,7 @@ jobs: run: | set -e uv tool install pre-commit==${{ steps.ci-config.outputs.pre_commit_version }} + uv sync --inexact --no-install-project --no-install-package nemo-flow --extra langchain --extra langgraph --extra deepagents if [[ "$FULL_CI" == "true" || -z "$PRE_COMMIT_BASE" ]]; then pre-commit run --all-files --show-diff-on-failure else diff --git a/.github/workflows/ci_python.yml b/.github/workflows/ci_python.yml index d7e9695b..0031603b 100644 --- a/.github/workflows/ci_python.yml +++ b/.github/workflows/ci_python.yml @@ -110,6 +110,23 @@ jobs: set -e UV_PYTHON_DOWNLOADS=manual uv python install --managed-python ${{ steps.ci-config.outputs.default_python_version }} + - name: Install Windows ARM64 OpenSSL + if: ${{ matrix.platform == 'windows-arm64' }} + shell: pwsh + run: | + $ErrorActionPreference = 'Stop' + $vcpkgRoot = Join-Path $env:RUNNER_TEMP 'vcpkg' + git clone https://github.com/microsoft/vcpkg $vcpkgRoot + git -C $vcpkgRoot checkout --detach 56bb2411609227288b70117ead2c47585ba07713 + & (Join-Path $vcpkgRoot 'bootstrap-vcpkg.bat') -disableMetrics + & (Join-Path $vcpkgRoot 'vcpkg.exe') install openssl:arm64-windows-static-md --clean-after-build --disable-metrics + + $opensslDir = Join-Path $vcpkgRoot 'installed\arm64-windows-static-md' + Add-Content -Path $env:GITHUB_ENV -Value "OPENSSL_DIR=$opensslDir" + Add-Content -Path $env:GITHUB_ENV -Value "OPENSSL_STATIC=1" + Add-Content -Path $env:GITHUB_ENV -Value "VCPKG_ROOT=$vcpkgRoot" + Add-Content -Path $env:GITHUB_ENV -Value "VCPKGRS_TRIPLET=arm64-windows-static-md" + - name: Run Python tests with coverage working-directory: ${{ env.NEMO_FLOW_CI_WORKSPACE }} run: just --set ci true --set output_dir "${{ github.workspace }}" test-python diff --git a/ATTRIBUTIONS-Python.md b/ATTRIBUTIONS-Python.md index 743b3692..d08622c4 100644 --- a/ATTRIBUTIONS-Python.md +++ b/ATTRIBUTIONS-Python.md @@ -642,6 +642,22 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` +## anthropic (0.101.0) + +### Licenses +License: `MIT` + + - `LICENSE`: +``` +Copyright 2023 Anthropic, PBC. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + ## anyio (4.13.0) ### Licenses @@ -1503,6 +1519,36 @@ which is also made available under the MIT license. Copyright (c) Isaac Muse ``` +## bracex (2.6) + +### Licenses +License: `MIT` + + - `LICENSE.md`: +``` +MIT License + +Copyright (c) 2018 - 2025 Isaac Muse + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + ## cattrs (24.1.3) ### Licenses @@ -1550,6 +1596,36 @@ one at http://mozilla.org/MPL/2.0/. @(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ ``` +## cffi (2.0.0) + +### Licenses +License: `MIT` + + - `LICENSE`: +``` +Except when otherwise stated (look for LICENSE files in directories or +information at the beginning of each file) all software and +documentation is licensed as follows: + + MIT No Attribution + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the + Software is furnished to do so. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +``` + ## cfgv (3.5.0) ### Licenses @@ -1829,6 +1905,18 @@ Apache License END OF TERMS AND CONDITIONS ``` +## cryptography (48.0.0) + +### Licenses +License: `Apache-2.0 OR BSD-3-Clause` + + - `LICENSE`: +``` +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to cryptography are made +under the terms of *both* these licenses. +``` + ## decorator (5.2.1) ### Licenses @@ -1865,6 +1953,16 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## deepagents (0.5.9) + +### Licenses +License: `MIT` + + - `LICENSE`: +``` +(No license file found in locked artifact for deepagents; see package metadata or PyPI.) +``` + ## distlib (0.4.0) ### Licenses @@ -2158,106 +2256,346 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -## docutils (0.21.2) +## distro (1.9.0) ### Licenses -License: `Public Domain OR Python Software Foundation License OR BSD License OR GNU General Public License (GPL)` +License: `Apache License, Version 2.0` - - `COPYING.txt`: + - `LICENSE`: ``` -.. include:: docs/header0.txt - -================== - Copying Docutils -================== +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -:Author: David Goodger -:Contact: goodger@python.org -:Date: $Date: 2023-06-22 17:34:37 +0200 (Do, 22. Jun 2023) $ -:Web site: https://docutils.sourceforge.io/ -:Copyright: This document has been placed in the public domain. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Most of the files included in this project have been placed in the -public domain, and therefore have no license requirements and no -restrictions on copying or usage; see the `Public Domain Dedication`_ -below. There are exceptions_, listed below. -Files in the Sandbox_ are not distributed with Docutils releases and -may have different license terms. + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -Public Domain Dedication -======================== + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -The persons who have associated their work with this project (the -"Dedicator": David Goodger and the many contributors to the Docutils -project) hereby dedicate the entire copyright, less the exceptions_ -listed below, in the work of authorship known as "Docutils" identified -below (the "Work") to the public domain. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -The primary repository for the Work is the Internet World Wide Web -site . The Work consists of the -files within the "docutils" module of the Docutils project Subversion -repository (http://svn.code.sf.net/p/docutils/code/), -whose Internet web interface is located at -. Files dedicated to the -public domain may be identified by the inclusion, near the beginning -of each file, of a declaration of the form:: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - Copyright: This document/module/DTD/stylesheet/file/etc. has been - placed in the public domain. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -Dedicator makes this dedication for the benefit of the public at large -and to the detriment of Dedicator's heirs and successors. Dedicator -intends this dedication to be an overt act of relinquishment in -perpetuity of all present and future rights under copyright law, -whether vested or contingent, in the Work. Dedicator understands that -such relinquishment of all rights includes the relinquishment of all -rights to enforce (by lawsuit or otherwise) those copyrights in the -Work. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Dedicator recognizes that, once placed in the public domain, the Work -may be freely reproduced, distributed, transmitted, used, modified, -built upon, or otherwise exploited by anyone for any purpose, -commercial or non-commercial, and in any way, including by methods -that have not yet been invented or conceived. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -(This dedication is derived from the text of the `Creative Commons -Public Domain Dedication`. [#]_) + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -.. [#] Creative Commons has `retired this legal tool`__ and does not - recommend that it be applied to works: This tool is based on United - States law and may not be applicable outside the US. For dedicating new - works to the public domain, Creative Commons recommend the replacement - Public Domain Dedication CC0_ (CC zero, "No Rights Reserved"). So does - the Free Software Foundation in its license-list_. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." - __ http://creativecommons.org/retiredlicenses - .. _CC0: http://creativecommons.org/about/cc0 + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Exceptions -========== + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -The exceptions to the `Public Domain Dedication`_ above are: + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -* docutils/utils/smartquotes.py + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - Copyright © 2011 Günter Milde, - based on `SmartyPants`_ © 2003 John Gruber - (released under a "revised" `BSD 3-Clause License`_ included in the file) - and smartypants.py © 2004, 2007 Chad Miller. - Released under the terms of the `BSD 2-Clause License`_ - (`local copy `__). + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - .. _SmartyPants: http://daringfireball.net/projects/smartypants/ + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -* docutils/utils/math/latex2mathml.py + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - Copyright © Jens Jørgen Mortensen, Günter Milde. - Released under the terms of the `BSD 2-Clause License`_ - (`local copy `__). + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -* | docutils/utils/math/math2html.py, - | docutils/writers/html5_polyglot/math.css + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +## docstring-parser (0.18.0) + +### Licenses +License: `MIT` + + - `LICENSE.md`: +``` +The MIT License (MIT) + +Copyright (c) 2018 Marcin Kurczewski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +## docutils (0.21.2) + +### Licenses +License: `Public Domain OR Python Software Foundation License OR BSD License OR GNU General Public License (GPL)` + + - `COPYING.txt`: +``` +.. include:: docs/header0.txt + +================== + Copying Docutils +================== + +:Author: David Goodger +:Contact: goodger@python.org +:Date: $Date: 2023-06-22 17:34:37 +0200 (Do, 22. Jun 2023) $ +:Web site: https://docutils.sourceforge.io/ +:Copyright: This document has been placed in the public domain. + +Most of the files included in this project have been placed in the +public domain, and therefore have no license requirements and no +restrictions on copying or usage; see the `Public Domain Dedication`_ +below. There are exceptions_, listed below. +Files in the Sandbox_ are not distributed with Docutils releases and +may have different license terms. + + +Public Domain Dedication +======================== + +The persons who have associated their work with this project (the +"Dedicator": David Goodger and the many contributors to the Docutils +project) hereby dedicate the entire copyright, less the exceptions_ +listed below, in the work of authorship known as "Docutils" identified +below (the "Work") to the public domain. + +The primary repository for the Work is the Internet World Wide Web +site . The Work consists of the +files within the "docutils" module of the Docutils project Subversion +repository (http://svn.code.sf.net/p/docutils/code/), +whose Internet web interface is located at +. Files dedicated to the +public domain may be identified by the inclusion, near the beginning +of each file, of a declaration of the form:: + + Copyright: This document/module/DTD/stylesheet/file/etc. has been + placed in the public domain. + +Dedicator makes this dedication for the benefit of the public at large +and to the detriment of Dedicator's heirs and successors. Dedicator +intends this dedication to be an overt act of relinquishment in +perpetuity of all present and future rights under copyright law, +whether vested or contingent, in the Work. Dedicator understands that +such relinquishment of all rights includes the relinquishment of all +rights to enforce (by lawsuit or otherwise) those copyrights in the +Work. + +Dedicator recognizes that, once placed in the public domain, the Work +may be freely reproduced, distributed, transmitted, used, modified, +built upon, or otherwise exploited by anyone for any purpose, +commercial or non-commercial, and in any way, including by methods +that have not yet been invented or conceived. + +(This dedication is derived from the text of the `Creative Commons +Public Domain Dedication`. [#]_) + +.. [#] Creative Commons has `retired this legal tool`__ and does not + recommend that it be applied to works: This tool is based on United + States law and may not be applicable outside the US. For dedicating new + works to the public domain, Creative Commons recommend the replacement + Public Domain Dedication CC0_ (CC zero, "No Rights Reserved"). So does + the Free Software Foundation in its license-list_. + + __ http://creativecommons.org/retiredlicenses + .. _CC0: http://creativecommons.org/about/cc0 + +Exceptions +========== + +The exceptions to the `Public Domain Dedication`_ above are: + +* docutils/utils/smartquotes.py + + Copyright © 2011 Günter Milde, + based on `SmartyPants`_ © 2003 John Gruber + (released under a "revised" `BSD 3-Clause License`_ included in the file) + and smartypants.py © 2004, 2007 Chad Miller. + Released under the terms of the `BSD 2-Clause License`_ + (`local copy `__). + + .. _SmartyPants: http://daringfireball.net/projects/smartypants/ + +* docutils/utils/math/latex2mathml.py + + Copyright © Jens Jørgen Mortensen, Günter Milde. + Released under the terms of the `BSD 2-Clause License`_ + (`local copy `__). + +* | docutils/utils/math/math2html.py, + | docutils/writers/html5_polyglot/math.css Copyright © 2009,2010 Alex Fernández; 2021 Günter Milde @@ -2395,28 +2733,448 @@ License: `MIT` ``` The MIT License (MIT) -Copyright (c) 2016 Tomás Aparicio +Copyright (c) 2016 Tomás Aparicio + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +## frozenlist (1.8.0) + +### Licenses +License: `Apache-2.0` + + - `LICENSE`: +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +## google-auth (2.52.0) + +### Licenses +License: `Apache 2.0` + + - `LICENSE`: +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## frozenlist (1.8.0) +## google-genai (1.75.0) ### Licenses License: `Apache-2.0` @@ -2603,7 +3361,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -2611,7 +3369,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -2952,6 +3710,36 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## jiter (0.14.0) + +### Licenses +License: `MIT` + + - `LICENSE`: +``` +The MIT License (MIT) + +Copyright (c) 2022 to present Samuel Colvin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + ## jsonpatch (1.33) ### Licenses @@ -3036,6 +3824,36 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` +## langchain-anthropic (1.4.3) + +### Licenses +License: `MIT` + + - `LICENSE`: +``` +MIT License + +Copyright (c) 2023 LangChain, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + ## langchain-core (1.3.3) ### Licenses @@ -3046,6 +3864,36 @@ License: `MIT` (No license file found in locked artifact for langchain-core; see package metadata or PyPI.) ``` +## langchain-google-genai (4.2.2) + +### Licenses +License: `MIT` + + - `LICENSE`: +``` +MIT License + +Copyright (c) 2023 LangChain, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + ## langchain-nvidia-ai-endpoints (1.3.0) ### Licenses @@ -4654,6 +5502,108 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` +## pyasn1 (0.6.3) + +### Licenses +License: `BSD-2-Clause` + + - `LICENSE.rst`: +``` +Copyright (c) 2005-2020, Ilya Etingof +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +``` + +## pyasn1-modules (0.4.2) + +### Licenses +License: `BSD` + + - `LICENSE.txt`: +``` +Copyright (c) 2005-2020, Ilya Etingof +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +``` + +## pycparser (3.0) + +### Licenses +License: `BSD-3-Clause` + + - `LICENSE`: +``` +pycparser -- A C parser in Python + +Copyright (c) 2008-2022, Eli Bendersky +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the copyright holder nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + ## pydantic (2.12.5) ### Licenses @@ -6283,6 +7233,18 @@ are: """ ``` +## sniffio (1.3.1) + +### Licenses +License: `MIT OR Apache-2.0` + + - `LICENSE`: +``` +This software is made available under the terms of *either* of the +licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to are +made under the terms of *both* these licenses. +``` + ## snowballstemmer (3.0.1) ### Licenses @@ -8350,6 +9312,36 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` +## wcmatch (10.1) + +### Licenses +License: `MIT` + + - `LICENSE.md`: +``` +MIT License + +Copyright (c) 2018 - 2025 Isaac Muse + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + ## wcwidth (0.6.0) ### Licenses @@ -8386,6 +9378,39 @@ for any purpose and without fee is hereby granted. The author disclaims all warranties with regard to this software. ``` +## websockets (16.0) + +### Licenses +License: `BSD-3-Clause` + + - `LICENSE`: +``` +Copyright (c) Aymeric Augustin and contributors + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + ## xxhash (3.7.0) ### Licenses diff --git a/docs/getting-started/python/deepagents.md b/docs/getting-started/python/deepagents.md new file mode 100644 index 00000000..77b7eaa2 --- /dev/null +++ b/docs/getting-started/python/deepagents.md @@ -0,0 +1,120 @@ + + +# NeMo Flow Deep Agents Integration + +Use the `nemo_flow.integrations.deepagents` package to add NeMo Flow +observability to Deep Agents applications through the LangChain and LangGraph +integration surfaces that Deep Agents builds on. + +## Setup + +Install the Deep Agents integration extra in your application environment. + +::::{tab-set} +:sync-group: install-tool + +:::{tab-item} uv +:selected: +:sync: uv + +```bash +uv add "nemo-flow[deepagents]" +``` +::: + +:::{tab-item} pip +:sync: pip + +```bash +pip install "nemo-flow[deepagents]" +``` +::: + +:::: + +The example below uses the NVIDIA LangChain provider. Install that provider +extra too if you want to run the example as written: + +::::{tab-set} +:sync-group: install-tool + +:::{tab-item} uv +:selected: +:sync: uv + +```bash +uv add "nemo-flow[deepagents,langchain-nvidia]" +``` +::: + +:::{tab-item} pip +:sync: pip + +```bash +pip install "nemo-flow[deepagents,langchain-nvidia]" +``` +::: + +:::: + +## Usage Example + +```python +import nemo_flow +from deepagents import create_deep_agent +from nemo_flow.integrations.deepagents import ( + NemoFlowDeepAgentsCallbackHandler, + add_nemo_flow_integration, +) + +agent = create_deep_agent( + **add_nemo_flow_integration( + model="nvidia:nvidia/nemotron-3-nano-30b-a3b", + tools=[], + skills=["/skills/research/"], + name="main-agent", + ) +) + +input_payload = { + "messages": [ + { + "role": "user", + "content": "Research recent GPU news", + } + ] +} + +with nemo_flow.scope.scope("deepagents-request", nemo_flow.ScopeType.Agent): + result = agent.invoke( + input_payload, + config={"callbacks": [NemoFlowDeepAgentsCallbackHandler()]}, + ) + +final_message = result["messages"][-1] +print(f"Final response: {final_message.content}") +``` + +## Observability + +The integration composes the existing NeMo Flow LangChain and LangGraph hooks, +then emits Deep Agents-specific marks for configured skills, subagents, and +human-in-the-loop lifecycle events. + +It captures: + +- LangChain model and tool calls through NeMo Flow managed execution. +- LangGraph run scopes through callbacks. +- Human-in-the-loop interrupt and resume marks. +- Configured skills and subagent summaries at agent-run start. +- In-process dictionary-style subagents with the same NeMo Flow middleware, so + their model and tool calls are captured when Deep Agents invokes them. + +Remote graphs or processes still need NeMo Flow instrumentation in that graph +or process to capture their internal model and tool calls. + +Refer to [Export Observability Data](../../export-observability-data/about.md) +for details on exporting NeMo Flow observability data to third-party systems. diff --git a/docs/getting-started/python/index.md b/docs/getting-started/python/index.md index 17b860f7..ef0b7544 100644 --- a/docs/getting-started/python/index.md +++ b/docs/getting-started/python/index.md @@ -7,7 +7,7 @@ SPDX-License-Identifier: Apache-2.0 This quick start shows the smallest Python workflow that emits scope, tool, and LLM events. -[LangChain](https://www.langchain.com/langchain) and [LangGraph](https://www.langchain.com/langgraph) users should start with the [LangChain integration](langchain.md) or [LangGraph integration](langgraph.md) guides for the best experience in those frameworks. +[LangChain](https://www.langchain.com/langchain), [LangGraph](https://www.langchain.com/langgraph), and [Deep Agents](https://www.langchain.com/deep-agents) users should start with the [LangChain integration](langchain.md), [LangGraph integration](langgraph.md), and [Deep Agents integration](deepagents.md) guides for the best experience in those frameworks. ## Choose an Install Path @@ -129,18 +129,21 @@ Use these links to continue from the quick start into the core runtime concepts. - [LangChain integration](langchain.md) - [LangGraph integration](langgraph.md) +- [Deep Agents integration](deepagents.md) - [Scopes](../../about/concepts/scopes.md) - [Middleware](../../about/concepts/middleware.md) - [Plugins](../../about/concepts/plugins.md) ## Framework Integrations -Use these guides when your Python application already uses LangChain or -LangGraph and you want NeMo Flow observability through their public APIs. +Use these guides when your Python application already uses LangChain, +LangGraph, or Deep Agents and you want NeMo Flow observability through their +public APIs. ```{toctree} :maxdepth: 1 LangChain Integration LangGraph Integration +Deep Agents Integration ``` diff --git a/docs/integrate-frameworks/about.md b/docs/integrate-frameworks/about.md index bec160b5..9ae886dd 100644 --- a/docs/integrate-frameworks/about.md +++ b/docs/integrate-frameworks/about.md @@ -29,10 +29,8 @@ Use these signals to decide whether this documentation path matches your current - Are building or reviewing third-party integration patches If you own the application call sites directly, use [Instrument Applications](../instrument-applications/about.md) first. -If your application uses [LangChain](https://www.langchain.com/langchain) or -[LangGraph](https://www.langchain.com/langgraph), start with -[LangChain Integration](../getting-started/python/langchain.md) or -[LangGraph Integration](../getting-started/python/langgraph.md). +If your application uses [LangChain](https://www.langchain.com/langchain), +[LangGraph](https://www.langchain.com/langgraph), or [Deep Agents](https://www.langchain.com/deep-agents), start with [LangChain Integration](../getting-started/python/langchain.md), [LangGraph Integration](../getting-started/python/langgraph.md), or [Deep Agents Integration](../getting-started/python/deepagents.md). ## Guides diff --git a/justfile b/justfile index e16cf77c..ec8d3bc2 100644 --- a/justfile +++ b/justfile @@ -725,7 +725,7 @@ build-python: #!/usr/bin/env bash {{ bash_helpers }} cd "$NEMO_FLOW_REPO_ROOT" - uv sync --inexact --no-install-project --no-install-package nemo-flow --extra langchain + uv sync --inexact --no-install-project --no-install-package nemo-flow --extra langchain --extra langgraph --extra deepagents activate_project_venv if is_true "{{ ci }}"; then prepare_llvm_cov_workspace @@ -854,7 +854,7 @@ test-python: fi cargo test -p nemo-flow-python --lib fi - uv sync --inexact --no-install-project --no-install-package nemo-flow --extra langchain + uv sync --inexact --no-install-project --no-install-package nemo-flow --extra langchain --extra langgraph --extra deepagents activate_project_venv python_executable="$(project_python_executable)" use_project_python_source "$python_executable" diff --git a/pyproject.toml b/pyproject.toml index 2414cd53..7b7d652a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -77,6 +77,7 @@ docs = [ langchain = [ "langchain>=1.2.11,<2.0.0", "langchain-core", + "langgraph", # allow any compatible version ] langgraph = [ @@ -84,6 +85,11 @@ langgraph = [ "langgraph>=1.1.10,<2.0.0", ] +deepagents = [ + "nemo-flow[langgraph]", + "deepagents>=0.5.3,<0.6.0", +] + langchain-nvidia = [ "nemo-flow[langchain]", "langchain-nvidia-ai-endpoints~=1.0", diff --git a/python/nemo_flow/integrations/deepagents/__init__.py b/python/nemo_flow/integrations/deepagents/__init__.py new file mode 100644 index 00000000..5be91048 --- /dev/null +++ b/python/nemo_flow/integrations/deepagents/__init__.py @@ -0,0 +1,113 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""NeMo Flow integrations for Deep Agents.""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from typing import Any + +from nemo_flow.integrations.deepagents.callbacks import NemoFlowDeepAgentsCallbackHandler +from nemo_flow.integrations.deepagents.middleware import NemoFlowDeepAgentsMiddleware + + +def add_nemo_flow_integration( + kwargs: Mapping[str, Any] | None = None, + *, + instrument_subagents: bool = True, + **overrides: Any, +) -> dict[str, Any]: + """ + Receives the keyword arguments for ``create_deep_agent`` and returns them with NeMo Flow observability attached. + + Use this helper as ``create_deep_agent(**add_nemo_flow_integration(...))``. + It injects Deep Agents-aware middleware at the top level, adds the same + middleware to dictionary-style custom subagents that do not inherit parent + middleware, and leaves any provided backend unchanged. + """ + observed = dict(kwargs or {}) + observed.update(overrides) + + skills = _string_sequence(observed.get("skills")) + subagents = list(observed.get("subagents") or ()) + subagent_summaries = [_subagent_summary(subagent) for subagent in subagents] + backend = observed.get("backend") + backend_name = type(backend).__name__ if backend is not None else None + + middleware = list(observed.get("middleware") or ()) + _append_middleware( + middleware, + NemoFlowDeepAgentsMiddleware( + agent_name=observed.get("name"), + skills=skills, + subagents=subagent_summaries, + backend_name=backend_name, + ), + ) + observed["middleware"] = middleware + + if instrument_subagents and subagents: + observed["subagents"] = [_instrument_subagent(subagent) for subagent in subagents] + + return observed + + +def _append_middleware(middleware: list[Any], new_middleware: NemoFlowDeepAgentsMiddleware) -> None: + if any(isinstance(item, NemoFlowDeepAgentsMiddleware) for item in middleware): + return + middleware.append(new_middleware) + + +def _instrument_subagent(subagent: Any) -> Any: + if not isinstance(subagent, dict): + return subagent + + observed = dict(subagent) + middleware = list(observed.get("middleware") or ()) + _append_middleware( + middleware, + NemoFlowDeepAgentsMiddleware( + agent_name=observed.get("name"), + skills=_string_sequence(observed.get("skills")), + subagents=None, + ), + ) + observed["middleware"] = middleware + return observed + + +def _subagent_summary(subagent: Any) -> Mapping[str, Any]: + if isinstance(subagent, Mapping): + summary: dict[str, Any] = {"type": "subagent"} + for key in ("name", "description", "model", "graph_id", "url"): + value = subagent.get(key) + if value is not None: + summary[key] = value + if "skills" in subagent: + summary["skills"] = _string_sequence(subagent.get("skills")) + return summary + + summary = {"type": type(subagent).__name__} + for attr in ("name", "description", "graph_id", "url"): + value = getattr(subagent, attr, None) + if value is not None: + summary[attr] = value + return summary + + +def _string_sequence(value: Any) -> Sequence[str] | None: + if value is None: + return None + if isinstance(value, str): + return [value] + if isinstance(value, Sequence): + return [str(item) for item in value] + return [str(value)] + + +__all__ = [ + "NemoFlowDeepAgentsCallbackHandler", + "NemoFlowDeepAgentsMiddleware", + "add_nemo_flow_integration", +] diff --git a/python/nemo_flow/integrations/deepagents/_events.py b/python/nemo_flow/integrations/deepagents/_events.py new file mode 100644 index 00000000..6be73fe8 --- /dev/null +++ b/python/nemo_flow/integrations/deepagents/_events.py @@ -0,0 +1,62 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Shared Deep Agents observability helpers.""" + +from __future__ import annotations + +import logging +from collections.abc import Mapping, Sequence +from typing import Any + +import nemo_flow + +_logger = logging.getLogger(__name__) + + +def event_base_name(kind: str) -> str: + """Return a stable event base name for a Deep Agents category.""" + return { + "human_in_the_loop": "DeepAgents Human In The Loop", + "skill": "DeepAgents Skills", + }.get(kind, "DeepAgents") + + +def json_safe(value: Any) -> nemo_flow.Json: + """Return a conservative JSON-compatible value.""" + if value is None or isinstance(value, str | int | float | bool): + return value + if isinstance(value, Mapping): + return {str(key): json_safe(item) for key, item in value.items()} + if isinstance(value, Sequence) and not isinstance(value, str | bytes | bytearray): + return [json_safe(item) for item in value] + if isinstance(value, bytes | bytearray): + return f"<{type(value).__name__}: {len(value)} bytes>" + return repr(value) + + +def emit_mark( + base_name: str, + kind: str, + phase: str, + data: Mapping[str, Any], + *, + metadata: Mapping[str, Any] | None = None, +) -> None: + """Emit a Deep Agents mark event without changing framework behavior.""" + event_metadata: dict[str, Any] = { + "integration": "deepagents", + "deepagents_kind": kind, + "phase": phase, + } + if metadata: + event_metadata.update(metadata) + + try: + nemo_flow.scope.event( + f"{base_name} {phase.title()}", + data=json_safe(data), + metadata=json_safe(event_metadata), + ) + except Exception: + _logger.debug("NeMo Flow: Deep Agents mark emission failed", exc_info=True) diff --git a/python/nemo_flow/integrations/deepagents/callbacks.py b/python/nemo_flow/integrations/deepagents/callbacks.py new file mode 100644 index 00000000..c03384ec --- /dev/null +++ b/python/nemo_flow/integrations/deepagents/callbacks.py @@ -0,0 +1,92 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Deep Agents callback handler for NeMo Flow observability.""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from typing import Any + +from nemo_flow.integrations.deepagents._events import emit_mark, event_base_name +from nemo_flow.integrations.langgraph.callbacks import NemoFlowCallbackHandler as LangGraphNemoFlowCallbackHandler + +_GraphEventKey = tuple[str | None, str | None, tuple[str, ...]] + + +class NemoFlowDeepAgentsCallbackHandler(LangGraphNemoFlowCallbackHandler): + """Bridge Deep Agents LangGraph lifecycle events to NeMo Flow marks.""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self._hitl_interrupts: set[_GraphEventKey] = set() + + def _emit_graph_mark(self, name: str, data: dict[str, Any]) -> None: + key = self._graph_event_key(data) + if name == "Graph Interrupt" and self._has_hitl_interrupt(data): + self._hitl_interrupts.add(key) + self._emit_human_in_the_loop_mark(name, "interrupt", data) + return + + if name == "Graph Resume" and key in self._hitl_interrupts: + self._hitl_interrupts.discard(key) + self._emit_human_in_the_loop_mark(name, "resume", data) + return + + super()._emit_graph_mark(name, data) + + def _emit_human_in_the_loop_mark(self, name: str, phase: str, data: dict[str, Any]) -> None: + emit_mark( + event_base_name("human_in_the_loop"), + "human_in_the_loop", + phase, + data, + metadata={"langgraph_event": name}, + ) + + @staticmethod + def _graph_event_key(data: Mapping[str, Any]) -> _GraphEventKey: + run_id = NemoFlowDeepAgentsCallbackHandler._string_or_none(data.get("run_id")) + checkpoint_id = NemoFlowDeepAgentsCallbackHandler._string_or_none(data.get("checkpoint_id")) + checkpoint_ns = data.get("checkpoint_ns") + if not isinstance(checkpoint_ns, Sequence) or isinstance(checkpoint_ns, str | bytes | bytearray): + return (run_id, checkpoint_id, ()) + return (run_id, checkpoint_id, tuple(str(part) for part in checkpoint_ns)) + + @staticmethod + def _string_or_none(value: Any) -> str | None: + if value is None: + return None + return value if isinstance(value, str) else str(value) + + @staticmethod + def _has_hitl_interrupt(data: Mapping[str, Any]) -> bool: + interrupts = data.get("interrupts") + if not isinstance(interrupts, Sequence) or isinstance(interrupts, str | bytes | bytearray): + return False + return any(NemoFlowDeepAgentsCallbackHandler._is_hitl_interrupt_payload(interrupt) for interrupt in interrupts) + + @staticmethod + def _is_hitl_interrupt_payload(interrupt: Any) -> bool: + if not isinstance(interrupt, Mapping): + return False + return NemoFlowDeepAgentsCallbackHandler._is_hitl_request(interrupt.get("value")) + + @staticmethod + def _is_hitl_request(value: Any) -> bool: + if not isinstance(value, Mapping): + return False + action_requests = value.get("action_requests") + review_configs = value.get("review_configs") + return NemoFlowDeepAgentsCallbackHandler._is_mapping_sequence( + action_requests + ) and NemoFlowDeepAgentsCallbackHandler._is_mapping_sequence(review_configs) + + @staticmethod + def _is_mapping_sequence(value: Any) -> bool: + if not isinstance(value, Sequence) or isinstance(value, str | bytes | bytearray): + return False + return all(isinstance(item, Mapping) for item in value) + + +__all__ = ["NemoFlowDeepAgentsCallbackHandler"] diff --git a/python/nemo_flow/integrations/deepagents/middleware.py b/python/nemo_flow/integrations/deepagents/middleware.py new file mode 100644 index 00000000..f87d8acd --- /dev/null +++ b/python/nemo_flow/integrations/deepagents/middleware.py @@ -0,0 +1,67 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Deep Agents middleware for NeMo Flow observability.""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from typing import Any + +from nemo_flow.integrations.deepagents._events import emit_mark, event_base_name +from nemo_flow.integrations.langchain.middleware import NemoFlowMiddleware + + +class NemoFlowDeepAgentsMiddleware(NemoFlowMiddleware): + """Route Deep Agents model/tool calls through NeMo Flow and emit semantic events. + + Deep Agents is built on LangChain ``AgentMiddleware`` and LangGraph. This + middleware keeps the existing NeMo Flow LangChain wrapping behavior, then + emits Deep Agents configuration marks. + """ + + def __init__( + self, + *, + name: str = "NemoFlowDeepAgentsMiddleware", + agent_name: str | None = None, + skills: Sequence[str] | None = None, + subagents: Sequence[Mapping[str, Any]] | None = None, + backend_name: str | None = None, + ) -> None: + super().__init__(name=name) + self._agent_name = agent_name + self._skills = list(skills) if skills is not None else None + self._subagents = list(subagents) if subagents is not None else None + self._backend_name = backend_name + + def before_agent(self, state: Any, runtime: Any) -> None: + """Emit run configuration metadata for sync Deep Agents runs.""" + self._emit_agent_configuration() + + async def abefore_agent(self, state: Any, runtime: Any) -> None: + """Emit run configuration metadata for async Deep Agents runs.""" + self._emit_agent_configuration() + + def _emit_agent_configuration(self) -> None: + data: dict[str, Any] = {} + if self._agent_name is not None: + data["agent_name"] = self._agent_name + + if self._skills is not None: + data["skills"] = list(self._skills) + + if self._subagents is not None: + data["subagents"] = list(self._subagents) + + if self._backend_name is not None: + data["backend"] = self._backend_name + + if data: + emit_mark( + event_base_name("skill"), + "skill", + "configured", + data, + metadata={"agent_name": self._agent_name} if self._agent_name is not None else None, + ) diff --git a/python/nemo_flow/integrations/langchain/_serialization.py b/python/nemo_flow/integrations/langchain/_serialization.py index 9769c972..0c13ec7d 100644 --- a/python/nemo_flow/integrations/langchain/_serialization.py +++ b/python/nemo_flow/integrations/langchain/_serialization.py @@ -15,12 +15,14 @@ messages_from_dict, messages_to_dict, ) +from langgraph.types import Command, Send from nemo_flow.codecs import AnthropicMessagesCodec, LlmCodec, OpenAIChatCodec, OpenAIResponsesCodec if TYPE_CHECKING: from langchain.agents.middleware import ModelRequest + # In order to infer codec support from LangChain chat model types, we need to import them here. # However these may not be installed in the user's environment. _HAS_ANTHROPIC = False @@ -176,16 +178,34 @@ def model_response_from_json(payload: Any, codec: Any) -> ModelResponse[Any]: raise TypeError(f"NeMo Flow model execution returned {type(decoded)!r}, expected ModelResponse") -def _prepare_outputs(outputs: dict[str, Any] | list[Any] | ToolMessage | BaseMessage) -> dict[str, Any] | list[Any]: +def _prepare_outputs(outputs: Any) -> Any: """Prepare a NeMo Flow scope output dict for returning to LangChain.""" if isinstance(outputs, dict): prepared_outputs = {} for key, value in outputs.items(): prepared_outputs[key] = _prepare_outputs(value) - elif isinstance(outputs, list): + elif isinstance(outputs, list | tuple): prepared_outputs = [] for value in outputs: prepared_outputs.append(_prepare_outputs(value)) + elif isinstance(outputs, Command): + prepared_outputs = { + "type": "command", + "command": { + "graph": _prepare_outputs(outputs.graph), + "update": _prepare_outputs(outputs.update), + "resume": _prepare_outputs(outputs.resume), + "goto": _prepare_outputs(outputs.goto), + }, + } + elif isinstance(outputs, Send): + prepared_outputs = { + "type": "send", + "send": { + "node": outputs.node, + "arg": _prepare_outputs(outputs.arg), + }, + } elif isinstance(outputs, ToolMessage): prepared_outputs = { "type": "tool_message", diff --git a/python/nemo_flow/integrations/langchain/callbacks.py b/python/nemo_flow/integrations/langchain/callbacks.py index eab9235b..bba0e36c 100644 --- a/python/nemo_flow/integrations/langchain/callbacks.py +++ b/python/nemo_flow/integrations/langchain/callbacks.py @@ -102,4 +102,4 @@ def _pop_scope(self, run_id: UUID, *, output: dict[str, typing.Any] | None = Non prepared_outputs = _prepare_outputs(output) if output is not None else None nemo_flow.scope.pop(handle, output=prepared_outputs) except Exception: - _logger.debug("NeMo Flow: scope.pop failed", exc_info=True) + _logger.warning("NeMo Flow: scope.pop failed", exc_info=True) diff --git a/python/nemo_flow/typed.py b/python/nemo_flow/typed.py index a8bdf629..cf1b112d 100644 --- a/python/nemo_flow/typed.py +++ b/python/nemo_flow/typed.py @@ -89,6 +89,11 @@ def _serialize_value(value: object) -> Json: return [_serialize_value(item) for item in value] if isinstance(value, dict): return {cast(str, key): _serialize_value(item) for key, item in value.items()} + if hasattr(value, "model_dump"): + try: + return cast(_SupportsModelDump, value).model_dump(mode="json") + except Exception: + pass # Intentional: fall through to the default string encoding return cast(Json, value) diff --git a/python/tests/conftest.py b/python/tests/conftest.py new file mode 100644 index 00000000..cc4b9794 --- /dev/null +++ b/python/tests/conftest.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Shared pytest fixtures for Python tests.""" + +from __future__ import annotations + +import typing +from collections.abc import Iterator +from uuid import uuid4 + +import pytest + +if typing.TYPE_CHECKING: + import nemo_flow + + +@pytest.fixture(name="subscribed_events") +def subscribed_events_fixture() -> Iterator[list[nemo_flow.Event]]: + import nemo_flow + + events: list[nemo_flow.Event] = [] + + def event_recorder(event: nemo_flow.Event) -> None: + events.append(event) + + subscriber_name = f"test-{uuid4()}" + nemo_flow.subscribers.register(subscriber_name, event_recorder) + yield events + nemo_flow.subscribers.deregister(subscriber_name) diff --git a/python/tests/integrations/deepagents/test_deepagents_integration.py b/python/tests/integrations/deepagents/test_deepagents_integration.py new file mode 100644 index 00000000..ea70cb01 --- /dev/null +++ b/python/tests/integrations/deepagents/test_deepagents_integration.py @@ -0,0 +1,256 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Tests for the Deep Agents NeMo Flow integration.""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any, cast +from unittest.mock import MagicMock +from uuid import uuid4 + +from deepagents import create_deep_agent +from deepagents.backends import LocalShellBackend +from langchain_core.language_models.fake_chat_models import FakeMessagesListChatModel +from langchain_core.messages import AIMessage, ToolMessage +from langgraph.callbacks import GraphInterruptEvent, GraphResumeEvent +from langgraph.types import Interrupt + +import nemo_flow +from nemo_flow.integrations.deepagents import ( + NemoFlowDeepAgentsCallbackHandler, + NemoFlowDeepAgentsMiddleware, + add_nemo_flow_integration, +) + + +class _MockDeepAgentsChatModel(FakeMessagesListChatModel): + model: str = "mock-model" + + def bind_tools(self, _tools: Any, *_args: Any, **_kwargs: Any) -> _MockDeepAgentsChatModel: + return self + + +def _filter_mark_events(events: list[nemo_flow.Event]) -> list[nemo_flow.MarkEvent]: + return [event for event in events if isinstance(event, nemo_flow.MarkEvent)] + + +def _mark_data(mark: nemo_flow.MarkEvent) -> dict[str, Any]: + assert isinstance(mark.data, dict) + return cast(dict[str, Any], mark.data) + + +def _mark_metadata(mark: nemo_flow.MarkEvent) -> dict[str, Any]: + assert isinstance(mark.metadata, dict) + return cast(dict[str, Any], mark.metadata) + + +def test_before_agent_emits_configuration_mark(subscribed_events: list[nemo_flow.Event]): + middleware = NemoFlowDeepAgentsMiddleware( + agent_name="main-agent", + skills=["/skills/research/"], + subagents=[{"name": "researcher"}], + backend_name="StateBackend", + ) + + with nemo_flow.scope.scope("request", nemo_flow.ScopeType.Agent): + middleware.before_agent(MagicMock(name="mock_state"), MagicMock(name="mock_runtime")) + + marks = _filter_mark_events(subscribed_events) + assert [mark.name for mark in marks] == ["DeepAgents Skills Configured"] + assert _mark_metadata(marks[0])["deepagents_kind"] == "skill" + assert _mark_data(marks[0])["skills"] == ["/skills/research/"] + assert _mark_data(marks[0])["subagents"] == [{"name": "researcher"}] + assert _mark_data(marks[0])["backend"] == "StateBackend" + + +def test_callback_handler_emits_human_in_the_loop_marks(subscribed_events: list[nemo_flow.Event]): + handler = NemoFlowDeepAgentsCallbackHandler() + run_id = uuid4() + hitl_request = { + "action_requests": [ + { + "name": "edit_file", + "args": {"file_path": "/workspace/notes.md"}, + "description": "Tool execution requires approval", + } + ], + "review_configs": [{"action_name": "edit_file", "allowed_decisions": ["approve", "reject"]}], + } + + with nemo_flow.scope.scope("request", nemo_flow.ScopeType.Agent): + handler.on_interrupt( + GraphInterruptEvent( + run_id=run_id, + status="interrupt_after", + checkpoint_id="checkpoint-1", + checkpoint_ns=("parent",), + interrupts=(Interrupt(hitl_request, id="interrupt-1"),), + ) + ) + handler.on_resume( + GraphResumeEvent( + run_id=run_id, + status="pending", + checkpoint_id="checkpoint-1", + checkpoint_ns=("parent",), + ) + ) + + marks = _filter_mark_events(subscribed_events) + assert [mark.name for mark in marks] == [ + "DeepAgents Human In The Loop Interrupt", + "DeepAgents Human In The Loop Resume", + ] + assert _mark_metadata(marks[0])["deepagents_kind"] == "human_in_the_loop" + assert _mark_data(marks[0])["interrupts"] == [{"id": "interrupt-1", "value": hitl_request}] + assert _mark_metadata(marks[1])["phase"] == "resume" + + +def test_callback_handler_falls_back_for_non_hitl_interrupt(subscribed_events: list[nemo_flow.Event]): + handler = NemoFlowDeepAgentsCallbackHandler() + run_id = uuid4() + + with nemo_flow.scope.scope("request", nemo_flow.ScopeType.Agent): + handler.on_interrupt( + GraphInterruptEvent( + run_id=run_id, + status="interrupt_after", + checkpoint_id="checkpoint-1", + checkpoint_ns=("parent",), + interrupts=(Interrupt("custom pause", id="interrupt-1"),), + ) + ) + handler.on_resume( + GraphResumeEvent( + run_id=run_id, + status="pending", + checkpoint_id="checkpoint-1", + checkpoint_ns=("parent",), + ) + ) + + marks = _filter_mark_events(subscribed_events) + assert [mark.name for mark in marks] == ["Graph Interrupt", "Graph Resume"] + assert _mark_metadata(marks[0])["integration"] == "langgraph" + assert "deepagents_kind" not in _mark_metadata(marks[0]) + + +def test_add_nemo_flow_integration_preserves_backend(): + mock_backend = MagicMock(name="mock_backend") + mock_compiled_subagent = MagicMock(name="mock_compiled_subagent") + kwargs = add_nemo_flow_integration( + model="mock-model", + name="main-agent", + skills=["/skills/main/"], + backend=mock_backend, + middleware=[MagicMock(name="mock_middleware")], + subagents=[ + {"name": "researcher", "description": "Research", "skills": ["/skills/research/"]}, + mock_compiled_subagent, + ], + ) + + assert kwargs["backend"] is mock_backend + assert any(isinstance(item, NemoFlowDeepAgentsMiddleware) for item in kwargs["middleware"]) + assert any(isinstance(item, NemoFlowDeepAgentsMiddleware) for item in kwargs["subagents"][0]["middleware"]) + assert kwargs["subagents"][1] is mock_compiled_subagent + + +def test_e2e_agent( + tmp_path: Path, + subscribed_events: list[nemo_flow.Event], +): + reviewer_description = "Reviews filesystem work performed by the main agent." + reviewer_model = _MockDeepAgentsChatModel( + responses=[ + AIMessage(content="reviewer verified turtle"), + ] + ) + model = _MockDeepAgentsChatModel( + responses=[ + AIMessage( + content="", + tool_calls=[ + { + "name": "write_file", + "args": {"file_path": "/turtle", "content": "shell"}, + "id": "call-1", + } + ], + ), + AIMessage( + content="", + tool_calls=[ + { + "name": "task", + "args": { + "description": "Review the file creation result and report whether turtle was created.", + "subagent_type": "reviewer", + }, + "id": "call-2", + } + ], + ), + AIMessage(content="created turtle after reviewer verified turtle"), + ] + ) + kwargs = add_nemo_flow_integration( + model=model, + tools=[], + name="main-agent", + backend=LocalShellBackend(root_dir=tmp_path, virtual_mode=True), + subagents=[ + { + "name": "reviewer", + "description": reviewer_description, + "system_prompt": "Review the delegated task and return one concise verification sentence.", + "model": reviewer_model, + "tools": [], + } + ], + ) + agent = create_deep_agent(**kwargs) + + with nemo_flow.scope.scope("deepagents-request", nemo_flow.ScopeType.Agent): + result = agent.invoke({"messages": [{"role": "user", "content": "Create a file named turtle."}]}) + + assert (tmp_path / "turtle").read_text() == "shell" + assert result["messages"][-1].content == "created turtle after reviewer verified turtle" + found_write_file_message = False + found_subagent_message = False + for message in result["messages"]: + if ( + isinstance(message, ToolMessage) + and message.name == "write_file" + and message.content == "Updated file /turtle" + ): + found_write_file_message = True + if isinstance(message, ToolMessage) and message.content == "reviewer verified turtle": + found_subagent_message = True + + assert found_write_file_message + assert found_subagent_message + + expected_events = [ + "scope.start.deepagents-request", + "mark..DeepAgents Skills Configured", + "scope.start.mock-model", + "scope.end.mock-model", + "scope.start.write_file", + "scope.end.write_file", + "scope.start.mock-model", + "scope.end.mock-model", + "scope.start.task", + "mark..DeepAgents Skills Configured", + "scope.start.mock-model", + "scope.end.mock-model", + "scope.end.task", + "scope.start.mock-model", + "scope.end.mock-model", + "scope.end.deepagents-request", + ] + event_strings = [f"{event.kind}.{getattr(event, 'scope_category', '')}.{event.name}" for event in subscribed_events] + + assert event_strings == expected_events diff --git a/python/tests/integrations/langchain/test_callbacks.py b/python/tests/integrations/langchain/test_callbacks.py index b0830de4..60700e1e 100644 --- a/python/tests/integrations/langchain/test_callbacks.py +++ b/python/tests/integrations/langchain/test_callbacks.py @@ -10,6 +10,8 @@ from uuid import uuid4 import pytest +from langchain_core.messages import ToolMessage +from langgraph.types import Command from nemo_flow.integrations.langchain import callbacks as callbacks_module from nemo_flow.integrations.langchain.callbacks import NemoFlowCallbackHandler @@ -118,6 +120,59 @@ def test_on_chain_error_pops_scope(self, handler: NemoFlowCallbackHandler, mock_ mock_nemo_flow.scope.pop.assert_called_once_with(handle, output={"error": "RuntimeError('boom')"}) assert run_id not in handler._scope_handles + def test_on_chain_end_prepares_command_outputs(self, handler: NemoFlowCallbackHandler, mock_nemo_flow: MagicMock): + run_id = uuid4() + handler.on_chain_start( + {"name": "MyChain"}, + {"input": "test"}, + run_id=run_id, + ) + handle = handler._scope_handles[run_id] + + handler.on_chain_end( + { + "result": Command( + update={ + "messages": [ + ToolMessage( + content="done", + tool_call_id="call-1", + name="task", + ) + ] + } + ) + }, + run_id=run_id, + ) + + mock_nemo_flow.scope.pop.assert_called_once_with( + handle, + output={ + "result": { + "type": "command", + "command": { + "graph": None, + "update": { + "messages": [ + { + "type": "tool_message", + "tool_call": { + "name": "task", + "id": None, + "tool_call_id": "call-1", + "content": "done", + }, + } + ] + }, + "resume": None, + "goto": [], + }, + } + }, + ) + def test_parent_scope_passed_to_push(self, handler: NemoFlowCallbackHandler, mock_nemo_flow: MagicMock): parent_id = uuid4() child_id = uuid4() diff --git a/python/tests/integrations/langchain/test_middleware.py b/python/tests/integrations/langchain/test_middleware.py index 86c5470e..b5b1a18f 100644 --- a/python/tests/integrations/langchain/test_middleware.py +++ b/python/tests/integrations/langchain/test_middleware.py @@ -12,7 +12,7 @@ import pytest from langchain.agents import create_agent from langchain.agents.middleware import ModelRequest, ModelResponse, ToolCallRequest -from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.language_models import BaseChatModel from langchain_core.messages import AIMessage, HumanMessage, ToolMessage from langchain_core.tools import tool diff --git a/python/tests/integrations/langgraph/test_langgraph_integration.py b/python/tests/integrations/langgraph/test_langgraph_integration.py index 96878a72..02e9443b 100644 --- a/python/tests/integrations/langgraph/test_langgraph_integration.py +++ b/python/tests/integrations/langgraph/test_langgraph_integration.py @@ -6,7 +6,6 @@ from __future__ import annotations import asyncio -from collections.abc import Iterator from typing import TYPE_CHECKING, Any, cast from uuid import uuid4 @@ -59,19 +58,6 @@ def async_graph_fixture() -> CompiledStateGraph: return _build_graph(use_async=True) -@pytest.fixture(name="subscribed_events") -def subscribed_events_fixture() -> Iterator[list[nemo_flow.Event]]: - events: list[nemo_flow.Event] = [] - - def event_recorder(event: nemo_flow.Event) -> None: - events.append(event) - - subscriber_name = f"langgraph-test-{uuid4()}" - nemo_flow.subscribers.register(subscriber_name, event_recorder) - yield events - nemo_flow.subscribers.deregister(subscriber_name) - - def events_to_strings(events: list[nemo_flow.Event]) -> list[str]: event_strings: list[str] = [] diff --git a/uv.lock b/uv.lock index c7474a6e..bef7c48c 100644 --- a/uv.lock +++ b/uv.lock @@ -160,6 +160,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] +[[package]] +name = "anthropic" +version = "0.101.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "docstring-parser" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/cb/9d0123243e749ac3a579972b2c398971bce1dc57bcc4efb08066df610360/anthropic-0.101.0.tar.gz", hash = "sha256:1116a6a87c55757e0fbe3e1ba40804fbd04de7963601a6dd6b539a889f18de3e", size = 758603, upload-time = "2026-05-11T15:46:33.944Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/b2/74ff06762d005ecf1658929a292df0acb786d025f6a6c54fcb30e2dc7761/anthropic-0.101.0-py3-none-any.whl", hash = "sha256:cc3cc6576989471e2aa9132258034ad0ff0d8fe500b04ac499e4e46ed68c5ed0", size = 753594, upload-time = "2026-05-11T15:46:32.216Z" }, +] + [[package]] name = "anyio" version = "4.13.0" @@ -222,6 +241,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, ] +[[package]] +name = "bracex" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/9a/fec38644694abfaaeca2798b58e276a8e61de49e2e37494ace423395febc/bracex-2.6.tar.gz", hash = "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7", size = 26642, upload-time = "2025-06-22T19:12:31.254Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/2a/9186535ce58db529927f6cf5990a849aa9e052eea3e2cfefe20b9e1802da/bracex-2.6-py3-none-any.whl", hash = "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952", size = 11508, upload-time = "2025-06-22T19:12:29.781Z" }, +] + [[package]] name = "cattrs" version = "24.1.3" @@ -243,6 +271,76 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, ] +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + [[package]] name = "cfgv" version = "3.5.0" @@ -454,6 +552,65 @@ toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] +[[package]] +name = "cryptography" +version = "48.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, + { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, + { url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" }, + { url = "https://files.pythonhosted.org/packages/6b/84/70e3feea9feea87fd7cbe77efb2712ae1e3e6edf10749dc6e95f4e60e455/cryptography-48.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec", size = 7986556, upload-time = "2026-05-04T22:58:11.172Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/18e07a618bb5442ba10cf4df16e99c071365528aa570dfcb8c02e25a303b/cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18", size = 4684776, upload-time = "2026-05-04T22:58:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/be/6a/4ea3b4c6c6759794d5ee2103c304a5076dc4b19ae1f9fe47dba439e159e9/cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20", size = 4698121, upload-time = "2026-05-04T22:58:16.448Z" }, + { url = "https://files.pythonhosted.org/packages/2f/59/6ff6ad6cae03bb887da2a5860b2c9805f8dac969ef01ce563336c49bd1d1/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff", size = 4690042, upload-time = "2026-05-04T22:58:18.544Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b4/fc334ed8cfd705aca282fe4d8f5ae64a8e0f74932e9feecb344610cf6e4d/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c", size = 5282526, upload-time = "2026-05-04T22:58:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/11/08/9f8c5386cc4cd90d8255c7cdd0f5baf459a08502a09de30dc51f553d38dc/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db", size = 4733116, upload-time = "2026-05-04T22:58:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/b8/77/99307d7574045699f8805aa500fa0fb83422d115b5400a064ddd306d7750/cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741", size = 4316030, upload-time = "2026-05-04T22:58:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/fd/36/a608b98337af3cb2aff4818e406649d30572b7031918b04c87d979495348/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166", size = 4689640, upload-time = "2026-05-04T22:58:27.747Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/825010a291b4438aecc1f568bc428189fc1175515223632477c07dc0a6df/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336", size = 5237657, upload-time = "2026-05-04T22:58:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/b9/09/4e76a09b4caa29aad535ddc806f5d4c5d01885bd978bd984fbc6ca032cae/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057", size = 4732362, upload-time = "2026-05-04T22:58:32.009Z" }, + { url = "https://files.pythonhosted.org/packages/18/78/444fa04a77d0cb95f417dda20d450e13c56ba8e5220fc892a1658f44f882/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae", size = 4819580, upload-time = "2026-05-04T22:58:34.254Z" }, + { url = "https://files.pythonhosted.org/packages/38/85/ea67067c70a1fd4be2c63d35eeed82658023021affccc7b17705f8527dd2/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c", size = 4963283, upload-time = "2026-05-04T22:58:36.376Z" }, + { url = "https://files.pythonhosted.org/packages/75/54/cc6d0f3deac3e81c7f847e8a189a12b6cdd65059b43dad25d4316abd849a/cryptography-48.0.0-cp314-cp314t-win32.whl", hash = "sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f", size = 3270954, upload-time = "2026-05-04T22:58:38.791Z" }, + { url = "https://files.pythonhosted.org/packages/49/67/cc947e288c0758a4e5473d1dcb743037ab7785541265a969240b8885441a/cryptography-48.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12", size = 3797313, upload-time = "2026-05-04T22:58:40.746Z" }, + { url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, + { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, + { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, + { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, + { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" }, + { url = "https://files.pythonhosted.org/packages/be/d2/024b5e06be9d44cb021fb0e1a03d34d63989cf56a0fe62f3dfbab695b9b4/cryptography-48.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:84cf79f0dc8b36ac5da873481716e87aef31fcfa0444f9e1d8b4b2cece142855", size = 3950391, upload-time = "2026-05-04T22:59:17.415Z" }, + { url = "https://files.pythonhosted.org/packages/bc/17/3861e17c56fa0fd37491a14a8673fdb77c57fc5693cafe745ea8b06dba75/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fdfef35d751d510fcef5252703621574364fec16418c4a1e5e1055248401054b", size = 4637126, upload-time = "2026-05-04T22:59:20.197Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0a/7e226dbff530f21480727eb764973a7bff2b912f8e15cd4f129e71b56d1d/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0890f502ddf7d9c6426129c3f49f5c0a39278ed7cd6322c8755ffca6ee675a13", size = 4667270, upload-time = "2026-05-04T22:59:22.647Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f2/5a72274ca9f1b2a8b44a662ee0bf1b435909deb473d6f97bcd035bcdbc71/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:ecde28a596bead48b0cfd2a1b4416c3d43074c2d785e3a398d7ec1fc4d0f7fbb", size = 4636797, upload-time = "2026-05-04T22:59:24.912Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e1/48cedb2fe63626e91ded1edad159e2a4fb8b6906c4425eb7749673077ce7/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:4defde8685ae324a9eb9d818717e93b4638ef67070ac9bc15b8ca85f63048355", size = 4666800, upload-time = "2026-05-04T22:59:27.474Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ca/7e8365deec19afb2b2c7be7c1c0aa8f99633b54e90c570999acda93260fc/cryptography-48.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:db63bf618e5dea46c07de12e900fe1cdd2541e6dc9dbae772a70b7d4d4765f6a", size = 3739536, upload-time = "2026-05-04T22:59:29.61Z" }, +] + [[package]] name = "decorator" version = "5.2.1" @@ -463,6 +620,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] +[[package]] +name = "deepagents" +version = "0.5.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain" }, + { name = "langchain-anthropic" }, + { name = "langchain-core" }, + { name = "langchain-google-genai" }, + { name = "langsmith" }, + { name = "wcmatch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/74/776e606f0508a4d7d4c9d061c797dcde43eed2452fea546ae29047aeaaa6/deepagents-0.5.9.tar.gz", hash = "sha256:74fe0f998641b20bda8adac662a018051c623a3c8e5ed4b6ff9ad53fc493a783", size = 165651, upload-time = "2026-05-10T22:31:17.095Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/f6/9698f98da72dfa8dc8e1d0f0542f2407a40a50cfdccf522fdb5cb43e39e2/deepagents-0.5.9-py3-none-any.whl", hash = "sha256:ce24a41763b2793bd21217411e9fb9f187a9128da6789f5a81654da1de9e4c7c", size = 188118, upload-time = "2026-05-10T22:31:15.974Z" }, +] + [[package]] name = "distlib" version = "0.4.0" @@ -472,6 +646,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "docstring-parser" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341, upload-time = "2026-04-14T04:09:19.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", size = 22484, upload-time = "2026-04-14T04:09:18.638Z" }, +] + [[package]] name = "docutils" version = "0.21.2" @@ -613,6 +805,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, ] +[[package]] +name = "google-auth" +version = "2.52.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyasn1-modules" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/f8/80d2493cbedece1c623dc3e3cb1883300871af0dcdae254409522985ac23/google_auth-2.52.0.tar.gz", hash = "sha256:01f30e1a9e3638698d89464f5e603ce29d18e1c0e63ec31ac570aba4e164aaf5", size = 335027, upload-time = "2026-05-07T19:45:24.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fc/2cdc74252746f547f81ff3f02d4d4234a3f411b5de5b61af97e633a060b9/google_auth-2.52.0-py3-none-any.whl", hash = "sha256:aee92803ba0ff93a70a3b8a35c7b4797837751cd6380b63ff38372b98f3ed627", size = 245614, upload-time = "2026-05-07T19:45:21.914Z" }, +] + +[package.optional-dependencies] +requests = [ + { name = "requests" }, +] + +[[package]] +name = "google-genai" +version = "1.75.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "google-auth", extra = ["requests"] }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "sniffio" }, + { name = "tenacity" }, + { name = "typing-extensions" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/59/3ed61240ef20b3ae6ed54e82c6f8b6d1f194947bc6679679dd6cdb037594/google_genai-1.75.0.tar.gz", hash = "sha256:56bac3991b311c93f980c0a2abcd287b672146905df1fbd71c92ed633d5a07cf", size = 539039, upload-time = "2026-05-04T22:48:54.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/b6/552d40e96da22921eb1fead7c14b00b5b5473a20e45959488660fab35ee2/google_genai-1.75.0-py3-none-any.whl", hash = "sha256:8dc4c096e7d6288c3087f6893f582fe52468932464781edb8193bd92b9fefb2c", size = 793726, upload-time = "2026-05-04T22:48:53.033Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -731,6 +962,96 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "jiter" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/1f/198ae537fccb7080a0ed655eb56abf64a92f79489dfbf79f40fa34225bcd/jiter-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7e791e247b8044512e070bd1f3633dc08350d32776d2d6e7473309d0edf256a2", size = 316896, upload-time = "2026-04-10T14:26:01.986Z" }, + { url = "https://files.pythonhosted.org/packages/cf/34/da67cff3fce964a36d03c3e365fb0f8726ade2a6cfd4d3c70107e216ead6/jiter-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71527ce13fd5a0c4e40ad37331f8c547177dbb2dd0a93e5278b6a5eecf748804", size = 321085, upload-time = "2026-04-10T14:26:03.364Z" }, + { url = "https://files.pythonhosted.org/packages/ed/36/4c72e67180d4e71a4f5dcf7886d0840e83c49ab11788172177a77570326e/jiter-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c4a7ab56f746014874f2c525584c0daca1dec37f66fd707ecef3b7e5c2228c", size = 347393, upload-time = "2026-04-10T14:26:05.314Z" }, + { url = "https://files.pythonhosted.org/packages/bc/db/9b39e09ceafa9878235c0fc29e3e3f9b12a4c6a98ea3085b998cadf3accc/jiter-0.14.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:376e9dafff914253bb9d46cdc5f7965607fbe7feb0a491c34e35f92b2770702e", size = 372937, upload-time = "2026-04-10T14:26:06.884Z" }, + { url = "https://files.pythonhosted.org/packages/b0/96/0dcba1d7a82c1b720774b48ef239376addbaf30df24c34742ac4a57b67b2/jiter-0.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23ad2a7a9da1935575c820428dd8d2490ce4d23189691ce33da1fc0a58e14e1c", size = 463646, upload-time = "2026-04-10T14:26:08.345Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e3/f61b71543e746e6b8b805e7755814fc242715c16f1dba58e1cbccb8032c2/jiter-0.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54b3ddf5786bc7732d293bba3411ac637ecfa200a39983166d1df86a59a43c9f", size = 380225, upload-time = "2026-04-10T14:26:10.161Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5e/0ddeb7096aca099114abe36c4921016e8d251e6f35f5890240b31f1f60ae/jiter-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c001d5a646c2a50dc055dd526dad5d5245969e8234d2b1131d0451e81f3a373", size = 358682, upload-time = "2026-04-10T14:26:11.574Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d1/fe0c46cd7fda9cad8f1ff9ad217dc61f1e4280b21052ec6dfe88c1446ef2/jiter-0.14.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:834bb5bdabca2e91592a03d373838a8d0a1b8bbde7077ae6913fd2fc51812d00", size = 359973, upload-time = "2026-04-10T14:26:13.316Z" }, + { url = "https://files.pythonhosted.org/packages/ac/21/f5317f91729b501019184771c80d60abd89907009e7bfa6c7e348c5bdd44/jiter-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4e9178be60e229b1b2b0710f61b9e24d1f4f8556985a83ff4c4f95920eea7314", size = 397568, upload-time = "2026-04-10T14:26:15.212Z" }, + { url = "https://files.pythonhosted.org/packages/e9/05/79d8f33fb2bf168db0df5c9cd16fe440a8ada57e929d3677b22712c2568f/jiter-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7e4ccff04ec03614e62c613e976a3a5860dc9714ce8266f44328bdc8b1cab2c", size = 522535, upload-time = "2026-04-10T14:26:16.956Z" }, + { url = "https://files.pythonhosted.org/packages/5c/00/d1e3ff3d2a465e67f08507d74bafb2dcd29eba91dc939820e39e8dea38b8/jiter-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69539d936fb5d55caf6ecd33e2e884de083ff0ea28579780d56c4403094bb8d9", size = 556709, upload-time = "2026-04-10T14:26:18.5Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/bbb2189f62ace8d95e869aa4c84c9946616f301e2d02895a6f20dcc3bba3/jiter-0.14.0-cp311-cp311-win32.whl", hash = "sha256:4927d09b3e572787cc5e0a5318601448e1ab9391bcef95677f5840c2d00eaa6d", size = 208660, upload-time = "2026-04-10T14:26:20.511Z" }, + { url = "https://files.pythonhosted.org/packages/b8/86/c500b53dcbf08575f5963e536ebd757a1f7c568272ba5d180b212c9a87fb/jiter-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:42d6ed359ac49eb922fdd565f209c57340aa06d589c84c8413e42a0f9ae1b842", size = 204659, upload-time = "2026-04-10T14:26:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/75/4a/a676249049d42cb29bef82233e4fe0524d414cbe3606c7a4b311193c2f77/jiter-0.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:6dd689f5f4a5a33747b28686e051095beb214fe28cfda5e9fe58a295a788f593", size = 194772, upload-time = "2026-04-10T14:26:23.458Z" }, + { url = "https://files.pythonhosted.org/packages/5a/68/7390a418f10897da93b158f2d5a8bd0bcd73a0f9ec3bb36917085bb759ef/jiter-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2fb2ce3a7bc331256dfb14cefc34832366bb28a9aca81deaf43bbf2a5659e607", size = 316295, upload-time = "2026-04-10T14:26:24.887Z" }, + { url = "https://files.pythonhosted.org/packages/60/a0/5854ac00ff63551c52c6c89534ec6aba4b93474e7924d64e860b1c94165b/jiter-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5252a7ca23785cef5d02d4ece6077a1b556a410c591b379f82091c3001e14844", size = 315898, upload-time = "2026-04-10T14:26:26.601Z" }, + { url = "https://files.pythonhosted.org/packages/41/a1/4f44832650a16b18e8391f1bf1d6ca4909bc738351826bcc198bba4357f4/jiter-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409578cbd77c338975670ada777add4efd53379667edf0aceea730cabede6fb", size = 343730, upload-time = "2026-04-10T14:26:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/a329e9d469f86307203594b1707e11ae51c3348d03bfd514a5f997870012/jiter-0.14.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ede4331a1899d604463369c730dbb961ffdc5312bc7f16c41c2896415b1304a", size = 370102, upload-time = "2026-04-10T14:26:30.089Z" }, + { url = "https://files.pythonhosted.org/packages/94/c1/5e3dfc59635aa4d4c7bd20a820ac1d09b8ed851568356802cf1c08edb3cf/jiter-0.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92cd8b6025981a041f5310430310b55b25ca593972c16407af8837d3d7d2ca01", size = 461335, upload-time = "2026-04-10T14:26:31.911Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1b/dd157009dbc058f7b00108f545ccb72a2d56461395c4fc7b9cfdccb00af4/jiter-0.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:351bf6eda4e3a7ceb876377840c702e9a3e4ecc4624dbfb2d6463c67ae52637d", size = 378536, upload-time = "2026-04-10T14:26:33.595Z" }, + { url = "https://files.pythonhosted.org/packages/91/78/256013667b7c10b8834f8e6e54cd3e562d4c6e34227a1596addccc05e38c/jiter-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfbeb93d9ecd9ca128bbf8910120367777973fa193fb9a39c31237d8df165", size = 353859, upload-time = "2026-04-10T14:26:35.098Z" }, + { url = "https://files.pythonhosted.org/packages/de/d9/137d65ade9093a409fe80955ce60b12bb753722c986467aeda47faf450ad/jiter-0.14.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ae039aaef8de3f8157ecc1fdd4d85043ac4f57538c245a0afaecb8321ec951c3", size = 357626, upload-time = "2026-04-10T14:26:36.685Z" }, + { url = "https://files.pythonhosted.org/packages/2e/48/76750835b87029342727c1a268bea8878ab988caf81ee4e7b880900eeb5a/jiter-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7d9d51eb96c82a9652933bd769fe6de66877d6eb2b2440e281f2938c51b5643e", size = 393172, upload-time = "2026-04-10T14:26:38.097Z" }, + { url = "https://files.pythonhosted.org/packages/a6/60/456c4e81d5c8045279aefe60e9e483be08793828800a4e64add8fdde7f2a/jiter-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d824ca4148b705970bf4e120924a212fdfca9859a73e42bd7889a63a4ea6bb98", size = 520300, upload-time = "2026-04-10T14:26:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9f/2020e0984c235f678dced38fe4eec3058cf528e6af36ebf969b410305941/jiter-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff3a6465b3a0f54b1a430f45c3c0ba7d61ceb45cbc3e33f9e1a7f638d690baf3", size = 553059, upload-time = "2026-04-10T14:26:40.991Z" }, + { url = "https://files.pythonhosted.org/packages/ef/32/e2d298e1a22a4bbe6062136d1c7192db7dba003a6975e51d9a9eecabc4c2/jiter-0.14.0-cp312-cp312-win32.whl", hash = "sha256:5dec7c0a3e98d2a3f8a2e67382d0d7c3ac60c69103a4b271da889b4e8bb1e129", size = 206030, upload-time = "2026-04-10T14:26:42.517Z" }, + { url = "https://files.pythonhosted.org/packages/36/ac/96369141b3d8a4a8e4590e983085efe1c436f35c0cda940dd76d942e3e40/jiter-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:fc7e37b4b8bc7e80a63ad6cfa5fc11fab27dbfea4cc4ae644b1ab3f273dc348f", size = 201603, upload-time = "2026-04-10T14:26:44.328Z" }, + { url = "https://files.pythonhosted.org/packages/01/c3/75d847f264647017d7e3052bbcc8b1e24b95fa139c320c5f5066fa7a0bdd/jiter-0.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:ee4a72f12847ef29b072aee9ad5474041ab2924106bdca9fcf5d7d965853e057", size = 191525, upload-time = "2026-04-10T14:26:46Z" }, + { url = "https://files.pythonhosted.org/packages/97/2a/09f70020898507a89279659a1afe3364d57fc1b2c89949081975d135f6f5/jiter-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:af72f204cf4d44258e5b4c1745130ac45ddab0e71a06333b01de660ab4187a94", size = 315502, upload-time = "2026-04-10T14:26:47.697Z" }, + { url = "https://files.pythonhosted.org/packages/d6/be/080c96a45cd74f9fce5db4fd68510b88087fb37ffe2541ff73c12db92535/jiter-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4b77da71f6e819be5fbcec11a453fde5b1d0267ef6ed487e2a392fd8e14e4e3a", size = 314870, upload-time = "2026-04-10T14:26:49.149Z" }, + { url = "https://files.pythonhosted.org/packages/7d/5e/2d0fee155826a968a832cc32438de5e2a193292c8721ca70d0b53e58245b/jiter-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f4ea612fe8b84b8b04e51d0e78029ecf3466348e25973f953de6e6a59aa4c1", size = 343406, upload-time = "2026-04-10T14:26:50.762Z" }, + { url = "https://files.pythonhosted.org/packages/70/af/bf9ee0d3a4f8dc0d679fc1337f874fe60cdbf841ebbb304b374e1c9aaceb/jiter-0.14.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62fe2451f8fcc0240261e6a4df18ecbcd58327857e61e625b2393ea3b468aac9", size = 369415, upload-time = "2026-04-10T14:26:52.188Z" }, + { url = "https://files.pythonhosted.org/packages/0f/83/8e8561eadba31f4d3948a5b712fb0447ec71c3560b57a855449e7b8ddc98/jiter-0.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6112f26f5afc75bcb475787d29da3aa92f9d09c7858f632f4be6ffe607be82e9", size = 461456, upload-time = "2026-04-10T14:26:53.611Z" }, + { url = "https://files.pythonhosted.org/packages/f6/c9/c5299e826a5fe6108d172b344033f61c69b1bb979dd8d9ddd4278a160971/jiter-0.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:215a6cb8fb7dc702aa35d475cc00ddc7f970e5c0b1417fb4b4ac5d82fa2a29db", size = 378488, upload-time = "2026-04-10T14:26:55.211Z" }, + { url = "https://files.pythonhosted.org/packages/5d/37/c16d9d15c0a471b8644b1abe3c82668092a707d9bedcf076f24ff2e380cd/jiter-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ab96a30fb3cb2c7e0cd33f7616c8860da5f5674438988a54ac717caccdbaa", size = 353242, upload-time = "2026-04-10T14:26:56.705Z" }, + { url = "https://files.pythonhosted.org/packages/58/ea/8050cb0dc654e728e1bfacbc0c640772f2181af5dedd13ae70145743a439/jiter-0.14.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:3a99c1387b1f2928f799a9de899193484d66206a50e98233b6b088a7f0c1edb2", size = 356823, upload-time = "2026-04-10T14:26:58.281Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/cf71506d270e5f84d97326bf220e47aed9b95e9a4a060758fb07772170ab/jiter-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab18d11074485438695f8d34a1b6da61db9754248f96d51341956607a8f39985", size = 392564, upload-time = "2026-04-10T14:27:00.018Z" }, + { url = "https://files.pythonhosted.org/packages/b0/cc/8c6c74a3efb5bd671bfd14f51e8a73375464ca914b1551bc3b40e26ac2c9/jiter-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:801028dcfc26ac0895e4964cbc0fd62c73be9fd4a7d7b1aaf6e5790033a719b7", size = 520322, upload-time = "2026-04-10T14:27:01.664Z" }, + { url = "https://files.pythonhosted.org/packages/41/24/68d7b883ec959884ddf00d019b2e0e82ba81b167e1253684fa90519ce33c/jiter-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ad425b087aafb4a1c7e1e98a279200743b9aaf30c3e0ba723aec93f061bd9bc8", size = 552619, upload-time = "2026-04-10T14:27:03.316Z" }, + { url = "https://files.pythonhosted.org/packages/b6/89/b1a0985223bbf3150ff9e8f46f98fc9360c1de94f48abe271bbe1b465682/jiter-0.14.0-cp313-cp313-win32.whl", hash = "sha256:882bcb9b334318e233950b8be366fe5f92c86b66a7e449e76975dfd6d776a01f", size = 205699, upload-time = "2026-04-10T14:27:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/4c/19/3f339a5a7f14a11730e67f6be34f9d5105751d547b615ef593fa122a5ded/jiter-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:9b8c571a5dba09b98bd3462b5a53f27209a5cbbe85670391692ede71974e979f", size = 201323, upload-time = "2026-04-10T14:27:06.139Z" }, + { url = "https://files.pythonhosted.org/packages/50/56/752dd89c84be0e022a8ea3720bcfa0a8431db79a962578544812ce061739/jiter-0.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:34f19dcc35cb1abe7c369b3756babf8c7f04595c0807a848df8f26ef8298ef92", size = 191099, upload-time = "2026-04-10T14:27:07.564Z" }, + { url = "https://files.pythonhosted.org/packages/91/28/292916f354f25a1fe8cf2c918d1415c699a4a659ae00be0430e1c5d9ffea/jiter-0.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e89bcd7d426a75bb4952c696b267075790d854a07aad4c9894551a82c5b574ab", size = 320880, upload-time = "2026-04-10T14:27:09.326Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c7/b002a7d8b8957ac3d469bd59c18ef4b1595a5216ae0de639a287b9816023/jiter-0.14.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b25beaa0d4447ea8c7ae0c18c688905d34840d7d0b937f2f7bdd52162c98a40", size = 346563, upload-time = "2026-04-10T14:27:11.287Z" }, + { url = "https://files.pythonhosted.org/packages/f9/3b/f8d07580d8706021d255a6356b8fab13ee4c869412995550ce6ed4ddf97d/jiter-0.14.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a8758dd413c51e3b7f6557cdc6921faf70b14106f45f969f091f5cda990ea", size = 357928, upload-time = "2026-04-10T14:27:12.729Z" }, + { url = "https://files.pythonhosted.org/packages/47/5b/ac1a974da29e35507230383110ffec59998b290a8732585d04e19a9eb5ba/jiter-0.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e1a7eead856a5038a8d291f1447176ab0b525c77a279a058121b5fccee257f6f", size = 203519, upload-time = "2026-04-10T14:27:14.125Z" }, + { url = "https://files.pythonhosted.org/packages/96/6d/9fc8433d667d2454271378a79747d8c76c10b51b482b454e6190e511f244/jiter-0.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e692633a12cda97e352fdcd1c4acc971b1c28707e1e33aeef782b0cbf051975", size = 190113, upload-time = "2026-04-10T14:27:16.638Z" }, + { url = "https://files.pythonhosted.org/packages/4f/1e/354ed92461b165bd581f9ef5150971a572c873ec3b68a916d5aa91da3cc2/jiter-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6f396837fc7577871ca8c12edaf239ed9ccef3bbe39904ae9b8b63ce0a48b140", size = 315277, upload-time = "2026-04-10T14:27:18.109Z" }, + { url = "https://files.pythonhosted.org/packages/a6/95/8c7c7028aa8636ac21b7a55faef3e34215e6ed0cbf5ae58258427f621aa3/jiter-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4d50ea3d8ba4176f79754333bd35f1bbcd28e91adc13eb9b7ca91bc52a6cef9", size = 315923, upload-time = "2026-04-10T14:27:19.603Z" }, + { url = "https://files.pythonhosted.org/packages/47/40/e2a852a44c4a089f2681a16611b7ce113224a80fd8504c46d78491b47220/jiter-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce17f8a050447d1b4153bda4fb7d26e6a9e74eb4f4a41913f30934c5075bf615", size = 344943, upload-time = "2026-04-10T14:27:21.262Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1f/670f92adee1e9895eac41e8a4d623b6da68c4d46249d8b556b60b63f949e/jiter-0.14.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4f1c4b125e1652aefbc2e2c1617b60a160ab789d180e3d423c41439e5f32850", size = 369725, upload-time = "2026-04-10T14:27:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/01/2f/541c9ba567d05de1c4874a0f8f8c5e3fd78e2b874266623da9a775cf46e0/jiter-0.14.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be808176a6a3a14321d18c603f2d40741858a7c4fc982f83232842689fe86dd9", size = 461210, upload-time = "2026-04-10T14:27:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a9/c31cbec09627e0d5de7aeaec7690dba03e090caa808fefd8133137cf45bc/jiter-0.14.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26679d58ba816f88c3849306dd58cb863a90a1cf352cdd4ef67e30ccf8a77994", size = 380002, upload-time = "2026-04-10T14:27:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/50/02/3c05c1666c41904a2f607475a73e7a4763d1cbde2d18229c4f85b22dc253/jiter-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80381f5a19af8fa9aef743f080e34f6b25ebd89656475f8cf0470ec6157052aa", size = 354678, upload-time = "2026-04-10T14:27:27.701Z" }, + { url = "https://files.pythonhosted.org/packages/7d/97/e15b33545c2b13518f560d695f974b9891b311641bdcf178d63177e8801e/jiter-0.14.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:004df5fdb8ecbd6d99f3227df18ba1a259254c4359736a2e6f036c944e02d7c5", size = 358920, upload-time = "2026-04-10T14:27:29.256Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d2/8b1461def6b96ba44530df20d07ef7a1c7da22f3f9bf1727e2d611077bf1/jiter-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cff5708f7ed0fa098f2b53446c6fa74c48469118e5cd7497b4f1cd569ab06928", size = 394512, upload-time = "2026-04-10T14:27:31.344Z" }, + { url = "https://files.pythonhosted.org/packages/e3/88/837566dd6ed6e452e8d3205355afd484ce44b2533edfa4ed73a298ea893e/jiter-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:2492e5f06c36a976d25c7cc347a60e26d5470178d44cde1b9b75e60b4e519f28", size = 521120, upload-time = "2026-04-10T14:27:33.299Z" }, + { url = "https://files.pythonhosted.org/packages/89/6b/b00b45c4d1b4c031777fe161d620b755b5b02cdade1e316dcb46e4471d63/jiter-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7609cfbe3a03d37bfdbf5052012d5a879e72b83168a363deae7b3a26564d57de", size = 553668, upload-time = "2026-04-10T14:27:34.868Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d8/6fe5b42011d19397433d345716eac16728ac241862a2aac9c91923c7509a/jiter-0.14.0-cp314-cp314-win32.whl", hash = "sha256:7282342d32e357543565286b6450378c3cd402eea333fc1ebe146f1fabb306fc", size = 207001, upload-time = "2026-04-10T14:27:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/e5/43/5c2e08da1efad5e410f0eaaabeadd954812612c33fbbd8fd5328b489139d/jiter-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd77945f38866a448e73b0b7637366afa814d4617790ecd88a18ca74377e6c02", size = 202187, upload-time = "2026-04-10T14:27:38Z" }, + { url = "https://files.pythonhosted.org/packages/aa/1f/6e39ac0b4cdfa23e606af5b245df5f9adaa76f35e0c5096790da430ca506/jiter-0.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:f2d4c61da0821ee42e0cdf5489da60a6d074306313a377c2b35af464955a3611", size = 192257, upload-time = "2026-04-10T14:27:39.504Z" }, + { url = "https://files.pythonhosted.org/packages/05/57/7dbc0ffbbb5176a27e3518716608aa464aee2e2887dc938f0b900a120449/jiter-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bf7ff85517dd2f20a5750081d2b75083c1b269cf75afc7511bdf1f9548beb3b", size = 323441, upload-time = "2026-04-10T14:27:41.039Z" }, + { url = "https://files.pythonhosted.org/packages/83/6e/7b3314398d8983f06b557aa21b670511ec72d3b79a68ee5e4d9bff972286/jiter-0.14.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ef8791c3e78d6c6b157c6d360fbb5c715bebb8113bc6a9303c5caff012754a", size = 348109, upload-time = "2026-04-10T14:27:42.552Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4f/8dc674bcd7db6dba566de73c08c763c337058baff1dbeb34567045b27cdc/jiter-0.14.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e74663b8b10da1fe0f4e4703fd7980d24ad17174b6bb35d8498d6e3ebce2ae6a", size = 368328, upload-time = "2026-04-10T14:27:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/188e09a1f20906f98bbdec44ed820e19f4e8eb8aff88b9d1a5a497587ff3/jiter-0.14.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1aca29ba52913f78362ec9c2da62f22cdc4c3083313403f90c15460979b84d9b", size = 463301, upload-time = "2026-04-10T14:27:46.717Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f0/19046ef965ed8f349e8554775bb12ff4352f443fbe12b95d31f575891256/jiter-0.14.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b39b7d87a952b79949af5fef44d2544e58c21a28da7f1bae3ef166455c61746", size = 378891, upload-time = "2026-04-10T14:27:48.32Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c3/da43bd8431ee175695777ee78cf0e93eacbb47393ff493f18c45231b427d/jiter-0.14.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d918a68b26e9fab068c2b5453577ef04943ab2807b9a6275df2a812599a310", size = 360749, upload-time = "2026-04-10T14:27:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/72/26/e054771be889707c6161dbdec9c23d33a9ec70945395d70f07cfea1e9a6f/jiter-0.14.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:b08997c35aee1201c1a5361466a8fb9162d03ae7bf6568df70b6c859f1e654a4", size = 358526, upload-time = "2026-04-10T14:27:51.504Z" }, + { url = "https://files.pythonhosted.org/packages/c3/0f/7bea65ea2a6d91f2bf989ff11a18136644392bf2b0497a1fa50934c30a9c/jiter-0.14.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:260bf7ca20704d58d41f669e5e9fe7fe2fa72901a6b324e79056f5d52e9c9be2", size = 393926, upload-time = "2026-04-10T14:27:53.368Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/b1ff7d70deef61ac0b7c6c2f12d2ace950cdeecb4fdc94500a0926802857/jiter-0.14.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:37826e3df29e60f30a382f9294348d0238ef127f4b5d7f5f8da78b5b9e050560", size = 521052, upload-time = "2026-04-10T14:27:55.058Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7b/3b0649983cbaf15eda26a414b5b1982e910c67bd6f7b1b490f3cfc76896a/jiter-0.14.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:645be49c46f2900937ba0eaf871ad5183c96858c0af74b6becc7f4e367e36e06", size = 553716, upload-time = "2026-04-10T14:27:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/97/f8/33d78c83bd93ae0c0af05293a6660f88a1977caef39a6d72a84afab94ce0/jiter-0.14.0-cp314-cp314t-win32.whl", hash = "sha256:2f7877ed45118de283786178eceaf877110abacd04fde31efff3940ae9672674", size = 207957, upload-time = "2026-04-10T14:27:59.285Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ac/2b760516c03e2227826d1f7025d89bf6bf6357a28fe75c2a2800873c50bf/jiter-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:14c0cb10337c49f5eafe8e7364daca5e29a020ea03580b8f8e6c597fed4e1588", size = 204690, upload-time = "2026-04-10T14:28:00.962Z" }, + { url = "https://files.pythonhosted.org/packages/dc/2e/a44c20c58aeed0355f2d326969a181696aeb551a25195f47563908a815be/jiter-0.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5419d4aa2024961da9fe12a9cfe7484996735dca99e8e090b5c88595ef1951ff", size = 191338, upload-time = "2026-04-10T14:28:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/32/a1/ef34ca2cab2962598591636a1804b93645821201cc0095d4a93a9a329c9d/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:a25ffa2dbbdf8721855612f6dca15c108224b12d0c4024d0ac3d7902132b4211", size = 311366, upload-time = "2026-04-10T14:28:27.943Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/520576a532a6b8a6f42747afed289c8448c879a34d7802fe2c832d4fd38f/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ac9cbaa86c10996b92bd12c91659b60f939f8e28fcfa6bc11a0e90a774ce95b", size = 309873, upload-time = "2026-04-10T14:28:29.688Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7c/c16db114ea1f2f532f198aa8dc39585026af45af362c69a0492f31bc4821/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:844e73b6c56b505e9e169234ea3bdea2ea43f769f847f47ac559ba1d2361ebea", size = 344816, upload-time = "2026-04-10T14:28:31.348Z" }, + { url = "https://files.pythonhosted.org/packages/99/8f/15e7741ff19e9bcd4d753f7ff22f988fd54592f134ca13701c13ea8c20e0/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52c076f187405fc21523c746c04399c9af8ece566077ed147b2126f2bcba577", size = 351445, upload-time = "2026-04-10T14:28:33.093Z" }, + { url = "https://files.pythonhosted.org/packages/21/42/9042c3f3019de4adcb8c16591c325ec7255beea9fcd33a42a43f3b0b1000/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:fbd9e482663ca9d005d051330e4d2d8150bb208a209409c10f7e7dfdf7c49da9", size = 308810, upload-time = "2026-04-10T14:28:34.673Z" }, + { url = "https://files.pythonhosted.org/packages/60/cf/a7e19b308bd86bb04776803b1f01a5f9a287a4c55205f4708827ee487fbf/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:33a20d838b91ef376b3a56896d5b04e725c7df5bc4864cc6569cf046a8d73b6d", size = 308443, upload-time = "2026-04-10T14:28:36.658Z" }, + { url = "https://files.pythonhosted.org/packages/ca/44/e26ede3f0caeff93f222559cb0cc4ca68579f07d009d7b6010c5b586f9b1/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:432c4db5255d86a259efde91e55cb4c8d18c0521d844c9e2e7efcce3899fb016", size = 343039, upload-time = "2026-04-10T14:28:38.356Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" }, +] + [[package]] name = "jsonpatch" version = "1.33" @@ -766,6 +1087,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/59/20/959f6098c79158afe5aedce7de05c3700f10d293890ef9e5dace6c3ad94b/langchain-1.2.18-py3-none-any.whl", hash = "sha256:8432d43a65540845ed6f1a783d38d869c4659a6b9405f9a510169ad40d2f7bae", size = 113643, upload-time = "2026-05-08T13:59:18.461Z" }, ] +[[package]] +name = "langchain-anthropic" +version = "1.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anthropic" }, + { name = "langchain-core" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/e3/d2f9dec95602524b1cfb4be2747ba5bc38d32501b2a56cb4bcb76e80bb45/langchain_anthropic-1.4.3.tar.gz", hash = "sha256:f8a2442463c0629b1b3110eaeaa56fdbdc87df2a802f8c7f5ecf611eb4874ec8", size = 685219, upload-time = "2026-05-03T17:33:27.118Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/55/482a1968c95275e8be6d8c1e53b54f0f7be0b8b155ce1608c947a95cf543/langchain_anthropic-1.4.3-py3-none-any.whl", hash = "sha256:65466e0f2f95909a009708f2958e917dfdbfab79c612b4484a30866a85e1f291", size = 50389, upload-time = "2026-05-03T17:33:25.671Z" }, +] + [[package]] name = "langchain-core" version = "1.3.3" @@ -786,6 +1121,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1f/01/4771b7ab2af1d1aba5b710bd8f13d9225c609425214b357590a17b01be77/langchain_core-1.3.3-py3-none-any.whl", hash = "sha256:18aae8506f37da7f74398492279a7d6efcee4f8e23c4c41c7af080eeb7ef7bd1", size = 543857, upload-time = "2026-05-05T19:02:34.52Z" }, ] +[[package]] +name = "langchain-google-genai" +version = "4.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filetype" }, + { name = "google-genai" }, + { name = "langchain-core" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/78/dfe068937338727b0dee637d971d59fe2fa275f9d0f0edee3fa80e811846/langchain_google_genai-4.2.2.tar.gz", hash = "sha256:5fc774bf41d1dc1c1a5ba8d7b9f2017dfa77e30653c9b44d2dfbaf0e877e7388", size = 267457, upload-time = "2026-04-15T15:08:32.18Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/5c/adf81d68ab89b4cf505e690f8c1956d11b5969c831c951c7b4b1b1818080/langchain_google_genai-4.2.2-py3-none-any.whl", hash = "sha256:c8d09aac0304d26f1c2483e41a350f15587af1fbe034c39a304e1e17a3b743f3", size = 67605, upload-time = "2026-04-15T15:08:31.346Z" }, +] + [[package]] name = "langchain-nvidia-ai-endpoints" version = "1.3.0" @@ -1173,14 +1523,22 @@ name = "nemo-flow" source = { editable = "." } [package.optional-dependencies] +deepagents = [ + { name = "deepagents" }, + { name = "langchain" }, + { name = "langchain-core" }, + { name = "langgraph" }, +] langchain = [ { name = "langchain" }, { name = "langchain-core" }, + { name = "langgraph" }, ] langchain-nvidia = [ { name = "langchain" }, { name = "langchain-core" }, { name = "langchain-nvidia-ai-endpoints" }, + { name = "langgraph" }, ] langgraph = [ { name = "langchain" }, @@ -1220,16 +1578,17 @@ test = [ [package.metadata] requires-dist = [ + { name = "deepagents", marker = "extra == 'deepagents'", specifier = ">=0.5.3,<0.6.0" }, { name = "langchain", marker = "extra == 'langchain'", specifier = ">=1.2.11,<2.0.0" }, - { name = "langchain", marker = "extra == 'langchain-nvidia'", specifier = ">=1.2.11,<2.0.0" }, - { name = "langchain", marker = "extra == 'langgraph'", specifier = ">=1.2.11,<2.0.0" }, { name = "langchain-core", marker = "extra == 'langchain'" }, - { name = "langchain-core", marker = "extra == 'langchain-nvidia'" }, - { name = "langchain-core", marker = "extra == 'langgraph'" }, { name = "langchain-nvidia-ai-endpoints", marker = "extra == 'langchain-nvidia'", specifier = "~=1.0" }, + { name = "langgraph", marker = "extra == 'langchain'" }, { name = "langgraph", marker = "extra == 'langgraph'", specifier = ">=1.1.10,<2.0.0" }, + { name = "nemo-flow", extras = ["langchain"], marker = "extra == 'langchain-nvidia'" }, + { name = "nemo-flow", extras = ["langchain"], marker = "extra == 'langgraph'" }, + { name = "nemo-flow", extras = ["langgraph"], marker = "extra == 'deepagents'" }, ] -provides-extras = ["langchain", "langchain-nvidia", "langgraph"] +provides-extras = ["deepagents", "langchain", "langchain-nvidia", "langgraph"] [package.metadata.requires-dev] dev = [ @@ -1627,6 +1986,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, ] +[[package]] +name = "pyasn1" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + [[package]] name = "pydantic" version = "2.12.5" @@ -2054,6 +2443,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/03/36/76704c4f312257d6dbaae3c959add2a622f63fcca9d864659ce6d8d97d3d/ruff-0.15.9-py3-none-win_arm64.whl", hash = "sha256:0694e601c028fd97dc5c6ee244675bc241aeefced7ef80cd9c6935a871078f53", size = 11005870, upload-time = "2026-04-02T18:17:15.773Z" }, ] +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + [[package]] name = "snowballstemmer" version = "3.0.1" @@ -2445,6 +2843,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl", hash = "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f", size = 5825084, upload-time = "2026-03-09T17:24:35.378Z" }, ] +[[package]] +name = "wcmatch" +version = "10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bracex" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/3e/c0bdc27cf06f4e47680bd5803a07cb3dfd17de84cde92dd217dcb9e05253/wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af", size = 117421, upload-time = "2025-06-22T19:14:02.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/d8/0d1d2e9d3fabcf5d6840362adcf05f8cf3cd06a73358140c3a97189238ae/wcmatch-10.1-py3-none-any.whl", hash = "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a", size = 39854, upload-time = "2025-06-22T19:14:00.978Z" }, +] + [[package]] name = "wcwidth" version = "0.6.0" @@ -2454,6 +2864,65 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, ] +[[package]] +name = "websockets" +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" }, + { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" }, + { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" }, + { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, + { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" }, + { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, + { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] + [[package]] name = "xxhash" version = "3.7.0" From 0a1a463e0ab8e12a9a784d6466bd21511ecc5f1e Mon Sep 17 00:00:00 2001 From: Will Killian <2007799+willkill07@users.noreply.github.com> Date: Thu, 14 May 2026 20:03:04 -0400 Subject: [PATCH 8/9] chore: refresh dependency locks (#112) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### Overview Refresh dependency locks and runtime compatibility wiring for the `release/0.2` branch. - [x] I confirm this contribution is my own work, or I have the right to submit it under this project license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details - Updates Python optional integration constraints and lockfile entries for the release branch. - Updates OpenClaw peer compatibility to `2026.5.12` and syncs the local hook type mirror with the current session end reasons. - Adjusts Rust reqwest/rustls provider configuration and OTLP HTTP client selection so TLS and exporter initialization remain stable while unused optional transport packages stay out of the lockfile. - Makes Node attribution generation lockfile-driven so platform-gated optional packages are listed consistently across CI and local machines. - Pulls Node license text from integrity-checked locked npm artifacts when packages are not installed on the current platform. - Regenerates Python and Node attribution files from the refreshed lockfiles. Validation run: - `cargo test -p nemo-flow-cli` - `cargo check -p nemo-flow --features otel` - `cargo check -p nemo-flow --features otel,openinference` - `cargo test -p nemo-flow http_config_exports_scope_push_pop_and_marks_without_tokio_runtime -- --nocapture` - `npm test --workspace integrations/openclaw` - `uv run --extra langgraph --extra langchain-nvidia pytest python/tests/integrations/langchain python/tests/integrations/langgraph third_party/langgraph_tests` - `npm audit --ignore-scripts` - `cargo fmt --all --check` - `pre-commit run --files scripts/licensing/attributions_lockfile_md.py ATTRIBUTIONS-Node.md package-lock.json` - signed commit pre-commit suite #### Where should the reviewer start? Start with `scripts/licensing/attributions_lockfile_md.py`, `crates/cli/src/tls.rs`, `crates/core/Cargo.toml`, and `integrations/openclaw/package.json` to review the generator, runtime, and integration compatibility changes before the regenerated lockfile and attribution diffs. #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Relates to: none ## Summary by CodeRabbit * **Dependencies** * Bumped several Python packages (langchain, langchain-core, langgraph, langgraph-*, urllib3) and raised OpenClaw compatibility to 2026.5.12. * **New Features** * Added "shutdown" and "restart" as session termination reasons. * **Chores** * Ensure TLS/crypto provider is initialized before network operations across CLI and services. * **Documentation** * Refreshed third‑party attributions and improved license extraction for Node/Python packages. [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NeMo-Flow/pull/112) Authors: - Will Killian (https://github.com/willkill07) Approvers: - David Gardner (https://github.com/dagardner-nv) - https://github.com/Salonijain27 URL: https://github.com/NVIDIA/NeMo-Flow/pull/112 --- ATTRIBUTIONS-Node.md | 27604 +++++----------- ATTRIBUTIONS-Python.md | 14 +- ATTRIBUTIONS-Rust.md | 268 + Cargo.lock | 199 +- crates/cli/Cargo.toml | 3 +- crates/cli/src/doctor.rs | 1 + crates/cli/src/installer.rs | 1 + crates/cli/src/launcher.rs | 1 + crates/cli/src/main.rs | 1 + crates/cli/src/server.rs | 1 + crates/cli/src/tls.rs | 6 + crates/cli/tests/coverage/gateway_tests.rs | 17 +- crates/cli/tests/coverage/launcher_tests.rs | 4 +- crates/cli/tests/coverage/server_tests.rs | 13 +- crates/core/Cargo.toml | 8 +- .../core/src/observability/openinference.rs | 7 + crates/core/src/observability/otel.rs | 7 + integrations/openclaw/package.json | 10 +- .../openclaw/src/openclaw-hook-types.ts | 4 +- package-lock.json | 3087 +- pyproject.toml | 4 +- scripts/licensing/attributions_lockfile_md.py | 311 +- uv.lock | 46 +- 23 files changed, 10275 insertions(+), 21342 deletions(-) create mode 100644 crates/cli/src/tls.rs diff --git a/ATTRIBUTIONS-Node.md b/ATTRIBUTIONS-Node.md index f2750ab0..101fc3e1 100644 --- a/ATTRIBUTIONS-Node.md +++ b/ATTRIBUTIONS-Node.md @@ -220,32 +220,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## @anthropic-ai/sdk - 0.93.0 -**Repository URL**: https://github.com/anthropics/anthropic-sdk-typescript -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright 2023 Anthropic, PBC. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## @anthropic-ai/vertex-sdk - 0.16.0 -**Repository URL**: https://github.com/anthropics/anthropic-sdk-typescript -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright 2023 Anthropic, PBC. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - ## @aws-crypto/crc32 - 5.2.0 **Repository URL**: https://github.com/aws/aws-sdk-js-crypto-helpers **License Type(s)**: Apache-2.0 @@ -1281,7 +1255,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/client-bedrock - 3.1042.0 +## @aws-sdk/client-bedrock-runtime - 3.1047.0 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -1488,7 +1462,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/client-bedrock-runtime - 3.1042.0 +## @aws-sdk/core - 3.974.10 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -1673,7 +1647,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -1681,7 +1655,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -1695,7 +1669,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/client-cognito-identity - 3.1045.0 +## @aws-sdk/credential-provider-env - 3.972.36 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -1902,7 +1876,23 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/core - 3.974.8 +## @aws-sdk/credential-provider-http - 3.972.38 +**Repository URL**: https://github.com/aws/aws-sdk-js-v3 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +# @aws-sdk/credential-provider-http + +[![NPM version](https://img.shields.io/npm/v/@aws-sdk/credential-provider-http/latest.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-http) +[![NPM downloads](https://img.shields.io/npm/dm/@aws-sdk/credential-provider-http.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-http) + +> An internal transitively required package. + +## Usage + +See https://www.npmjs.com/package/@aws-sdk/credential-providers``` + +## @aws-sdk/credential-provider-ini - 3.972.40 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -2087,7 +2077,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -2095,7 +2085,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -2109,7 +2099,29 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/credential-provider-cognito-identity - 3.972.31 +## @aws-sdk/credential-provider-login - 3.972.40 +**Repository URL**: https://github.com/aws/aws-sdk-js-v3 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +# @aws-sdk/credential-provider-login + +### :warning: Internal API :warning: + +> This is an internal package. +> That means this is used as a dependency for other, public packages, but +> should not be taken directly as a dependency in your application's `package.json`. + +> If you are updating the version of this package, for example to bring in a +> bug-fix, you should do so by updating your application lockfile with +> e.g. `npm up @scope/package` or equivalent command in another +> package manager, rather than taking a direct dependency. + +--- + +Please use [@aws-sdk/credential-providers](https://www.npmjs.com/package/@aws-sdk/credential-providers) instead.``` + +## @aws-sdk/credential-provider-node - 3.972.41 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -2316,7 +2328,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/credential-provider-env - 3.972.34 +## @aws-sdk/credential-provider-process - 3.972.36 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -2509,7 +2521,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -2523,23 +2535,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/credential-provider-http - 3.972.36 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -# @aws-sdk/credential-provider-http - -[![NPM version](https://img.shields.io/npm/v/@aws-sdk/credential-provider-http/latest.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-http) -[![NPM downloads](https://img.shields.io/npm/dm/@aws-sdk/credential-provider-http.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-http) - -> An internal transitively required package. - -## Usage - -See https://www.npmjs.com/package/@aws-sdk/credential-providers``` - -## @aws-sdk/credential-provider-ini - 3.972.38 +## @aws-sdk/credential-provider-sso - 3.972.40 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -2732,7 +2728,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -2746,29 +2742,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/credential-provider-login - 3.972.38 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -# @aws-sdk/credential-provider-login - -### :warning: Internal API :warning: - -> This is an internal package. -> That means this is used as a dependency for other, public packages, but -> should not be taken directly as a dependency in your application's `package.json`. - -> If you are updating the version of this package, for example to bring in a -> bug-fix, you should do so by updating your application lockfile with -> e.g. `npm up @scope/package` or equivalent command in another -> package manager, rather than taking a direct dependency. - ---- - -Please use [@aws-sdk/credential-providers](https://www.npmjs.com/package/@aws-sdk/credential-providers) instead.``` - -## @aws-sdk/credential-provider-node - 3.972.39 +## @aws-sdk/credential-provider-web-identity - 3.972.40 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -2961,7 +2935,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -2975,7 +2949,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/credential-provider-process - 3.972.34 +## @aws-sdk/eventstream-handler-node - 3.972.15 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -3182,7 +3156,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/credential-provider-sso - 3.972.38 +## @aws-sdk/middleware-eventstream - 3.972.11 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -3375,7 +3349,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -3389,7 +3363,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/credential-provider-web-identity - 3.972.38 +## @aws-sdk/middleware-host-header - 3.972.11 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -3596,7 +3570,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/credential-providers - 3.1045.0 +## @aws-sdk/middleware-logger - 3.972.10 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -3789,7 +3763,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -3803,7 +3777,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/eventstream-handler-node - 3.972.14 +## @aws-sdk/middleware-recursion-detection - 3.972.12 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -4010,7 +3984,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/middleware-eventstream - 3.972.10 +## @aws-sdk/middleware-user-agent - 3.972.40 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -4203,7 +4177,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -4217,7 +4191,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/middleware-host-header - 3.972.10 +## @aws-sdk/middleware-websocket - 3.972.18 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -4424,7 +4398,26 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/middleware-logger - 3.972.10 +## @aws-sdk/nested-clients - 3.997.8 +**Repository URL**: https://github.com/aws/aws-sdk-js-v3 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +# @aws-sdk/nested-clients + +## Description + +This is an internal package. Do not install this as a direct dependency. + +This package contains separate internal implementations of the STS and SSO-OIDC AWS SDK clients +to be used by the AWS SDK credential providers to break a cyclic dependency. + +### Bundlers + +This package may be marked as external if you do not use STS nor SSO-OIDC +in your credential resolution process.``` + +## @aws-sdk/region-config-resolver - 3.972.14 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -4617,7 +4610,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -4631,7 +4624,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/middleware-recursion-detection - 3.972.11 +## @aws-sdk/signature-v4-multi-region - 3.996.26 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -4838,7 +4831,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/middleware-sdk-s3 - 3.972.37 +## @aws-sdk/token-providers - 3.1047.0 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -5031,7 +5024,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -5045,7 +5038,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/middleware-user-agent - 3.972.38 +## @aws-sdk/types - 3.973.8 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -5238,7 +5231,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -5252,7 +5245,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/middleware-websocket - 3.972.16 +## @aws-sdk/util-endpoints - 3.996.9 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -5445,7 +5438,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -5459,26 +5452,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/nested-clients - 3.997.6 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -# @aws-sdk/nested-clients - -## Description - -This is an internal package. Do not install this as a direct dependency. - -This package contains separate internal implementations of the STS and SSO-OIDC AWS SDK clients -to be used by the AWS SDK credential providers to break a cyclic dependency. - -### Bundlers - -This package may be marked as external if you do not use STS nor SSO-OIDC -in your credential resolution process.``` - -## @aws-sdk/region-config-resolver - 3.972.13 +## @aws-sdk/util-locate-window - 3.965.5 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -5685,7 +5659,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/signature-v4-multi-region - 3.996.25 +## @aws-sdk/util-user-agent-browser - 3.972.11 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -5878,7 +5852,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -5892,7 +5866,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/token-providers - 3.1041.0 +## @aws-sdk/util-user-agent-node - 3.973.26 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -6099,7 +6073,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/token-providers - 3.1042.0 +## @aws-sdk/xml-builder - 3.972.24 **Repository URL**: https://github.com/aws/aws-sdk-js-v3 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -6306,8 +6280,8 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @aws-sdk/types - 3.973.8 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 +## @aws/lambda-invoke-store - 0.2.4 +**Repository URL**: https://github.com/awslabs/aws-lambda-invoke-store **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -6484,5808 +6458,5259 @@ Apache License of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. + of your accepting any such warranty or additional liability.``` - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +## @babel/runtime - 7.29.2 +**Repository URL**: https://github.com/babel/babel +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Copyright (c) 2014-present Sebastian McKenzie and other contributors - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## @aws-sdk/util-arn-parser - 3.972.3 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## @bcoe/v8-coverage - 1.0.2 +**Repository URL**: https://github.com/bcoe/v8-coverage +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +The MIT License (MIT) - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright © 2015-2017 Charles Samborski - 1. Definitions. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +## @borewit/text-codec - 0.2.2 +**Repository URL**: https://github.com/Borewit/text-codec +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +Copyright © 2025 Borewit - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +## @clack/core - 1.3.0 +**Repository URL**: https://github.com/bombshell-dev/clack +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +Copyright (c) Nate Moore - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +## @clack/prompts - 1.3.0 +**Repository URL**: https://github.com/bombshell-dev/clack +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +Copyright (c) Nate Moore - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +## @earendil-works/pi-agent-core - 0.74.0 +**Repository URL**: https://github.com/earendil-works/pi-mono +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +# @earendil-works/pi-agent-core - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +Stateful agent with tool execution and event streaming. Built on `@earendil-works/pi-ai`. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +## Installation - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +```bash +npm install @earendil-works/pi-agent-core +``` - END OF TERMS AND CONDITIONS +## Quick Start - APPENDIX: How to apply the Apache License to your work. +```typescript +import { Agent } from "@earendil-works/pi-agent-core"; +import { getModel } from "@earendil-works/pi-ai"; - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +const agent = new Agent({ + initialState: { + systemPrompt: "You are a helpful assistant.", + model: getModel("anthropic", "claude-sonnet-4-20250514"), + }, +}); - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +agent.subscribe((event) => { + if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") { + // Stream just the new text chunk + process.stdout.write(event.assistantMessageEvent.delta); + } +}); - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +await agent.prompt("Hello!"); +``` - http://www.apache.org/licenses/LICENSE-2.0 +## Core Concepts - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +### AgentMessage vs LLM Message -## @aws-sdk/util-endpoints - 3.996.8 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +The agent works with `AgentMessage`, a flexible type that can include: +- Standard LLM messages (`user`, `assistant`, `toolResult`) +- Custom app-specific message types via declaration merging - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +LLMs only understand `user`, `assistant`, and `toolResult`. The `convertToLlm` function bridges this gap by filtering and transforming messages before each LLM call. - 1. Definitions. +### Message Flow - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +``` +AgentMessage[] → transformContext() → AgentMessage[] → convertToLlm() → Message[] → LLM + (optional) (required) +``` - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +1. **transformContext**: Prune old messages, inject external context +2. **convertToLlm**: Filter out UI-only messages, convert custom types to LLM format - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +## Event Flow - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +The agent emits events for UI updates. Understanding the event sequence helps build responsive interfaces. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +### prompt() Event Sequence - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +When you call `prompt("Hello")`: - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +``` +prompt("Hello") +├─ agent_start +├─ turn_start +├─ message_start { message: userMessage } // Your prompt +├─ message_end { message: userMessage } +├─ message_start { message: assistantMessage } // LLM starts responding +├─ message_update { message: partial... } // Streaming chunks +├─ message_update { message: partial... } +├─ message_end { message: assistantMessage } // Complete response +├─ turn_end { message, toolResults: [] } +└─ agent_end { messages: [...] } +``` - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +### With Tool Calls - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +If the assistant calls tools, the loop continues: - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +``` +prompt("Read config.json") +├─ agent_start +├─ turn_start +├─ message_start/end { userMessage } +├─ message_start { assistantMessage with toolCall } +├─ message_update... +├─ message_end { assistantMessage } +├─ tool_execution_start { toolCallId, toolName, args } +├─ tool_execution_update { partialResult } // If tool streams +├─ tool_execution_end { toolCallId, result } +├─ message_start/end { toolResultMessage } +├─ turn_end { message, toolResults: [toolResult] } +│ +├─ turn_start // Next turn +├─ message_start { assistantMessage } // LLM responds to tool result +├─ message_update... +├─ message_end +├─ turn_end +└─ agent_end +``` - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +Tool execution mode is configurable: - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +- `parallel` (default): preflight tool calls sequentially, execute allowed tools concurrently, emit `tool_execution_end` as soon as each tool is finalized, then emit toolResult messages and `turn_end.toolResults` in assistant source order +- `sequential`: execute tool calls one by one, matching the historical behavior - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +In parallel mode, tool completion events follow tool completion order, but persisted toolResult messages still follow assistant source order. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +The mode can be set globally via `toolExecution` in the agent config, or per-tool via `executionMode` on `AgentTool`. If any tool call in a batch targets a tool with `executionMode: "sequential"`, the entire batch executes sequentially regardless of the global setting. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +The `beforeToolCall` hook runs after `tool_execution_start` and validated argument parsing. It can block execution. The `afterToolCall` hook runs after tool execution finishes and before `tool_execution_end` and final tool result message events are emitted. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +Tools can also return `terminate: true` to hint that the automatic follow-up LLM call should be skipped. The loop only stops early when every finalized tool result in that batch sets `terminate: true`. Mixed batches continue normally. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +Low-level loop callers can set `shouldStopAfterTurn` to stop gracefully after the current turn completes: - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +```typescript +const stream = agentLoop(prompts, context, { + model, + convertToLlm, + shouldStopAfterTurn: async ({ message, toolResults, context, newMessages }) => { + return shouldCompactBeforeNextTurn(context.messages); + }, +}); +``` - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +`shouldStopAfterTurn` runs after `turn_end` is emitted and after the assistant response and any tool executions have completed normally. If it returns `true`, the loop emits `agent_end` and exits before polling steering or follow-up queues, and before starting another LLM call. It does not abort the provider stream, does not cancel running tools, and does not alter the assistant message stop reason. - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +When you use the `Agent` class, assistant `message_end` processing is treated as a barrier before tool preflight begins. That means `beforeToolCall` sees agent state that already includes the assistant message that requested the tool call. - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +### continue() Event Sequence - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +`continue()` resumes from existing context without adding a new message. Use it for retries after errors. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +```typescript +// After an error, retry from current state +await agent.continue(); +``` - END OF TERMS AND CONDITIONS +The last message in context must be `user` or `toolResult` (not `assistant`). - APPENDIX: How to apply the Apache License to your work. +### Event Types - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +| Event | Description | +|-------|-------------| +| `agent_start` | Agent begins processing | +| `agent_end` | Final event for the run. Awaited subscribers for this event still count toward settlement | +| `turn_start` | New turn begins (one LLM call + tool executions) | +| `turn_end` | Turn completes with assistant message and tool results | +| `message_start` | Any message begins (user, assistant, toolResult) | +| `message_update` | **Assistant only.** Includes `assistantMessageEvent` with delta | +| `message_end` | Message completes | +| `tool_execution_start` | Tool begins | +| `tool_execution_update` | Tool streams progress | +| `tool_execution_end` | Tool completes | - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +`Agent.subscribe()` listeners are awaited in registration order. `agent_end` means no more loop events will be emitted, but `await agent.waitForIdle()` and `await agent.prompt(...)` only settle after awaited `agent_end` listeners finish. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +## Agent Options - http://www.apache.org/licenses/LICENSE-2.0 +```typescript +const agent = new Agent({ + // Initial state + initialState: { + systemPrompt: string, + model: Model, + thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh", + tools: AgentTool[], + messages: AgentMessage[], + }, - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` + // Convert AgentMessage[] to LLM Message[] (required for custom message types) + convertToLlm: (messages) => messages.filter(...), -## @aws-sdk/util-format-url - 3.972.10 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ + // Transform context before convertToLlm (for pruning, compaction) + transformContext: async (messages, signal) => pruneOldMessages(messages), - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + // Steering mode: "one-at-a-time" (default) or "all" + steeringMode: "one-at-a-time", - 1. Definitions. + // Follow-up mode: "one-at-a-time" (default) or "all" + followUpMode: "one-at-a-time", - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. + // Custom stream function (for proxy backends) + streamFn: streamProxy, - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. + // Session ID for provider caching + sessionId: "session-123", - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. + // Dynamic API key resolution (for expiring OAuth tokens) + getApiKey: async (provider) => refreshToken(), - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. + // Tool execution mode: "parallel" (default) or "sequential" + toolExecution: "parallel", - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. + // Preflight each tool call after args are validated. Can block execution. + beforeToolCall: async ({ toolCall, args, context }) => { + if (toolCall.name === "bash") { + return { block: true, reason: "bash is disabled" }; + } + }, - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. + // Postprocess each tool result before final tool events are emitted. + afterToolCall: async ({ toolCall, result, isError, context }) => { + if (toolCall.name === "notify_done" && !isError) { + return { terminate: true }; + } + if (!isError) { + return { details: { ...result.details, audited: true } }; + } + }, - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). + // Custom thinking budgets for token-based providers + thinkingBudgets: { + minimal: 128, + low: 512, + medium: 1024, + high: 2048, + }, +}); +``` - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +## Agent State - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +```typescript +interface AgentState { + systemPrompt: string; + model: Model; + thinkingLevel: ThinkingLevel; + tools: AgentTool[]; + messages: AgentMessage[]; + readonly isStreaming: boolean; + readonly streamingMessage?: AgentMessage; + readonly pendingToolCalls: ReadonlySet; + readonly errorMessage?: string; +} +``` - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +Access state via `agent.state`. - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +Assigning `agent.state.tools = [...]` or `agent.state.messages = [...]` copies the top-level array before storing it. Mutating the returned array mutates the current agent state. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +During streaming, `agent.state.streamingMessage` contains the current partial assistant message. - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +`agent.state.isStreaming` remains `true` until the run fully settles, including awaited `agent_end` subscribers. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +## Methods - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +### Prompting - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +```typescript +// Text prompt +await agent.prompt("Hello"); - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +// With images +await agent.prompt("What's in this image?", [ + { type: "image", data: base64Data, mimeType: "image/jpeg" } +]); - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +// AgentMessage directly +await agent.prompt({ role: "user", content: "Hello", timestamp: Date.now() }); - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +// Continue from current context (last message must be user or toolResult) +await agent.continue(); +``` - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +### State Management - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +```typescript +agent.state.systemPrompt = "New prompt"; +agent.state.model = getModel("openai", "gpt-4o"); +agent.state.thinkingLevel = "medium"; +agent.state.tools = [myTool]; +agent.toolExecution = "sequential"; +agent.beforeToolCall = async ({ toolCall }) => undefined; +agent.afterToolCall = async ({ toolCall, result }) => undefined; +agent.state.messages = newMessages; // top-level array is copied +agent.state.messages.push(message); +agent.reset(); +``` - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +### Session and Thinking Budgets - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +```typescript +agent.sessionId = "session-123"; - END OF TERMS AND CONDITIONS +agent.thinkingBudgets = { + minimal: 128, + low: 512, + medium: 1024, + high: 2048, +}; +``` - APPENDIX: How to apply the Apache License to your work. +### Control - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +```typescript +agent.abort(); // Cancel current operation +await agent.waitForIdle(); // Wait for completion +``` - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +### Events - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +```typescript +const unsubscribe = agent.subscribe(async (event, signal) => { + if (event.type === "agent_end") { + // Final barrier work for the run + await flushSessionState(signal); + } +}); +unsubscribe(); +``` - http://www.apache.org/licenses/LICENSE-2.0 +## Steering and Follow-up - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +Steering messages let you interrupt the agent while tools are running. Follow-up messages let you queue work after the agent would otherwise stop. -## @aws-sdk/util-locate-window - 3.965.5 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +```typescript +agent.steeringMode = "one-at-a-time"; +agent.followUpMode = "one-at-a-time"; - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +// While agent is running tools +agent.steer({ + role: "user", + content: "Stop! Do this instead.", + timestamp: Date.now(), +}); - 1. Definitions. +// After the agent finishes its current work +agent.followUp({ + role: "user", + content: "Also summarize the result.", + timestamp: Date.now(), +}); - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +const steeringMode = agent.steeringMode; +const followUpMode = agent.followUpMode; - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +agent.clearSteeringQueue(); +agent.clearFollowUpQueue(); +agent.clearAllQueues(); +``` - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +Use clearSteeringQueue, clearFollowUpQueue, or clearAllQueues to drop queued messages. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +When steering messages are detected after a turn completes: +1. All tool calls from the current assistant message have already finished +2. Steering messages are injected +3. The LLM responds on the next turn - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +Follow-up messages are checked only when there are no more tool calls and no steering messages. If any are queued, they are injected and another turn runs. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +## Custom Message Types - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Extend `AgentMessage` via declaration merging: - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +```typescript +declare module "@earendil-works/pi-agent-core" { + interface CustomAgentMessages { + notification: { role: "notification"; text: string; timestamp: number }; + } +} - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +// Now valid +const msg: AgentMessage = { role: "notification", text: "Info", timestamp: Date.now() }; +``` - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +Handle custom types in `convertToLlm`: - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +```typescript +const agent = new Agent({ + convertToLlm: (messages) => messages.flatMap(m => { + if (m.role === "notification") return []; // Filter out + return [m]; + }), +}); +``` - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +## Tools - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +Define tools using `AgentTool`: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +```typescript +import { Type } from "typebox"; - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +const readFileTool: AgentTool = { + name: "read_file", + label: "Read File", // For UI display + description: "Read a file's contents", + parameters: Type.Object({ + path: Type.String({ description: "File path" }), + }), + // Override execution mode for this tool (optional). + // "sequential" forces the entire batch to run one at a time. + // "parallel" allows concurrent execution with other tool calls. + // If omitted, the global toolExecution config applies. + executionMode: "sequential", + execute: async (toolCallId, params, signal, onUpdate) => { + const content = await fs.readFile(params.path, "utf-8"); - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and + // Optional: stream progress + onUpdate?.({ content: [{ type: "text", text: "Reading..." }], details: {} }); - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + // Optional: add `terminate: true` here to skip the automatic follow-up LLM call + // when every finalized tool result in the batch does the same. + return { + content: [{ type: "text", text: content }], + details: { path: params.path, size: content.length }, + }; + }, +}; - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +agent.state.tools = [readFileTool]; +``` - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +### Error Handling - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +**Throw an error** when a tool fails. Do not return error messages as content. - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +```typescript +execute: async (toolCallId, params, signal, onUpdate) => { + if (!fs.existsSync(params.path)) { + throw new Error(`File not found: ${params.path}`); + } + // Return content only on success + return { content: [{ type: "text", text: "..." }] }; +} +``` - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +Thrown errors are caught by the agent and reported to the LLM as tool errors with `isError: true`. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +Return `terminate: true` from `execute()` or `afterToolCall` to hint that the agent should stop after the current tool batch. This only takes effect when every finalized tool result in the batch is terminating. The hint is runtime-only; emitted `toolResult` transcript messages remain standard LLM tool results. - END OF TERMS AND CONDITIONS +## Proxy Usage - APPENDIX: How to apply the Apache License to your work. +For browser apps that proxy through a backend: - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +```typescript +import { Agent, streamProxy } from "@earendil-works/pi-agent-core"; - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +const agent = new Agent({ + streamFn: (model, context, options) => + streamProxy(model, context, { + ...options, + authToken: "...", + proxyUrl: "https://your-server.com", + }), +}); +``` - http://www.apache.org/licenses/LICENSE-2.0 +## Low-Level API - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +For direct control without the Agent class: -## @aws-sdk/util-user-agent-browser - 3.972.10 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +```typescript +import { agentLoop, agentLoopContinue } from "@earendil-works/pi-agent-core"; - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +const context: AgentContext = { + systemPrompt: "You are helpful.", + messages: [], + tools: [], +}; - 1. Definitions. +const config: AgentLoopConfig = { + model: getModel("openai", "gpt-4o"), + convertToLlm: (msgs) => msgs.filter(m => ["user", "assistant", "toolResult"].includes(m.role)), + toolExecution: "parallel", // overridden by per-tool executionMode if set + beforeToolCall: async ({ toolCall, args, context }) => undefined, + afterToolCall: async ({ toolCall, result, isError, context }) => undefined, +}; - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +const userMessage = { role: "user", content: "Hello", timestamp: Date.now() }; - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +for await (const event of agentLoop([userMessage], context, config)) { + console.log(event.type); +} - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +// Continue from existing context +for await (const event of agentLoopContinue(context, config)) { + console.log(event.type); +} +``` - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +These low-level streams are observational. They preserve event order, but they do not wait for your async event handling to settle before later producer phases continue. If you need message processing to act as a barrier before tool preflight, use the `Agent` class instead of raw `agentLoop()` or `agentLoopContinue()`. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +## License - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +MIT``` - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +## @earendil-works/pi-ai - 0.74.0 +**Repository URL**: https://github.com/earendil-works/pi-mono +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +# @earendil-works/pi-ai - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +Unified LLM API with automatic model discovery, provider configuration, token and cost tracking, and simple context persistence and hand-off to other models mid-session. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +**Note**: This library only includes models that support tool calling (function calling), as this is essential for agentic workflows. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +## Table of Contents - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +- [Supported Providers](#supported-providers) +- [Installation](#installation) +- [Quick Start](#quick-start) +- [Tools](#tools) + - [Defining Tools](#defining-tools) + - [Handling Tool Calls](#handling-tool-calls) + - [Streaming Tool Calls with Partial JSON](#streaming-tool-calls-with-partial-json) + - [Validating Tool Arguments](#validating-tool-arguments) + - [Complete Event Reference](#complete-event-reference) +- [Image Input](#image-input) +- [Thinking/Reasoning](#thinkingreasoning) + - [Unified Interface](#unified-interface-streamsimplecompletesimple) + - [Provider-Specific Options](#provider-specific-options-streamcomplete) + - [Streaming Thinking Content](#streaming-thinking-content) +- [Stop Reasons](#stop-reasons) +- [Error Handling](#error-handling) + - [Aborting Requests](#aborting-requests) + - [Continuing After Abort](#continuing-after-abort) +- [APIs, Models, and Providers](#apis-models-and-providers) + - [Providers and Models](#providers-and-models) + - [Querying Providers and Models](#querying-providers-and-models) + - [Custom Models](#custom-models) + - [OpenAI Compatibility Settings](#openai-compatibility-settings) + - [Type Safety](#type-safety) +- [Cross-Provider Handoffs](#cross-provider-handoffs) +- [Context Serialization](#context-serialization) +- [Browser Usage](#browser-usage) + - [Browser Compatibility Notes](#browser-compatibility-notes) + - [Environment Variables](#environment-variables-nodejs-only) + - [Checking Environment Variables](#checking-environment-variables) +- [OAuth Providers](#oauth-providers) + - [Vertex AI](#vertex-ai) + - [CLI Login](#cli-login) + - [Programmatic OAuth](#programmatic-oauth) + - [Login Flow Example](#login-flow-example) + - [Using OAuth Tokens](#using-oauth-tokens) + - [Provider Notes](#provider-notes) +- [License](#license) - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +## Supported Providers - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +- **OpenAI** +- **Azure OpenAI (Responses)** +- **OpenAI Codex** (ChatGPT Plus/Pro subscription, requires OAuth, see below) +- **DeepSeek** +- **Anthropic** +- **Google** +- **Vertex AI** (Gemini via Vertex AI) +- **Mistral** +- **Groq** +- **Cerebras** +- **Cloudflare AI Gateway** +- **Cloudflare Workers AI** +- **xAI** +- **OpenRouter** +- **Vercel AI Gateway** +- **MiniMax** +- **GitHub Copilot** (requires OAuth, see below) +- **Amazon Bedrock** +- **OpenCode Zen** +- **OpenCode Go** +- **Fireworks** (uses Anthropic-compatible API) +- **Kimi For Coding** (Moonshot AI, uses Anthropic-compatible API) +- **Xiaomi MiMo** (uses Anthropic-compatible API; defaults to API billing endpoint, with separate Token Plan providers for `cn`/`ams`/`sgp` regions) +- **Any OpenAI-compatible API**: Ollama, vLLM, LM Studio, etc. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +## Installation - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +```bash +npm install @earendil-works/pi-ai +``` - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +TypeBox exports are re-exported from `@earendil-works/pi-ai`: `Type`, `Static`, and `TSchema`. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +## Quick Start - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +```typescript +import { Type, getModel, stream, complete, Context, Tool, StringEnum } from '@earendil-works/pi-ai'; - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +// Fully typed with auto-complete support for both providers and models +const model = getModel('openai', 'gpt-4o-mini'); - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +// Define tools with TypeBox schemas for type safety and validation +const tools: Tool[] = [{ + name: 'get_time', + description: 'Get the current time', + parameters: Type.Object({ + timezone: Type.Optional(Type.String({ description: 'Optional timezone (e.g., America/New_York)' })) + }) +}]; - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +// Build a conversation context (easily serializable and transferable between models) +const context: Context = { + systemPrompt: 'You are a helpful assistant.', + messages: [{ role: 'user', content: 'What time is it?' }], + tools +}; - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +// Option 1: Streaming with all event types +const s = stream(model, context); - END OF TERMS AND CONDITIONS +for await (const event of s) { + switch (event.type) { + case 'start': + console.log(`Starting with ${event.partial.model}`); + break; + case 'text_start': + console.log('\n[Text started]'); + break; + case 'text_delta': + process.stdout.write(event.delta); + break; + case 'text_end': + console.log('\n[Text ended]'); + break; + case 'thinking_start': + console.log('[Model is thinking...]'); + break; + case 'thinking_delta': + process.stdout.write(event.delta); + break; + case 'thinking_end': + console.log('[Thinking complete]'); + break; + case 'toolcall_start': + console.log(`\n[Tool call started: index ${event.contentIndex}]`); + break; + case 'toolcall_delta': + // Partial tool arguments are being streamed + const partialCall = event.partial.content[event.contentIndex]; + if (partialCall.type === 'toolCall') { + console.log(`[Streaming args for ${partialCall.name}]`); + } + break; + case 'toolcall_end': + console.log(`\nTool called: ${event.toolCall.name}`); + console.log(`Arguments: ${JSON.stringify(event.toolCall.arguments)}`); + break; + case 'done': + console.log(`\nFinished: ${event.reason}`); + break; + case 'error': + console.error(`Error: ${event.error}`); + break; + } +} - APPENDIX: How to apply the Apache License to your work. +// Get the final message after streaming, add it to the context +const finalMessage = await s.result(); +context.messages.push(finalMessage); - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +// Handle tool calls if any +const toolCalls = finalMessage.content.filter(b => b.type === 'toolCall'); +for (const call of toolCalls) { + // Execute the tool + const result = call.name === 'get_time' + ? new Date().toLocaleString('en-US', { + timeZone: call.arguments.timezone || 'UTC', + dateStyle: 'full', + timeStyle: 'long' + }) + : 'Unknown tool'; - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + // Add tool result to context (supports text and images) + context.messages.push({ + role: 'toolResult', + toolCallId: call.id, + toolName: call.name, + content: [{ type: 'text', text: result }], + isError: false, + timestamp: Date.now() + }); +} - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +// Continue if there were tool calls +if (toolCalls.length > 0) { + const continuation = await complete(model, context); + context.messages.push(continuation); + console.log('After tool execution:', continuation.content); +} - http://www.apache.org/licenses/LICENSE-2.0 +console.log(`Total tokens: ${finalMessage.usage.input} in, ${finalMessage.usage.output} out`); +console.log(`Cost: $${finalMessage.usage.cost.total.toFixed(4)}`); - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +// Option 2: Get complete response without streaming +const response = await complete(model, context); -## @aws-sdk/util-user-agent-node - 3.973.24 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +for (const block of response.content) { + if (block.type === 'text') { + console.log(block.text); + } else if (block.type === 'toolCall') { + console.log(`Tool: ${block.name}(${JSON.stringify(block.arguments)})`); + } +} ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +## Tools - 1. Definitions. +Tools enable LLMs to interact with external systems. This library uses TypeBox schemas for type-safe tool definitions with automatic validation using TypeBox's built-in validator and value conversion utilities. TypeBox schemas can be serialized and deserialized as plain JSON, making them ideal for distributed systems. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +### Defining Tools - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +```typescript +import { Type, Tool, StringEnum } from '@earendil-works/pi-ai'; - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +// Define tool parameters with TypeBox +const weatherTool: Tool = { + name: 'get_weather', + description: 'Get current weather for a location', + parameters: Type.Object({ + location: Type.String({ description: 'City name or coordinates' }), + units: StringEnum(['celsius', 'fahrenheit'], { default: 'celsius' }) + }) +}; - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +// Note: For Google API compatibility, use StringEnum helper instead of Type.Enum +// Type.Enum generates anyOf/const patterns that Google doesn't support - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +const bookMeetingTool: Tool = { + name: 'book_meeting', + description: 'Schedule a meeting', + parameters: Type.Object({ + title: Type.String({ minLength: 1 }), + startTime: Type.String({ format: 'date-time' }), + endTime: Type.String({ format: 'date-time' }), + attendees: Type.Array(Type.String({ format: 'email' }), { minItems: 1 }) + }) +}; +``` - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +### Handling Tool Calls - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Tool results use content blocks and can include both text and images: - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +```typescript +import { readFileSync } from 'fs'; - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +const context: Context = { + messages: [{ role: 'user', content: 'What is the weather in London?' }], + tools: [weatherTool] +}; - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +const response = await complete(model, context); - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +// Check for tool calls in the response +for (const block of response.content) { + if (block.type === 'toolCall') { + // Execute your tool with the arguments + // See "Validating Tool Arguments" section for validation + const result = await executeWeatherApi(block.arguments); - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. + // Add tool result with text content + context.messages.push({ + role: 'toolResult', + toolCallId: block.id, + toolName: block.name, + content: [{ type: 'text', text: JSON.stringify(result) }], + isError: false, + timestamp: Date.now() + }); + } +} - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +// Tool results can also include images (for vision-capable models) +const imageBuffer = readFileSync('chart.png'); +context.messages.push({ + role: 'toolResult', + toolCallId: 'tool_xyz', + toolName: 'generate_chart', + content: [ + { type: 'text', text: 'Generated chart showing temperature trends' }, + { type: 'image', data: imageBuffer.toString('base64'), mimeType: 'image/png' } + ], + isError: false, + timestamp: Date.now() +}); +``` - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +### Streaming Tool Calls with Partial JSON - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +During streaming, tool call arguments are progressively parsed as they arrive. This enables real-time UI updates before the complete arguments are available: - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +```typescript +const s = stream(model, context); - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +for await (const event of s) { + if (event.type === 'toolcall_delta') { + const toolCall = event.partial.content[event.contentIndex]; - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + // toolCall.arguments contains partially parsed JSON during streaming + // This allows for progressive UI updates + if (toolCall.type === 'toolCall' && toolCall.arguments) { + // BE DEFENSIVE: arguments may be incomplete + // Example: Show file path being written even before content is complete + if (toolCall.name === 'write_file' && toolCall.arguments.path) { + console.log(`Writing to: ${toolCall.arguments.path}`); - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. + // Content might be partial or missing + if (toolCall.arguments.content) { + console.log(`Content preview: ${toolCall.arguments.content.substring(0, 100)}...`); + } + } + } + } - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. + if (event.type === 'toolcall_end') { + // Here toolCall.arguments is complete (but not yet validated) + const toolCall = event.toolCall; + console.log(`Tool completed: ${toolCall.name}`, toolCall.arguments); + } +} +``` - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +**Important notes about partial tool arguments:** +- During `toolcall_delta` events, `arguments` contains the best-effort parse of partial JSON +- Fields may be missing or incomplete - always check for existence before use +- String values may be truncated mid-word +- Arrays may be incomplete +- Nested objects may be partially populated +- At minimum, `arguments` will be an empty object `{}`, never `undefined` +- The Google provider does not support function call streaming. Instead, you will receive a single `toolcall_delta` event with the full arguments. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +### Validating Tool Arguments - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +When using `agentLoop`, tool arguments are automatically validated against your TypeBox schemas before execution. If validation fails, the error is returned to the model as a tool result, allowing it to retry. - END OF TERMS AND CONDITIONS +When implementing your own tool execution loop with `stream()` or `complete()`, use `validateToolCall` to validate arguments before passing them to your tools: - APPENDIX: How to apply the Apache License to your work. +```typescript +import { stream, validateToolCall, Tool } from '@earendil-works/pi-ai'; - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +const tools: Tool[] = [weatherTool, calculatorTool]; +const s = stream(model, { messages, tools }); - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +for await (const event of s) { + if (event.type === 'toolcall_end') { + const toolCall = event.toolCall; - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at + try { + // Validate arguments against the tool's schema (throws on invalid args) + const validatedArgs = validateToolCall(tools, toolCall); + const result = await executeMyTool(toolCall.name, validatedArgs); + // ... add tool result to context + } catch (error) { + // Validation failed - return error as tool result so model can retry + context.messages.push({ + role: 'toolResult', + toolCallId: toolCall.id, + toolName: toolCall.name, + content: [{ type: 'text', text: error.message }], + isError: true, + timestamp: Date.now() + }); + } + } +} +``` - http://www.apache.org/licenses/LICENSE-2.0 +### Complete Event Reference - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +All streaming events emitted during assistant message generation: -## @aws-sdk/xml-builder - 3.972.22 -**Repository URL**: https://github.com/aws/aws-sdk-js-v3 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +| Event Type | Description | Key Properties | +|------------|-------------|----------------| +| `start` | Stream begins | `partial`: Initial assistant message structure | +| `text_start` | Text block starts | `contentIndex`: Position in content array | +| `text_delta` | Text chunk received | `delta`: New text, `contentIndex`: Position | +| `text_end` | Text block complete | `content`: Full text, `contentIndex`: Position | +| `thinking_start` | Thinking block starts | `contentIndex`: Position in content array | +| `thinking_delta` | Thinking chunk received | `delta`: New text, `contentIndex`: Position | +| `thinking_end` | Thinking block complete | `content`: Full thinking, `contentIndex`: Position | +| `toolcall_start` | Tool call begins | `contentIndex`: Position in content array | +| `toolcall_delta` | Tool arguments streaming | `delta`: JSON chunk, `partial.content[contentIndex].arguments`: Partial parsed args | +| `toolcall_end` | Tool call complete | `toolCall`: Complete validated tool call with `id`, `name`, `arguments` | +| `done` | Stream complete | `reason`: Stop reason ("stop", "length", "toolUse"), `message`: Final assistant message | +| `error` | Error occurred | `reason`: Error type ("error" or "aborted"), `error`: AssistantMessage with partial content | - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Streaming events for different content blocks are not guaranteed to be contiguous. Providers may emit deltas for text, thinking, and tool calls in the same upstream chunk, and pi may surface corresponding events interleaved, for example `text_start`, `text_delta`, `toolcall_start`, `text_delta`, `toolcall_delta`. Consumers must use `contentIndex` to associate each delta/end event with its block and must not assume that a block's `*_start`/`*_delta`/`*_end` sequence is uninterrupted by events for other blocks. - 1. Definitions. +## Image Input - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +Models with vision capabilities can process images. You can check if a model supports images via the `input` property. If you pass images to a non-vision model, they are silently ignored. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +```typescript +import { readFileSync } from 'fs'; +import { getModel, complete } from '@earendil-works/pi-ai'; - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +const model = getModel('openai', 'gpt-4o-mini'); - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +// Check if model supports images +if (model.input.includes('image')) { + console.log('Model supports vision'); +} - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +const imageBuffer = readFileSync('image.png'); +const base64Image = imageBuffer.toString('base64'); - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +const response = await complete(model, { + messages: [{ + role: 'user', + content: [ + { type: 'text', text: 'What is in this image?' }, + { type: 'image', data: base64Image, mimeType: 'image/png' } + ] + }] +}); - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +// Access the response +for (const block of response.content) { + if (block.type === 'text') { + console.log(block.text); + } +} +``` - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +## Thinking/Reasoning - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +Many models support thinking/reasoning capabilities where they can show their internal thought process. You can check if a model supports reasoning via the `reasoning` property. If you pass reasoning options to a non-reasoning model, they are silently ignored. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +### Unified Interface (streamSimple/completeSimple) - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +```typescript +import { getModel, streamSimple, completeSimple } from '@earendil-works/pi-ai'; - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +// Many models across providers support thinking/reasoning +const model = getModel('anthropic', 'claude-sonnet-4-20250514'); +// or getModel('openai', 'gpt-5-mini'); +// or getModel('google', 'gemini-2.5-flash'); +// or getModel('xai', 'grok-code-fast-1'); +// or getModel('groq', 'openai/gpt-oss-20b'); +// or getModel('cerebras', 'gpt-oss-120b'); +// or getModel('openrouter', 'z-ai/glm-4.5v'); - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +// Check if model supports reasoning +if (model.reasoning) { + console.log('Model supports reasoning/thinking'); +} - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +// Use the simplified reasoning option +const response = await completeSimple(model, { + messages: [{ role: 'user', content: 'Solve: 2x + 5 = 13' }] +}, { + reasoning: 'medium' // 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' +}); - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +// Access thinking and text blocks +for (const block of response.content) { + if (block.type === 'thinking') { + console.log('Thinking:', block.thinking); + } else if (block.type === 'text') { + console.log('Response:', block.text); + } +} +``` - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +### Provider-Specific Options (stream/complete) - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +For fine-grained control, use the provider-specific options: - END OF TERMS AND CONDITIONS +```typescript +import { getModel, complete } from '@earendil-works/pi-ai'; - APPENDIX: How to apply the Apache License to your work. +// OpenAI Reasoning (o1, o3, gpt-5) +const openaiModel = getModel('openai', 'gpt-5-mini'); +await complete(openaiModel, context, { + reasoningEffort: 'medium', + reasoningSummary: 'detailed' // OpenAI Responses API only +}); - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +// Anthropic Thinking (Claude Sonnet 4) +const anthropicModel = getModel('anthropic', 'claude-sonnet-4-20250514'); +await complete(anthropicModel, context, { + thinkingEnabled: true, + thinkingBudgetTokens: 8192 // Optional token limit +}); - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Google Gemini Thinking +const googleModel = getModel('google', 'gemini-2.5-flash'); +await complete(googleModel, context, { + thinking: { + enabled: true, + budgetTokens: 8192 // -1 for dynamic, 0 to disable + } +}); +``` - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +### Streaming Thinking Content - http://www.apache.org/licenses/LICENSE-2.0 +When streaming, thinking content is delivered through specific events: - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +```typescript +const s = streamSimple(model, context, { reasoning: 'high' }); -## @aws/bedrock-token-generator - 1.1.0 -**Repository URL**: https://github.com/aws/aws-bedrock-token-generator-js -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +for await (const event of s) { + switch (event.type) { + case 'thinking_start': + console.log('[Model started thinking]'); + break; + case 'thinking_delta': + process.stdout.write(event.delta); // Stream thinking content + break; + case 'thinking_end': + console.log('\n[Thinking complete]'); + break; + } +} ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +## Stop Reasons -1. Definitions. +Every `AssistantMessage` includes a `stopReason` field that indicates how the generation ended: -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity granting the License. - -"Legal Entity" shall mean the union of the acting entity and all -other entities that control, are controlled by, or are under common -control with that entity. For the purposes of this definition, -"control" means (i) the power, direct or indirect, to cause the -direction or management of such entity, whether by contract or -otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity -exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation -source, and configuration files. - -"Object" form shall mean any form resulting from mechanical -transformation or translation of a Source form, including but -not limited to compiled object code, generated documentation, -and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by a -copyright notice that is included in or attached to the work -(which shall not include communications that are clearly marked or -otherwise designated in writing by the copyright owner as "Not a Work"). - -"Derivative Works" shall mean any work, whether in Source or Object -form, that is based upon (or derived from) the Work and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. For the purposes -of this License, Derivative Works shall not include works that remain -separable from, or merely link (or bind by name) to the interfaces of, -the Work and derivative works thereof. - -"Contribution" shall mean any work of authorship, including -the original version of the Work and any modifications or additions -to that Work or Derivative Works thereof, that is intentionally -submitted to Licensor for inclusion in the Work by the copyright owner -or by an individual or Legal Entity authorized to submit on behalf of -the copyright owner. For the purposes of this definition, "submitted" -means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control -systems, and issue tracking systems that are managed by, or on behalf -of, the Licensor for the purpose of discussing and improving the Work, -but excluding communication that is conspicuously marked or otherwise -designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -copyright license to use, reproduce, modify, distribute, and prepare -Derivative Works of, publicly display, publicly perform, sublicense, -and distribute the Work and such Derivative Works in Source or Object -form. - -3. Grant of Patent License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -(except as stated in this section) patent license to make, have made, -use, offer to sell, sell, import, and otherwise transfer the Work, -where such license applies only to those patent claims licensable -by such Contributor that are necessarily infringed by their -Contribution(s) alone or by combination of their Contribution(s) -with the Work to which such Contribution(s) was submitted. If You -institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work -or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses -granted to You under this License for that Work shall terminate -as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the -Work or Derivative Works thereof in any medium, with or without -modifications, and in Source or Object form, provided that You -meet the following conditions: - -(a) You must give any other recipients of the Work or -Derivative Works a copy of this License; and - -(b) You must cause any modified files to carry prominent notices -stating that You changed the files; and - -(c) You must retain, in the Source form of any Derivative Works -that You distribute, all copyright, trademark, patent, and -attribution notices from the Source form of the Work, -excluding those notices that do not pertain to any part of -the Derivative Works; and - -(d) If the Work includes a "NOTICE" text file as part of its -distribution, then any Derivative Works that You distribute must -include a readable copy of the attribution notices contained -within such NOTICE file, excluding those notices that do not -pertain to any part of the Derivative Works, in at least one -of the following places: within a NOTICE text file distributed -as part of the Derivative Works; within the Source form or -documentation, if provided along with the Derivative Works; or, -within a display generated by the Derivative Works, if and -wherever such third-party notices normally appear. The contents -of the NOTICE file are for informational purposes only and -do not modify the License. You may add Your own attribution -notices within Derivative Works that You distribute, alongside -or as an addendum to the NOTICE text from the Work, provided -that such additional attribution notices cannot be construed -as modifying the License. - -You may add Your own copyright notice to Your modifications and -may provide additional or different license terms and conditions -for use, reproduction, or distribution of Your modifications, or -for any such Derivative Works as a whole, provided Your use, -reproduction, and distribution of the Work otherwise complies with -the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, -any Contribution intentionally submitted for inclusion in the Work -by You to the Licensor shall be under the terms and conditions of -this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify -the terms of any separate license agreement you may have executed -with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade -names, trademarks, service marks, or product names of the Licensor, -except as required for reasonable and customary use in describing the -origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or -agreed to in writing, Licensor provides the Work (and each -Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -implied, including, without limitation, any warranties or conditions -of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any -risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, -whether in tort (including negligence), contract, or otherwise, -unless required by applicable law (such as deliberate and grossly -negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, -incidental, or consequential damages of any character arising as a -result of this License or out of the use or inability to use the -Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all -other commercial damages or losses), even if such Contributor -has been advised of the possibility of such damages. - -9. Accepting Warranty or Support. You may choose to offer, and to -charge a fee for, warranty, support, indemnity or other liability -obligations and/or rights consistent with this License. However, in -accepting such obligations, You may act only on Your own behalf and on -Your sole responsibility, not on behalf of any other Contributor, and -only if You agree to indemnify, defend, and hold each Contributor -harmless for any liability incurred by, or claims asserted against, -such Contributor by reason of your accepting any such warranty or support. - -END OF TERMS AND CONDITIONS - -Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.``` +- `"stop"` - Normal completion, the model finished its response +- `"length"` - Output hit the maximum token limit +- `"toolUse"` - Model is calling tools and expects tool results +- `"error"` - An error occurred during generation +- `"aborted"` - Request was cancelled via abort signal -## @aws/lambda-invoke-store - 0.2.4 -**Repository URL**: https://github.com/awslabs/aws-lambda-invoke-store -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +`AssistantMessage` may also include `responseId`, a provider-specific upstream response or message identifier when the underlying API exposes one. Do not assume it is always present across providers. - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +## Error Handling - 1. Definitions. +When a request ends with an error (including aborts and tool call validation errors), the streaming API emits an error event: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +```typescript +// In streaming +for await (const event of stream) { + if (event.type === 'error') { + // event.reason is either "error" or "aborted" + // event.error is the AssistantMessage with partial content + console.error(`Error (${event.reason}):`, event.error.errorMessage); + console.log('Partial content:', event.error.content); + } +} - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +// The final message will have the error details +const message = await stream.result(); +if (message.stopReason === 'error' || message.stopReason === 'aborted') { + console.error('Request failed:', message.errorMessage); + // message.content contains any partial content received before the error + // message.usage contains partial token counts and costs +} +``` - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +### Aborting Requests - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +The abort signal allows you to cancel in-progress requests. Aborted requests have `stopReason === 'aborted'`: - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +```typescript +import { getModel, stream } from '@earendil-works/pi-ai'; - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +const model = getModel('openai', 'gpt-4o-mini'); +const controller = new AbortController(); - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +// Abort after 2 seconds +setTimeout(() => controller.abort(), 2000); - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +const s = stream(model, { + messages: [{ role: 'user', content: 'Write a long story' }] +}, { + signal: controller.signal +}); - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +for await (const event of s) { + if (event.type === 'text_delta') { + process.stdout.write(event.delta); + } else if (event.type === 'error') { + // event.reason tells you if it was "error" or "aborted" + console.log(`${event.reason === 'aborted' ? 'Aborted' : 'Error'}:`, event.error.errorMessage); + } +} - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +// Get results (may be partial if aborted) +const response = await s.result(); +if (response.stopReason === 'aborted') { + console.log('Request was aborted:', response.errorMessage); + console.log('Partial content received:', response.content); + console.log('Tokens used:', response.usage); +} +``` - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +### Continuing After Abort - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +Aborted messages can be added to the conversation context and continued in subsequent requests: - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +```typescript +const context = { + messages: [ + { role: 'user', content: 'Explain quantum computing in detail' } + ] +}; - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +// First request gets aborted after 2 seconds +const controller1 = new AbortController(); +setTimeout(() => controller1.abort(), 2000); - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +const partial = await complete(model, context, { signal: controller1.signal }); - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +// Add the partial response to context +context.messages.push(partial); +context.messages.push({ role: 'user', content: 'Please continue' }); - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +// Continue the conversation +const continuation = await complete(model, context); +``` - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +### Debugging Provider Payloads - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +Use the `onPayload` callback to inspect the request payload sent to the provider. This is useful for debugging request formatting issues or provider validation errors. - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +```typescript +const response = await complete(model, context, { + onPayload: (payload) => { + console.log('Provider payload:', JSON.stringify(payload, null, 2)); + } +}); +``` - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +The callback is supported by `stream`, `complete`, `streamSimple`, and `completeSimple`. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +## APIs, Models, and Providers - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability.``` +The library uses a registry of API implementations. Built-in APIs include: -## @babel/runtime - 7.29.2 -**Repository URL**: https://github.com/babel/babel -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +- **`anthropic-messages`**: Anthropic Messages API (`streamAnthropic`, `AnthropicOptions`) +- **`google-generative-ai`**: Google Generative AI API (`streamGoogle`, `GoogleOptions`) +- **`google-vertex`**: Google Vertex AI API (`streamGoogleVertex`, `GoogleVertexOptions`) +- **`mistral-conversations`**: Mistral Conversations API (`streamMistral`, `MistralOptions`) +- **`openai-completions`**: OpenAI Chat Completions API (`streamOpenAICompletions`, `OpenAICompletionsOptions`) +- **`openai-responses`**: OpenAI Responses API (`streamOpenAIResponses`, `OpenAIResponsesOptions`) +- **`openai-codex-responses`**: OpenAI Codex Responses API (`streamOpenAICodexResponses`, `OpenAICodexResponsesOptions`) +- **`azure-openai-responses`**: Azure OpenAI Responses API (`streamAzureOpenAIResponses`, `AzureOpenAIResponsesOptions`) +- **`bedrock-converse-stream`**: Amazon Bedrock Converse API (`streamBedrock`, `BedrockOptions`) -Copyright (c) 2014-present Sebastian McKenzie and other contributors +### Faux provider for tests -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +`registerFauxProvider()` registers a temporary in-memory provider for tests and demos. It is opt-in and not part of the built-in provider set. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +```typescript +import { + complete, + fauxAssistantMessage, + fauxText, + fauxThinking, + fauxToolCall, + registerFauxProvider, + stream, +} from '@earendil-works/pi-ai'; -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +const registration = registerFauxProvider({ + tokensPerSecond: 50 // optional +}); -## @bcoe/v8-coverage - 1.0.2 -**Repository URL**: https://github.com/bcoe/v8-coverage -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) +const model = registration.getModel(); +const context = { + messages: [{ role: 'user', content: 'Summarize package.json and then call echo', timestamp: Date.now() }] +}; -Copyright © 2015-2017 Charles Samborski +registration.setResponses([ + fauxAssistantMessage([ + fauxThinking('Need to inspect package metadata first.'), + fauxToolCall('echo', { text: 'package.json' }) + ], { stopReason: 'toolUse' }) +]); -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +const first = await complete(model, context, { + sessionId: 'session-1', + cacheRetention: 'short' +}); +context.messages.push(first); -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +context.messages.push({ + role: 'toolResult', + toolCallId: first.content.find((block) => block.type === 'toolCall')!.id, + toolName: 'echo', + content: [{ type: 'text', text: 'package.json contents here' }], + isError: false, + timestamp: Date.now() +}); -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +registration.setResponses([ + fauxAssistantMessage([ + fauxThinking('Now I can summarize the tool output.'), + fauxText('Here is the summary.') + ]) +]); -## @borewit/text-codec - 0.2.2 -**Repository URL**: https://github.com/Borewit/text-codec -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) +const s = stream(model, context); +for await (const event of s) { + console.log(event.type); +} -Copyright © 2025 Borewit +// Optional: register multiple faux models for model-switching tests +const multiModel = registerFauxProvider({ + models: [ + { id: 'faux-fast', reasoning: false }, + { id: 'faux-thinker', reasoning: true } + ] +}); +const thinker = multiModel.getModel('faux-thinker'); -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +console.log(thinker?.reasoning); +console.log(registration.getPendingResponseCount()); +console.log(registration.state.callCount); +registration.unregister(); +multiModel.unregister(); +``` -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Notes: +- Responses are consumed from a queue in request start order. +- If the queue is empty, the faux provider returns an assistant error message with `errorMessage: "No more faux responses queued"`. +- Use `registration.setResponses([...])` to replace the remaining queue and `registration.appendResponses([...])` to add more responses. +- `registration.models` exposes all registered faux models. `registration.getModel()` returns the first one, and `registration.getModel(id)` returns a specific one. +- Use `fauxAssistantMessage(...)` for scripted assistant replies. Use `fauxText(...)`, `fauxThinking(...)`, and `fauxToolCall(...)` to build content blocks without filling in low-level fields manually. +- `registration.unregister()` removes the temporary provider from the global API registry. +- Usage is estimated at roughly 1 token per 4 characters. When `sessionId` is present and `cacheRetention` is not `"none"`, prompt cache reads and writes are simulated automatically. +- Tool call arguments stream incrementally via `toolcall_delta` chunks. +- By default, each streamed chunk is emitted on its own microtask. Set `tokensPerSecond` to pace chunk delivery in real time. +- The intended use is one deterministic scripted flow per registration. If you need independent concurrent flows, register separate faux providers. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +### Providers and Models -## @clack/core - 1.3.0 -**Repository URL**: https://github.com/bombshell-dev/clack -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +A **provider** offers models through a specific API. For example: +- **Anthropic** models use the `anthropic-messages` API +- **Google** models use the `google-generative-ai` API +- **OpenAI** models use the `openai-responses` API +- **Mistral** models use the `mistral-conversations` API +- **xAI, Cerebras, Groq, etc.** models use the `openai-completions` API (OpenAI-compatible) -Copyright (c) Nate Moore +### Querying Providers and Models -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +```typescript +import { getProviders, getModels, getModel } from '@earendil-works/pi-ai'; -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// Get all available providers +const providers = getProviders(); +console.log(providers); // ['openai', 'anthropic', 'google', 'xai', 'groq', ...] -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +// Get all models from a provider (fully typed) +const anthropicModels = getModels('anthropic'); +for (const model of anthropicModels) { + console.log(`${model.id}: ${model.name}`); + console.log(` API: ${model.api}`); // 'anthropic-messages' + console.log(` Context: ${model.contextWindow} tokens`); + console.log(` Vision: ${model.input.includes('image')}`); + console.log(` Reasoning: ${model.reasoning}`); +} -## @clack/prompts - 1.3.0 -**Repository URL**: https://github.com/bombshell-dev/clack -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +// Get a specific model (both provider and model ID are auto-completed in IDEs) +const model = getModel('openai', 'gpt-4o-mini'); +console.log(`Using ${model.name} via ${model.api} API`); ``` -MIT License -Copyright (c) Nate Moore +### Custom Models -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +You can create custom models for local inference servers or custom endpoints: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +```typescript +import { Model, stream } from '@earendil-works/pi-ai'; -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +// Example: Ollama using OpenAI-compatible API +const ollamaModel: Model<'openai-completions'> = { + id: 'llama-3.1-8b', + name: 'Llama 3.1 8B (Ollama)', + api: 'openai-completions', + provider: 'ollama', + baseUrl: 'http://localhost:11434/v1', + reasoning: false, + input: ['text'], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 128000, + maxTokens: 32000 +}; -## @gerrit0/mini-shiki - 3.23.0 -**Repository URL**: https://github.com/Gerrit0/mini-shiki -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +// Example: LiteLLM proxy with explicit compat settings +const litellmModel: Model<'openai-completions'> = { + id: 'gpt-4o', + name: 'GPT-4o (via LiteLLM)', + api: 'openai-completions', + provider: 'litellm', + baseUrl: 'http://localhost:4000/v1', + reasoning: false, + input: ['text', 'image'], + cost: { input: 2.5, output: 10, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 128000, + maxTokens: 16384, + compat: { + supportsStore: false, // LiteLLM doesn't support the store field + } +}; -Copyright (c) 2024 Gerrit Birkeland +// Example: Custom endpoint with headers (bypassing Cloudflare bot detection) +const proxyModel: Model<'anthropic-messages'> = { + id: 'claude-sonnet-4', + name: 'Claude Sonnet 4 (Proxied)', + api: 'anthropic-messages', + provider: 'custom-proxy', + baseUrl: 'https://proxy.example.com/v1', + reasoning: true, + input: ['text', 'image'], + cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 }, + contextWindow: 200000, + maxTokens: 8192, + headers: { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', + 'X-Custom-Auth': 'bearer-token-here' + } +}; -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +// Use the custom model +const response = await stream(ollamaModel, context, { + apiKey: 'dummy' // Ollama doesn't need a real key +}); +``` -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Some OpenAI-compatible servers do not understand the `developer` role used for reasoning-capable models. For those providers, set `compat.supportsDeveloperRole` to `false` so the system prompt is sent as a `system` message instead. If the server also does not support `reasoning_effort`, set `compat.supportsReasoningEffort` to `false` too. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +Use model-level `thinkingLevelMap` to describe model-specific thinking controls. Keys are pi thinking levels (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`). Missing keys use provider defaults, string values are sent to the provider, and `null` marks a level unsupported. -## @google/genai - 1.52.0 -**Repository URL**: https://github.com/googleapis/js-genai -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +This commonly applies to Ollama, vLLM, SGLang, and similar OpenAI-compatible servers. You can set `compat` at the provider level or per model. + +```typescript +const ollamaReasoningModel: Model<'openai-completions'> = { + id: 'gpt-oss:20b', + name: 'GPT-OSS 20B (Ollama)', + api: 'openai-completions', + provider: 'ollama', + baseUrl: 'http://localhost:11434/v1', + reasoning: true, + input: ['text'], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 131072, + maxTokens: 32000, + thinkingLevelMap: { + minimal: null, + low: null, + medium: null, + high: 'high', + xhigh: null, + }, + compat: { + supportsDeveloperRole: false, + supportsReasoningEffort: false, + } +}; ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +### OpenAI Compatibility Settings - 1. Definitions. +The `openai-completions` API is implemented by many providers with minor differences. By default, the library auto-detects compatibility settings based on `baseUrl` for a small set of known OpenAI-compatible providers (Cerebras, xAI, Chutes, DeepSeek, zAi, OpenCode, Cloudflare Workers AI, etc.). For custom proxies or unknown endpoints, you can override these settings via the `compat` field. For `openai-responses` models, the compat field only supports Responses-specific flags. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +```typescript +interface OpenAICompletionsCompat { + supportsStore?: boolean; // Whether provider supports the `store` field (default: true) + supportsDeveloperRole?: boolean; // Whether provider supports `developer` role vs `system` (default: true) + supportsReasoningEffort?: boolean; // Whether provider supports `reasoning_effort` (default: true) + supportsUsageInStreaming?: boolean; // Whether provider supports `stream_options: { include_usage: true }` (default: true) + supportsStrictMode?: boolean; // Whether provider supports `strict` in tool definitions (default: true) + sendSessionAffinityHeaders?: boolean; // Whether to send `session_id`, `x-client-request-id`, and `x-session-affinity` from `sessionId` when caching is enabled (default: false) + maxTokensField?: 'max_completion_tokens' | 'max_tokens'; // Which field name to use (default: max_completion_tokens) + requiresToolResultName?: boolean; // Whether tool results require the `name` field (default: false) + requiresAssistantAfterToolResult?: boolean; // Whether tool results must be followed by an assistant message (default: false) + requiresThinkingAsText?: boolean; // Whether thinking blocks must be converted to text (default: false) + requiresReasoningContentOnAssistantMessages?: boolean; // Whether all replayed assistant messages must include empty reasoning_content when reasoning is enabled (default: auto-detected for DeepSeek) + thinkingFormat?: 'openai' | 'deepseek' | 'zai' | 'qwen' | 'qwen-chat-template'; // Format for reasoning param: 'openai' uses reasoning_effort, 'deepseek' uses thinking: { type } plus reasoning_effort, 'zai' uses enable_thinking, 'qwen' uses enable_thinking, 'qwen-chat-template' uses chat_template_kwargs.enable_thinking (default: openai) + cacheControlFormat?: 'anthropic'; // Anthropic-style cache_control on system prompt, last tool, and last user/assistant text content + openRouterRouting?: OpenRouterRouting; // OpenRouter routing preferences (default: {}) + vercelGatewayRouting?: VercelGatewayRouting; // Vercel AI Gateway routing preferences (default: {}) +} - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +interface OpenAIResponsesCompat { + // Reserved for future use +} +``` - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +If `compat` is not set, the library falls back to URL-based detection. If `compat` is partially set, unspecified fields use the detected defaults. This is useful for: - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +- **LiteLLM proxies**: May not support `store` field +- **Custom inference servers**: May use non-standard field names +- **Self-hosted endpoints**: May have different feature support - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +### Type Safety - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +Models are typed by their API, which keeps the model metadata accurate. Provider-specific option types are enforced when you call the provider functions directly. The generic `stream` and `complete` functions accept `StreamOptions` with additional provider fields. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +```typescript +import { streamAnthropic, type AnthropicOptions } from '@earendil-works/pi-ai'; - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +// TypeScript knows this is an Anthropic model +const claude = getModel('anthropic', 'claude-sonnet-4-20250514'); - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +const options: AnthropicOptions = { + thinkingEnabled: true, + thinkingBudgetTokens: 2048 +}; - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +await streamAnthropic(claude, context, options); +``` - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +## Cross-Provider Handoffs - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +The library supports seamless handoffs between different LLM providers within the same conversation. This allows you to switch models mid-conversation while preserving context, including thinking blocks, tool calls, and tool results. - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +### How It Works - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +When messages from one provider are sent to a different provider, the library automatically transforms them for compatibility: - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +- **User and tool result messages** are passed through unchanged +- **Assistant messages from the same provider/API** are preserved as-is +- **Assistant messages from different providers** have their thinking blocks converted to text with `` tags +- **Tool calls and regular text** are preserved unchanged - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +### Example: Multi-Provider Conversation - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +```typescript +import { getModel, complete, Context } from '@earendil-works/pi-ai'; - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +// Start with Claude +const claude = getModel('anthropic', 'claude-sonnet-4-20250514'); +const context: Context = { + messages: [] +}; - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +context.messages.push({ role: 'user', content: 'What is 25 * 18?' }); +const claudeResponse = await complete(claude, context, { + thinkingEnabled: true +}); +context.messages.push(claudeResponse); - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +// Switch to GPT-5 - it will see Claude's thinking as tagged text +const gpt5 = getModel('openai', 'gpt-5-mini'); +context.messages.push({ role: 'user', content: 'Is that calculation correct?' }); +const gptResponse = await complete(gpt5, context); +context.messages.push(gptResponse); - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +// Switch to Gemini +const gemini = getModel('google', 'gemini-2.5-flash'); +context.messages.push({ role: 'user', content: 'What was the original question?' }); +const geminiResponse = await complete(gemini, context); +``` - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +### Provider Compatibility - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +All providers can handle messages from other providers, including: +- Text content +- Tool calls and tool results (including images in tool results) +- Thinking/reasoning blocks (transformed to tagged text for cross-provider compatibility) +- Aborted messages with partial content - END OF TERMS AND CONDITIONS +This enables flexible workflows where you can: +- Start with a fast model for initial responses +- Switch to a more capable model for complex reasoning +- Use specialized models for specific tasks +- Maintain conversation continuity across provider outages - APPENDIX: How to apply the Apache License to your work. +## Context Serialization - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +The `Context` object can be easily serialized and deserialized using standard JSON methods, making it simple to persist conversations, implement chat history, or transfer contexts between services: - Copyright [yyyy] [name of copyright owner] +```typescript +import { Context, getModel, complete } from '@earendil-works/pi-ai'; - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +// Create and use a context +const context: Context = { + systemPrompt: 'You are a helpful assistant.', + messages: [ + { role: 'user', content: 'What is TypeScript?' } + ] +}; - http://www.apache.org/licenses/LICENSE-2.0 +const model = getModel('openai', 'gpt-4o-mini'); +const response = await complete(model, context); +context.messages.push(response); - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +// Serialize the entire context +const serialized = JSON.stringify(context); +console.log('Serialized context size:', serialized.length, 'bytes'); -## @grammyjs/runner - 2.0.3 -**Repository URL**: https://github.com/grammyjs/runner -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +// Save to database, localStorage, file, etc. +localStorage.setItem('conversation', serialized); + +// Later: deserialize and continue the conversation +const restored: Context = JSON.parse(localStorage.getItem('conversation')!); +restored.messages.push({ role: 'user', content: 'Tell me more about its type system' }); + +// Continue with any model +const newModel = getModel('anthropic', 'claude-3-5-haiku-20241022'); +const continuation = await complete(newModel, restored); ``` -MIT License -Copyright (c) 2021-2023 KnorpelSenf +> **Note**: If the context contains images (encoded as base64 as shown in the Image Input section), those will also be serialized. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +## Browser Usage -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The library supports browser environments. You must pass the API key explicitly since environment variables are not available in browsers: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +```typescript +import { getModel, complete } from '@earendil-works/pi-ai'; -## @grammyjs/transformer-throttler - 1.2.1 -**Repository URL**: https://github.com/grammyjs/transformer-throttler -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +// API key must be passed explicitly in browser +const model = getModel('anthropic', 'claude-3-5-haiku-20241022'); + +const response = await complete(model, { + messages: [{ role: 'user', content: 'Hello!' }] +}, { + apiKey: 'your-api-key' +}); ``` -MIT License -Copyright (c) 2022 grammyjs +> **Security Warning**: Exposing API keys in frontend code is dangerous. Anyone can extract and abuse your keys. Only use this approach for internal tools or demos. For production applications, use a backend proxy that keeps your API keys secure. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +### Browser Compatibility Notes -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +- Amazon Bedrock (`bedrock-converse-stream`) is not supported in browser environments. +- OAuth login flows are not supported in browser environments. Use the `@earendil-works/pi-ai/oauth` entry point in Node.js. +- In browser builds, Bedrock can still appear in model lists. Calls to Bedrock models fail at runtime. +- Use a server-side proxy or backend service if you need Bedrock or OAuth-based auth from a web app. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +### Environment Variables (Node.js only) -## @grammyjs/types - 3.26.0 -**Repository URL**: https://github.com/grammyjs/types -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +In Node.js environments, you can set environment variables to avoid passing API keys: -Copyright (c) 2021-2024 KnorpelSenf +| Provider | Environment Variable(s) | +|----------|------------------------| +| OpenAI | `OPENAI_API_KEY` | +| Azure OpenAI | `AZURE_OPENAI_API_KEY` + `AZURE_OPENAI_BASE_URL` (e.g. `https://{resource}.openai.azure.com`) or `AZURE_OPENAI_RESOURCE_NAME`. Supports `*.openai.azure.com` and `*.cognitiveservices.azure.com`; root endpoints auto-normalize to `/openai/v1`. Optional: `AZURE_OPENAI_API_VERSION` (default `v1`), `AZURE_OPENAI_DEPLOYMENT_NAME_MAP`. | +| Anthropic | `ANTHROPIC_API_KEY` or `ANTHROPIC_OAUTH_TOKEN` | +| DeepSeek | `DEEPSEEK_API_KEY` | +| Google | `GEMINI_API_KEY` | +| Vertex AI | `GOOGLE_CLOUD_API_KEY` or `GOOGLE_CLOUD_PROJECT` (or `GCLOUD_PROJECT`) + `GOOGLE_CLOUD_LOCATION` + ADC | +| Mistral | `MISTRAL_API_KEY` | +| Groq | `GROQ_API_KEY` | +| Cerebras | `CEREBRAS_API_KEY` | +| Cloudflare AI Gateway | `CLOUDFLARE_API_KEY` + `CLOUDFLARE_ACCOUNT_ID` + `CLOUDFLARE_GATEWAY_ID` | +| Cloudflare Workers AI | `CLOUDFLARE_API_KEY` + `CLOUDFLARE_ACCOUNT_ID` | +| xAI | `XAI_API_KEY` | +| Fireworks | `FIREWORKS_API_KEY` | +| OpenRouter | `OPENROUTER_API_KEY` | +| Vercel AI Gateway | `AI_GATEWAY_API_KEY` | +| zAI | `ZAI_API_KEY` | +| MiniMax | `MINIMAX_API_KEY` | +| OpenCode Zen / OpenCode Go | `OPENCODE_API_KEY` | +| Kimi For Coding | `KIMI_API_KEY` | +| Xiaomi MiMo (API billing) | `XIAOMI_API_KEY` | +| Xiaomi MiMo Token Plan (China) | `XIAOMI_TOKEN_PLAN_CN_API_KEY` | +| Xiaomi MiMo Token Plan (Amsterdam) | `XIAOMI_TOKEN_PLAN_AMS_API_KEY` | +| Xiaomi MiMo Token Plan (Singapore) | `XIAOMI_TOKEN_PLAN_SGP_API_KEY` | +| GitHub Copilot | `COPILOT_GITHUB_TOKEN` or `GH_TOKEN` or `GITHUB_TOKEN` | -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +When set, the library automatically uses these keys: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +```typescript +// Uses OPENAI_API_KEY from environment +const model = getModel('openai', 'gpt-4o-mini'); +const response = await complete(model, context); -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +// Or override with explicit key +const response = await complete(model, context, { + apiKey: 'sk-different-key' +}); +``` -## @homebridge/ciao - 1.3.8 -**Repository URL**: https://github.com/homebridge/ciao -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +### Checking Environment Variables + +```typescript +import { getEnvApiKey } from '@earendil-works/pi-ai'; + +// Check if an API key is set in environment variables +const key = getEnvApiKey('openai'); // checks OPENAI_API_KEY ``` -MIT License -Copyright (c) 2020 Andreas Bauer +## OAuth Providers -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Several providers require OAuth authentication instead of static API keys: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +- **Anthropic** (Claude Pro/Max subscription) +- **OpenAI Codex** (ChatGPT Plus/Pro subscription, access to GPT-5.x Codex models) +- **GitHub Copilot** (Copilot subscription) -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +For paid Cloud Code Assist subscriptions, set `GOOGLE_CLOUD_PROJECT` or `GOOGLE_CLOUD_PROJECT_ID` to your project ID. -## @hono/node-server - 1.19.14 -**Repository URL**: https://github.com/honojs/node-server -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +### Vertex AI -Copyright (c) 2022 - present, Yusuke Wada and Hono contributors +Vertex AI models support either a Google Cloud API key or Application Default Credentials (ADC): -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +- **API key**: Set `GOOGLE_CLOUD_API_KEY` or pass `apiKey` in the call options. +- **Local development (ADC)**: Run `gcloud auth application-default login` +- **CI/Production (ADC)**: Set `GOOGLE_APPLICATION_CREDENTIALS` to point to a service account JSON key file -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +When using ADC, also set `GOOGLE_CLOUD_PROJECT` (or `GCLOUD_PROJECT`) and `GOOGLE_CLOUD_LOCATION`. You can also pass `project`/`location` in the call options. When using `GOOGLE_CLOUD_API_KEY`, `project` and `location` are not required. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +Example: -## @isaacs/fs-minipass - 4.0.1 -**Repository URL**: https://github.com/npm/fs-minipass -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html +```bash +# Local (uses your user credentials) +gcloud auth application-default login +export GOOGLE_CLOUD_PROJECT="my-project" +export GOOGLE_CLOUD_LOCATION="us-central1" + +# CI/Production (service account key file) +export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json" ``` -The ISC License -Copyright (c) Isaac Z. Schlueter and Contributors +```typescript +import { getModel, complete } from '@earendil-works/pi-ai'; -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +(async () => { + const model = getModel('google-vertex', 'gemini-2.5-flash'); + const response = await complete(model, { + messages: [{ role: 'user', content: 'Hello from Vertex AI' }] + }, { + apiKey: process.env.GOOGLE_CLOUD_API_KEY, + }); -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` + for (const block of response.content) { + if (block.type === 'text') console.log(block.text); + } +})().catch(console.error); +``` -## @istanbuljs/schema - 0.1.3 -**Repository URL**: https://github.com/istanbuljs/schema -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +Official docs: [Application Default Credentials](https://cloud.google.com/docs/authentication/application-default-credentials) + +### CLI Login + +The quickest way to authenticate: + +```bash +npx @earendil-works/pi-ai login # interactive provider selection +npx @earendil-works/pi-ai login anthropic # login to specific provider +npx @earendil-works/pi-ai list # list available providers ``` -MIT License -Copyright (c) 2019 CFWare, LLC +Credentials are saved to `auth.json` in the current directory. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +### Programmatic OAuth -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The library provides login and token refresh functions via the `@earendil-works/pi-ai/oauth` entry point. Credential storage is the caller's responsibility. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +```typescript +import { + // Login functions (return credentials, do not store) + loginAnthropic, + loginOpenAICodex, + loginGitHubCopilot, + loginGeminiCli, -## @istanbuljs/schema - 0.1.6 -**Repository URL**: https://github.com/istanbuljs/schema -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License + // Token management + refreshOAuthToken, // (provider, credentials) => new credentials + getOAuthApiKey, // (provider, credentialsMap) => { newCredentials, apiKey } | null -Copyright (c) 2019 CFWare, LLC + // Types + type OAuthProvider, + type OAuthCredentials, +} from '@earendil-works/pi-ai/oauth'; +``` -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +### Login Flow Example -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +```typescript +import { loginGitHubCopilot } from '@earendil-works/pi-ai/oauth'; +import { writeFileSync } from 'fs'; -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +const credentials = await loginGitHubCopilot({ + onAuth: (url, instructions) => { + console.log(`Open: ${url}`); + if (instructions) console.log(instructions); + }, + onPrompt: async (prompt) => { + return await getUserInput(prompt.message); + }, + onProgress: (message) => console.log(message) +}); -## @jridgewell/resolve-uri - 3.1.2 -**Repository URL**: https://github.com/jridgewell/resolve-uri -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +// Store credentials yourself +const auth = { 'github-copilot': { type: 'oauth', ...credentials } }; +writeFileSync('auth.json', JSON.stringify(auth, null, 2)); ``` -Copyright 2019 Justin Ridgewell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +### Using OAuth Tokens -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +Use `getOAuthApiKey()` to get an API key, automatically refreshing if expired: -## @jridgewell/sourcemap-codec - 1.5.5 -**Repository URL**: https://github.com/jridgewell/sourcemaps -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright 2024 Justin Ridgewell +```typescript +import { getModel, complete } from '@earendil-works/pi-ai'; +import { getOAuthApiKey } from '@earendil-works/pi-ai/oauth'; +import { readFileSync, writeFileSync } from 'fs'; -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +// Load your stored credentials +const auth = JSON.parse(readFileSync('auth.json', 'utf-8')); -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +// Get API key (refreshes if expired) +const result = await getOAuthApiKey('github-copilot', auth); +if (!result) throw new Error('Not logged in'); -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +// Save refreshed credentials +auth['github-copilot'] = { type: 'oauth', ...result.newCredentials }; +writeFileSync('auth.json', JSON.stringify(auth, null, 2)); -## @jridgewell/trace-mapping - 0.3.31 -**Repository URL**: https://github.com/jridgewell/sourcemaps -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +// Use the API key +const model = getModel('github-copilot', 'gpt-4o'); +const response = await complete(model, { + messages: [{ role: 'user', content: 'Hello!' }] +}, { apiKey: result.apiKey }); ``` -Copyright 2024 Justin Ridgewell -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +### Provider Notes -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +**OpenAI Codex**: Requires a ChatGPT Plus or Pro subscription. Provides access to GPT-5.x Codex models with extended context windows and reasoning capabilities. The library automatically handles session-based prompt caching when `sessionId` is provided in stream options. You can set `transport` in stream options to `"sse"`, `"websocket"`, or `"auto"` for Codex Responses transport selection. When using WebSocket with a `sessionId`, connections are reused per session and expire after 5 minutes of inactivity. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +**Azure OpenAI (Responses)**: Uses the Responses API only. Set `AZURE_OPENAI_API_KEY` and either `AZURE_OPENAI_BASE_URL` or `AZURE_OPENAI_RESOURCE_NAME`. `AZURE_OPENAI_BASE_URL` supports both `https://.openai.azure.com` and `https://.cognitiveservices.azure.com`; root endpoints are normalized to `.../openai/v1` automatically. Use `AZURE_OPENAI_API_VERSION` (defaults to `v1`) to override the API version if needed. Deployment names are treated as model IDs by default, override with `azureDeploymentName` or `AZURE_OPENAI_DEPLOYMENT_NAME_MAP` using comma-separated `model-id=deployment` pairs (for example `gpt-4o-mini=my-deployment,gpt-4o=prod`). Legacy deployment-based URLs are intentionally unsupported. -## @lydell/node-pty - 1.2.0-beta.12 -**Repository URL**: https://github.com/lydell/node-pty -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +**GitHub Copilot**: If you get "The requested model is not supported" error, enable the model manually in VS Code: open Copilot Chat, click the model selector, select the model (warning icon), and click "Enable". -Copyright (c) 2026 Simon Lydell +## Development -All rights reserved. +### Adding a New Provider -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Adding a new LLM provider requires changes across multiple files. This checklist covers all necessary steps: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +#### 1. Core Types (`src/types.ts`) -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +- Add the API identifier to `KnownApi` (for example `"bedrock-converse-stream"`) +- Create an options interface extending `StreamOptions` (for example `BedrockOptions`) +- Add the provider name to `KnownProvider` (for example `"amazon-bedrock"`) -## @mariozechner/jiti - 2.6.5 -**Repository URL**: https://github.com/badlogic/jiti -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +#### 2. Provider Implementation (`src/providers/`) -Copyright (c) Pooya Parsa +Create a new provider file (for example `amazon-bedrock.ts`) that exports: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +- `stream()` function returning `AssistantMessageEventStream` +- `streamSimple()` for `SimpleStreamOptions` mapping +- Provider-specific options interface +- Message conversion functions to transform `Context` to provider format +- Tool conversion if the provider supports tools +- Response parsing to emit standardized events (`text`, `tool_call`, `thinking`, `usage`, `stop`) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +#### 3. API Registry Integration (`src/providers/register-builtins.ts`) -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +- Register the API with `registerApiProvider()` +- Add a package subpath export in `package.json` for the provider module (`./dist/providers/.js`) +- Add lazy loader wrappers in `src/providers/register-builtins.ts`, do not statically import provider implementation modules there +- Add any root-level `export type` re-exports in `src/index.ts` that should remain available from `@earendil-works/pi-ai` +- Add credential detection in `env-api-keys.ts` for the new provider +- Ensure `streamSimple` handles auth lookup via `getEnvApiKey()` or provider-specific auth -## @mariozechner/pi-agent-core - 0.73.0 -**Repository URL**: https://github.com/badlogic/pi-mono -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -# @mariozechner/pi-agent-core +#### 4. Model Generation (`scripts/generate-models.ts`) -Stateful agent with tool execution and event streaming. Built on `@mariozechner/pi-ai`. +- Add logic to fetch and parse models from the provider's source (e.g., models.dev API) +- Map provider model data to the standardized `Model` interface +- Handle provider-specific quirks (pricing format, capability flags, model ID transformations) -## Installation +#### 5. Tests (`test/`) -```bash -npm install @mariozechner/pi-agent-core -``` +Create or update test files to cover the new provider: -## Quick Start +- `stream.test.ts` - Basic streaming and tool use +- `tokens.test.ts` - Token usage reporting +- `abort.test.ts` - Request cancellation +- `empty.test.ts` - Empty message handling +- `context-overflow.test.ts` - Context limit errors +- `image-limits.test.ts` - Image support (if applicable) +- `unicode-surrogate.test.ts` - Unicode handling +- `tool-call-without-result.test.ts` - Orphaned tool calls +- `image-tool-result.test.ts` - Images in tool results +- `total-tokens.test.ts` - Token counting accuracy +- `cross-provider-handoff.test.ts` - Cross-provider context replay -```typescript -import { Agent } from "@mariozechner/pi-agent-core"; -import { getModel } from "@mariozechner/pi-ai"; +For `cross-provider-handoff.test.ts`, add at least one provider/model pair. If the provider exposes multiple model families (for example GPT and Claude), add at least one pair per family. -const agent = new Agent({ - initialState: { - systemPrompt: "You are a helpful assistant.", - model: getModel("anthropic", "claude-sonnet-4-20250514"), - }, -}); +For providers with non-standard auth (AWS, Google Vertex), create a utility like `bedrock-utils.ts` with credential detection helpers. -agent.subscribe((event) => { - if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") { - // Stream just the new text chunk - process.stdout.write(event.assistantMessageEvent.delta); - } -}); +#### 6. Coding Agent Integration (`../coding-agent/`) -await agent.prompt("Hello!"); -``` +Update `src/core/model-resolver.ts`: -## Core Concepts +- Add a default model ID for the provider in `DEFAULT_MODELS` -### AgentMessage vs LLM Message +Update `src/cli/args.ts`: -The agent works with `AgentMessage`, a flexible type that can include: -- Standard LLM messages (`user`, `assistant`, `toolResult`) -- Custom app-specific message types via declaration merging +- Add environment variable documentation in the help text -LLMs only understand `user`, `assistant`, and `toolResult`. The `convertToLlm` function bridges this gap by filtering and transforming messages before each LLM call. - -### Message Flow - -``` -AgentMessage[] → transformContext() → AgentMessage[] → convertToLlm() → Message[] → LLM - (optional) (required) -``` - -1. **transformContext**: Prune old messages, inject external context -2. **convertToLlm**: Filter out UI-only messages, convert custom types to LLM format - -## Event Flow +Update `README.md`: -The agent emits events for UI updates. Understanding the event sequence helps build responsive interfaces. +- Add the provider to the providers section with setup instructions -### prompt() Event Sequence +#### 7. Documentation -When you call `prompt("Hello")`: +Update `packages/ai/README.md`: -``` -prompt("Hello") -├─ agent_start -├─ turn_start -├─ message_start { message: userMessage } // Your prompt -├─ message_end { message: userMessage } -├─ message_start { message: assistantMessage } // LLM starts responding -├─ message_update { message: partial... } // Streaming chunks -├─ message_update { message: partial... } -├─ message_end { message: assistantMessage } // Complete response -├─ turn_end { message, toolResults: [] } -└─ agent_end { messages: [...] } -``` +- Add to the Supported Providers table +- Document any provider-specific options or authentication requirements +- Add environment variable to the Environment Variables section -### With Tool Calls +#### 8. Changelog -If the assistant calls tools, the loop continues: +Add an entry to `packages/ai/CHANGELOG.md` under `## [Unreleased]`: +```markdown +### Added +- Added support for [Provider Name] provider ([#PR](link) by [@author](link)) ``` -prompt("Read config.json") -├─ agent_start -├─ turn_start -├─ message_start/end { userMessage } -├─ message_start { assistantMessage with toolCall } -├─ message_update... -├─ message_end { assistantMessage } -├─ tool_execution_start { toolCallId, toolName, args } -├─ tool_execution_update { partialResult } // If tool streams -├─ tool_execution_end { toolCallId, result } -├─ message_start/end { toolResultMessage } -├─ turn_end { message, toolResults: [toolResult] } -│ -├─ turn_start // Next turn -├─ message_start { assistantMessage } // LLM responds to tool result -├─ message_update... -├─ message_end -├─ turn_end -└─ agent_end -``` - -Tool execution mode is configurable: - -- `parallel` (default): preflight tool calls sequentially, execute allowed tools concurrently, emit `tool_execution_end` as soon as each tool is finalized, then emit toolResult messages and `turn_end.toolResults` in assistant source order -- `sequential`: execute tool calls one by one, matching the historical behavior - -In parallel mode, tool completion events follow tool completion order, but persisted toolResult messages still follow assistant source order. - -The mode can be set globally via `toolExecution` in the agent config, or per-tool via `executionMode` on `AgentTool`. If any tool call in a batch targets a tool with `executionMode: "sequential"`, the entire batch executes sequentially regardless of the global setting. -The `beforeToolCall` hook runs after `tool_execution_start` and validated argument parsing. It can block execution. The `afterToolCall` hook runs after tool execution finishes and before `tool_execution_end` and final tool result message events are emitted. - -Tools can also return `terminate: true` to hint that the automatic follow-up LLM call should be skipped. The loop only stops early when every finalized tool result in that batch sets `terminate: true`. Mixed batches continue normally. +## License -Low-level loop callers can set `shouldStopAfterTurn` to stop gracefully after the current turn completes: +MIT``` -```typescript -const stream = agentLoop(prompts, context, { - model, - convertToLlm, - shouldStopAfterTurn: async ({ message, toolResults, context, newMessages }) => { - return shouldCompactBeforeNextTurn(context.messages); - }, -}); +## @earendil-works/pi-coding-agent - 0.74.0 +**Repository URL**: https://github.com/earendil-works/pi-mono +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +

+ + + + + pi logo + + +

+

+ Discord + npm + Build status +

+

+ pi.dev domain graciously donated by +

+ Exy mascot
exe.dev
+

-`shouldStopAfterTurn` runs after `turn_end` is emitted and after the assistant response and any tool executions have completed normally. If it returns `true`, the loop emits `agent_end` and exits before polling steering or follow-up queues, and before starting another LLM call. It does not abort the provider stream, does not cancel running tools, and does not alter the assistant message stop reason. - -When you use the `Agent` class, assistant `message_end` processing is treated as a barrier before tool preflight begins. That means `beforeToolCall` sees agent state that already includes the assistant message that requested the tool call. - -### continue() Event Sequence +> New issues and PRs from new contributors are auto-closed by default. Maintainers review auto-closed issues daily. See [CONTRIBUTING.md](../../CONTRIBUTING.md). -`continue()` resumes from existing context without adding a new message. Use it for retries after errors. +--- -```typescript -// After an error, retry from current state -await agent.continue(); -``` +Pi is a minimal terminal coding harness. Adapt pi to your workflows, not the other way around, without having to fork and modify pi internals. Extend it with TypeScript [Extensions](#extensions), [Skills](#skills), [Prompt Templates](#prompt-templates), and [Themes](#themes). Put your extensions, skills, prompt templates, and themes in [Pi Packages](#pi-packages) and share them with others via npm or git. -The last message in context must be `user` or `toolResult` (not `assistant`). +Pi ships with powerful defaults but skips features like sub agents and plan mode. Instead, you can ask pi to build what you want or install a third party pi package that matches your workflow. -### Event Types +Pi runs in four modes: interactive, print or JSON, RPC for process integration, and an SDK for embedding in your own apps. See [openclaw/openclaw](https://github.com/openclaw/openclaw) for a real-world SDK integration. -| Event | Description | -|-------|-------------| -| `agent_start` | Agent begins processing | -| `agent_end` | Final event for the run. Awaited subscribers for this event still count toward settlement | -| `turn_start` | New turn begins (one LLM call + tool executions) | -| `turn_end` | Turn completes with assistant message and tool results | -| `message_start` | Any message begins (user, assistant, toolResult) | -| `message_update` | **Assistant only.** Includes `assistantMessageEvent` with delta | -| `message_end` | Message completes | -| `tool_execution_start` | Tool begins | -| `tool_execution_update` | Tool streams progress | -| `tool_execution_end` | Tool completes | +## Share your OSS coding agent sessions -`Agent.subscribe()` listeners are awaited in registration order. `agent_end` means no more loop events will be emitted, but `await agent.waitForIdle()` and `await agent.prompt(...)` only settle after awaited `agent_end` listeners finish. +If you use pi for open source work, please share your coding agent sessions. -## Agent Options +Public OSS session data helps improve models, prompts, tools, and evaluations using real development workflows. -```typescript -const agent = new Agent({ - // Initial state - initialState: { - systemPrompt: string, - model: Model, - thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh", - tools: AgentTool[], - messages: AgentMessage[], - }, +For the full explanation, see [this post on X](https://x.com/badlogicgames/status/2037811643774652911). - // Convert AgentMessage[] to LLM Message[] (required for custom message types) - convertToLlm: (messages) => messages.filter(...), +To publish sessions, use [`badlogic/pi-share-hf`](https://github.com/badlogic/pi-share-hf). Read its README.md for setup instructions. All you need is a Hugging Face account, the Hugging Face CLI, and `pi-share-hf`. - // Transform context before convertToLlm (for pruning, compaction) - transformContext: async (messages, signal) => pruneOldMessages(messages), +You can also watch [this video](https://x.com/badlogicgames/status/2041151967695634619), where I show how I publish my `pi-mono` sessions. - // Steering mode: "one-at-a-time" (default) or "all" - steeringMode: "one-at-a-time", +I regularly publish my own `pi-mono` work sessions here: - // Follow-up mode: "one-at-a-time" (default) or "all" - followUpMode: "one-at-a-time", +- [badlogicgames/pi-mono on Hugging Face](https://huggingface.co/datasets/badlogicgames/pi-mono) - // Custom stream function (for proxy backends) - streamFn: streamProxy, +## Table of Contents - // Session ID for provider caching - sessionId: "session-123", +- [Quick Start](#quick-start) +- [Providers & Models](#providers--models) +- [Interactive Mode](#interactive-mode) + - [Editor](#editor) + - [Commands](#commands) + - [Keyboard Shortcuts](#keyboard-shortcuts) + - [Message Queue](#message-queue) +- [Sessions](#sessions) + - [Branching](#branching) + - [Compaction](#compaction) +- [Settings](#settings) +- [Context Files](#context-files) +- [Customization](#customization) + - [Prompt Templates](#prompt-templates) + - [Skills](#skills) + - [Extensions](#extensions) + - [Themes](#themes) + - [Pi Packages](#pi-packages) +- [Programmatic Usage](#programmatic-usage) +- [Philosophy](#philosophy) +- [CLI Reference](#cli-reference) - // Dynamic API key resolution (for expiring OAuth tokens) - getApiKey: async (provider) => refreshToken(), +--- - // Tool execution mode: "parallel" (default) or "sequential" - toolExecution: "parallel", +## Quick Start - // Preflight each tool call after args are validated. Can block execution. - beforeToolCall: async ({ toolCall, args, context }) => { - if (toolCall.name === "bash") { - return { block: true, reason: "bash is disabled" }; - } - }, +```bash +npm install -g @earendil-works/pi-coding-agent +``` - // Postprocess each tool result before final tool events are emitted. - afterToolCall: async ({ toolCall, result, isError, context }) => { - if (toolCall.name === "notify_done" && !isError) { - return { terminate: true }; - } - if (!isError) { - return { details: { ...result.details, audited: true } }; - } - }, +Authenticate with an API key: - // Custom thinking budgets for token-based providers - thinkingBudgets: { - minimal: 128, - low: 512, - medium: 1024, - high: 2048, - }, -}); +```bash +export ANTHROPIC_API_KEY=sk-ant-... +pi ``` -## Agent State +Or use your existing subscription: -```typescript -interface AgentState { - systemPrompt: string; - model: Model; - thinkingLevel: ThinkingLevel; - tools: AgentTool[]; - messages: AgentMessage[]; - readonly isStreaming: boolean; - readonly streamingMessage?: AgentMessage; - readonly pendingToolCalls: ReadonlySet; - readonly errorMessage?: string; -} +```bash +pi +/login # Then select provider ``` -Access state via `agent.state`. +Then just talk to pi. By default, pi gives the model four tools: `read`, `write`, `edit`, and `bash`. The model uses these to fulfill your requests. Add capabilities via [skills](#skills), [prompt templates](#prompt-templates), [extensions](#extensions), or [pi packages](#pi-packages). -Assigning `agent.state.tools = [...]` or `agent.state.messages = [...]` copies the top-level array before storing it. Mutating the returned array mutates the current agent state. +**Platform notes:** [Windows](docs/windows.md) | [Termux (Android)](docs/termux.md) | [tmux](docs/tmux.md) | [Terminal setup](docs/terminal-setup.md) | [Shell aliases](docs/shell-aliases.md) -During streaming, `agent.state.streamingMessage` contains the current partial assistant message. +--- -`agent.state.isStreaming` remains `true` until the run fully settles, including awaited `agent_end` subscribers. +## Providers & Models -## Methods +For each built-in provider, pi maintains a list of tool-capable models, updated with every release. Authenticate via subscription (`/login`) or API key, then select any model from that provider via `/model` (or Ctrl+L). -### Prompting +**Subscriptions:** +- Anthropic Claude Pro/Max +- OpenAI ChatGPT Plus/Pro (Codex) +- GitHub Copilot -```typescript -// Text prompt -await agent.prompt("Hello"); +**API keys:** +- Anthropic +- OpenAI +- Azure OpenAI +- DeepSeek +- Google Gemini +- Google Vertex +- Amazon Bedrock +- Mistral +- Groq +- Cerebras +- Cloudflare AI Gateway +- Cloudflare Workers AI +- xAI +- OpenRouter +- Vercel AI Gateway +- ZAI +- OpenCode Zen +- OpenCode Go +- Hugging Face +- Fireworks +- Kimi For Coding +- MiniMax +- Xiaomi MiMo +- Xiaomi MiMo Token Plan (China) +- Xiaomi MiMo Token Plan (Amsterdam) +- Xiaomi MiMo Token Plan (Singapore) -// With images -await agent.prompt("What's in this image?", [ - { type: "image", data: base64Data, mimeType: "image/jpeg" } -]); +See [docs/providers.md](docs/providers.md) for detailed setup instructions. -// AgentMessage directly -await agent.prompt({ role: "user", content: "Hello", timestamp: Date.now() }); +**Custom providers & models:** Add providers via `~/.pi/agent/models.json` if they speak a supported API (OpenAI, Anthropic, Google). For custom APIs or OAuth, use extensions. See [docs/models.md](docs/models.md) and [docs/custom-provider.md](docs/custom-provider.md). -// Continue from current context (last message must be user or toolResult) -await agent.continue(); -``` +--- -### State Management +## Interactive Mode -```typescript -agent.state.systemPrompt = "New prompt"; -agent.state.model = getModel("openai", "gpt-4o"); -agent.state.thinkingLevel = "medium"; -agent.state.tools = [myTool]; -agent.toolExecution = "sequential"; -agent.beforeToolCall = async ({ toolCall }) => undefined; -agent.afterToolCall = async ({ toolCall, result }) => undefined; -agent.state.messages = newMessages; // top-level array is copied -agent.state.messages.push(message); -agent.reset(); -``` +

Interactive Mode

-### Session and Thinking Budgets +The interface from top to bottom: -```typescript -agent.sessionId = "session-123"; +- **Startup header** - Shows shortcuts (`/hotkeys` for all), loaded AGENTS.md files, prompt templates, skills, and extensions +- **Messages** - Your messages, assistant responses, tool calls and results, notifications, errors, and extension UI +- **Editor** - Where you type; border color indicates thinking level +- **Footer** - Working directory, session name, total token/cache usage, cost, context usage, current model -agent.thinkingBudgets = { - minimal: 128, - low: 512, - medium: 1024, - high: 2048, -}; -``` +The editor can be temporarily replaced by other UI, like built-in `/settings` or custom UI from extensions (e.g., a Q&A tool that lets the user answer model questions in a structured format). [Extensions](#extensions) can also replace the editor, add widgets above/below it, a status line, custom footer, or overlays. -### Control +### Editor -```typescript -agent.abort(); // Cancel current operation -await agent.waitForIdle(); // Wait for completion -``` +| Feature | How | +|---------|-----| +| File reference | Type `@` to fuzzy-search project files | +| Path completion | Tab to complete paths | +| Multi-line | Shift+Enter (or Ctrl+Enter on Windows Terminal) | +| Images | Ctrl+V to paste (Alt+V on Windows), or drag onto terminal | +| Bash commands | `!command` runs and sends output to LLM, `!!command` runs without sending | -### Events +Standard editing keybindings for delete word, undo, etc. See [docs/keybindings.md](docs/keybindings.md). -```typescript -const unsubscribe = agent.subscribe(async (event, signal) => { - if (event.type === "agent_end") { - // Final barrier work for the run - await flushSessionState(signal); - } -}); -unsubscribe(); -``` +### Commands -## Steering and Follow-up +Type `/` in the editor to trigger commands. [Extensions](#extensions) can register custom commands, [skills](#skills) are available as `/skill:name`, and [prompt templates](#prompt-templates) expand via `/templatename`. -Steering messages let you interrupt the agent while tools are running. Follow-up messages let you queue work after the agent would otherwise stop. +| Command | Description | +|---------|-------------| +| `/login`, `/logout` | OAuth authentication | +| `/model` | Switch models | +| `/scoped-models` | Enable/disable models for Ctrl+P cycling | +| `/settings` | Thinking level, theme, message delivery, transport | +| `/resume` | Pick from previous sessions | +| `/new` | Start a new session | +| `/name ` | Set session display name | +| `/session` | Show session info (file, ID, messages, tokens, cost) | +| `/tree` | Jump to any point in the session and continue from there | +| `/fork` | Create a new session from a previous user message | +| `/clone` | Duplicate the current active branch into a new session | +| `/compact [prompt]` | Manually compact context, optional custom instructions | +| `/copy` | Copy last assistant message to clipboard | +| `/export [file]` | Export session to HTML file | +| `/share` | Upload as private GitHub gist with shareable HTML link | +| `/reload` | Reload keybindings, extensions, skills, prompts, and context files (themes hot-reload automatically) | +| `/hotkeys` | Show all keyboard shortcuts | +| `/changelog` | Display version history | +| `/quit` | Quit pi | -```typescript -agent.steeringMode = "one-at-a-time"; -agent.followUpMode = "one-at-a-time"; +### Keyboard Shortcuts -// While agent is running tools -agent.steer({ - role: "user", - content: "Stop! Do this instead.", - timestamp: Date.now(), -}); +See `/hotkeys` for the full list. Customize via `~/.pi/agent/keybindings.json`. See [docs/keybindings.md](docs/keybindings.md). -// After the agent finishes its current work -agent.followUp({ - role: "user", - content: "Also summarize the result.", - timestamp: Date.now(), -}); +**Commonly used:** -const steeringMode = agent.steeringMode; -const followUpMode = agent.followUpMode; +| Key | Action | +|-----|--------| +| Ctrl+C | Clear editor | +| Ctrl+C twice | Quit | +| Escape | Cancel/abort | +| Escape twice | Open `/tree` | +| Ctrl+L | Open model selector | +| Ctrl+P / Shift+Ctrl+P | Cycle scoped models forward/backward | +| Shift+Tab | Cycle thinking level | +| Ctrl+O | Collapse/expand tool output | +| Ctrl+T | Collapse/expand thinking blocks | -agent.clearSteeringQueue(); -agent.clearFollowUpQueue(); -agent.clearAllQueues(); -``` +### Message Queue -Use clearSteeringQueue, clearFollowUpQueue, or clearAllQueues to drop queued messages. +Submit messages while the agent is working: -When steering messages are detected after a turn completes: -1. All tool calls from the current assistant message have already finished -2. Steering messages are injected -3. The LLM responds on the next turn +- **Enter** queues a *steering* message, delivered after the current assistant turn finishes executing its tool calls +- **Alt+Enter** queues a *follow-up* message, delivered only after the agent finishes all work +- **Escape** aborts and restores queued messages to editor +- **Alt+Up** retrieves queued messages back to editor -Follow-up messages are checked only when there are no more tool calls and no steering messages. If any are queued, they are injected and another turn runs. +On Windows Terminal, `Alt+Enter` is fullscreen by default. Remap it in [docs/terminal-setup.md](docs/terminal-setup.md) so pi can receive the follow-up shortcut. -## Custom Message Types +Configure delivery in [settings](docs/settings.md): `steeringMode` and `followUpMode` can be `"one-at-a-time"` (default, waits for response) or `"all"` (delivers all queued at once). `transport` selects provider transport preference (`"sse"`, `"websocket"`, or `"auto"`) for providers that support multiple transports. -Extend `AgentMessage` via declaration merging: +--- -```typescript -declare module "@mariozechner/pi-agent-core" { - interface CustomAgentMessages { - notification: { role: "notification"; text: string; timestamp: number }; - } -} +## Sessions -// Now valid -const msg: AgentMessage = { role: "notification", text: "Info", timestamp: Date.now() }; -``` +Sessions are stored as JSONL files with a tree structure. Each entry has an `id` and `parentId`, enabling in-place branching without creating new files. See [docs/session-format.md](docs/session-format.md) for file format. -Handle custom types in `convertToLlm`: +### Management -```typescript -const agent = new Agent({ - convertToLlm: (messages) => messages.flatMap(m => { - if (m.role === "notification") return []; // Filter out - return [m]; - }), -}); +Sessions auto-save to `~/.pi/agent/sessions/` organized by working directory. + +```bash +pi -c # Continue most recent session +pi -r # Browse and select from past sessions +pi --no-session # Ephemeral mode (don't save) +pi --session # Use specific session file or ID +pi --fork # Fork specific session file or ID into a new session ``` -## Tools +Use `/session` in interactive mode to see the current session ID before reusing it with `--session ` or `--fork `. -Define tools using `AgentTool`: +### Branching -```typescript -import { Type } from "typebox"; +**`/tree`** - Navigate the session tree in-place. Select any previous point, continue from there, and switch between branches. All history preserved in a single file. -const readFileTool: AgentTool = { - name: "read_file", - label: "Read File", // For UI display - description: "Read a file's contents", - parameters: Type.Object({ - path: Type.String({ description: "File path" }), - }), - // Override execution mode for this tool (optional). - // "sequential" forces the entire batch to run one at a time. - // "parallel" allows concurrent execution with other tool calls. - // If omitted, the global toolExecution config applies. - executionMode: "sequential", - execute: async (toolCallId, params, signal, onUpdate) => { - const content = await fs.readFile(params.path, "utf-8"); +

Tree View

- // Optional: stream progress - onUpdate?.({ content: [{ type: "text", text: "Reading..." }], details: {} }); +- Search by typing, fold/unfold and jump between branches with Ctrl+←/Ctrl+→ or Alt+←/Alt+→, page with ←/→ +- Filter modes (Ctrl+O): default → no-tools → user-only → labeled-only → all +- Press Shift+L to label entries as bookmarks and Shift+T to toggle label timestamps - // Optional: add `terminate: true` here to skip the automatic follow-up LLM call - // when every finalized tool result in the batch does the same. - return { - content: [{ type: "text", text: content }], - details: { path: params.path, size: content.length }, - }; - }, -}; +**`/fork`** - Create a new session file from a previous user message on the active branch. Opens a selector, copies the active path up to that point, and places the selected prompt in the editor for modification. -agent.state.tools = [readFileTool]; -``` +**`/clone`** - Duplicate the current active branch into a new session file at the current position. The new session keeps the full active-path history and opens with an empty editor. -### Error Handling +**`--fork `** - Fork an existing session file or partial session UUID directly from the CLI. This copies the full source session into a new session file in the current project. -**Throw an error** when a tool fails. Do not return error messages as content. +### Compaction -```typescript -execute: async (toolCallId, params, signal, onUpdate) => { - if (!fs.existsSync(params.path)) { - throw new Error(`File not found: ${params.path}`); - } - // Return content only on success - return { content: [{ type: "text", text: "..." }] }; -} -``` +Long sessions can exhaust context windows. Compaction summarizes older messages while keeping recent ones. -Thrown errors are caught by the agent and reported to the LLM as tool errors with `isError: true`. +**Manual:** `/compact` or `/compact ` -Return `terminate: true` from `execute()` or `afterToolCall` to hint that the agent should stop after the current tool batch. This only takes effect when every finalized tool result in the batch is terminating. The hint is runtime-only; emitted `toolResult` transcript messages remain standard LLM tool results. +**Automatic:** Enabled by default. Triggers on context overflow (recovers and retries) or when approaching the limit (proactive). Configure via `/settings` or `settings.json`. -## Proxy Usage +Compaction is lossy. The full history remains in the JSONL file; use `/tree` to revisit. Customize compaction behavior via [extensions](#extensions). See [docs/compaction.md](docs/compaction.md) for internals. -For browser apps that proxy through a backend: +--- -```typescript -import { Agent, streamProxy } from "@mariozechner/pi-agent-core"; +## Settings -const agent = new Agent({ - streamFn: (model, context, options) => - streamProxy(model, context, { - ...options, - authToken: "...", - proxyUrl: "https://your-server.com", - }), -}); -``` +Use `/settings` to modify common options, or edit JSON files directly: -## Low-Level API +| Location | Scope | +|----------|-------| +| `~/.pi/agent/settings.json` | Global (all projects) | +| `.pi/settings.json` | Project (overrides global) | -For direct control without the Agent class: +See [docs/settings.md](docs/settings.md) for all options. -```typescript -import { agentLoop, agentLoopContinue } from "@mariozechner/pi-agent-core"; +### Telemetry and update checks -const context: AgentContext = { - systemPrompt: "You are helpful.", - messages: [], - tools: [], -}; +Pi has two separate startup features: -const config: AgentLoopConfig = { - model: getModel("openai", "gpt-4o"), - convertToLlm: (msgs) => msgs.filter(m => ["user", "assistant", "toolResult"].includes(m.role)), - toolExecution: "parallel", // overridden by per-tool executionMode if set - beforeToolCall: async ({ toolCall, args, context }) => undefined, - afterToolCall: async ({ toolCall, result, isError, context }) => undefined, -}; +- **Update check:** fetches `https://pi.dev/api/latest-version` to check whether a newer Pi version exists. Disable it with `PI_SKIP_VERSION_CHECK=1`. Disabling update checks only turns off this check. +- **Install/update telemetry:** after first install or a changelog-detected update, sends an anonymous version ping to `https://pi.dev/api/report-install`. Opt out by setting `enableInstallTelemetry` to `false` in `settings.json`, or by setting `PI_TELEMETRY=0`. This does not disable update checks; Pi may still contact `pi.dev` for the latest version unless update checks are disabled or offline mode is enabled. -const userMessage = { role: "user", content: "Hello", timestamp: Date.now() }; +Use `--offline` or `PI_OFFLINE=1` to disable all startup network operations described here, including update checks, package update checks, and install/update telemetry. -for await (const event of agentLoop([userMessage], context, config)) { - console.log(event.type); -} +--- -// Continue from existing context -for await (const event of agentLoopContinue(context, config)) { - console.log(event.type); -} -``` +## Context Files -These low-level streams are observational. They preserve event order, but they do not wait for your async event handling to settle before later producer phases continue. If you need message processing to act as a barrier before tool preflight, use the `Agent` class instead of raw `agentLoop()` or `agentLoopContinue()`. +Pi loads `AGENTS.md` (or `CLAUDE.md`) at startup from: +- `~/.pi/agent/AGENTS.md` (global) +- Parent directories (walking up from cwd) +- Current directory -## License +Use for project instructions, conventions, common commands. All matching files are concatenated. -MIT``` +Disable context file loading with `--no-context-files` (or `-nc`). -## @mariozechner/pi-ai - 0.73.0 -**Repository URL**: https://github.com/badlogic/pi-mono -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -# @mariozechner/pi-ai +### System Prompt -Unified LLM API with automatic model discovery, provider configuration, token and cost tracking, and simple context persistence and hand-off to other models mid-session. +Replace the default system prompt with `.pi/SYSTEM.md` (project) or `~/.pi/agent/SYSTEM.md` (global). Append without replacing via `APPEND_SYSTEM.md`. -**Note**: This library only includes models that support tool calling (function calling), as this is essential for agentic workflows. +--- -## Table of Contents +## Customization -- [Supported Providers](#supported-providers) -- [Installation](#installation) -- [Quick Start](#quick-start) -- [Tools](#tools) - - [Defining Tools](#defining-tools) - - [Handling Tool Calls](#handling-tool-calls) - - [Streaming Tool Calls with Partial JSON](#streaming-tool-calls-with-partial-json) - - [Validating Tool Arguments](#validating-tool-arguments) - - [Complete Event Reference](#complete-event-reference) -- [Image Input](#image-input) -- [Thinking/Reasoning](#thinkingreasoning) - - [Unified Interface](#unified-interface-streamsimplecompletesimple) - - [Provider-Specific Options](#provider-specific-options-streamcomplete) - - [Streaming Thinking Content](#streaming-thinking-content) -- [Stop Reasons](#stop-reasons) -- [Error Handling](#error-handling) - - [Aborting Requests](#aborting-requests) - - [Continuing After Abort](#continuing-after-abort) -- [APIs, Models, and Providers](#apis-models-and-providers) - - [Providers and Models](#providers-and-models) - - [Querying Providers and Models](#querying-providers-and-models) - - [Custom Models](#custom-models) - - [OpenAI Compatibility Settings](#openai-compatibility-settings) - - [Type Safety](#type-safety) -- [Cross-Provider Handoffs](#cross-provider-handoffs) -- [Context Serialization](#context-serialization) -- [Browser Usage](#browser-usage) - - [Browser Compatibility Notes](#browser-compatibility-notes) - - [Environment Variables](#environment-variables-nodejs-only) - - [Checking Environment Variables](#checking-environment-variables) -- [OAuth Providers](#oauth-providers) - - [Vertex AI](#vertex-ai) - - [CLI Login](#cli-login) - - [Programmatic OAuth](#programmatic-oauth) - - [Login Flow Example](#login-flow-example) - - [Using OAuth Tokens](#using-oauth-tokens) - - [Provider Notes](#provider-notes) -- [License](#license) +### Prompt Templates -## Supported Providers +Reusable prompts as Markdown files. Type `/name` to expand. -- **OpenAI** -- **Azure OpenAI (Responses)** -- **OpenAI Codex** (ChatGPT Plus/Pro subscription, requires OAuth, see below) -- **DeepSeek** -- **Anthropic** -- **Google** -- **Vertex AI** (Gemini via Vertex AI) -- **Mistral** -- **Groq** -- **Cerebras** -- **Cloudflare AI Gateway** -- **Cloudflare Workers AI** -- **xAI** -- **OpenRouter** -- **Vercel AI Gateway** -- **MiniMax** -- **GitHub Copilot** (requires OAuth, see below) -- **Amazon Bedrock** -- **OpenCode Zen** -- **OpenCode Go** -- **Fireworks** (uses Anthropic-compatible API) -- **Kimi For Coding** (Moonshot AI, uses Anthropic-compatible API) -- **Xiaomi MiMo** (uses Anthropic-compatible API; defaults to API billing endpoint, with separate Token Plan providers for `cn`/`ams`/`sgp` regions) -- **Any OpenAI-compatible API**: Ollama, vLLM, LM Studio, etc. +```markdown + +Review this code for bugs, security issues, and performance problems. +Focus on: {{focus}} +``` -## Installation +Place in `~/.pi/agent/prompts/`, `.pi/prompts/`, or a [pi package](#pi-packages) to share with others. See [docs/prompt-templates.md](docs/prompt-templates.md). -```bash -npm install @mariozechner/pi-ai +### Skills + +On-demand capability packages following the [Agent Skills standard](https://agentskills.io). Invoke via `/skill:name` or let the agent load them automatically. + +```markdown + +# My Skill +Use this skill when the user asks about X. + +## Steps +1. Do this +2. Then that ``` -TypeBox exports are re-exported from `@mariozechner/pi-ai`: `Type`, `Static`, and `TSchema`. +Place in `~/.pi/agent/skills/`, `~/.agents/skills/`, `.pi/skills/`, or `.agents/skills/` (from `cwd` up through parent directories) or a [pi package](#pi-packages) to share with others. See [docs/skills.md](docs/skills.md). -## Quick Start +### Extensions + +

Doom Extension

+ +TypeScript modules that extend pi with custom tools, commands, keyboard shortcuts, event handlers, and UI components. ```typescript -import { Type, getModel, stream, complete, Context, Tool, StringEnum } from '@mariozechner/pi-ai'; +export default function (pi: ExtensionAPI) { + pi.registerTool({ name: "deploy", ... }); + pi.registerCommand("stats", { ... }); + pi.on("tool_call", async (event, ctx) => { ... }); +} +``` -// Fully typed with auto-complete support for both providers and models -const model = getModel('openai', 'gpt-4o-mini'); +The default export can also be `async`. pi waits for async extension factories before startup continues, which is useful for one-time initialization such as fetching remote model lists before calling `pi.registerProvider()`. -// Define tools with TypeBox schemas for type safety and validation -const tools: Tool[] = [{ - name: 'get_time', - description: 'Get the current time', - parameters: Type.Object({ - timezone: Type.Optional(Type.String({ description: 'Optional timezone (e.g., America/New_York)' })) - }) -}]; +**What's possible:** +- Custom tools (or replace built-in tools entirely) +- Sub-agents and plan mode +- Custom compaction and summarization +- Permission gates and path protection +- Custom editors and UI components +- Status lines, headers, footers +- Git checkpointing and auto-commit +- SSH and sandbox execution +- MCP server integration +- Make pi look like Claude Code +- Games while waiting (yes, Doom runs) +- ...anything you can dream up -// Build a conversation context (easily serializable and transferable between models) -const context: Context = { - systemPrompt: 'You are a helpful assistant.', - messages: [{ role: 'user', content: 'What time is it?' }], - tools -}; +Place in `~/.pi/agent/extensions/`, `.pi/extensions/`, or a [pi package](#pi-packages) to share with others. See [docs/extensions.md](docs/extensions.md) and [examples/extensions/](examples/extensions/). -// Option 1: Streaming with all event types -const s = stream(model, context); +### Themes -for await (const event of s) { - switch (event.type) { - case 'start': - console.log(`Starting with ${event.partial.model}`); - break; - case 'text_start': - console.log('\n[Text started]'); - break; - case 'text_delta': - process.stdout.write(event.delta); - break; - case 'text_end': - console.log('\n[Text ended]'); - break; - case 'thinking_start': - console.log('[Model is thinking...]'); - break; - case 'thinking_delta': - process.stdout.write(event.delta); - break; - case 'thinking_end': - console.log('[Thinking complete]'); - break; - case 'toolcall_start': - console.log(`\n[Tool call started: index ${event.contentIndex}]`); - break; - case 'toolcall_delta': - // Partial tool arguments are being streamed - const partialCall = event.partial.content[event.contentIndex]; - if (partialCall.type === 'toolCall') { - console.log(`[Streaming args for ${partialCall.name}]`); - } - break; - case 'toolcall_end': - console.log(`\nTool called: ${event.toolCall.name}`); - console.log(`Arguments: ${JSON.stringify(event.toolCall.arguments)}`); - break; - case 'done': - console.log(`\nFinished: ${event.reason}`); - break; - case 'error': - console.error(`Error: ${event.error}`); - break; - } -} +Built-in: `dark`, `light`. Themes hot-reload: modify the active theme file and pi immediately applies changes. -// Get the final message after streaming, add it to the context -const finalMessage = await s.result(); -context.messages.push(finalMessage); +Place in `~/.pi/agent/themes/`, `.pi/themes/`, or a [pi package](#pi-packages) to share with others. See [docs/themes.md](docs/themes.md). -// Handle tool calls if any -const toolCalls = finalMessage.content.filter(b => b.type === 'toolCall'); -for (const call of toolCalls) { - // Execute the tool - const result = call.name === 'get_time' - ? new Date().toLocaleString('en-US', { - timeZone: call.arguments.timezone || 'UTC', - dateStyle: 'full', - timeStyle: 'long' - }) - : 'Unknown tool'; +### Pi Packages - // Add tool result to context (supports text and images) - context.messages.push({ - role: 'toolResult', - toolCallId: call.id, - toolName: call.name, - content: [{ type: 'text', text: result }], - isError: false, - timestamp: Date.now() - }); -} +Bundle and share extensions, skills, prompts, and themes via npm or git. Find packages on [npmjs.com](https://www.npmjs.com/search?q=keywords%3Api-package) or [Discord](https://discord.com/channels/1456806362351669492/1457744485428629628). -// Continue if there were tool calls -if (toolCalls.length > 0) { - const continuation = await complete(model, context); - context.messages.push(continuation); - console.log('After tool execution:', continuation.content); -} +> **Security:** Pi packages run with full system access. Extensions execute arbitrary code, and skills can instruct the model to perform any action including running executables. Review source code before installing third-party packages. -console.log(`Total tokens: ${finalMessage.usage.input} in, ${finalMessage.usage.output} out`); -console.log(`Cost: $${finalMessage.usage.cost.total.toFixed(4)}`); +```bash +pi install npm:@foo/pi-tools +pi install npm:@foo/pi-tools@1.2.3 # pinned version +pi install git:github.com/user/repo +pi install git:github.com/user/repo@v1 # tag or commit +pi install git:git@github.com:user/repo +pi install git:git@github.com:user/repo@v1 # tag or commit +pi install https://github.com/user/repo +pi install https://github.com/user/repo@v1 # tag or commit +pi install ssh://git@github.com/user/repo +pi install ssh://git@github.com/user/repo@v1 # tag or commit +pi remove npm:@foo/pi-tools +pi uninstall npm:@foo/pi-tools # alias for remove +pi list +pi update # update pi and packages (skips pinned packages) +pi update --extensions # update packages only +pi update --self # update pi only +pi update --self --force # reinstall pi even if current +pi update npm:@foo/pi-tools # update one package +pi config # enable/disable extensions, skills, prompts, themes +``` -// Option 2: Get complete response without streaming -const response = await complete(model, context); +Packages install to `~/.pi/agent/git/` (git) or global npm. Use `-l` for project-local installs (`.pi/git/`, `.pi/npm/`). Git packages install dependencies with `npm install --omit=dev` by default, so runtime deps must be listed under `dependencies`; when `npmCommand` is configured, git packages use plain `install` for compatibility with wrappers. If you use a Node version manager and want package installs to reuse a stable npm context, set `npmCommand` in `settings.json`, for example `["mise", "exec", "node@20", "--", "npm"]`. -for (const block of response.content) { - if (block.type === 'text') { - console.log(block.text); - } else if (block.type === 'toolCall') { - console.log(`Tool: ${block.name}(${JSON.stringify(block.arguments)})`); +Create a package by adding a `pi` key to `package.json`: + +```json +{ + "name": "my-pi-package", + "keywords": ["pi-package"], + "pi": { + "extensions": ["./extensions"], + "skills": ["./skills"], + "prompts": ["./prompts"], + "themes": ["./themes"] } } ``` -## Tools - -Tools enable LLMs to interact with external systems. This library uses TypeBox schemas for type-safe tool definitions with automatic validation using TypeBox's built-in validator and value conversion utilities. TypeBox schemas can be serialized and deserialized as plain JSON, making them ideal for distributed systems. - -### Defining Tools +Without a `pi` manifest, pi auto-discovers from conventional directories (`extensions/`, `skills/`, `prompts/`, `themes/`). -```typescript -import { Type, Tool, StringEnum } from '@mariozechner/pi-ai'; +See [docs/packages.md](docs/packages.md). -// Define tool parameters with TypeBox -const weatherTool: Tool = { - name: 'get_weather', - description: 'Get current weather for a location', - parameters: Type.Object({ - location: Type.String({ description: 'City name or coordinates' }), - units: StringEnum(['celsius', 'fahrenheit'], { default: 'celsius' }) - }) -}; +--- -// Note: For Google API compatibility, use StringEnum helper instead of Type.Enum -// Type.Enum generates anyOf/const patterns that Google doesn't support +## Programmatic Usage -const bookMeetingTool: Tool = { - name: 'book_meeting', - description: 'Schedule a meeting', - parameters: Type.Object({ - title: Type.String({ minLength: 1 }), - startTime: Type.String({ format: 'date-time' }), - endTime: Type.String({ format: 'date-time' }), - attendees: Type.Array(Type.String({ format: 'email' }), { minItems: 1 }) - }) -}; -``` +### SDK -### Handling Tool Calls +```typescript +import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@earendil-works/pi-coding-agent"; -Tool results use content blocks and can include both text and images: +const authStorage = AuthStorage.create(); +const modelRegistry = ModelRegistry.create(authStorage); +const { session } = await createAgentSession({ + sessionManager: SessionManager.inMemory(), + authStorage, + modelRegistry, +}); -```typescript -import { readFileSync } from 'fs'; +await session.prompt("What files are in the current directory?"); +``` -const context: Context = { - messages: [{ role: 'user', content: 'What is the weather in London?' }], - tools: [weatherTool] -}; +For advanced multi-session runtime replacement, use `createAgentSessionRuntime()` and `AgentSessionRuntime`. -const response = await complete(model, context); +See [docs/sdk.md](docs/sdk.md) and [examples/sdk/](examples/sdk/). -// Check for tool calls in the response -for (const block of response.content) { - if (block.type === 'toolCall') { - // Execute your tool with the arguments - // See "Validating Tool Arguments" section for validation - const result = await executeWeatherApi(block.arguments); +### RPC Mode - // Add tool result with text content - context.messages.push({ - role: 'toolResult', - toolCallId: block.id, - toolName: block.name, - content: [{ type: 'text', text: JSON.stringify(result) }], - isError: false, - timestamp: Date.now() - }); - } -} +For non-Node.js integrations, use RPC mode over stdin/stdout: -// Tool results can also include images (for vision-capable models) -const imageBuffer = readFileSync('chart.png'); -context.messages.push({ - role: 'toolResult', - toolCallId: 'tool_xyz', - toolName: 'generate_chart', - content: [ - { type: 'text', text: 'Generated chart showing temperature trends' }, - { type: 'image', data: imageBuffer.toString('base64'), mimeType: 'image/png' } - ], - isError: false, - timestamp: Date.now() -}); +```bash +pi --mode rpc ``` -### Streaming Tool Calls with Partial JSON +RPC mode uses strict LF-delimited JSONL framing. Clients must split records on `\n` only. Do not use generic line readers like Node `readline`, which also split on Unicode separators inside JSON payloads. -During streaming, tool call arguments are progressively parsed as they arrive. This enables real-time UI updates before the complete arguments are available: +See [docs/rpc.md](docs/rpc.md) for the protocol. -```typescript -const s = stream(model, context); +--- -for await (const event of s) { - if (event.type === 'toolcall_delta') { - const toolCall = event.partial.content[event.contentIndex]; +## Philosophy - // toolCall.arguments contains partially parsed JSON during streaming - // This allows for progressive UI updates - if (toolCall.type === 'toolCall' && toolCall.arguments) { - // BE DEFENSIVE: arguments may be incomplete - // Example: Show file path being written even before content is complete - if (toolCall.name === 'write_file' && toolCall.arguments.path) { - console.log(`Writing to: ${toolCall.arguments.path}`); +Pi is aggressively extensible so it doesn't have to dictate your workflow. Features that other tools bake in can be built with [extensions](#extensions), [skills](#skills), or installed from third-party [pi packages](#pi-packages). This keeps the core minimal while letting you shape pi to fit how you work. - // Content might be partial or missing - if (toolCall.arguments.content) { - console.log(`Content preview: ${toolCall.arguments.content.substring(0, 100)}...`); - } - } - } - } +**No MCP.** Build CLI tools with READMEs (see [Skills](#skills)), or build an extension that adds MCP support. [Why?](https://mariozechner.at/posts/2025-11-02-what-if-you-dont-need-mcp/) - if (event.type === 'toolcall_end') { - // Here toolCall.arguments is complete (but not yet validated) - const toolCall = event.toolCall; - console.log(`Tool completed: ${toolCall.name}`, toolCall.arguments); - } -} -``` +**No sub-agents.** There's many ways to do this. Spawn pi instances via tmux, or build your own with [extensions](#extensions), or install a package that does it your way. -**Important notes about partial tool arguments:** -- During `toolcall_delta` events, `arguments` contains the best-effort parse of partial JSON -- Fields may be missing or incomplete - always check for existence before use -- String values may be truncated mid-word -- Arrays may be incomplete -- Nested objects may be partially populated -- At minimum, `arguments` will be an empty object `{}`, never `undefined` -- The Google provider does not support function call streaming. Instead, you will receive a single `toolcall_delta` event with the full arguments. +**No permission popups.** Run in a container, or build your own confirmation flow with [extensions](#extensions) inline with your environment and security requirements. -### Validating Tool Arguments +**No plan mode.** Write plans to files, or build it with [extensions](#extensions), or install a package. -When using `agentLoop`, tool arguments are automatically validated against your TypeBox schemas before execution. If validation fails, the error is returned to the model as a tool result, allowing it to retry. +**No built-in to-dos.** They confuse models. Use a TODO.md file, or build your own with [extensions](#extensions). -When implementing your own tool execution loop with `stream()` or `complete()`, use `validateToolCall` to validate arguments before passing them to your tools: +**No background bash.** Use tmux. Full observability, direct interaction. -```typescript -import { stream, validateToolCall, Tool } from '@mariozechner/pi-ai'; +Read the [blog post](https://mariozechner.at/posts/2025-11-30-pi-coding-agent/) for the full rationale. -const tools: Tool[] = [weatherTool, calculatorTool]; -const s = stream(model, { messages, tools }); +--- -for await (const event of s) { - if (event.type === 'toolcall_end') { - const toolCall = event.toolCall; +## CLI Reference - try { - // Validate arguments against the tool's schema (throws on invalid args) - const validatedArgs = validateToolCall(tools, toolCall); - const result = await executeMyTool(toolCall.name, validatedArgs); - // ... add tool result to context - } catch (error) { - // Validation failed - return error as tool result so model can retry - context.messages.push({ - role: 'toolResult', - toolCallId: toolCall.id, - toolName: toolCall.name, - content: [{ type: 'text', text: error.message }], - isError: true, - timestamp: Date.now() - }); - } - } -} +```bash +pi [options] [@files...] [messages...] ``` -### Complete Event Reference +### Package Commands -All streaming events emitted during assistant message generation: +```bash +pi install [-l] # Install package, -l for project-local +pi remove [-l] # Remove package +pi uninstall [-l] # Alias for remove +pi update [source|self|pi] # Update pi and packages (skips pinned packages) +pi update --extensions # Update packages only +pi update --self # Update pi only +pi update --self --force # Reinstall pi even if current +pi update --extension # Update one package +pi list # List installed packages +pi config # Enable/disable package resources +``` -| Event Type | Description | Key Properties | -|------------|-------------|----------------| -| `start` | Stream begins | `partial`: Initial assistant message structure | -| `text_start` | Text block starts | `contentIndex`: Position in content array | -| `text_delta` | Text chunk received | `delta`: New text, `contentIndex`: Position | -| `text_end` | Text block complete | `content`: Full text, `contentIndex`: Position | -| `thinking_start` | Thinking block starts | `contentIndex`: Position in content array | -| `thinking_delta` | Thinking chunk received | `delta`: New text, `contentIndex`: Position | -| `thinking_end` | Thinking block complete | `content`: Full thinking, `contentIndex`: Position | -| `toolcall_start` | Tool call begins | `contentIndex`: Position in content array | -| `toolcall_delta` | Tool arguments streaming | `delta`: JSON chunk, `partial.content[contentIndex].arguments`: Partial parsed args | -| `toolcall_end` | Tool call complete | `toolCall`: Complete validated tool call with `id`, `name`, `arguments` | -| `done` | Stream complete | `reason`: Stop reason ("stop", "length", "toolUse"), `message`: Final assistant message | -| `error` | Error occurred | `reason`: Error type ("error" or "aborted"), `error`: AssistantMessage with partial content | +### Modes -## Image Input +| Flag | Description | +|------|-------------| +| (default) | Interactive mode | +| `-p`, `--print` | Print response and exit | +| `--mode json` | Output all events as JSON lines (see [docs/json.md](docs/json.md)) | +| `--mode rpc` | RPC mode for process integration (see [docs/rpc.md](docs/rpc.md)) | +| `--export [out]` | Export session to HTML | -Models with vision capabilities can process images. You can check if a model supports images via the `input` property. If you pass images to a non-vision model, they are silently ignored. +In print mode, pi also reads piped stdin and merges it into the initial prompt: -```typescript -import { readFileSync } from 'fs'; -import { getModel, complete } from '@mariozechner/pi-ai'; +```bash +cat README.md | pi -p "Summarize this text" +``` -const model = getModel('openai', 'gpt-4o-mini'); +### Model Options -// Check if model supports images -if (model.input.includes('image')) { - console.log('Model supports vision'); -} +| Option | Description | +|--------|-------------| +| `--provider ` | Provider (anthropic, openai, google, etc.) | +| `--model ` | Model pattern or ID (supports `provider/id` and optional `:`) | +| `--api-key ` | API key (overrides env vars) | +| `--thinking ` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh` | +| `--models ` | Comma-separated patterns for Ctrl+P cycling | +| `--list-models [search]` | List available models | -const imageBuffer = readFileSync('image.png'); -const base64Image = imageBuffer.toString('base64'); +### Session Options -const response = await complete(model, { - messages: [{ - role: 'user', - content: [ - { type: 'text', text: 'What is in this image?' }, - { type: 'image', data: base64Image, mimeType: 'image/png' } - ] - }] -}); +| Option | Description | +|--------|-------------| +| `-c`, `--continue` | Continue most recent session | +| `-r`, `--resume` | Browse and select session | +| `--session ` | Use specific session file or partial UUID | +| `--fork ` | Fork specific session file or partial UUID into a new session | +| `--session-dir ` | Custom session storage directory | +| `--no-session` | Ephemeral mode (don't save) | -// Access the response -for (const block of response.content) { - if (block.type === 'text') { - console.log(block.text); - } -} -``` +### Tool Options -## Thinking/Reasoning +| Option | Description | +|--------|-------------| +| `--tools `, `-t ` | Allowlist specific tool names across built-in, extension, and custom tools | +| `--no-builtin-tools`, `-nbt` | Disable built-in tools by default but keep extension/custom tools enabled | +| `--no-tools`, `-nt` | Disable all tools by default | -Many models support thinking/reasoning capabilities where they can show their internal thought process. You can check if a model supports reasoning via the `reasoning` property. If you pass reasoning options to a non-reasoning model, they are silently ignored. +Available built-in tools: `read`, `bash`, `edit`, `write`, `grep`, `find`, `ls` -### Unified Interface (streamSimple/completeSimple) +### Resource Options -```typescript -import { getModel, streamSimple, completeSimple } from '@mariozechner/pi-ai'; +| Option | Description | +|--------|-------------| +| `-e`, `--extension ` | Load extension from path, npm, or git (repeatable) | +| `--no-extensions` | Disable extension discovery | +| `--skill ` | Load skill (repeatable) | +| `--no-skills` | Disable skill discovery | +| `--prompt-template ` | Load prompt template (repeatable) | +| `--no-prompt-templates` | Disable prompt template discovery | +| `--theme ` | Load theme (repeatable) | +| `--no-themes` | Disable theme discovery | +| `--no-context-files`, `-nc` | Disable AGENTS.md and CLAUDE.md context file discovery | -// Many models across providers support thinking/reasoning -const model = getModel('anthropic', 'claude-sonnet-4-20250514'); -// or getModel('openai', 'gpt-5-mini'); -// or getModel('google', 'gemini-2.5-flash'); -// or getModel('xai', 'grok-code-fast-1'); -// or getModel('groq', 'openai/gpt-oss-20b'); -// or getModel('cerebras', 'gpt-oss-120b'); -// or getModel('openrouter', 'z-ai/glm-4.5v'); +Combine `--no-*` with explicit flags to load exactly what you need, ignoring settings.json (e.g., `--no-extensions -e ./my-ext.ts`). -// Check if model supports reasoning -if (model.reasoning) { - console.log('Model supports reasoning/thinking'); -} +### Other Options -// Use the simplified reasoning option -const response = await completeSimple(model, { - messages: [{ role: 'user', content: 'Solve: 2x + 5 = 13' }] -}, { - reasoning: 'medium' // 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' -}); +| Option | Description | +|--------|-------------| +| `--system-prompt ` | Replace default prompt (context files and skills still appended) | +| `--append-system-prompt ` | Append to system prompt | +| `--verbose` | Force verbose startup | +| `-h`, `--help` | Show help | +| `-v`, `--version` | Show version | -// Access thinking and text blocks -for (const block of response.content) { - if (block.type === 'thinking') { - console.log('Thinking:', block.thinking); - } else if (block.type === 'text') { - console.log('Response:', block.text); - } -} +### File Arguments + +Prefix files with `@` to include in the message: + +```bash +pi @prompt.md "Answer this" +pi -p @screenshot.png "What's in this image?" +pi @code.ts @test.ts "Review these files" ``` -### Provider-Specific Options (stream/complete) +### Examples -For fine-grained control, use the provider-specific options: +```bash +# Interactive with initial prompt +pi "List all .ts files in src/" -```typescript -import { getModel, complete } from '@mariozechner/pi-ai'; +# Non-interactive +pi -p "Summarize this codebase" -// OpenAI Reasoning (o1, o3, gpt-5) -const openaiModel = getModel('openai', 'gpt-5-mini'); -await complete(openaiModel, context, { - reasoningEffort: 'medium', - reasoningSummary: 'detailed' // OpenAI Responses API only -}); +# Non-interactive with piped stdin +cat README.md | pi -p "Summarize this text" -// Anthropic Thinking (Claude Sonnet 4) -const anthropicModel = getModel('anthropic', 'claude-sonnet-4-20250514'); -await complete(anthropicModel, context, { - thinkingEnabled: true, - thinkingBudgetTokens: 8192 // Optional token limit -}); +# Different model +pi --provider openai --model gpt-4o "Help me refactor" -// Google Gemini Thinking -const googleModel = getModel('google', 'gemini-2.5-flash'); -await complete(googleModel, context, { - thinking: { - enabled: true, - budgetTokens: 8192 // -1 for dynamic, 0 to disable - } -}); -``` +# Model with provider prefix (no --provider needed) +pi --model openai/gpt-4o "Help me refactor" -### Streaming Thinking Content +# Model with thinking level shorthand +pi --model sonnet:high "Solve this complex problem" -When streaming, thinking content is delivered through specific events: +# Limit model cycling +pi --models "claude-*,gpt-4o" -```typescript -const s = streamSimple(model, context, { reasoning: 'high' }); +# Read-only mode +pi --tools read,grep,find,ls -p "Review the code" -for await (const event of s) { - switch (event.type) { - case 'thinking_start': - console.log('[Model started thinking]'); - break; - case 'thinking_delta': - process.stdout.write(event.delta); // Stream thinking content - break; - case 'thinking_end': - console.log('\n[Thinking complete]'); - break; - } -} +# High thinking level +pi --thinking high "Solve this complex problem" ``` -## Stop Reasons +### Environment Variables -Every `AssistantMessage` includes a `stopReason` field that indicates how the generation ended: +| Variable | Description | +|----------|-------------| +| `PI_CODING_AGENT_DIR` | Override config directory (default: `~/.pi/agent`) | +| `PI_CODING_AGENT_SESSION_DIR` | Override session storage directory (overridden by `--session-dir`) | +| `PI_PACKAGE_DIR` | Override package directory (useful for Nix/Guix where store paths tokenize poorly) | +| `PI_OFFLINE` | Disable startup network operations, including update checks, package update checks, and install/update telemetry | +| `PI_SKIP_VERSION_CHECK` | Skip the Pi version update check at startup. This prevents the `pi.dev` latest-version request | +| `PI_TELEMETRY` | Override install/update telemetry. Use `1`/`true`/`yes` to enable or `0`/`false`/`no` to disable. This does not disable update checks | +| `PI_CACHE_RETENTION` | Set to `long` for extended prompt cache (Anthropic: 1h, OpenAI: 24h) | +| `VISUAL`, `EDITOR` | External editor for Ctrl+G | -- `"stop"` - Normal completion, the model finished its response -- `"length"` - Output hit the maximum token limit -- `"toolUse"` - Model is calling tools and expects tool results -- `"error"` - An error occurred during generation -- `"aborted"` - Request was cancelled via abort signal +--- -`AssistantMessage` may also include `responseId`, a provider-specific upstream response or message identifier when the underlying API exposes one. Do not assume it is always present across providers. +## Contributing & Development -## Error Handling +See [CONTRIBUTING.md](../../CONTRIBUTING.md) for guidelines and [docs/development.md](docs/development.md) for setup, forking, and debugging. -When a request ends with an error (including aborts and tool call validation errors), the streaming API emits an error event: +--- -```typescript -// In streaming -for await (const event of stream) { - if (event.type === 'error') { - // event.reason is either "error" or "aborted" - // event.error is the AssistantMessage with partial content - console.error(`Error (${event.reason}):`, event.error.errorMessage); - console.log('Partial content:', event.error.content); - } -} +## License -// The final message will have the error details -const message = await stream.result(); -if (message.stopReason === 'error' || message.stopReason === 'aborted') { - console.error('Request failed:', message.errorMessage); - // message.content contains any partial content received before the error - // message.usage contains partial token counts and costs -} -``` +MIT -### Aborting Requests +## See Also -The abort signal allows you to cancel in-progress requests. Aborted requests have `stopReason === 'aborted'`: +- [@earendil-works/pi-ai](https://www.npmjs.com/package/@earendil-works/pi-ai): Core LLM toolkit +- [@earendil-works/pi-agent-core](https://www.npmjs.com/package/@earendil-works/pi-agent-core): Agent framework +- [@earendil-works/pi-tui](https://www.npmjs.com/package/@earendil-works/pi-tui): Terminal UI components``` -```typescript -import { getModel, stream } from '@mariozechner/pi-ai'; +## @earendil-works/pi-tui - 0.74.0 +**Repository URL**: https://github.com/earendil-works/pi-mono +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +# @earendil-works/pi-tui -const model = getModel('openai', 'gpt-4o-mini'); -const controller = new AbortController(); +Minimal terminal UI framework with differential rendering and synchronized output for flicker-free interactive CLI applications. -// Abort after 2 seconds -setTimeout(() => controller.abort(), 2000); +## Features -const s = stream(model, { - messages: [{ role: 'user', content: 'Write a long story' }] -}, { - signal: controller.signal -}); +- **Differential Rendering**: Three-strategy rendering system that only updates what changed +- **Synchronized Output**: Uses CSI 2026 for atomic screen updates (no flicker) +- **Bracketed Paste Mode**: Handles large pastes correctly with markers for >10 line pastes +- **Component-based**: Simple Component interface with render() method +- **Theme Support**: Components accept theme interfaces for customizable styling +- **Built-in Components**: Text, TruncatedText, Input, Editor, Markdown, Loader, SelectList, SettingsList, Spacer, Image, Box, Container +- **Inline Images**: Renders images in terminals that support Kitty or iTerm2 graphics protocols +- **Autocomplete Support**: File paths and slash commands -for await (const event of s) { - if (event.type === 'text_delta') { - process.stdout.write(event.delta); - } else if (event.type === 'error') { - // event.reason tells you if it was "error" or "aborted" - console.log(`${event.reason === 'aborted' ? 'Aborted' : 'Error'}:`, event.error.errorMessage); - } -} +## Quick Start -// Get results (may be partial if aborted) -const response = await s.result(); -if (response.stopReason === 'aborted') { - console.log('Request was aborted:', response.errorMessage); - console.log('Partial content received:', response.content); - console.log('Tokens used:', response.usage); -} -``` +```typescript +import { TUI, Text, Editor, ProcessTerminal, matchesKey } from "@earendil-works/pi-tui"; -### Continuing After Abort +// Create terminal +const terminal = new ProcessTerminal(); -Aborted messages can be added to the conversation context and continued in subsequent requests: +// Create TUI +const tui = new TUI(terminal); -```typescript -const context = { - messages: [ - { role: 'user', content: 'Explain quantum computing in detail' } - ] -}; +// Add components +tui.addChild(new Text("Welcome to my app!")); -// First request gets aborted after 2 seconds -const controller1 = new AbortController(); -setTimeout(() => controller1.abort(), 2000); +import { defaultEditorTheme as editorTheme } from './test/test-themes.ts'; +const editor = new Editor(tui, editorTheme); +editor.onSubmit = (text) => { + console.log("Submitted:", text); + tui.addChild(new Text(`You said: ${text}`)); +}; +tui.addChild(editor); -const partial = await complete(model, context, { signal: controller1.signal }); +// Focus the editor so it receives keyboard input +tui.setFocus(editor); -// Add the partial response to context -context.messages.push(partial); -context.messages.push({ role: 'user', content: 'Please continue' }); +// In raw mode Ctrl+C doesn't send SIGINT — intercept it here to allow exit +tui.addInputListener((data) => { + if (matchesKey(data, 'ctrl+c')) { + tui.stop(); + process.exit(0); + } +}); -// Continue the conversation -const continuation = await complete(model, context); +// Start +tui.start(); ``` -### Debugging Provider Payloads +## Core API -Use the `onPayload` callback to inspect the request payload sent to the provider. This is useful for debugging request formatting issues or provider validation errors. +### TUI + +Main container that manages components and rendering. ```typescript -const response = await complete(model, context, { - onPayload: (payload) => { - console.log('Provider payload:', JSON.stringify(payload, null, 2)); - } -}); +const tui = new TUI(terminal); +tui.addChild(component); +tui.removeChild(component); +tui.start(); +tui.stop(); +tui.requestRender(); // Request a re-render + +// Global debug key handler (Shift+Ctrl+D) +tui.onDebug = () => console.log("Debug triggered"); ``` -The callback is supported by `stream`, `complete`, `streamSimple`, and `completeSimple`. +### Overlays -## APIs, Models, and Providers +Overlays render components on top of existing content without replacing it. Useful for dialogs, menus, and modal UI. -The library uses a registry of API implementations. Built-in APIs include: +```typescript +// Show overlay with default options (centered, max 80 cols) +const handle = tui.showOverlay(component); -- **`anthropic-messages`**: Anthropic Messages API (`streamAnthropic`, `AnthropicOptions`) -- **`google-generative-ai`**: Google Generative AI API (`streamGoogle`, `GoogleOptions`) -- **`google-vertex`**: Google Vertex AI API (`streamGoogleVertex`, `GoogleVertexOptions`) -- **`mistral-conversations`**: Mistral Conversations API (`streamMistral`, `MistralOptions`) -- **`openai-completions`**: OpenAI Chat Completions API (`streamOpenAICompletions`, `OpenAICompletionsOptions`) -- **`openai-responses`**: OpenAI Responses API (`streamOpenAIResponses`, `OpenAIResponsesOptions`) -- **`openai-codex-responses`**: OpenAI Codex Responses API (`streamOpenAICodexResponses`, `OpenAICodexResponsesOptions`) -- **`azure-openai-responses`**: Azure OpenAI Responses API (`streamAzureOpenAIResponses`, `AzureOpenAIResponsesOptions`) -- **`bedrock-converse-stream`**: Amazon Bedrock Converse API (`streamBedrock`, `BedrockOptions`) +// Show overlay with custom positioning and sizing +// Values can be numbers (absolute) or percentage strings (e.g., "50%") +const handle = tui.showOverlay(component, { + // Sizing + width: 60, // Fixed width in columns + width: "80%", // Width as percentage of terminal + minWidth: 40, // Minimum width floor + maxHeight: 20, // Maximum height in rows + maxHeight: "50%", // Maximum height as percentage of terminal -### Faux provider for tests + // Anchor-based positioning (default: 'center') + anchor: 'bottom-right', // Position relative to anchor point + offsetX: 2, // Horizontal offset from anchor + offsetY: -1, // Vertical offset from anchor -`registerFauxProvider()` registers a temporary in-memory provider for tests and demos. It is opt-in and not part of the built-in provider set. + // Percentage-based positioning (alternative to anchor) + row: "25%", // Vertical position (0%=top, 100%=bottom) + col: "50%", // Horizontal position (0%=left, 100%=right) -```typescript -import { - complete, - fauxAssistantMessage, - fauxText, - fauxThinking, - fauxToolCall, - registerFauxProvider, - stream, -} from '@mariozechner/pi-ai'; + // Absolute positioning (overrides anchor/percent) + row: 5, // Exact row position + col: 10, // Exact column position -const registration = registerFauxProvider({ - tokensPerSecond: 50 // optional + // Margin from terminal edges + margin: 2, // All sides + margin: { top: 1, right: 2, bottom: 1, left: 2 }, + + // Responsive visibility + visible: (termWidth, termHeight) => termWidth >= 100 // Hide on narrow terminals + + // Focus behavior + nonCapturing: true // Don't auto-focus when shown }); -const model = registration.getModel(); -const context = { - messages: [{ role: 'user', content: 'Summarize package.json and then call echo', timestamp: Date.now() }] -}; +// OverlayHandle methods +handle.hide(); // Permanently remove the overlay +handle.setHidden(true); // Temporarily hide (can show again) +handle.setHidden(false); // Show again after hiding +handle.isHidden(); // Check if temporarily hidden +handle.focus(); // Focus and bring to visual front +handle.unfocus(); // Release focus to previous target +handle.isFocused(); // Check if overlay has focus -registration.setResponses([ - fauxAssistantMessage([ - fauxThinking('Need to inspect package metadata first.'), - fauxToolCall('echo', { text: 'package.json' }) - ], { stopReason: 'toolUse' }) -]); +// Hide topmost overlay +tui.hideOverlay(); -const first = await complete(model, context, { - sessionId: 'session-1', - cacheRetention: 'short' -}); -context.messages.push(first); +// Check if any visible overlay is active +tui.hasOverlay(); +``` -context.messages.push({ - role: 'toolResult', - toolCallId: first.content.find((block) => block.type === 'toolCall')!.id, - toolName: 'echo', - content: [{ type: 'text', text: 'package.json contents here' }], - isError: false, - timestamp: Date.now() -}); +**Anchor values**: `'center'`, `'top-left'`, `'top-right'`, `'bottom-left'`, `'bottom-right'`, `'top-center'`, `'bottom-center'`, `'left-center'`, `'right-center'` -registration.setResponses([ - fauxAssistantMessage([ - fauxThinking('Now I can summarize the tool output.'), - fauxText('Here is the summary.') - ]) -]); +**Resolution order**: +1. `minWidth` is applied as a floor after width calculation +2. For position: absolute `row`/`col` > percentage `row`/`col` > `anchor` +3. `margin` clamps final position to stay within terminal bounds +4. `visible` callback controls whether overlay renders (called each frame) -const s = stream(model, context); -for await (const event of s) { - console.log(event.type); -} +### Component Interface -// Optional: register multiple faux models for model-switching tests -const multiModel = registerFauxProvider({ - models: [ - { id: 'faux-fast', reasoning: false }, - { id: 'faux-thinker', reasoning: true } - ] -}); -const thinker = multiModel.getModel('faux-thinker'); +All components implement: -console.log(thinker?.reasoning); -console.log(registration.getPendingResponseCount()); -console.log(registration.state.callCount); -registration.unregister(); -multiModel.unregister(); +```typescript +interface Component { + render(width: number): string[]; + handleInput?(data: string): void; + invalidate?(): void; +} ``` -Notes: -- Responses are consumed from a queue in request start order. -- If the queue is empty, the faux provider returns an assistant error message with `errorMessage: "No more faux responses queued"`. -- Use `registration.setResponses([...])` to replace the remaining queue and `registration.appendResponses([...])` to add more responses. -- `registration.models` exposes all registered faux models. `registration.getModel()` returns the first one, and `registration.getModel(id)` returns a specific one. -- Use `fauxAssistantMessage(...)` for scripted assistant replies. Use `fauxText(...)`, `fauxThinking(...)`, and `fauxToolCall(...)` to build content blocks without filling in low-level fields manually. -- `registration.unregister()` removes the temporary provider from the global API registry. -- Usage is estimated at roughly 1 token per 4 characters. When `sessionId` is present and `cacheRetention` is not `"none"`, prompt cache reads and writes are simulated automatically. -- Tool call arguments stream incrementally via `toolcall_delta` chunks. -- By default, each streamed chunk is emitted on its own microtask. Set `tokensPerSecond` to pace chunk delivery in real time. -- The intended use is one deterministic scripted flow per registration. If you need independent concurrent flows, register separate faux providers. +| Method | Description | +|--------|-------------| +| `render(width)` | Returns an array of strings, one per line. Each line **must not exceed `width`** or the TUI will error. Use `truncateToWidth()` or manual wrapping to ensure this. | +| `handleInput?(data)` | Called when the component has focus and receives keyboard input. The `data` string contains raw terminal input (may include ANSI escape sequences). | +| `invalidate?()` | Called to clear any cached render state. Components should re-render from scratch on the next `render()` call. | -### Providers and Models +The TUI appends a full SGR reset and OSC 8 reset at the end of each rendered line. Styles do not carry across lines. If you emit multi-line text with styling, reapply styles per line or use `wrapTextWithAnsi()` so styles are preserved for each wrapped line. -A **provider** offers models through a specific API. For example: -- **Anthropic** models use the `anthropic-messages` API -- **Google** models use the `google-generative-ai` API -- **OpenAI** models use the `openai-responses` API -- **Mistral** models use the `mistral-conversations` API -- **xAI, Cerebras, Groq, etc.** models use the `openai-completions` API (OpenAI-compatible) +### Focusable Interface (IME Support) -### Querying Providers and Models +Components that display a text cursor and need IME (Input Method Editor) support should implement the `Focusable` interface: ```typescript -import { getProviders, getModels, getModel } from '@mariozechner/pi-ai'; +import { CURSOR_MARKER, type Component, type Focusable } from "@earendil-works/pi-tui"; -// Get all available providers -const providers = getProviders(); -console.log(providers); // ['openai', 'anthropic', 'google', 'xai', 'groq', ...] +class MyInput implements Component, Focusable { + focused: boolean = false; // Set by TUI when focus changes -// Get all models from a provider (fully typed) -const anthropicModels = getModels('anthropic'); -for (const model of anthropicModels) { - console.log(`${model.id}: ${model.name}`); - console.log(` API: ${model.api}`); // 'anthropic-messages' - console.log(` Context: ${model.contextWindow} tokens`); - console.log(` Vision: ${model.input.includes('image')}`); - console.log(` Reasoning: ${model.reasoning}`); + render(width: number): string[] { + const marker = this.focused ? CURSOR_MARKER : ""; + // Emit marker right before the fake cursor + return [`> ${beforeCursor}${marker}\x1b[7m${atCursor}\x1b[27m${afterCursor}`]; + } } - -// Get a specific model (both provider and model ID are auto-completed in IDEs) -const model = getModel('openai', 'gpt-4o-mini'); -console.log(`Using ${model.name} via ${model.api} API`); ``` -### Custom Models +When a `Focusable` component has focus, TUI: +1. Sets `focused = true` on the component +2. Scans rendered output for `CURSOR_MARKER` (a zero-width APC escape sequence) +3. Positions the hardware terminal cursor at that location +4. Shows the hardware cursor -You can create custom models for local inference servers or custom endpoints: +This enables IME candidate windows to appear at the correct position for CJK input methods. The `Editor` and `Input` built-in components already implement this interface. + +**Container components with embedded inputs:** When a container component (dialog, selector, etc.) contains an `Input` or `Editor` child, the container must implement `Focusable` and propagate the focus state to the child: ```typescript -import { Model, stream } from '@mariozechner/pi-ai'; +import { Container, type Focusable, Input } from "@earendil-works/pi-tui"; -// Example: Ollama using OpenAI-compatible API -const ollamaModel: Model<'openai-completions'> = { - id: 'llama-3.1-8b', - name: 'Llama 3.1 8B (Ollama)', - api: 'openai-completions', - provider: 'ollama', - baseUrl: 'http://localhost:11434/v1', - reasoning: false, - input: ['text'], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 128000, - maxTokens: 32000 -}; +class SearchDialog extends Container implements Focusable { + private searchInput: Input; -// Example: LiteLLM proxy with explicit compat settings -const litellmModel: Model<'openai-completions'> = { - id: 'gpt-4o', - name: 'GPT-4o (via LiteLLM)', - api: 'openai-completions', - provider: 'litellm', - baseUrl: 'http://localhost:4000/v1', - reasoning: false, - input: ['text', 'image'], - cost: { input: 2.5, output: 10, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 128000, - maxTokens: 16384, - compat: { - supportsStore: false, // LiteLLM doesn't support the store field + // Propagate focus to child input for IME cursor positioning + private _focused = false; + get focused(): boolean { return this._focused; } + set focused(value: boolean) { + this._focused = value; + this.searchInput.focused = value; } -}; -// Example: Custom endpoint with headers (bypassing Cloudflare bot detection) -const proxyModel: Model<'anthropic-messages'> = { - id: 'claude-sonnet-4', - name: 'Claude Sonnet 4 (Proxied)', - api: 'anthropic-messages', - provider: 'custom-proxy', - baseUrl: 'https://proxy.example.com/v1', - reasoning: true, - input: ['text', 'image'], - cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 }, - contextWindow: 200000, - maxTokens: 8192, - headers: { - 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', - 'X-Custom-Auth': 'bearer-token-here' + constructor() { + super(); + this.searchInput = new Input(); + this.addChild(this.searchInput); } -}; - -// Use the custom model -const response = await stream(ollamaModel, context, { - apiKey: 'dummy' // Ollama doesn't need a real key -}); +} ``` -Some OpenAI-compatible servers do not understand the `developer` role used for reasoning-capable models. For those providers, set `compat.supportsDeveloperRole` to `false` so the system prompt is sent as a `system` message instead. If the server also does not support `reasoning_effort`, set `compat.supportsReasoningEffort` to `false` too. +Without this propagation, typing with an IME (Chinese, Japanese, Korean, etc.) will show the candidate window in the wrong position. -Use model-level `thinkingLevelMap` to describe model-specific thinking controls. Keys are pi thinking levels (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`). Missing keys use provider defaults, string values are sent to the provider, and `null` marks a level unsupported. +## Built-in Components -This commonly applies to Ollama, vLLM, SGLang, and similar OpenAI-compatible servers. You can set `compat` at the provider level or per model. +### Container + +Groups child components. ```typescript -const ollamaReasoningModel: Model<'openai-completions'> = { - id: 'gpt-oss:20b', - name: 'GPT-OSS 20B (Ollama)', - api: 'openai-completions', - provider: 'ollama', - baseUrl: 'http://localhost:11434/v1', - reasoning: true, - input: ['text'], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 131072, - maxTokens: 32000, - thinkingLevelMap: { - minimal: null, - low: null, - medium: null, - high: 'high', - xhigh: null, - }, - compat: { - supportsDeveloperRole: false, - supportsReasoningEffort: false, - } -}; +const container = new Container(); +container.addChild(component); +container.removeChild(component); ``` -### OpenAI Compatibility Settings +### Box -The `openai-completions` API is implemented by many providers with minor differences. By default, the library auto-detects compatibility settings based on `baseUrl` for a small set of known OpenAI-compatible providers (Cerebras, xAI, Chutes, DeepSeek, zAi, OpenCode, Cloudflare Workers AI, etc.). For custom proxies or unknown endpoints, you can override these settings via the `compat` field. For `openai-responses` models, the compat field only supports Responses-specific flags. +Container that applies padding and background color to all children. ```typescript -interface OpenAICompletionsCompat { - supportsStore?: boolean; // Whether provider supports the `store` field (default: true) - supportsDeveloperRole?: boolean; // Whether provider supports `developer` role vs `system` (default: true) - supportsReasoningEffort?: boolean; // Whether provider supports `reasoning_effort` (default: true) - supportsUsageInStreaming?: boolean; // Whether provider supports `stream_options: { include_usage: true }` (default: true) - supportsStrictMode?: boolean; // Whether provider supports `strict` in tool definitions (default: true) - sendSessionAffinityHeaders?: boolean; // Whether to send `session_id`, `x-client-request-id`, and `x-session-affinity` from `sessionId` when caching is enabled (default: false) - maxTokensField?: 'max_completion_tokens' | 'max_tokens'; // Which field name to use (default: max_completion_tokens) - requiresToolResultName?: boolean; // Whether tool results require the `name` field (default: false) - requiresAssistantAfterToolResult?: boolean; // Whether tool results must be followed by an assistant message (default: false) - requiresThinkingAsText?: boolean; // Whether thinking blocks must be converted to text (default: false) - requiresReasoningContentOnAssistantMessages?: boolean; // Whether all replayed assistant messages must include empty reasoning_content when reasoning is enabled (default: auto-detected for DeepSeek) - thinkingFormat?: 'openai' | 'deepseek' | 'zai' | 'qwen' | 'qwen-chat-template'; // Format for reasoning param: 'openai' uses reasoning_effort, 'deepseek' uses thinking: { type } plus reasoning_effort, 'zai' uses enable_thinking, 'qwen' uses enable_thinking, 'qwen-chat-template' uses chat_template_kwargs.enable_thinking (default: openai) - cacheControlFormat?: 'anthropic'; // Anthropic-style cache_control on system prompt, last tool, and last user/assistant text content - openRouterRouting?: OpenRouterRouting; // OpenRouter routing preferences (default: {}) - vercelGatewayRouting?: VercelGatewayRouting; // Vercel AI Gateway routing preferences (default: {}) -} - -interface OpenAIResponsesCompat { - // Reserved for future use -} +const box = new Box( + 1, // paddingX (default: 1) + 1, // paddingY (default: 1) + (text) => chalk.bgGray(text) // optional background function +); +box.addChild(new Text("Content")); +box.setBgFn((text) => chalk.bgBlue(text)); // Change background dynamically ``` -If `compat` is not set, the library falls back to URL-based detection. If `compat` is partially set, unspecified fields use the detected defaults. This is useful for: - -- **LiteLLM proxies**: May not support `store` field -- **Custom inference servers**: May use non-standard field names -- **Self-hosted endpoints**: May have different feature support - -### Type Safety +### Text -Models are typed by their API, which keeps the model metadata accurate. Provider-specific option types are enforced when you call the provider functions directly. The generic `stream` and `complete` functions accept `StreamOptions` with additional provider fields. +Displays multi-line text with word wrapping and padding. ```typescript -import { streamAnthropic, type AnthropicOptions } from '@mariozechner/pi-ai'; +const text = new Text( + "Hello World", // text content + 1, // paddingX (default: 1) + 1, // paddingY (default: 1) + (text) => chalk.bgGray(text) // optional background function +); +text.setText("Updated text"); +text.setCustomBgFn((text) => chalk.bgBlue(text)); +``` -// TypeScript knows this is an Anthropic model -const claude = getModel('anthropic', 'claude-sonnet-4-20250514'); +### TruncatedText -const options: AnthropicOptions = { - thinkingEnabled: true, - thinkingBudgetTokens: 2048 -}; +Single-line text that truncates to fit viewport width. Useful for status lines and headers. -await streamAnthropic(claude, context, options); +```typescript +const truncated = new TruncatedText( + "This is a very long line that will be truncated...", + 0, // paddingX (default: 0) + 0 // paddingY (default: 0) +); ``` -## Cross-Provider Handoffs +### Input -The library supports seamless handoffs between different LLM providers within the same conversation. This allows you to switch models mid-conversation while preserving context, including thinking blocks, tool calls, and tool results. +Single-line text input with horizontal scrolling. -### How It Works +```typescript +const input = new Input(); +input.onSubmit = (value) => console.log(value); +input.setValue("initial"); +input.getValue(); +``` -When messages from one provider are sent to a different provider, the library automatically transforms them for compatibility: +**Key Bindings:** +- `Enter` - Submit +- `Ctrl+A` / `Ctrl+E` - Line start/end +- `Ctrl+W` or `Alt+Backspace` - Delete word backwards +- `Ctrl+U` - Delete to start of line +- `Ctrl+K` - Delete to end of line +- `Ctrl+Left` / `Ctrl+Right` - Word navigation +- `Alt+Left` / `Alt+Right` - Word navigation +- Arrow keys, Backspace, Delete work as expected -- **User and tool result messages** are passed through unchanged -- **Assistant messages from the same provider/API** are preserved as-is -- **Assistant messages from different providers** have their thinking blocks converted to text with `` tags -- **Tool calls and regular text** are preserved unchanged +### Editor -### Example: Multi-Provider Conversation +Multi-line text editor with autocomplete, file completion, paste handling, and vertical scrolling when content exceeds terminal height. ```typescript -import { getModel, complete, Context } from '@mariozechner/pi-ai'; - -// Start with Claude -const claude = getModel('anthropic', 'claude-sonnet-4-20250514'); -const context: Context = { - messages: [] -}; - -context.messages.push({ role: 'user', content: 'What is 25 * 18?' }); -const claudeResponse = await complete(claude, context, { - thinkingEnabled: true -}); -context.messages.push(claudeResponse); +interface EditorTheme { + borderColor: (str: string) => string; + selectList: SelectListTheme; +} -// Switch to GPT-5 - it will see Claude's thinking as tagged text -const gpt5 = getModel('openai', 'gpt-5-mini'); -context.messages.push({ role: 'user', content: 'Is that calculation correct?' }); -const gptResponse = await complete(gpt5, context); -context.messages.push(gptResponse); +interface EditorOptions { + paddingX?: number; // Horizontal padding (default: 0) +} -// Switch to Gemini -const gemini = getModel('google', 'gemini-2.5-flash'); -context.messages.push({ role: 'user', content: 'What was the original question?' }); -const geminiResponse = await complete(gemini, context); +const editor = new Editor(tui, theme, options?); // tui is required for height-aware scrolling +editor.onSubmit = (text) => console.log(text); +editor.onChange = (text) => console.log("Changed:", text); +editor.disableSubmit = true; // Disable submit temporarily +editor.setAutocompleteProvider(provider); +editor.borderColor = (s) => chalk.blue(s); // Change border dynamically +editor.setPaddingX(1); // Update horizontal padding dynamically +editor.getPaddingX(); // Get current padding ``` -### Provider Compatibility +**Features:** +- Multi-line editing with word wrap +- Slash command autocomplete (type `/`) +- File path autocomplete (press `Tab`) +- Large paste handling (>10 lines creates `[paste #1 +50 lines]` marker) +- Horizontal lines above/below editor +- Fake cursor rendering (hidden real cursor) -All providers can handle messages from other providers, including: -- Text content -- Tool calls and tool results (including images in tool results) -- Thinking/reasoning blocks (transformed to tagged text for cross-provider compatibility) -- Aborted messages with partial content - -This enables flexible workflows where you can: -- Start with a fast model for initial responses -- Switch to a more capable model for complex reasoning -- Use specialized models for specific tasks -- Maintain conversation continuity across provider outages +**Key Bindings:** +- `Enter` - Submit +- `Shift+Enter`, `Ctrl+Enter`, or `Alt+Enter` - New line (terminal-dependent, Alt+Enter most reliable) +- `Tab` - Autocomplete +- `Ctrl+K` - Delete to end of line +- `Ctrl+U` - Delete to start of line +- `Ctrl+W` or `Alt+Backspace` - Delete word backwards +- `Alt+D` or `Alt+Delete` - Delete word forwards +- `Ctrl+A` / `Ctrl+E` - Line start/end +- `Ctrl+]` - Jump forward to character (awaits next keypress, then moves cursor to first occurrence) +- `Ctrl+Alt+]` - Jump backward to character +- Arrow keys, Backspace, Delete work as expected -## Context Serialization +### Markdown -The `Context` object can be easily serialized and deserialized using standard JSON methods, making it simple to persist conversations, implement chat history, or transfer contexts between services: +Renders markdown with syntax highlighting and theming support. ```typescript -import { Context, getModel, complete } from '@mariozechner/pi-ai'; +interface MarkdownTheme { + heading: (text: string) => string; + link: (text: string) => string; + linkUrl: (text: string) => string; + code: (text: string) => string; + codeBlock: (text: string) => string; + codeBlockBorder: (text: string) => string; + quote: (text: string) => string; + quoteBorder: (text: string) => string; + hr: (text: string) => string; + listBullet: (text: string) => string; + bold: (text: string) => string; + italic: (text: string) => string; + strikethrough: (text: string) => string; + underline: (text: string) => string; + highlightCode?: (code: string, lang?: string) => string[]; +} -// Create and use a context -const context: Context = { - systemPrompt: 'You are a helpful assistant.', - messages: [ - { role: 'user', content: 'What is TypeScript?' } - ] -}; +interface DefaultTextStyle { + color?: (text: string) => string; + bgColor?: (text: string) => string; + bold?: boolean; + italic?: boolean; + strikethrough?: boolean; + underline?: boolean; +} -const model = getModel('openai', 'gpt-4o-mini'); -const response = await complete(model, context); -context.messages.push(response); +const md = new Markdown( + "# Hello\n\nSome **bold** text", + 1, // paddingX + 1, // paddingY + theme, // MarkdownTheme + defaultStyle // optional DefaultTextStyle +); +md.setText("Updated markdown"); +``` -// Serialize the entire context -const serialized = JSON.stringify(context); -console.log('Serialized context size:', serialized.length, 'bytes'); +**Features:** +- Headings, bold, italic, code blocks, lists, links, blockquotes +- HTML tags rendered as plain text +- Optional syntax highlighting via `highlightCode` +- Padding support +- Render caching for performance -// Save to database, localStorage, file, etc. -localStorage.setItem('conversation', serialized); +### Loader -// Later: deserialize and continue the conversation -const restored: Context = JSON.parse(localStorage.getItem('conversation')!); -restored.messages.push({ role: 'user', content: 'Tell me more about its type system' }); +Animated loading spinner. -// Continue with any model -const newModel = getModel('anthropic', 'claude-3-5-haiku-20241022'); -const continuation = await complete(newModel, restored); +```typescript +const loader = new Loader( + tui, // TUI instance for render updates + (s) => chalk.cyan(s), // spinner color function + (s) => chalk.gray(s), // message color function + "Loading..." // message (default: "Loading...") +); +loader.start(); +loader.setMessage("Still loading..."); +loader.stop(); ``` -> **Note**: If the context contains images (encoded as base64 as shown in the Image Input section), those will also be serialized. - -## Browser Usage +### CancellableLoader -The library supports browser environments. You must pass the API key explicitly since environment variables are not available in browsers: +Extends Loader with Escape key handling and an AbortSignal for cancelling async operations. ```typescript -import { getModel, complete } from '@mariozechner/pi-ai'; - -// API key must be passed explicitly in browser -const model = getModel('anthropic', 'claude-3-5-haiku-20241022'); - -const response = await complete(model, { - messages: [{ role: 'user', content: 'Hello!' }] -}, { - apiKey: 'your-api-key' -}); +const loader = new CancellableLoader( + tui, // TUI instance for render updates + (s) => chalk.cyan(s), // spinner color function + (s) => chalk.gray(s), // message color function + "Working..." // message +); +loader.onAbort = () => done(null); // Called when user presses Escape +doAsyncWork(loader.signal).then(done); ``` -> **Security Warning**: Exposing API keys in frontend code is dangerous. Anyone can extract and abuse your keys. Only use this approach for internal tools or demos. For production applications, use a backend proxy that keeps your API keys secure. +**Properties:** +- `signal: AbortSignal` - Aborted when user presses Escape +- `aborted: boolean` - Whether the loader was aborted +- `onAbort?: () => void` - Callback when user presses Escape -### Browser Compatibility Notes +### SelectList -- Amazon Bedrock (`bedrock-converse-stream`) is not supported in browser environments. -- OAuth login flows are not supported in browser environments. Use the `@mariozechner/pi-ai/oauth` entry point in Node.js. -- In browser builds, Bedrock can still appear in model lists. Calls to Bedrock models fail at runtime. -- Use a server-side proxy or backend service if you need Bedrock or OAuth-based auth from a web app. +Interactive selection list with keyboard navigation. -### Environment Variables (Node.js only) +```typescript +interface SelectItem { + value: string; + label: string; + description?: string; +} -In Node.js environments, you can set environment variables to avoid passing API keys: +interface SelectListTheme { + selectedPrefix: (text: string) => string; + selectedText: (text: string) => string; + description: (text: string) => string; + scrollInfo: (text: string) => string; + noMatch: (text: string) => string; +} -| Provider | Environment Variable(s) | -|----------|------------------------| -| OpenAI | `OPENAI_API_KEY` | -| Azure OpenAI | `AZURE_OPENAI_API_KEY` + `AZURE_OPENAI_BASE_URL` (e.g. `https://{resource}.openai.azure.com`) or `AZURE_OPENAI_RESOURCE_NAME`. Supports `*.openai.azure.com` and `*.cognitiveservices.azure.com`; root endpoints auto-normalize to `/openai/v1`. Optional: `AZURE_OPENAI_API_VERSION` (default `v1`), `AZURE_OPENAI_DEPLOYMENT_NAME_MAP`. | -| Anthropic | `ANTHROPIC_API_KEY` or `ANTHROPIC_OAUTH_TOKEN` | -| DeepSeek | `DEEPSEEK_API_KEY` | -| Google | `GEMINI_API_KEY` | -| Vertex AI | `GOOGLE_CLOUD_API_KEY` or `GOOGLE_CLOUD_PROJECT` (or `GCLOUD_PROJECT`) + `GOOGLE_CLOUD_LOCATION` + ADC | -| Mistral | `MISTRAL_API_KEY` | -| Groq | `GROQ_API_KEY` | -| Cerebras | `CEREBRAS_API_KEY` | -| Cloudflare AI Gateway | `CLOUDFLARE_API_KEY` + `CLOUDFLARE_ACCOUNT_ID` + `CLOUDFLARE_GATEWAY_ID` | -| Cloudflare Workers AI | `CLOUDFLARE_API_KEY` + `CLOUDFLARE_ACCOUNT_ID` | -| xAI | `XAI_API_KEY` | -| Fireworks | `FIREWORKS_API_KEY` | -| OpenRouter | `OPENROUTER_API_KEY` | -| Vercel AI Gateway | `AI_GATEWAY_API_KEY` | -| zAI | `ZAI_API_KEY` | -| MiniMax | `MINIMAX_API_KEY` | -| OpenCode Zen / OpenCode Go | `OPENCODE_API_KEY` | -| Kimi For Coding | `KIMI_API_KEY` | -| Xiaomi MiMo (API billing) | `XIAOMI_API_KEY` | -| Xiaomi MiMo Token Plan (China) | `XIAOMI_TOKEN_PLAN_CN_API_KEY` | -| Xiaomi MiMo Token Plan (Amsterdam) | `XIAOMI_TOKEN_PLAN_AMS_API_KEY` | -| Xiaomi MiMo Token Plan (Singapore) | `XIAOMI_TOKEN_PLAN_SGP_API_KEY` | -| GitHub Copilot | `COPILOT_GITHUB_TOKEN` or `GH_TOKEN` or `GITHUB_TOKEN` | +const list = new SelectList( + [ + { value: "opt1", label: "Option 1", description: "First option" }, + { value: "opt2", label: "Option 2", description: "Second option" }, + ], + 5, // maxVisible + theme // SelectListTheme +); -When set, the library automatically uses these keys: +list.onSelect = (item) => console.log("Selected:", item); +list.onCancel = () => console.log("Cancelled"); +list.onSelectionChange = (item) => console.log("Highlighted:", item); +list.setFilter("opt"); // Filter items +``` -```typescript -// Uses OPENAI_API_KEY from environment -const model = getModel('openai', 'gpt-4o-mini'); -const response = await complete(model, context); +**Controls:** +- Arrow keys: Navigate +- Enter: Select +- Escape: Cancel -// Or override with explicit key -const response = await complete(model, context, { - apiKey: 'sk-different-key' -}); -``` +### SettingsList -### Checking Environment Variables +Settings panel with value cycling and submenus. ```typescript -import { getEnvApiKey } from '@mariozechner/pi-ai'; +interface SettingItem { + id: string; + label: string; + description?: string; + currentValue: string; + values?: string[]; // If provided, Enter/Space cycles through these + submenu?: (currentValue: string, done: (selectedValue?: string) => void) => Component; +} -// Check if an API key is set in environment variables -const key = getEnvApiKey('openai'); // checks OPENAI_API_KEY +interface SettingsListTheme { + label: (text: string, selected: boolean) => string; + value: (text: string, selected: boolean) => string; + description: (text: string) => string; + cursor: string; + hint: (text: string) => string; +} + +const settings = new SettingsList( + [ + { id: "theme", label: "Theme", currentValue: "dark", values: ["dark", "light"] }, + { id: "model", label: "Model", currentValue: "gpt-4", submenu: (val, done) => modelSelector }, + ], + 10, // maxVisible + theme, // SettingsListTheme + (id, newValue) => console.log(`${id} changed to ${newValue}`), + () => console.log("Cancelled") +); +settings.updateValue("theme", "light"); ``` -## OAuth Providers +**Controls:** +- Arrow keys: Navigate +- Enter/Space: Activate (cycle value or open submenu) +- Escape: Cancel -Several providers require OAuth authentication instead of static API keys: +### Spacer -- **Anthropic** (Claude Pro/Max subscription) -- **OpenAI Codex** (ChatGPT Plus/Pro subscription, access to GPT-5.x Codex models) -- **GitHub Copilot** (Copilot subscription) +Empty lines for vertical spacing. -For paid Cloud Code Assist subscriptions, set `GOOGLE_CLOUD_PROJECT` or `GOOGLE_CLOUD_PROJECT_ID` to your project ID. +```typescript +const spacer = new Spacer(2); // 2 empty lines (default: 1) +``` -### Vertex AI +### Image -Vertex AI models support either a Google Cloud API key or Application Default Credentials (ADC): +Renders images inline for terminals that support the Kitty graphics protocol (Kitty, Ghostty, WezTerm) or iTerm2 inline images. Falls back to a text placeholder on unsupported terminals. -- **API key**: Set `GOOGLE_CLOUD_API_KEY` or pass `apiKey` in the call options. -- **Local development (ADC)**: Run `gcloud auth application-default login` -- **CI/Production (ADC)**: Set `GOOGLE_APPLICATION_CREDENTIALS` to point to a service account JSON key file - -When using ADC, also set `GOOGLE_CLOUD_PROJECT` (or `GCLOUD_PROJECT`) and `GOOGLE_CLOUD_LOCATION`. You can also pass `project`/`location` in the call options. When using `GOOGLE_CLOUD_API_KEY`, `project` and `location` are not required. - -Example: +```typescript +interface ImageTheme { + fallbackColor: (str: string) => string; +} -```bash -# Local (uses your user credentials) -gcloud auth application-default login -export GOOGLE_CLOUD_PROJECT="my-project" -export GOOGLE_CLOUD_LOCATION="us-central1" +interface ImageOptions { + maxWidthCells?: number; + maxHeightCells?: number; + filename?: string; +} -# CI/Production (service account key file) -export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json" +const image = new Image( + base64Data, // base64-encoded image data + "image/png", // MIME type + theme, // ImageTheme + options // optional ImageOptions +); +tui.addChild(image); ``` -```typescript -import { getModel, complete } from '@mariozechner/pi-ai'; +Supported formats: PNG, JPEG, GIF, WebP. Dimensions are parsed from the image headers automatically. -(async () => { - const model = getModel('google-vertex', 'gemini-2.5-flash'); - const response = await complete(model, { - messages: [{ role: 'user', content: 'Hello from Vertex AI' }] - }, { - apiKey: process.env.GOOGLE_CLOUD_API_KEY, - }); +## Autocomplete - for (const block of response.content) { - if (block.type === 'text') console.log(block.text); - } -})().catch(console.error); -``` +### CombinedAutocompleteProvider -Official docs: [Application Default Credentials](https://cloud.google.com/docs/authentication/application-default-credentials) +Supports both slash commands and file paths. -### CLI Login +```typescript +import { CombinedAutocompleteProvider } from "@earendil-works/pi-tui"; -The quickest way to authenticate: +const provider = new CombinedAutocompleteProvider( + [ + { name: "help", description: "Show help" }, + { name: "clear", description: "Clear screen" }, + { name: "delete", description: "Delete last message" }, + ], + process.cwd() // base path for file completion +); -```bash -npx @mariozechner/pi-ai login # interactive provider selection -npx @mariozechner/pi-ai login anthropic # login to specific provider -npx @mariozechner/pi-ai list # list available providers +editor.setAutocompleteProvider(provider); ``` -Credentials are saved to `auth.json` in the current directory. +**Features:** +- Type `/` to see slash commands +- Press `Tab` for file path completion +- Works with `~/`, `./`, `../`, and `@` prefix +- Filters to attachable files for `@` prefix -### Programmatic OAuth +## Key Detection -The library provides login and token refresh functions via the `@mariozechner/pi-ai/oauth` entry point. Credential storage is the caller's responsibility. +Use `matchesKey()` with the `Key` helper for detecting keyboard input (supports Kitty keyboard protocol): ```typescript -import { - // Login functions (return credentials, do not store) - loginAnthropic, - loginOpenAICodex, - loginGitHubCopilot, - loginGeminiCli, +import { matchesKey, Key } from "@earendil-works/pi-tui"; - // Token management - refreshOAuthToken, // (provider, credentials) => new credentials - getOAuthApiKey, // (provider, credentialsMap) => { newCredentials, apiKey } | null +if (matchesKey(data, Key.ctrl("c"))) { + process.exit(0); +} - // Types - type OAuthProvider, - type OAuthCredentials, -} from '@mariozechner/pi-ai/oauth'; +if (matchesKey(data, Key.enter)) { + submit(); +} else if (matchesKey(data, Key.escape)) { + cancel(); +} else if (matchesKey(data, Key.up)) { + moveUp(); +} ``` -### Login Flow Example +**Key identifiers** (use `Key.*` for autocomplete, or string literals): +- Basic keys: `Key.enter`, `Key.escape`, `Key.tab`, `Key.space`, `Key.backspace`, `Key.delete`, `Key.home`, `Key.end` +- Arrow keys: `Key.up`, `Key.down`, `Key.left`, `Key.right` +- With modifiers: `Key.ctrl("c")`, `Key.shift("tab")`, `Key.alt("left")`, `Key.ctrlShift("p")` +- String format also works: `"enter"`, `"ctrl+c"`, `"shift+tab"`, `"ctrl+shift+p"` -```typescript -import { loginGitHubCopilot } from '@mariozechner/pi-ai/oauth'; -import { writeFileSync } from 'fs'; +## Differential Rendering -const credentials = await loginGitHubCopilot({ - onAuth: (url, instructions) => { - console.log(`Open: ${url}`); - if (instructions) console.log(instructions); - }, - onPrompt: async (prompt) => { - return await getUserInput(prompt.message); - }, - onProgress: (message) => console.log(message) -}); +The TUI uses three rendering strategies: -// Store credentials yourself -const auth = { 'github-copilot': { type: 'oauth', ...credentials } }; -writeFileSync('auth.json', JSON.stringify(auth, null, 2)); +1. **First Render**: Output all lines without clearing scrollback +2. **Width Changed or Change Above Viewport**: Clear screen and full re-render +3. **Normal Update**: Move cursor to first changed line, clear to end, render changed lines + +All updates are wrapped in **synchronized output** (`\x1b[?2026h` ... `\x1b[?2026l`) for atomic, flicker-free rendering. + +## Terminal Interface + +The TUI works with any object implementing the `Terminal` interface: + +```typescript +interface Terminal { + start(onInput: (data: string) => void, onResize: () => void): void; + stop(): void; + write(data: string): void; + get columns(): number; + get rows(): number; + moveBy(lines: number): void; + hideCursor(): void; + showCursor(): void; + clearLine(): void; + clearFromCursor(): void; + clearScreen(): void; +} ``` -### Using OAuth Tokens +**Built-in implementations:** +- `ProcessTerminal` - Uses `process.stdin/stdout` +- `VirtualTerminal` - For testing (uses `@xterm/headless`) -Use `getOAuthApiKey()` to get an API key, automatically refreshing if expired: +## Utilities ```typescript -import { getModel, complete } from '@mariozechner/pi-ai'; -import { getOAuthApiKey } from '@mariozechner/pi-ai/oauth'; -import { readFileSync, writeFileSync } from 'fs'; +import { visibleWidth, truncateToWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui"; -// Load your stored credentials -const auth = JSON.parse(readFileSync('auth.json', 'utf-8')); +// Get visible width of string (ignoring ANSI codes) +const width = visibleWidth("\x1b[31mHello\x1b[0m"); // 5 -// Get API key (refreshes if expired) -const result = await getOAuthApiKey('github-copilot', auth); -if (!result) throw new Error('Not logged in'); +// Truncate string to width (preserving ANSI codes, adds ellipsis) +const truncated = truncateToWidth("Hello World", 8); // "Hello..." -// Save refreshed credentials -auth['github-copilot'] = { type: 'oauth', ...result.newCredentials }; -writeFileSync('auth.json', JSON.stringify(auth, null, 2)); +// Truncate without ellipsis +const truncatedNoEllipsis = truncateToWidth("Hello World", 8, ""); // "Hello Wo" -// Use the API key -const model = getModel('github-copilot', 'gpt-4o'); -const response = await complete(model, { - messages: [{ role: 'user', content: 'Hello!' }] -}, { apiKey: result.apiKey }); +// Wrap text to width (preserving ANSI codes across line breaks) +const lines = wrapTextWithAnsi("This is a long line that needs wrapping", 20); +// ["This is a long line", "that needs wrapping"] ``` -### Provider Notes +## Creating Custom Components -**OpenAI Codex**: Requires a ChatGPT Plus or Pro subscription. Provides access to GPT-5.x Codex models with extended context windows and reasoning capabilities. The library automatically handles session-based prompt caching when `sessionId` is provided in stream options. You can set `transport` in stream options to `"sse"`, `"websocket"`, or `"auto"` for Codex Responses transport selection. When using WebSocket with a `sessionId`, connections are reused per session and expire after 5 minutes of inactivity. +When creating custom components, **each line returned by `render()` must not exceed the `width` parameter**. The TUI will error if any line is wider than the terminal. -**Azure OpenAI (Responses)**: Uses the Responses API only. Set `AZURE_OPENAI_API_KEY` and either `AZURE_OPENAI_BASE_URL` or `AZURE_OPENAI_RESOURCE_NAME`. `AZURE_OPENAI_BASE_URL` supports both `https://.openai.azure.com` and `https://.cognitiveservices.azure.com`; root endpoints are normalized to `.../openai/v1` automatically. Use `AZURE_OPENAI_API_VERSION` (defaults to `v1`) to override the API version if needed. Deployment names are treated as model IDs by default, override with `azureDeploymentName` or `AZURE_OPENAI_DEPLOYMENT_NAME_MAP` using comma-separated `model-id=deployment` pairs (for example `gpt-4o-mini=my-deployment,gpt-4o=prod`). Legacy deployment-based URLs are intentionally unsupported. +### Handling Input -**GitHub Copilot**: If you get "The requested model is not supported" error, enable the model manually in VS Code: open Copilot Chat, click the model selector, select the model (warning icon), and click "Enable". +Use `matchesKey()` with the `Key` helper for keyboard input: -## Development +```typescript +import { matchesKey, Key, truncateToWidth } from "@earendil-works/pi-tui"; +import type { Component } from "@earendil-works/pi-tui"; -### Adding a New Provider +class MyInteractiveComponent implements Component { + private selectedIndex = 0; + private items = ["Option 1", "Option 2", "Option 3"]; -Adding a new LLM provider requires changes across multiple files. This checklist covers all necessary steps: + public onSelect?: (index: number) => void; + public onCancel?: () => void; -#### 1. Core Types (`src/types.ts`) + handleInput(data: string): void { + if (matchesKey(data, Key.up)) { + this.selectedIndex = Math.max(0, this.selectedIndex - 1); + } else if (matchesKey(data, Key.down)) { + this.selectedIndex = Math.min(this.items.length - 1, this.selectedIndex + 1); + } else if (matchesKey(data, Key.enter)) { + this.onSelect?.(this.selectedIndex); + } else if (matchesKey(data, Key.escape) || matchesKey(data, Key.ctrl("c"))) { + this.onCancel?.(); + } + } -- Add the API identifier to `KnownApi` (for example `"bedrock-converse-stream"`) -- Create an options interface extending `StreamOptions` (for example `BedrockOptions`) -- Add the provider name to `KnownProvider` (for example `"amazon-bedrock"`) + render(width: number): string[] { + return this.items.map((item, i) => { + const prefix = i === this.selectedIndex ? "> " : " "; + return truncateToWidth(prefix + item, width); + }); + } +} +``` -#### 2. Provider Implementation (`src/providers/`) +### Handling Line Width -Create a new provider file (for example `amazon-bedrock.ts`) that exports: +Use the provided utilities to ensure lines fit: -- `stream()` function returning `AssistantMessageEventStream` -- `streamSimple()` for `SimpleStreamOptions` mapping -- Provider-specific options interface -- Message conversion functions to transform `Context` to provider format -- Tool conversion if the provider supports tools -- Response parsing to emit standardized events (`text`, `tool_call`, `thinking`, `usage`, `stop`) +```typescript +import { visibleWidth, truncateToWidth } from "@earendil-works/pi-tui"; +import type { Component } from "@earendil-works/pi-tui"; -#### 3. API Registry Integration (`src/providers/register-builtins.ts`) +class MyComponent implements Component { + private text: string; -- Register the API with `registerApiProvider()` -- Add a package subpath export in `package.json` for the provider module (`./dist/providers/.js`) -- Add lazy loader wrappers in `src/providers/register-builtins.ts`, do not statically import provider implementation modules there -- Add any root-level `export type` re-exports in `src/index.ts` that should remain available from `@mariozechner/pi-ai` -- Add credential detection in `env-api-keys.ts` for the new provider -- Ensure `streamSimple` handles auth lookup via `getEnvApiKey()` or provider-specific auth + constructor(text: string) { + this.text = text; + } -#### 4. Model Generation (`scripts/generate-models.ts`) + render(width: number): string[] { + // Option 1: Truncate long lines + return [truncateToWidth(this.text, width)]; -- Add logic to fetch and parse models from the provider's source (e.g., models.dev API) -- Map provider model data to the standardized `Model` interface -- Handle provider-specific quirks (pricing format, capability flags, model ID transformations) + // Option 2: Check and pad to exact width + const line = this.text; + const visible = visibleWidth(line); + if (visible > width) { + return [truncateToWidth(line, width)]; + } + // Pad to exact width (optional, for backgrounds) + return [line + " ".repeat(width - visible)]; + } +} +``` -#### 5. Tests (`test/`) +### ANSI Code Considerations -Create or update test files to cover the new provider: +Both `visibleWidth()` and `truncateToWidth()` correctly handle ANSI escape codes: -- `stream.test.ts` - Basic streaming and tool use -- `tokens.test.ts` - Token usage reporting -- `abort.test.ts` - Request cancellation -- `empty.test.ts` - Empty message handling -- `context-overflow.test.ts` - Context limit errors -- `image-limits.test.ts` - Image support (if applicable) -- `unicode-surrogate.test.ts` - Unicode handling -- `tool-call-without-result.test.ts` - Orphaned tool calls -- `image-tool-result.test.ts` - Images in tool results -- `total-tokens.test.ts` - Token counting accuracy -- `cross-provider-handoff.test.ts` - Cross-provider context replay +- `visibleWidth()` ignores ANSI codes when calculating width +- `truncateToWidth()` preserves ANSI codes and properly closes them when truncating -For `cross-provider-handoff.test.ts`, add at least one provider/model pair. If the provider exposes multiple model families (for example GPT and Claude), add at least one pair per family. +```typescript +import chalk from "chalk"; -For providers with non-standard auth (AWS, Google Vertex), create a utility like `bedrock-utils.ts` with credential detection helpers. +const styled = chalk.red("Hello") + " " + chalk.blue("World"); +const width = visibleWidth(styled); // 11 (not counting ANSI codes) +const truncated = truncateToWidth(styled, 8); // Red "Hello" + " W..." with proper reset +``` -#### 6. Coding Agent Integration (`../coding-agent/`) +### Caching -Update `src/core/model-resolver.ts`: +For performance, components should cache their rendered output and only re-render when necessary: -- Add a default model ID for the provider in `DEFAULT_MODELS` +```typescript +class CachedComponent implements Component { + private text: string; + private cachedWidth?: number; + private cachedLines?: string[]; -Update `src/cli/args.ts`: + render(width: number): string[] { + if (this.cachedLines && this.cachedWidth === width) { + return this.cachedLines; + } -- Add environment variable documentation in the help text + const lines = [truncateToWidth(this.text, width)]; -Update `README.md`: + this.cachedWidth = width; + this.cachedLines = lines; + return lines; + } -- Add the provider to the providers section with setup instructions + invalidate(): void { + this.cachedWidth = undefined; + this.cachedLines = undefined; + } +} +``` -#### 7. Documentation +## Example -Update `packages/ai/README.md`: +See `test/chat-simple.ts` for a complete chat interface example with: +- Markdown messages with custom background colors +- Loading spinner during responses +- Editor with autocomplete and slash commands +- Spacers between messages -- Add to the Supported Providers table -- Document any provider-specific options or authentication requirements -- Add environment variable to the Environment Variables section +Run it: +```bash +npx tsx test/chat-simple.ts +``` -#### 8. Changelog +## Development -Add an entry to `packages/ai/CHANGELOG.md` under `## [Unreleased]`: +```bash +# Install dependencies (from monorepo root) +npm install -```markdown -### Added -- Added support for [Provider Name] provider ([#PR](link) by [@author](link)) +# Run type checking +npm run check + +# Run the demo +npx tsx test/chat-simple.ts ``` -## License +### Debug logging -MIT``` +Set `PI_TUI_WRITE_LOG` to capture the raw ANSI stream written to stdout. + +```bash +PI_TUI_WRITE_LOG=/tmp/tui-ansi.log npx tsx test/chat-simple.ts +`````` -## @mariozechner/pi-coding-agent - 0.73.0 -**Repository URL**: https://github.com/badlogic/pi-mono +## @gerrit0/mini-shiki - 3.23.0 +**Repository URL**: https://github.com/Gerrit0/mini-shiki **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -

- - - - - pi logo - - -

-

- Discord - npm - Build status -

-

- pi.dev domain graciously donated by -

- Exy mascot
exe.dev
-

- -> New issues and PRs from new contributors are auto-closed by default. Maintainers review auto-closed issues daily. See [CONTRIBUTING.md](../../CONTRIBUTING.md). - ---- +MIT License -Pi is a minimal terminal coding harness. Adapt pi to your workflows, not the other way around, without having to fork and modify pi internals. Extend it with TypeScript [Extensions](#extensions), [Skills](#skills), [Prompt Templates](#prompt-templates), and [Themes](#themes). Put your extensions, skills, prompt templates, and themes in [Pi Packages](#pi-packages) and share them with others via npm or git. +Copyright (c) 2024 Gerrit Birkeland -Pi ships with powerful defaults but skips features like sub agents and plan mode. Instead, you can ask pi to build what you want or install a third party pi package that matches your workflow. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Pi runs in four modes: interactive, print or JSON, RPC for process integration, and an SDK for embedding in your own apps. See [openclaw/openclaw](https://github.com/openclaw/openclaw) for a real-world SDK integration. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -## Share your OSS coding agent sessions +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -If you use pi for open source work, please share your coding agent sessions. +## @google/genai - 1.52.0 +**Repository URL**: https://github.com/googleapis/js-genai +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Public OSS session data helps improve models, prompts, tools, and evaluations using real development workflows. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -For the full explanation, see [this post on X](https://x.com/badlogicgames/status/2037811643774652911). + 1. Definitions. -To publish sessions, use [`badlogic/pi-share-hf`](https://github.com/badlogic/pi-share-hf). Read its README.md for setup instructions. All you need is a Hugging Face account, the Hugging Face CLI, and `pi-share-hf`. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -You can also watch [this video](https://x.com/badlogicgames/status/2041151967695634619), where I show how I publish my `pi-mono` sessions. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -I regularly publish my own `pi-mono` work sessions here: + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -- [badlogicgames/pi-mono on Hugging Face](https://huggingface.co/datasets/badlogicgames/pi-mono) + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -## Table of Contents + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -- [Quick Start](#quick-start) -- [Providers & Models](#providers--models) -- [Interactive Mode](#interactive-mode) - - [Editor](#editor) - - [Commands](#commands) - - [Keyboard Shortcuts](#keyboard-shortcuts) - - [Message Queue](#message-queue) -- [Sessions](#sessions) - - [Branching](#branching) - - [Compaction](#compaction) -- [Settings](#settings) -- [Context Files](#context-files) -- [Customization](#customization) - - [Prompt Templates](#prompt-templates) - - [Skills](#skills) - - [Extensions](#extensions) - - [Themes](#themes) - - [Pi Packages](#pi-packages) -- [Programmatic Usage](#programmatic-usage) -- [Philosophy](#philosophy) -- [CLI Reference](#cli-reference) + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. ---- + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -## Quick Start + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -```bash -npm install -g @mariozechner/pi-coding-agent -``` + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -Authenticate with an API key: + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -```bash -export ANTHROPIC_API_KEY=sk-ant-... -pi -``` + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Or use your existing subscription: + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -```bash -pi -/login # Then select provider -``` + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -Then just talk to pi. By default, pi gives the model four tools: `read`, `write`, `edit`, and `bash`. The model uses these to fulfill your requests. Add capabilities via [skills](#skills), [prompt templates](#prompt-templates), [extensions](#extensions), or [pi packages](#pi-packages). + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -**Platform notes:** [Windows](docs/windows.md) | [Termux (Android)](docs/termux.md) | [tmux](docs/tmux.md) | [Terminal setup](docs/terminal-setup.md) | [Shell aliases](docs/shell-aliases.md) + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and ---- - -## Providers & Models - -For each built-in provider, pi maintains a list of tool-capable models, updated with every release. Authenticate via subscription (`/login`) or API key, then select any model from that provider via `/model` (or Ctrl+L). - -**Subscriptions:** -- Anthropic Claude Pro/Max -- OpenAI ChatGPT Plus/Pro (Codex) -- GitHub Copilot + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -**API keys:** -- Anthropic -- OpenAI -- Azure OpenAI -- DeepSeek -- Google Gemini -- Google Vertex -- Amazon Bedrock -- Mistral -- Groq -- Cerebras -- Cloudflare AI Gateway -- Cloudflare Workers AI -- xAI -- OpenRouter -- Vercel AI Gateway -- ZAI -- OpenCode Zen -- OpenCode Go -- Hugging Face -- Fireworks -- Kimi For Coding -- MiniMax -- Xiaomi MiMo -- Xiaomi MiMo Token Plan (China) -- Xiaomi MiMo Token Plan (Amsterdam) -- Xiaomi MiMo Token Plan (Singapore) + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -See [docs/providers.md](docs/providers.md) for detailed setup instructions. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -**Custom providers & models:** Add providers via `~/.pi/agent/models.json` if they speak a supported API (OpenAI, Anthropic, Google). For custom APIs or OAuth, use extensions. See [docs/models.md](docs/models.md) and [docs/custom-provider.md](docs/custom-provider.md). + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. ---- + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -## Interactive Mode + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -

Interactive Mode

+ 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -The interface from top to bottom: + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -- **Startup header** - Shows shortcuts (`/hotkeys` for all), loaded AGENTS.md files, prompt templates, skills, and extensions -- **Messages** - Your messages, assistant responses, tool calls and results, notifications, errors, and extension UI -- **Editor** - Where you type; border color indicates thinking level -- **Footer** - Working directory, session name, total token/cache usage, cost, context usage, current model + END OF TERMS AND CONDITIONS -The editor can be temporarily replaced by other UI, like built-in `/settings` or custom UI from extensions (e.g., a Q&A tool that lets the user answer model questions in a structured format). [Extensions](#extensions) can also replace the editor, add widgets above/below it, a status line, custom footer, or overlays. + APPENDIX: How to apply the Apache License to your work. -### Editor + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -| Feature | How | -|---------|-----| -| File reference | Type `@` to fuzzy-search project files | -| Path completion | Tab to complete paths | -| Multi-line | Shift+Enter (or Ctrl+Enter on Windows Terminal) | -| Images | Ctrl+V to paste (Alt+V on Windows), or drag onto terminal | -| Bash commands | `!command` runs and sends output to LLM, `!!command` runs without sending | + Copyright [yyyy] [name of copyright owner] -Standard editing keybindings for delete word, undo, etc. See [docs/keybindings.md](docs/keybindings.md). + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -### Commands + http://www.apache.org/licenses/LICENSE-2.0 -Type `/` in the editor to trigger commands. [Extensions](#extensions) can register custom commands, [skills](#skills) are available as `/skill:name`, and [prompt templates](#prompt-templates) expand via `/templatename`. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -| Command | Description | -|---------|-------------| -| `/login`, `/logout` | OAuth authentication | -| `/model` | Switch models | -| `/scoped-models` | Enable/disable models for Ctrl+P cycling | -| `/settings` | Thinking level, theme, message delivery, transport | -| `/resume` | Pick from previous sessions | -| `/new` | Start a new session | -| `/name ` | Set session display name | -| `/session` | Show session info (file, ID, messages, tokens, cost) | -| `/tree` | Jump to any point in the session and continue from there | -| `/fork` | Create a new session from a previous user message | -| `/clone` | Duplicate the current active branch into a new session | -| `/compact [prompt]` | Manually compact context, optional custom instructions | -| `/copy` | Copy last assistant message to clipboard | -| `/export [file]` | Export session to HTML file | -| `/share` | Upload as private GitHub gist with shareable HTML link | -| `/reload` | Reload keybindings, extensions, skills, prompts, and context files (themes hot-reload automatically) | -| `/hotkeys` | Show all keyboard shortcuts | -| `/changelog` | Display version history | -| `/quit` | Quit pi | +## @google/genai - 2.0.1 +**Repository URL**: https://github.com/googleapis/js-genai +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -### Keyboard Shortcuts + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -See `/hotkeys` for the full list. Customize via `~/.pi/agent/keybindings.json`. See [docs/keybindings.md](docs/keybindings.md). + 1. Definitions. -**Commonly used:** + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -| Key | Action | -|-----|--------| -| Ctrl+C | Clear editor | -| Ctrl+C twice | Quit | -| Escape | Cancel/abort | -| Escape twice | Open `/tree` | -| Ctrl+L | Open model selector | -| Ctrl+P / Shift+Ctrl+P | Cycle scoped models forward/backward | -| Shift+Tab | Cycle thinking level | -| Ctrl+O | Collapse/expand tool output | -| Ctrl+T | Collapse/expand thinking blocks | + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -### Message Queue + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Submit messages while the agent is working: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -- **Enter** queues a *steering* message, delivered after the current assistant turn finishes executing its tool calls -- **Alt+Enter** queues a *follow-up* message, delivered only after the agent finishes all work -- **Escape** aborts and restores queued messages to editor -- **Alt+Up** retrieves queued messages back to editor + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -On Windows Terminal, `Alt+Enter` is fullscreen by default. Remap it in [docs/terminal-setup.md](docs/terminal-setup.md) so pi can receive the follow-up shortcut. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Configure delivery in [settings](docs/settings.md): `steeringMode` and `followUpMode` can be `"one-at-a-time"` (default, waits for response) or `"all"` (delivers all queued at once). `transport` selects provider transport preference (`"sse"`, `"websocket"`, or `"auto"`) for providers that support multiple transports. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). ---- + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -## Sessions + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -Sessions are stored as JSONL files with a tree structure. Each entry has an `id` and `parentId`, enabling in-place branching without creating new files. See [docs/session-format.md](docs/session-format.md) for file format. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -### Management + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Sessions auto-save to `~/.pi/agent/sessions/` organized by working directory. - -```bash -pi -c # Continue most recent session -pi -r # Browse and select from past sessions -pi --no-session # Ephemeral mode (don't save) -pi --session # Use specific session file or ID -pi --fork # Fork specific session file or ID into a new session -``` + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -Use `/session` in interactive mode to see the current session ID before reusing it with `--session ` or `--fork `. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -### Branching + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -**`/tree`** - Navigate the session tree in-place. Select any previous point, continue from there, and switch between branches. All history preserved in a single file. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -

Tree View

+ (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -- Search by typing, fold/unfold and jump between branches with Ctrl+←/Ctrl+→ or Alt+←/Alt+→, page with ←/→ -- Filter modes (Ctrl+O): default → no-tools → user-only → labeled-only → all -- Press Shift+L to label entries as bookmarks and Shift+T to toggle label timestamps + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -**`/fork`** - Create a new session file from a previous user message on the active branch. Opens a selector, copies the active path up to that point, and places the selected prompt in the editor for modification. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -**`/clone`** - Duplicate the current active branch into a new session file at the current position. The new session keeps the full active-path history and opens with an empty editor. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -**`--fork `** - Fork an existing session file or partial session UUID directly from the CLI. This copies the full source session into a new session file in the current project. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -### Compaction + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -Long sessions can exhaust context windows. Compaction summarizes older messages while keeping recent ones. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -**Manual:** `/compact` or `/compact ` + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -**Automatic:** Enabled by default. Triggers on context overflow (recovers and retries) or when approaching the limit (proactive). Configure via `/settings` or `settings.json`. + END OF TERMS AND CONDITIONS -Compaction is lossy. The full history remains in the JSONL file; use `/tree` to revisit. Customize compaction behavior via [extensions](#extensions). See [docs/compaction.md](docs/compaction.md) for internals. + APPENDIX: How to apply the Apache License to your work. ---- + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -## Settings + Copyright [yyyy] [name of copyright owner] -Use `/settings` to modify common options, or edit JSON files directly: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -| Location | Scope | -|----------|-------| -| `~/.pi/agent/settings.json` | Global (all projects) | -| `.pi/settings.json` | Project (overrides global) | + http://www.apache.org/licenses/LICENSE-2.0 -See [docs/settings.md](docs/settings.md) for all options. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -### Telemetry and update checks +## @grammyjs/runner - 2.0.3 +**Repository URL**: https://github.com/grammyjs/runner +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -Pi has two separate startup features: +Copyright (c) 2021-2023 KnorpelSenf -- **Update check:** fetches `https://pi.dev/api/latest-version` to check whether a newer Pi version exists. Disable it with `PI_SKIP_VERSION_CHECK=1`. Disabling update checks only turns off this check. -- **Install/update telemetry:** after first install or a changelog-detected update, sends an anonymous version ping to `https://pi.dev/api/report-install`. Opt out by setting `enableInstallTelemetry` to `false` in `settings.json`, or by setting `PI_TELEMETRY=0`. This does not disable update checks; Pi may still contact `pi.dev` for the latest version unless update checks are disabled or offline mode is enabled. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Use `--offline` or `PI_OFFLINE=1` to disable all startup network operations described here, including update checks, package update checks, and install/update telemetry. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. ---- +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## Context Files +## @grammyjs/transformer-throttler - 1.2.1 +**Repository URL**: https://github.com/grammyjs/transformer-throttler +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -Pi loads `AGENTS.md` (or `CLAUDE.md`) at startup from: -- `~/.pi/agent/AGENTS.md` (global) -- Parent directories (walking up from cwd) -- Current directory +Copyright (c) 2022 grammyjs -Use for project instructions, conventions, common commands. All matching files are concatenated. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Disable context file loading with `--no-context-files` (or `-nc`). +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -### System Prompt +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -Replace the default system prompt with `.pi/SYSTEM.md` (project) or `~/.pi/agent/SYSTEM.md` (global). Append without replacing via `APPEND_SYSTEM.md`. +## @grammyjs/types - 3.26.0 +**Repository URL**: https://github.com/grammyjs/types +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License ---- +Copyright (c) 2021-2024 KnorpelSenf -## Customization +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -### Prompt Templates +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Reusable prompts as Markdown files. Type `/name` to expand. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -```markdown - -Review this code for bugs, security issues, and performance problems. -Focus on: {{focus}} +## @homebridge/ciao - 1.3.8 +**Repository URL**: https://github.com/homebridge/ciao +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +MIT License -Place in `~/.pi/agent/prompts/`, `.pi/prompts/`, or a [pi package](#pi-packages) to share with others. See [docs/prompt-templates.md](docs/prompt-templates.md). - -### Skills +Copyright (c) 2020 Andreas Bauer -On-demand capability packages following the [Agent Skills standard](https://agentskills.io). Invoke via `/skill:name` or let the agent load them automatically. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -```markdown - -# My Skill -Use this skill when the user asks about X. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -## Steps -1. Do this -2. Then that +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` + +## @hono/node-server - 1.19.14 +**Repository URL**: https://github.com/honojs/node-server +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +MIT License -Place in `~/.pi/agent/skills/`, `~/.agents/skills/`, `.pi/skills/`, or `.agents/skills/` (from `cwd` up through parent directories) or a [pi package](#pi-packages) to share with others. See [docs/skills.md](docs/skills.md). +Copyright (c) 2022 - present, Yusuke Wada and Hono contributors -### Extensions +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -

Doom Extension

+The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -TypeScript modules that extend pi with custom tools, commands, keyboard shortcuts, event handlers, and UI components. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -```typescript -export default function (pi: ExtensionAPI) { - pi.registerTool({ name: "deploy", ... }); - pi.registerCommand("stats", { ... }); - pi.on("tool_call", async (event, ctx) => { ... }); -} +## @isaacs/fs-minipass - 4.0.1 +**Repository URL**: https://github.com/npm/fs-minipass +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html ``` +The ISC License -The default export can also be `async`. pi waits for async extension factories before startup continues, which is useful for one-time initialization such as fetching remote model lists before calling `pi.registerProvider()`. - -**What's possible:** -- Custom tools (or replace built-in tools entirely) -- Sub-agents and plan mode -- Custom compaction and summarization -- Permission gates and path protection -- Custom editors and UI components -- Status lines, headers, footers -- Git checkpointing and auto-commit -- SSH and sandbox execution -- MCP server integration -- Make pi look like Claude Code -- Games while waiting (yes, Doom runs) -- ...anything you can dream up +Copyright (c) Isaac Z. Schlueter and Contributors -Place in `~/.pi/agent/extensions/`, `.pi/extensions/`, or a [pi package](#pi-packages) to share with others. See [docs/extensions.md](docs/extensions.md) and [examples/extensions/](examples/extensions/). +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -### Themes +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` -Built-in: `dark`, `light`. Themes hot-reload: modify the active theme file and pi immediately applies changes. +## @istanbuljs/schema - 0.1.3 +**Repository URL**: https://github.com/istanbuljs/schema +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -Place in `~/.pi/agent/themes/`, `.pi/themes/`, or a [pi package](#pi-packages) to share with others. See [docs/themes.md](docs/themes.md). +Copyright (c) 2019 CFWare, LLC -### Pi Packages +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Bundle and share extensions, skills, prompts, and themes via npm or git. Find packages on [npmjs.com](https://www.npmjs.com/search?q=keywords%3Api-package) or [Discord](https://discord.com/channels/1456806362351669492/1457744485428629628). +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -> **Security:** Pi packages run with full system access. Extensions execute arbitrary code, and skills can instruct the model to perform any action including running executables. Review source code before installing third-party packages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -```bash -pi install npm:@foo/pi-tools -pi install npm:@foo/pi-tools@1.2.3 # pinned version -pi install git:github.com/user/repo -pi install git:github.com/user/repo@v1 # tag or commit -pi install git:git@github.com:user/repo -pi install git:git@github.com:user/repo@v1 # tag or commit -pi install https://github.com/user/repo -pi install https://github.com/user/repo@v1 # tag or commit -pi install ssh://git@github.com/user/repo -pi install ssh://git@github.com/user/repo@v1 # tag or commit -pi remove npm:@foo/pi-tools -pi uninstall npm:@foo/pi-tools # alias for remove -pi list -pi update # update pi and packages (skips pinned packages) -pi update --extensions # update packages only -pi update --self # update pi only -pi update --self --force # reinstall pi even if current -pi update npm:@foo/pi-tools # update one package -pi config # enable/disable extensions, skills, prompts, themes +## @istanbuljs/schema - 0.1.6 +**Repository URL**: https://github.com/istanbuljs/schema +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +MIT License -Packages install to `~/.pi/agent/git/` (git) or global npm. Use `-l` for project-local installs (`.pi/git/`, `.pi/npm/`). Git packages install dependencies with `npm install --omit=dev` by default, so runtime deps must be listed under `dependencies`; when `npmCommand` is configured, git packages use plain `install` for compatibility with wrappers. If you use a Node version manager and want package installs to reuse a stable npm context, set `npmCommand` in `settings.json`, for example `["mise", "exec", "node@20", "--", "npm"]`. +Copyright (c) 2019 CFWare, LLC -Create a package by adding a `pi` key to `package.json`: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -```json -{ - "name": "my-pi-package", - "keywords": ["pi-package"], - "pi": { - "extensions": ["./extensions"], - "skills": ["./skills"], - "prompts": ["./prompts"], - "themes": ["./themes"] - } -} +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` + +## @jridgewell/resolve-uri - 3.1.2 +**Repository URL**: https://github.com/jridgewell/resolve-uri +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +Copyright 2019 Justin Ridgewell -Without a `pi` manifest, pi auto-discovers from conventional directories (`extensions/`, `skills/`, `prompts/`, `themes/`). +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -See [docs/packages.md](docs/packages.md). +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. ---- +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## Programmatic Usage +## @jridgewell/sourcemap-codec - 1.5.5 +**Repository URL**: https://github.com/jridgewell/sourcemaps +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright 2024 Justin Ridgewell -### SDK +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -```typescript -import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@mariozechner/pi-coding-agent"; +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -const authStorage = AuthStorage.create(); -const modelRegistry = ModelRegistry.create(authStorage); -const { session } = await createAgentSession({ - sessionManager: SessionManager.inMemory(), - authStorage, - modelRegistry, -}); +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -await session.prompt("What files are in the current directory?"); +## @jridgewell/trace-mapping - 0.3.31 +**Repository URL**: https://github.com/jridgewell/sourcemaps +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +Copyright 2024 Justin Ridgewell -For advanced multi-session runtime replacement, use `createAgentSessionRuntime()` and `AgentSessionRuntime`. - -See [docs/sdk.md](docs/sdk.md) and [examples/sdk/](examples/sdk/). +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -### RPC Mode +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -For non-Node.js integrations, use RPC mode over stdin/stdout: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -```bash -pi --mode rpc +## @lydell/node-pty - 1.2.0-beta.12 +**Repository URL**: https://github.com/lydell/node-pty +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +MIT License -RPC mode uses strict LF-delimited JSONL framing. Clients must split records on `\n` only. Do not use generic line readers like Node `readline`, which also split on Unicode separators inside JSON payloads. +Copyright (c) 2026 Simon Lydell -See [docs/rpc.md](docs/rpc.md) for the protocol. +All rights reserved. ---- +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -## Philosophy +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Pi is aggressively extensible so it doesn't have to dictate your workflow. Features that other tools bake in can be built with [extensions](#extensions), [skills](#skills), or installed from third-party [pi packages](#pi-packages). This keeps the core minimal while letting you shape pi to fit how you work. - -**No MCP.** Build CLI tools with READMEs (see [Skills](#skills)), or build an extension that adds MCP support. [Why?](https://mariozechner.at/posts/2025-11-02-what-if-you-dont-need-mcp/) - -**No sub-agents.** There's many ways to do this. Spawn pi instances via tmux, or build your own with [extensions](#extensions), or install a package that does it your way. - -**No permission popups.** Run in a container, or build your own confirmation flow with [extensions](#extensions) inline with your environment and security requirements. - -**No plan mode.** Write plans to files, or build it with [extensions](#extensions), or install a package. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -**No built-in to-dos.** They confuse models. Use a TODO.md file, or build your own with [extensions](#extensions). +## @mariozechner/clipboard - 0.3.5 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard; see npm metadata.) +``` -**No background bash.** Use tmux. Full observability, direct interaction. +## @mariozechner/clipboard-darwin-arm64 - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-darwin-arm64 +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-darwin-arm64; see npm metadata.) +``` -Read the [blog post](https://mariozechner.at/posts/2025-11-30-pi-coding-agent/) for the full rationale. +## @mariozechner/clipboard-darwin-universal - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-darwin-universal +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-darwin-universal; see npm metadata.) +``` ---- +## @mariozechner/clipboard-darwin-x64 - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-darwin-x64 +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-darwin-x64; see npm metadata.) +``` -## CLI Reference +## @mariozechner/clipboard-linux-arm64-gnu - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-linux-arm64-gnu +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-linux-arm64-gnu; see npm metadata.) +``` -```bash -pi [options] [@files...] [messages...] +## @mariozechner/clipboard-linux-arm64-musl - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-linux-arm64-musl +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-linux-arm64-musl; see npm metadata.) ``` -### Package Commands +## @mariozechner/clipboard-linux-riscv64-gnu - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-linux-riscv64-gnu +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-linux-riscv64-gnu; see npm metadata.) +``` -```bash -pi install [-l] # Install package, -l for project-local -pi remove [-l] # Remove package -pi uninstall [-l] # Alias for remove -pi update [source|self|pi] # Update pi and packages (skips pinned packages) -pi update --extensions # Update packages only -pi update --self # Update pi only -pi update --self --force # Reinstall pi even if current -pi update --extension # Update one package -pi list # List installed packages -pi config # Enable/disable package resources +## @mariozechner/clipboard-linux-x64-gnu - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-linux-x64-gnu +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-linux-x64-gnu; see npm metadata.) ``` -### Modes +## @mariozechner/clipboard-linux-x64-musl - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-linux-x64-musl +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-linux-x64-musl; see npm metadata.) +``` -| Flag | Description | -|------|-------------| -| (default) | Interactive mode | -| `-p`, `--print` | Print response and exit | -| `--mode json` | Output all events as JSON lines (see [docs/json.md](docs/json.md)) | -| `--mode rpc` | RPC mode for process integration (see [docs/rpc.md](docs/rpc.md)) | -| `--export [out]` | Export session to HTML | +## @mariozechner/clipboard-win32-arm64-msvc - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-win32-arm64-msvc +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-win32-arm64-msvc; see npm metadata.) +``` -In print mode, pi also reads piped stdin and merges it into the initial prompt: +## @mariozechner/clipboard-win32-x64-msvc - 0.3.2 +**Repository URL**: https://www.npmjs.com/package/@mariozechner/clipboard-win32-x64-msvc +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(No license file read from locked npm artifact for @mariozechner/clipboard-win32-x64-msvc; see npm metadata.) +``` -```bash -cat README.md | pi -p "Summarize this text" +## @mistralai/mistralai - 2.2.1 +**Repository URL**: https://github.com/mistralai/client-ts +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -### Model Options + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -| Option | Description | -|--------|-------------| -| `--provider ` | Provider (anthropic, openai, google, etc.) | -| `--model ` | Model pattern or ID (supports `provider/id` and optional `:`) | -| `--api-key ` | API key (overrides env vars) | -| `--thinking ` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh` | -| `--models ` | Comma-separated patterns for Ctrl+P cycling | -| `--list-models [search]` | List available models | + 1. Definitions. -### Session Options + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -| Option | Description | -|--------|-------------| -| `-c`, `--continue` | Continue most recent session | -| `-r`, `--resume` | Browse and select session | -| `--session ` | Use specific session file or partial UUID | -| `--fork ` | Fork specific session file or partial UUID into a new session | -| `--session-dir ` | Custom session storage directory | -| `--no-session` | Ephemeral mode (don't save) | + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -### Tool Options + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -| Option | Description | -|--------|-------------| -| `--tools `, `-t ` | Allowlist specific tool names across built-in, extension, and custom tools | -| `--no-builtin-tools`, `-nbt` | Disable built-in tools by default but keep extension/custom tools enabled | -| `--no-tools`, `-nt` | Disable all tools by default | + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Available built-in tools: `read`, `bash`, `edit`, `write`, `grep`, `find`, `ls` + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -### Resource Options + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -| Option | Description | -|--------|-------------| -| `-e`, `--extension ` | Load extension from path, npm, or git (repeatable) | -| `--no-extensions` | Disable extension discovery | -| `--skill ` | Load skill (repeatable) | -| `--no-skills` | Disable skill discovery | -| `--prompt-template ` | Load prompt template (repeatable) | -| `--no-prompt-templates` | Disable prompt template discovery | -| `--theme ` | Load theme (repeatable) | -| `--no-themes` | Disable theme discovery | -| `--no-context-files`, `-nc` | Disable AGENTS.md and CLAUDE.md context file discovery | + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -Combine `--no-*` with explicit flags to load exactly what you need, ignoring settings.json (e.g., `--no-extensions -e ./my-ext.ts`). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -### Other Options + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -| Option | Description | -|--------|-------------| -| `--system-prompt ` | Replace default prompt (context files and skills still appended) | -| `--append-system-prompt ` | Append to system prompt | -| `--verbose` | Force verbose startup | -| `-h`, `--help` | Show help | -| `-v`, `--version` | Show version | + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -### File Arguments + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Prefix files with `@` to include in the message: + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -```bash -pi @prompt.md "Answer this" -pi -p @screenshot.png "What's in this image?" -pi @code.ts @test.ts "Review these files" -``` + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -### Examples + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -```bash -# Interactive with initial prompt -pi "List all .ts files in src/" + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -# Non-interactive -pi -p "Summarize this codebase" + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -# Non-interactive with piped stdin -cat README.md | pi -p "Summarize this text" + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -# Different model -pi --provider openai --model gpt-4o "Help me refactor" - -# Model with provider prefix (no --provider needed) -pi --model openai/gpt-4o "Help me refactor" - -# Model with thinking level shorthand -pi --model sonnet:high "Solve this complex problem" - -# Limit model cycling -pi --models "claude-*,gpt-4o" + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -# Read-only mode -pi --tools read,grep,find,ls -p "Review the code" + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -# High thinking level -pi --thinking high "Solve this complex problem" -``` + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -### Environment Variables + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -| Variable | Description | -|----------|-------------| -| `PI_CODING_AGENT_DIR` | Override config directory (default: `~/.pi/agent`) | -| `PI_CODING_AGENT_SESSION_DIR` | Override session storage directory (overridden by `--session-dir`) | -| `PI_PACKAGE_DIR` | Override package directory (useful for Nix/Guix where store paths tokenize poorly) | -| `PI_OFFLINE` | Disable startup network operations, including update checks, package update checks, and install/update telemetry | -| `PI_SKIP_VERSION_CHECK` | Skip the Pi version update check at startup. This prevents the `pi.dev` latest-version request | -| `PI_TELEMETRY` | Override install/update telemetry. Use `1`/`true`/`yes` to enable or `0`/`false`/`no` to disable. This does not disable update checks | -| `PI_CACHE_RETENTION` | Set to `long` for extended prompt cache (Anthropic: 1h, OpenAI: 24h) | -| `VISUAL`, `EDITOR` | External editor for Ctrl+G | + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. ---- + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -## Contributing & Development + END OF TERMS AND CONDITIONS -See [CONTRIBUTING.md](../../CONTRIBUTING.md) for guidelines and [docs/development.md](docs/development.md) for setup, forking, and debugging. + APPENDIX: How to apply the Apache License to your work. ---- + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -## License + Copyright 2024 Mistral AI -MIT + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -## See Also + http://www.apache.org/licenses/LICENSE-2.0 -- [@mariozechner/pi-ai](https://www.npmjs.com/package/@mariozechner/pi-ai): Core LLM toolkit -- [@mariozechner/pi-agent-core](https://www.npmjs.com/package/@mariozechner/pi-agent-core): Agent framework -- [@mariozechner/pi-tui](https://www.npmjs.com/package/@mariozechner/pi-tui): Terminal UI components``` + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -## @mariozechner/pi-tui - 0.73.0 -**Repository URL**: https://github.com/badlogic/pi-mono +## @modelcontextprotocol/sdk - 1.29.0 +**Repository URL**: https://github.com/modelcontextprotocol/typescript-sdk **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -# @mariozechner/pi-tui - -Minimal terminal UI framework with differential rendering and synchronized output for flicker-free interactive CLI applications. - -## Features - -- **Differential Rendering**: Three-strategy rendering system that only updates what changed -- **Synchronized Output**: Uses CSI 2026 for atomic screen updates (no flicker) -- **Bracketed Paste Mode**: Handles large pastes correctly with markers for >10 line pastes -- **Component-based**: Simple Component interface with render() method -- **Theme Support**: Components accept theme interfaces for customizable styling -- **Built-in Components**: Text, TruncatedText, Input, Editor, Markdown, Loader, SelectList, SettingsList, Spacer, Image, Box, Container -- **Inline Images**: Renders images in terminals that support Kitty or iTerm2 graphics protocols -- **Autocomplete Support**: File paths and slash commands +MIT License -## Quick Start +Copyright (c) 2024 Anthropic, PBC -```typescript -import { TUI, Text, Editor, ProcessTerminal, matchesKey } from "@mariozechner/pi-tui"; +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -// Create terminal -const terminal = new ProcessTerminal(); +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -// Create TUI -const tui = new TUI(terminal); +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -// Add components -tui.addChild(new Text("Welcome to my app!")); +## @mozilla/readability - 0.6.0 +**Repository URL**: https://github.com/mozilla/readability +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Copyright (c) 2010 Arc90 Inc -import { defaultEditorTheme as editorTheme } from './test/test-themes.ts'; -const editor = new Editor(tui, editorTheme); -editor.onSubmit = (text) => { - console.log("Submitted:", text); - tui.addChild(new Text(`You said: ${text}`)); -}; -tui.addChild(editor); +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at -// Focus the editor so it receives keyboard input -tui.setFocus(editor); + http://www.apache.org/licenses/LICENSE-2.0 -// In raw mode Ctrl+C doesn't send SIGINT — intercept it here to allow exit -tui.addInputListener((data) => { - if (matchesKey(data, 'ctrl+c')) { - tui.stop(); - process.exit(0); - } -}); +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.``` -// Start -tui.start(); +## @napi-rs/cli - 2.18.4 +**Repository URL**: https://github.com/napi-rs/napi-rs +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +MIT License -## Core API +Copyright (c) 2020 LongYinan -### TUI +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Main container that manages components and rendering. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -```typescript -const tui = new TUI(terminal); -tui.addChild(component); -tui.removeChild(component); -tui.start(); -tui.stop(); -tui.requestRender(); // Request a re-render +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -// Global debug key handler (Shift+Ctrl+D) -tui.onDebug = () => console.log("Debug triggered"); +## @nodable/entities - 2.1.0 +**Repository URL**: https://github.com/nodable/val-parsers +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +# @nodable/entities -### Overlays +Fast, zero-dependency XML/HTML entity encoder and decoder for Node.js. -Overlays render components on top of existing content without replacing it. Useful for dialogs, menus, and modal UI. +## Install -```typescript -// Show overlay with default options (centered, max 80 cols) -const handle = tui.showOverlay(component); +```bash +npm install @nodable/entities +``` -// Show overlay with custom positioning and sizing -// Values can be numbers (absolute) or percentage strings (e.g., "50%") -const handle = tui.showOverlay(component, { - // Sizing - width: 60, // Fixed width in columns - width: "80%", // Width as percentage of terminal - minWidth: 40, // Minimum width floor - maxHeight: 20, // Maximum height in rows - maxHeight: "50%", // Maximum height as percentage of terminal +## Quick start - // Anchor-based positioning (default: 'center') - anchor: 'bottom-right', // Position relative to anchor point - offsetX: 2, // Horizontal offset from anchor - offsetY: -1, // Vertical offset from anchor +```js +import { EntityEncoder, EntityDecoder, ALL_ENTITIES } from '@nodable/entities'; - // Percentage-based positioning (alternative to anchor) - row: "25%", // Vertical position (0%=top, 100%=bottom) - col: "50%", // Horizontal position (0%=left, 100%=right) +// Encode: plain text → entity references +const enc = new EntityEncoder(); +enc.encode('Hello © 2024 & '); +// → 'Hello © 2024 & <stuff>' - // Absolute positioning (overrides anchor/percent) - row: 5, // Exact row position - col: 10, // Exact column position +// Decode: entity references → plain text +const dec = new EntityDecoder({ namedEntities: ALL_ENTITIES }); +dec.decode('Hello © 2024 & <stuff>'); +// → 'Hello © 2024 & ' +``` - // Margin from terminal edges - margin: 2, // All sides - margin: { top: 1, right: 2, bottom: 1, left: 2 }, +## Performance - // Responsive visibility - visible: (termWidth, termHeight) => termWidth >= 100 // Hide on narrow terminals +| | encode | decode | +|---|---|---| +| `entities` (npm) | 3.65 M req/s | 1.76 M req/s | +| `@nodable/entities` | 3.33 M req/s | **5.19 M req/s** | - // Focus behavior - nonCapturing: true // Don't auto-focus when shown -}); +## Documentation -// OverlayHandle methods -handle.hide(); // Permanently remove the overlay -handle.setHidden(true); // Temporarily hide (can show again) -handle.setHidden(false); // Show again after hiding -handle.isHidden(); // Check if temporarily hidden -handle.focus(); // Focus and bring to visual front -handle.unfocus(); // Release focus to previous target -handle.isFocused(); // Check if overlay has focus +- [EntityEncoder](docs/EntityEncoder.md) — options, API, recipes +- [EntityDecoder](docs/EntityDecoder.md) — options, API, security limits, entity sets -// Hide topmost overlay -tui.hideOverlay(); +## License -// Check if any visible overlay is active -tui.hasOverlay(); +MIT``` + +## @openclaw/fs-safe - 0.2.4 +**Repository URL**: https://github.com/openclaw/fs-safe +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +MIT License -**Anchor values**: `'center'`, `'top-left'`, `'top-right'`, `'bottom-left'`, `'bottom-right'`, `'top-center'`, `'bottom-center'`, `'left-center'`, `'right-center'` +Copyright (c) 2026 openclaw -**Resolution order**: -1. `minWidth` is applied as a floor after width calculation -2. For position: absolute `row`/`col` > percentage `row`/`col` > `anchor` -3. `margin` clamps final position to stay within terminal bounds -4. `visible` callback controls whether overlay renders (called each frame) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -### Component Interface +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -All components implement: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -```typescript -interface Component { - render(width: number): string[]; - handleInput?(data: string): void; - invalidate?(): void; -} +## @protobufjs/aspromise - 1.1.2 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html ``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -| Method | Description | -|--------|-------------| -| `render(width)` | Returns an array of strings, one per line. Each line **must not exceed `width`** or the TUI will error. Use `truncateToWidth()` or manual wrapping to ensure this. | -| `handleInput?(data)` | Called when the component has focus and receives keyboard input. The `data` string contains raw terminal input (may include ANSI escape sequences). | -| `invalidate?()` | Called to clear any cached render state. Components should re-render from scratch on the next `render()` call. | +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -The TUI appends a full SGR reset and OSC 8 reset at the end of each rendered line. Styles do not carry across lines. If you emit multi-line text with styling, reapply styles per line or use `wrapTextWithAnsi()` so styles are preserved for each wrapped line. +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. -### Focusable Interface (IME Support) +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -Components that display a text cursor and need IME (Input Method Editor) support should implement the `Focusable` interface: +## @protobufjs/base64 - 1.1.2 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html +``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -```typescript -import { CURSOR_MARKER, type Component, type Focusable } from "@mariozechner/pi-tui"; +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -class MyInput implements Component, Focusable { - focused: boolean = false; // Set by TUI when focus changes +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. - render(width: number): string[] { - const marker = this.focused ? CURSOR_MARKER : ""; - // Emit marker right before the fake cursor - return [`> ${beforeCursor}${marker}\x1b[7m${atCursor}\x1b[27m${afterCursor}`]; - } -} +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## @protobufjs/codegen - 2.0.5 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html ``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -When a `Focusable` component has focus, TUI: -1. Sets `focused = true` on the component -2. Scans rendered output for `CURSOR_MARKER` (a zero-width APC escape sequence) -3. Positions the hardware terminal cursor at that location -4. Shows the hardware cursor +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -This enables IME candidate windows to appear at the correct position for CJK input methods. The `Editor` and `Input` built-in components already implement this interface. +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. -**Container components with embedded inputs:** When a container component (dialog, selector, etc.) contains an `Input` or `Editor` child, the container must implement `Focusable` and propagate the focus state to the child: +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -```typescript -import { Container, type Focusable, Input } from "@mariozechner/pi-tui"; +## @protobufjs/eventemitter - 1.1.0 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html +``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -class SearchDialog extends Container implements Focusable { - private searchInput: Input; +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: - // Propagate focus to child input for IME cursor positioning - private _focused = false; - get focused(): boolean { return this._focused; } - set focused(value: boolean) { - this._focused = value; - this.searchInput.focused = value; - } +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. - constructor() { - super(); - this.searchInput = new Input(); - this.addChild(this.searchInput); - } -} -``` +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -Without this propagation, typing with an IME (Chinese, Japanese, Korean, etc.) will show the candidate window in the wrong position. +## @protobufjs/fetch - 1.1.0 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html +``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -## Built-in Components +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -### Container +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. -Groups child components. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -```typescript -const container = new Container(); -container.addChild(component); -container.removeChild(component); +## @protobufjs/float - 1.0.2 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html ``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -### Box +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -Container that applies padding and background color to all children. +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. -```typescript -const box = new Box( - 1, // paddingX (default: 1) - 1, // paddingY (default: 1) - (text) => chalk.bgGray(text) // optional background function -); -box.addChild(new Text("Content")); -box.setBgFn((text) => chalk.bgBlue(text)); // Change background dynamically +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## @protobufjs/inquire - 1.1.1 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html ``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -### Text +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -Displays multi-line text with word wrapping and padding. +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. -```typescript -const text = new Text( - "Hello World", // text content - 1, // paddingX (default: 1) - 1, // paddingY (default: 1) - (text) => chalk.bgGray(text) // optional background function -); -text.setText("Updated text"); -text.setCustomBgFn((text) => chalk.bgBlue(text)); +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## @protobufjs/path - 1.1.2 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html ``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -### TruncatedText +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -Single-line text that truncates to fit viewport width. Useful for status lines and headers. +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. -```typescript -const truncated = new TruncatedText( - "This is a very long line that will be truncated...", - 0, // paddingX (default: 0) - 0 // paddingY (default: 0) -); +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## @protobufjs/pool - 1.1.0 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html ``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -### Input +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -Single-line text input with horizontal scrolling. +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. -```typescript -const input = new Input(); -input.onSubmit = (value) => console.log(value); -input.setValue("initial"); -input.getValue(); +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## @protobufjs/utf8 - 1.1.1 +**Repository URL**: https://github.com/dcodeIO/protobuf.js +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html ``` +Copyright (c) 2016, Daniel Wirtz All rights reserved. -**Key Bindings:** -- `Enter` - Submit -- `Ctrl+A` / `Ctrl+E` - Line start/end -- `Ctrl+W` or `Alt+Backspace` - Delete word backwards -- `Ctrl+U` - Delete to start of line -- `Ctrl+K` - Delete to end of line -- `Ctrl+Left` / `Ctrl+Right` - Word navigation -- `Alt+Left` / `Alt+Right` - Word navigation -- Arrow keys, Backspace, Delete work as expected +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -### Editor +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. -Multi-line text editor with autocomplete, file completion, paste handling, and vertical scrolling when content exceeds terminal height. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -```typescript -interface EditorTheme { - borderColor: (str: string) => string; - selectList: SelectListTheme; -} +## @shikijs/engine-oniguruma - 3.23.0 +**Repository URL**: https://github.com/shikijs/shiki +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -interface EditorOptions { - paddingX?: number; // Horizontal padding (default: 0) -} +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu -const editor = new Editor(tui, theme, options?); // tui is required for height-aware scrolling -editor.onSubmit = (text) => console.log(text); -editor.onChange = (text) => console.log("Changed:", text); -editor.disableSubmit = true; // Disable submit temporarily -editor.setAutocompleteProvider(provider); -editor.borderColor = (s) => chalk.blue(s); // Change border dynamically -editor.setPaddingX(1); // Update horizontal padding dynamically -editor.getPaddingX(); // Get current padding -``` +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -**Features:** -- Multi-line editing with word wrap -- Slash command autocomplete (type `/`) -- File path autocomplete (press `Tab`) -- Large paste handling (>10 lines creates `[paste #1 +50 lines]` marker) -- Horizontal lines above/below editor -- Fake cursor rendering (hidden real cursor) +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -**Key Bindings:** -- `Enter` - Submit -- `Shift+Enter`, `Ctrl+Enter`, or `Alt+Enter` - New line (terminal-dependent, Alt+Enter most reliable) -- `Tab` - Autocomplete -- `Ctrl+K` - Delete to end of line -- `Ctrl+U` - Delete to start of line -- `Ctrl+W` or `Alt+Backspace` - Delete word backwards -- `Alt+D` or `Alt+Delete` - Delete word forwards -- `Ctrl+A` / `Ctrl+E` - Line start/end -- `Ctrl+]` - Jump forward to character (awaits next keypress, then moves cursor to first occurrence) -- `Ctrl+Alt+]` - Jump backward to character -- Arrow keys, Backspace, Delete work as expected +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -### Markdown +## @shikijs/langs - 3.23.0 +**Repository URL**: https://github.com/shikijs/shiki +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -Renders markdown with syntax highlighting and theming support. +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu -```typescript -interface MarkdownTheme { - heading: (text: string) => string; - link: (text: string) => string; - linkUrl: (text: string) => string; - code: (text: string) => string; - codeBlock: (text: string) => string; - codeBlockBorder: (text: string) => string; - quote: (text: string) => string; - quoteBorder: (text: string) => string; - hr: (text: string) => string; - listBullet: (text: string) => string; - bold: (text: string) => string; - italic: (text: string) => string; - strikethrough: (text: string) => string; - underline: (text: string) => string; - highlightCode?: (code: string, lang?: string) => string[]; -} - -interface DefaultTextStyle { - color?: (text: string) => string; - bgColor?: (text: string) => string; - bold?: boolean; - italic?: boolean; - strikethrough?: boolean; - underline?: boolean; -} - -const md = new Markdown( - "# Hello\n\nSome **bold** text", - 1, // paddingX - 1, // paddingY - theme, // MarkdownTheme - defaultStyle // optional DefaultTextStyle -); -md.setText("Updated markdown"); -``` - -**Features:** -- Headings, bold, italic, code blocks, lists, links, blockquotes -- HTML tags rendered as plain text -- Optional syntax highlighting via `highlightCode` -- Padding support -- Render caching for performance +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -### Loader +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Animated loading spinner. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -```typescript -const loader = new Loader( - tui, // TUI instance for render updates - (s) => chalk.cyan(s), // spinner color function - (s) => chalk.gray(s), // message color function - "Loading..." // message (default: "Loading...") -); -loader.start(); -loader.setMessage("Still loading..."); -loader.stop(); +## @shikijs/themes - 3.23.0 +**Repository URL**: https://github.com/shikijs/shiki +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +MIT License -### CancellableLoader +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu -Extends Loader with Escape key handling and an AbortSignal for cancelling async operations. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -```typescript -const loader = new CancellableLoader( - tui, // TUI instance for render updates - (s) => chalk.cyan(s), // spinner color function - (s) => chalk.gray(s), // message color function - "Working..." // message -); -loader.onAbort = () => done(null); // Called when user presses Escape -doAsyncWork(loader.signal).then(done); -``` +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -**Properties:** -- `signal: AbortSignal` - Aborted when user presses Escape -- `aborted: boolean` - Whether the loader was aborted -- `onAbort?: () => void` - Callback when user presses Escape +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -### SelectList +## @shikijs/types - 3.23.0 +**Repository URL**: https://github.com/shikijs/shiki +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -Interactive selection list with keyboard navigation. +Copyright (c) 2021 Pine Wu +Copyright (c) 2023 Anthony Fu -```typescript -interface SelectItem { - value: string; - label: string; - description?: string; -} +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -interface SelectListTheme { - selectedPrefix: (text: string) => string; - selectedText: (text: string) => string; - description: (text: string) => string; - scrollInfo: (text: string) => string; - noMatch: (text: string) => string; -} +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -const list = new SelectList( - [ - { value: "opt1", label: "Option 1", description: "First option" }, - { value: "opt2", label: "Option 2", description: "Second option" }, - ], - 5, // maxVisible - theme // SelectListTheme -); +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -list.onSelect = (item) => console.log("Selected:", item); -list.onCancel = () => console.log("Cancelled"); -list.onSelectionChange = (item) => console.log("Highlighted:", item); -list.setFilter("opt"); // Filter items +## @shikijs/vscode-textmate - 10.0.2 +**Repository URL**: https://github.com/shikijs/vscode-textmate +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +The MIT License (MIT) -**Controls:** -- Arrow keys: Navigate -- Enter: Select -- Escape: Cancel - -### SettingsList +Copyright (c) Microsoft Corporation -Settings panel with value cycling and submenus. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -```typescript -interface SettingItem { - id: string; - label: string; - description?: string; - currentValue: string; - values?: string[]; // If provided, Enter/Space cycles through these - submenu?: (currentValue: string, done: (selectedValue?: string) => void) => Component; -} +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -interface SettingsListTheme { - label: (text: string, selected: boolean) => string; - value: (text: string, selected: boolean) => string; - description: (text: string) => string; - cursor: string; - hint: (text: string) => string; -} +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -const settings = new SettingsList( - [ - { id: "theme", label: "Theme", currentValue: "dark", values: ["dark", "light"] }, - { id: "model", label: "Model", currentValue: "gpt-4", submenu: (val, done) => modelSelector }, - ], - 10, // maxVisible - theme, // SettingsListTheme - (id, newValue) => console.log(`${id} changed to ${newValue}`), - () => console.log("Cancelled") -); -settings.updateValue("theme", "light"); +## @silvia-odwyer/photon-node - 0.3.4 +**Repository URL**: https://github.com/silvia-odwyer/photon +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -**Controls:** -- Arrow keys: Navigate -- Enter/Space: Activate (cycle value or open submenu) -- Escape: Cancel + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -### Spacer + 1. Definitions. -Empty lines for vertical spacing. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -```typescript -const spacer = new Spacer(2); // 2 empty lines (default: 1) -``` + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -### Image + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Renders images inline for terminals that support the Kitty graphics protocol (Kitty, Ghostty, WezTerm) or iTerm2 inline images. Falls back to a text placeholder on unsupported terminals. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -```typescript -interface ImageTheme { - fallbackColor: (str: string) => string; -} + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -interface ImageOptions { - maxWidthCells?: number; - maxHeightCells?: number; - filename?: string; -} + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -const image = new Image( - base64Data, // base64-encoded image data - "image/png", // MIME type - theme, // ImageTheme - options // optional ImageOptions -); -tui.addChild(image); -``` - -Supported formats: PNG, JPEG, GIF, WebP. Dimensions are parsed from the image headers automatically. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -## Autocomplete + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -### CombinedAutocompleteProvider + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -Supports both slash commands and file paths. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -```typescript -import { CombinedAutocompleteProvider } from "@mariozechner/pi-tui"; + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -const provider = new CombinedAutocompleteProvider( - [ - { name: "help", description: "Show help" }, - { name: "clear", description: "Clear screen" }, - { name: "delete", description: "Delete last message" }, - ], - process.cwd() // base path for file completion -); + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -editor.setAutocompleteProvider(provider); -``` + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -**Features:** -- Type `/` to see slash commands -- Press `Tab` for file path completion -- Works with `~/`, `./`, `../`, and `@` prefix -- Filters to attachable files for `@` prefix + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -## Key Detection + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -Use `matchesKey()` with the `Key` helper for detecting keyboard input (supports Kitty keyboard protocol): + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -```typescript -import { matchesKey, Key } from "@mariozechner/pi-tui"; + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -if (matchesKey(data, Key.ctrl("c"))) { - process.exit(0); -} + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -if (matchesKey(data, Key.enter)) { - submit(); -} else if (matchesKey(data, Key.escape)) { - cancel(); -} else if (matchesKey(data, Key.up)) { - moveUp(); -} -``` + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -**Key identifiers** (use `Key.*` for autocomplete, or string literals): -- Basic keys: `Key.enter`, `Key.escape`, `Key.tab`, `Key.space`, `Key.backspace`, `Key.delete`, `Key.home`, `Key.end` -- Arrow keys: `Key.up`, `Key.down`, `Key.left`, `Key.right` -- With modifiers: `Key.ctrl("c")`, `Key.shift("tab")`, `Key.alt("left")`, `Key.ctrlShift("p")` -- String format also works: `"enter"`, `"ctrl+c"`, `"shift+tab"`, `"ctrl+shift+p"` + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -## Differential Rendering + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -The TUI uses three rendering strategies: + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -1. **First Render**: Output all lines without clearing scrollback -2. **Width Changed or Change Above Viewport**: Clear screen and full re-render -3. **Normal Update**: Move cursor to first changed line, clear to end, render changed lines + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -All updates are wrapped in **synchronized output** (`\x1b[?2026h` ... `\x1b[?2026l`) for atomic, flicker-free rendering. + END OF TERMS AND CONDITIONS -## Terminal Interface + APPENDIX: How to apply the Apache License to your work. -The TUI works with any object implementing the `Terminal` interface: + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -```typescript -interface Terminal { - start(onInput: (data: string) => void, onResize: () => void): void; - stop(): void; - write(data: string): void; - get columns(): number; - get rows(): number; - moveBy(lines: number): void; - hideCursor(): void; - showCursor(): void; - clearLine(): void; - clearFromCursor(): void; - clearScreen(): void; -} -``` + Copyright 2023, Silvia O'Dwyer -**Built-in implementations:** -- `ProcessTerminal` - Uses `process.stdin/stdout` -- `VirtualTerminal` - For testing (uses `@xterm/headless`) + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -## Utilities + http://www.apache.org/licenses/LICENSE-2.0 -```typescript -import { visibleWidth, truncateToWidth, wrapTextWithAnsi } from "@mariozechner/pi-tui"; + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -// Get visible width of string (ignoring ANSI codes) -const width = visibleWidth("\x1b[31mHello\x1b[0m"); // 5 +## @smithy/core - 3.24.2 +**Repository URL**: https://github.com/smithy-lang/smithy-typescript +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -// Truncate string to width (preserving ANSI codes, adds ellipsis) -const truncated = truncateToWidth("Hello World", 8); // "Hello..." + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -// Truncate without ellipsis -const truncatedNoEllipsis = truncateToWidth("Hello World", 8, ""); // "Hello Wo" + 1. Definitions. -// Wrap text to width (preserving ANSI codes across line breaks) -const lines = wrapTextWithAnsi("This is a long line that needs wrapping", 20); -// ["This is a long line", "that needs wrapping"] -``` + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -## Creating Custom Components + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -When creating custom components, **each line returned by `render()` must not exceed the `width` parameter**. The TUI will error if any line is wider than the terminal. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -### Handling Input + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Use `matchesKey()` with the `Key` helper for keyboard input: - -```typescript -import { matchesKey, Key, truncateToWidth } from "@mariozechner/pi-tui"; -import type { Component } from "@mariozechner/pi-tui"; - -class MyInteractiveComponent implements Component { - private selectedIndex = 0; - private items = ["Option 1", "Option 2", "Option 3"]; - - public onSelect?: (index: number) => void; - public onCancel?: () => void; - - handleInput(data: string): void { - if (matchesKey(data, Key.up)) { - this.selectedIndex = Math.max(0, this.selectedIndex - 1); - } else if (matchesKey(data, Key.down)) { - this.selectedIndex = Math.min(this.items.length - 1, this.selectedIndex + 1); - } else if (matchesKey(data, Key.enter)) { - this.onSelect?.(this.selectedIndex); - } else if (matchesKey(data, Key.escape) || matchesKey(data, Key.ctrl("c"))) { - this.onCancel?.(); - } - } - - render(width: number): string[] { - return this.items.map((item, i) => { - const prefix = i === this.selectedIndex ? "> " : " "; - return truncateToWidth(prefix + item, width); - }); - } -} -``` - -### Handling Line Width - -Use the provided utilities to ensure lines fit: - -```typescript -import { visibleWidth, truncateToWidth } from "@mariozechner/pi-tui"; -import type { Component } from "@mariozechner/pi-tui"; - -class MyComponent implements Component { - private text: string; - - constructor(text: string) { - this.text = text; - } - - render(width: number): string[] { - // Option 1: Truncate long lines - return [truncateToWidth(this.text, width)]; - - // Option 2: Check and pad to exact width - const line = this.text; - const visible = visibleWidth(line); - if (visible > width) { - return [truncateToWidth(line, width)]; - } - // Pad to exact width (optional, for backgrounds) - return [line + " ".repeat(width - visible)]; - } -} -``` - -### ANSI Code Considerations - -Both `visibleWidth()` and `truncateToWidth()` correctly handle ANSI escape codes: - -- `visibleWidth()` ignores ANSI codes when calculating width -- `truncateToWidth()` preserves ANSI codes and properly closes them when truncating - -```typescript -import chalk from "chalk"; - -const styled = chalk.red("Hello") + " " + chalk.blue("World"); -const width = visibleWidth(styled); // 11 (not counting ANSI codes) -const truncated = truncateToWidth(styled, 8); // Red "Hello" + " W..." with proper reset -``` - -### Caching - -For performance, components should cache their rendered output and only re-render when necessary: - -```typescript -class CachedComponent implements Component { - private text: string; - private cachedWidth?: number; - private cachedLines?: string[]; - - render(width: number): string[] { - if (this.cachedLines && this.cachedWidth === width) { - return this.cachedLines; - } - - const lines = [truncateToWidth(this.text, width)]; - - this.cachedWidth = width; - this.cachedLines = lines; - return lines; - } - - invalidate(): void { - this.cachedWidth = undefined; - this.cachedLines = undefined; - } -} -``` - -## Example - -See `test/chat-simple.ts` for a complete chat interface example with: -- Markdown messages with custom background colors -- Loading spinner during responses -- Editor with autocomplete and slash commands -- Spacers between messages - -Run it: -```bash -npx tsx test/chat-simple.ts -``` - -## Development - -```bash -# Install dependencies (from monorepo root) -npm install - -# Run type checking -npm run check - -# Run the demo -npx tsx test/chat-simple.ts -``` - -### Debug logging - -Set `PI_TUI_WRITE_LOG` to capture the raw ANSI stream written to stdout. - -```bash -PI_TUI_WRITE_LOG=/tmp/tui-ansi.log npx tsx test/chat-simple.ts -`````` - -## @mistralai/mistralai - 2.2.1 -**Repository URL**: https://github.com/mistralai/client-ts -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but @@ -12438,7 +11863,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -12446,7 +11871,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2024 Mistral AI + Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12460,11298 +11885,1931 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## @modelcontextprotocol/sdk - 1.29.0 -**Repository URL**: https://github.com/modelcontextprotocol/typescript-sdk -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2024 Anthropic, PBC - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## @mozilla/readability - 0.6.0 -**Repository URL**: https://github.com/mozilla/readability +## @smithy/credential-provider-imds - 4.3.2 +**Repository URL**: https://github.com/smithy-lang/smithy-typescript **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Copyright (c) 2010 Arc90 Inc +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - http://www.apache.org/licenses/LICENSE-2.0 + 1. Definitions. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.``` + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -## @napi-rs/cli - 2.18.4 -**Repository URL**: https://github.com/napi-rs/napi-rs -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Copyright (c) 2020 LongYinan + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -## @nodable/entities - 2.1.0 -**Repository URL**: https://github.com/nodable/val-parsers -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -# @nodable/entities + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -Fast, zero-dependency XML/HTML entity encoder and decoder for Node.js. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -## Install + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -```bash -npm install @nodable/entities -``` + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -## Quick start + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -```js -import { EntityEncoder, EntityDecoder, ALL_ENTITIES } from '@nodable/entities'; + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -// Encode: plain text → entity references -const enc = new EntityEncoder(); -enc.encode('Hello © 2024 & '); -// → 'Hello © 2024 & <stuff>' + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -// Decode: entity references → plain text -const dec = new EntityDecoder({ namedEntities: ALL_ENTITIES }); -dec.decode('Hello © 2024 & <stuff>'); -// → 'Hello © 2024 & ' -``` + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -## Performance + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -| | encode | decode | -|---|---|---| -| `entities` (npm) | 3.65 M req/s | 1.76 M req/s | -| `@nodable/entities` | 3.33 M req/s | **5.19 M req/s** | + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -## Documentation + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -- [EntityEncoder](docs/EntityEncoder.md) — options, API, recipes -- [EntityDecoder](docs/EntityDecoder.md) — options, API, security limits, entity sets + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -## License + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -MIT``` + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -## @protobufjs/aspromise - 1.1.2 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + END OF TERMS AND CONDITIONS -## @protobufjs/base64 - 1.1.2 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. + APPENDIX: How to apply the Apache License to your work. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -## @protobufjs/codegen - 2.0.5 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` + +## @smithy/fetch-http-handler - 5.4.2 +**Repository URL**: https://github.com/smithy-lang/smithy-typescript +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## @protobufjs/eventemitter - 1.1.0 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## @protobufjs/fetch - 1.1.0 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## @protobufjs/float - 1.0.2 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## @protobufjs/inquire - 1.1.1 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## @protobufjs/path - 1.1.2 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## @protobufjs/pool - 1.1.0 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## @protobufjs/utf8 - 1.1.1 -**Repository URL**: https://github.com/dcodeIO/protobuf.js -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## @shikijs/engine-oniguruma - 3.23.0 -**Repository URL**: https://github.com/shikijs/shiki -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2021 Pine Wu -Copyright (c) 2023 Anthony Fu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## @shikijs/langs - 3.23.0 -**Repository URL**: https://github.com/shikijs/shiki -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2021 Pine Wu -Copyright (c) 2023 Anthony Fu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## @shikijs/themes - 3.23.0 -**Repository URL**: https://github.com/shikijs/shiki -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2021 Pine Wu -Copyright (c) 2023 Anthony Fu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## @shikijs/types - 3.23.0 -**Repository URL**: https://github.com/shikijs/shiki -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2021 Pine Wu -Copyright (c) 2023 Anthony Fu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## @shikijs/vscode-textmate - 10.0.2 -**Repository URL**: https://github.com/shikijs/vscode-textmate -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## @silvia-odwyer/photon-node - 0.3.4 -**Repository URL**: https://github.com/silvia-odwyer/photon -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2023, Silvia O'Dwyer - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @slack/bolt - 4.7.2 -**Repository URL**: https://github.com/slackapi/bolt-js -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) 2016-2018 Robots & Pencils -Copyright (c) 2019- Slack Technologies, LLC - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## @slack/logger - 4.0.1 -**Repository URL**: https://github.com/slackapi/node-slack-sdk -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2014- Slack Technologies, LLC - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## @slack/oauth - 3.0.5 -**Repository URL**: https://github.com/slackapi/node-slack-sdk -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2014- Slack Technologies, LLC - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## @slack/socket-mode - 2.0.7 -**Repository URL**: https://github.com/slackapi/node-slack-sdk -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2014- Slack Technologies, LLC - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## @slack/types - 2.21.1 -**Repository URL**: https://github.com/slackapi/node-slack-sdk -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2014- Slack Technologies, LLC - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## @slack/web-api - 7.15.2 -**Repository URL**: https://github.com/slackapi/node-slack-sdk -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2014- Slack Technologies, LLC - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## @smithy/config-resolver - 4.5.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/core - 3.24.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/credential-provider-imds - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/eventstream-codec - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/eventstream-serde-browser - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/eventstream-serde-config-resolver - 4.4.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/eventstream-serde-node - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/fetch-http-handler - 5.4.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/hash-node - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/invalid-dependency - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/is-array-buffer - 2.2.0 -**Repository URL**: https://github.com/awslabs/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/middleware-content-length - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/middleware-endpoint - 4.5.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/middleware-retry - 4.6.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/middleware-serde - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/middleware-stack - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/node-config-provider - 4.4.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/node-http-handler - 4.7.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/property-provider - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/protocol-http - 5.4.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/querystring-builder - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/shared-ini-file-loader - 4.5.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/signature-v4 - 5.4.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/smithy-client - 4.13.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/types - 4.14.1 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/url-parser - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-base64 - 4.4.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-body-length-browser - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-body-length-node - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-buffer-from - 2.2.0 -**Repository URL**: https://github.com/awslabs/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-config-provider - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-defaults-mode-browser - 4.4.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-defaults-mode-node - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-endpoints - 3.5.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-hex-encoding - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-middleware - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-retry - 4.4.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-stream - 4.6.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-utf8 - 2.3.0 -**Repository URL**: https://github.com/awslabs/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @smithy/util-utf8 - 4.3.0 -**Repository URL**: https://github.com/smithy-lang/smithy-typescript -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - -## @telegraf/types - 7.1.0 -**Repository URL**: https://github.com/telegraf/types -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) KnorpelSenf & Telegraf contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## @tokenizer/inflate - 0.4.1 -**Repository URL**: https://github.com/Borewit/tokenizer-inflate -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) 2024, Borewit -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the -Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## @tokenizer/token - 0.3.0 -**Repository URL**: https://github.com/Borewit/tokenizer-token -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -[![npm version](https://badge.fury.io/js/%40tokenizer%2Ftoken.svg)](https://www.npmjs.com/package/@tokenizer/token) -[![npm downloads](http://img.shields.io/npm/dm/@tokenizer/token.svg)](https://npmcharts.com/compare/@tokenizer/token?interval=30) - -# @tokenizer/token - -TypeScript definition of an [strtok3](https://github.com/Borewit/strtok3) token. - -## Licence - -(The MIT License) - -Copyright (c) 2020 Borewit - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## @tootallnate/quickjs-emscripten - 0.23.0 -**Repository URL**: https://github.com/justjake/quickjs-emscripten -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -quickjs-emscripten copyright (c) 2019 Jake Teton-Landis - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## @types/body-parser - 1.19.6 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/connect - 3.4.38 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/express - 5.0.6 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/express-serve-static-core - 5.1.1 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/hast - 3.0.4 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/http-errors - 2.0.5 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/istanbul-lib-coverage - 2.0.6 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/jsonwebtoken - 9.0.10 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/mime-types - 2.1.4 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/ms - 2.1.0 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/node - 20.19.40 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/qs - 6.15.1 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/range-parser - 1.2.7 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/retry - 0.12.0 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/send - 1.2.1 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/serve-static - 2.2.0 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/unist - 3.0.3 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## @types/ws - 8.18.1 -**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE``` - -## abort-controller - 3.0.0 -**Repository URL**: https://github.com/mysticatea/abort-controller -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2017 Toru Nagashima - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## accepts - 2.0.0 -**Repository URL**: https://github.com/jshttp/accepts -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## agent-base - 7.1.4 -**Repository URL**: https://github.com/TooTallNate/proxy-agents -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -(The MIT License) - -Copyright (c) 2013 Nathan Rajlich - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## agent-base - 9.0.0 -**Repository URL**: https://github.com/TooTallNate/proxy-agents -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -(The MIT License) - -Copyright (c) 2013 Nathan Rajlich - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## ajv - 8.20.0 -**Repository URL**: https://github.com/ajv-validator/ajv -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) 2015-2021 Evgeny Poberezkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## ajv-formats - 3.0.1 -**Repository URL**: https://github.com/ajv-validator/ajv-formats -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2020 Evgeny Poberezkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## ansi-regex - 5.0.1 -**Repository URL**: https://github.com/chalk/ansi-regex -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + 1. Definitions. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -## ansi-regex - 6.2.2 -**Repository URL**: https://github.com/chalk/ansi-regex -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Copyright (c) Sindre Sorhus (https://sindresorhus.com) + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -## ansi-styles - 4.3.0 -**Repository URL**: https://github.com/chalk/ansi-styles -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -Copyright (c) Sindre Sorhus (sindresorhus.com) + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -## any-promise - 1.3.0 -**Repository URL**: https://github.com/kevinbeaty/any-promise -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (C) 2014-2016 Kevin Beaty + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -## argparse - 2.0.1 -**Repository URL**: https://github.com/nodeca/argparse -**License Type(s)**: Python-2.0 -### License: https://spdx.org/licenses/Python-2.0.html -``` -A. HISTORY OF THE SOFTWARE -========================== + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -All Python releases are Open Source (see http://www.opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. - Release Derived Year Owner GPL- - from compatible? (1) + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -Footnotes: + END OF TERMS AND CONDITIONS -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. + APPENDIX: How to apply the Apache License to your work. -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== + http://www.apache.org/licenses/LICENSE-2.0 -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. +## @smithy/is-array-buffer - 2.2.0 +**Repository URL**: https://github.com/awslabs/smithy-typescript +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; -All Rights Reserved" are retained in Python alone or in any derivative version -prepared by Licensee. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. + 1. Definitions. -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the Internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the Internet -using the following URL: http://hdl.handle.net/1895.22/1013". + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. + END OF TERMS AND CONDITIONS -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. + APPENDIX: How to apply the Apache License to your work. -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - ACCEPT + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- + http://www.apache.org/licenses/LICENSE-2.0 -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. +## @smithy/node-http-handler - 4.7.2 +**Repository URL**: https://github.com/smithy-lang/smithy-typescript +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -## asn1.js - 5.4.1 -**Repository URL**: https://github.com/indutny/asn1.js -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License + 1. Definitions. -Copyright (c) 2017 Fedor Indutny + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -## ast-types - 0.13.4 -**Repository URL**: https://github.com/benjamn/ast-types -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) 2013 Ben Newman + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -## asynckit - 0.4.0 -**Repository URL**: https://github.com/alexindigo/asynckit -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Copyright (c) 2016 Alex Indigo + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -## axios - 1.16.0 -**Repository URL**: https://github.com/axios/axios -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -# Copyright (c) 2014-present Matt Zabriskie & Collaborators + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -## balanced-match - 4.0.4 -**Repository URL**: https://github.com/juliangruber/balanced-match -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -(MIT) + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -Original code Copyright Julian Gruber + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -Port to TypeScript Copyright Isaac Z. Schlueter + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + END OF TERMS AND CONDITIONS -## base64-js - 1.5.1 -**Repository URL**: https://github.com/beatgammit/base64-js -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) + APPENDIX: How to apply the Apache License to your work. -Copyright (c) 2014 Jameson Little + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` + http://www.apache.org/licenses/LICENSE-2.0 -## basic-ftp - 5.3.1 -**Repository URL**: https://github.com/patrickjuchli/basic-ftp -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` + +## @smithy/signature-v4 - 5.4.2 +**Repository URL**: https://github.com/smithy-lang/smithy-typescript +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` -Copyright (c) 2019 Patrick Juchli +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + 1. Definitions. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -## bignumber.js - 9.3.1 -**Repository URL**: https://github.com/MikeMcl/bignumber.js -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) -===================== + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Copyright © `<2025>` `Michael Mclaughlin` + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the “Software”), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE.``` + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -## bn.js - 4.12.3 -**Repository URL**: https://github.com/indutny/bn.js -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright Fedor Indutny, 2015. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -## body-parser - 2.2.2 -**Repository URL**: https://github.com/expressjs/body-parser -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -(The MIT License) + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -## boolbase - 1.0.0 -**Repository URL**: https://github.com/fb55/boolbase -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html -``` -#boolbase -This very simple module provides two basic functions, one that always returns true (`trueFunc`) and one that always returns false (`falseFunc`). + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -###WTF? + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -By having only a single instance of these functions around, it's possible to do some nice optimizations. Eg. [`CSSselect`](https://github.com/fb55/CSSselect) uses these functions to determine whether a selector won't match any elements. If that's the case, the DOM doesn't even have to be touched. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -###And why is this a separate module? + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -I'm trying to modularize `CSSselect` and most modules depend on these functions. IMHO, having a separate module is the easiest solution to this problem.``` + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -## bottleneck - 2.19.5 -**Repository URL**: https://github.com/SGrondin/bottleneck -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -Copyright (c) 2014 Simon Grondin + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: + END OF TERMS AND CONDITIONS -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + APPENDIX: How to apply the Apache License to your work. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -## bowser - 2.14.1 -**Repository URL**: https://github.com/bowser-js/bowser -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright 2015, Dustin Diaz (the "Original Author") -All rights reserved. + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. -MIT License + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` + +## @smithy/types - 4.14.1 +**Repository URL**: https://github.com/smithy-lang/smithy-typescript +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Distributions of all or part of the Software intended to be used -by the recipients as they would use the unmodified Software, -containing modifications that substantially alter, remove, or -disable functionality of the Software, outside of the documented -configuration mechanisms provided by the Software, shall be -modified such that the Original Author's bug reporting email -addresses and urls are either replaced with the contact information -of the parties responsible for the changes, or removed entirely. + 1. Definitions. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Except where noted, this license applies to any and all software -programs and associated documentation files created by the -Original Author, when distributed with the Software.``` + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -## brace-expansion - 5.0.6 -**Repository URL**: https://github.com/juliangruber/brace-expansion -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Copyright Julian Gruber + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -TypeScript port Copyright Isaac Z. Schlueter + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -## buffer-alloc - 1.2.0 -**Repository URL**: https://github.com/LinusU/buffer-alloc -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -# Buffer Alloc + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -A [ponyfill](https://ponyfill.com) for `Buffer.alloc`. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Works as Node.js: `v7.0.0`
-Works on Node.js: `v0.10.0` + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -## Installation + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -```sh -npm install --save buffer-alloc -``` + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -## Usage + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -```js -const alloc = require('buffer-alloc') + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -console.log(alloc(4)) -//=> + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -console.log(alloc(6, 0x41)) -//=> + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -console.log(alloc(10, 'linus', 'utf8')) -//=> -``` + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -## API + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -### alloc(size[, fill[, encoding]]) + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -- `size` <Integer> The desired length of the new `Buffer` -- `fill` <String> | <Buffer> | <Integer> A value to pre-fill the new `Buffer` with. **Default:** `0` -- `encoding` <String> If `fill` is a string, this is its encoding. **Default:** `'utf8'` + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the `Buffer` will be zero-filled. + END OF TERMS AND CONDITIONS -## See also + APPENDIX: How to apply the Apache License to your work. -- [buffer-alloc-unsafe](https://github.com/LinusU/buffer-alloc-unsafe) A ponyfill for `Buffer.allocUnsafe` -- [buffer-fill](https://github.com/LinusU/buffer-fill) A ponyfill for `Buffer.fill` -- [buffer-from](https://github.com/LinusU/buffer-from) A ponyfill for `Buffer.from```` + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -## buffer-alloc-unsafe - 1.1.0 -**Repository URL**: https://github.com/LinusU/buffer-alloc-unsafe -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -# Buffer Alloc Unsafe + Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. -A [ponyfill](https://ponyfill.com) for `Buffer.allocUnsafe`. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -Works as Node.js: `v7.0.0`
-Works on Node.js: `v0.10.0` + http://www.apache.org/licenses/LICENSE-2.0 -## Installation + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -```sh -npm install --save buffer-alloc-unsafe +## @smithy/util-buffer-from - 2.2.0 +**Repository URL**: https://github.com/awslabs/smithy-typescript +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -## Usage - -```js -const allocUnsafe = require('buffer-alloc-unsafe') + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -console.log(allocUnsafe(10)) -//=> + 1. Definitions. -console.log(allocUnsafe(10)) -//=> + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -console.log(allocUnsafe(10)) -//=> + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -allocUnsafe(-10) -//=> RangeError: "size" argument must not be negative -``` + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -## API + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -### allocUnsafe(size) + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -- `size` <Integer> The desired length of the new `Buffer` + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Allocates a new *non-zero-filled* `Buffer` of `size` bytes. The `size` must be -less than or equal to the value of `buffer.kMaxLength` and greater than or equal -to zero. Otherwise, a `RangeError` is thrown. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -## See also + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -- [buffer-alloc](https://github.com/LinusU/buffer-alloc) A ponyfill for `Buffer.alloc` -- [buffer-fill](https://github.com/LinusU/buffer-fill) A ponyfill for `Buffer.fill` -- [buffer-from](https://github.com/LinusU/buffer-from) A ponyfill for `Buffer.from```` + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -## buffer-crc32 - 0.2.13 -**Repository URL**: https://github.com/brianloveswords/buffer-crc32 -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Copyright (c) 2013 Brian J. Brennan + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the -Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -## buffer-equal-constant-time - 1.0.1 -**Repository URL**: https://github.com/goinstant/buffer-equal-constant-time -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2013, GoInstant Inc., a salesforce.com company -All rights reserved. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -## buffer-fill - 1.0.0 -**Repository URL**: https://github.com/LinusU/buffer-fill -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -# Buffer Fill + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -A [ponyfill](https://ponyfill.com) for `Buffer.fill`. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -Works as Node.js: `v6.4.0`
-Works on Node.js: `v0.10.0` + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -## Installation + END OF TERMS AND CONDITIONS -```sh -npm install --save buffer-fill -``` + APPENDIX: How to apply the Apache License to your work. -## Usage + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -```js -const fill = require('buffer-fill') -const buf = Buffer.allocUnsafe(5) + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. -console.log(buf.fill(8)) -//=> + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -console.log(buf.fill(9, 2, 4)) -//=> + http://www.apache.org/licenses/LICENSE-2.0 -console.log(buf.fill('linus', 'latin1')) -//=> + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -console.log(buf.fill('\u0222')) -//=> +## @smithy/util-utf8 - 2.3.0 +**Repository URL**: https://github.com/awslabs/smithy-typescript +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -## API + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -### fill(buf, value[, offset[, end]][, encoding]) + 1. Definitions. -- `value` <String> | <Buffer> | <Integer> The value to fill `buf` with -- `offset` <Integer> Where to start filling `buf`. **Default:** `0` -- `end` <Integer> Where to stop filling `buf` (not inclusive). **Default:** `buf.length` -- `encoding` <String> If `value` is a string, this is its encoding. **Default:** `'utf8'` -- Return: <Buffer> A reference to `buf` + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -Fills `buf` with the specified `value`. If the `offset` and `end` are not given, -the entire `buf` will be filled. This is meant to be a small simplification to -allow the creation and filling of a `Buffer` to be done on a single line. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -If the final write of a `fill()` operation falls on a multi-byte character, then -only the first bytes of that character that fit into `buf` are written. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -## See also + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -- [buffer-alloc-unsafe](https://github.com/LinusU/buffer-alloc-unsafe) A ponyfill for `Buffer.allocUnsafe` -- [buffer-alloc](https://github.com/LinusU/buffer-alloc) A ponyfill for `Buffer.alloc` -- [buffer-from](https://github.com/LinusU/buffer-from) A ponyfill for `Buffer.from```` + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -## buffer-from - 1.1.2 -**Repository URL**: https://github.com/LinusU/buffer-from -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Copyright (c) 2016, 2018 Linus Unnebäck + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -## bytes - 3.1.2 -**Repository URL**: https://github.com/visionmedia/bytes.js -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -(The MIT License) + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -Copyright (c) 2012-2014 TJ Holowaychuk -Copyright (c) 2015 Jed Watson + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -## c8 - 11.0.0 -**Repository URL**: https://github.com/bcoe/c8 -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html -``` -Copyright (c) 2017, Contributors + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -Permission to use, copy, modify, and/or distribute this software -for any purpose with or without fee is hereby granted, provided -that the above copyright notice and this permission notice -appear in all copies. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -## call-bind-apply-helpers - 1.0.2 -**Repository URL**: https://github.com/ljharb/call-bind-apply-helpers -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -Copyright (c) 2024 Jordan Harband + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + END OF TERMS AND CONDITIONS -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + APPENDIX: How to apply the Apache License to your work. -## call-bound - 1.0.4 -**Repository URL**: https://github.com/ljharb/call-bound -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) 2024 Jordan Harband + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -## camelcase - 5.3.1 -**Repository URL**: https://github.com/sindresorhus/camelcase +## @tokenizer/inflate - 0.4.1 +**Repository URL**: https://github.com/Borewit/tokenizer-inflate **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2024, Borewit +All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## chalk - 4.1.2 -**Repository URL**: https://github.com/chalk/chalk +## @tokenizer/token - 0.3.0 +**Repository URL**: https://github.com/Borewit/tokenizer-token **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) +[![npm version](https://badge.fury.io/js/%40tokenizer%2Ftoken.svg)](https://www.npmjs.com/package/@tokenizer/token) +[![npm downloads](http://img.shields.io/npm/dm/@tokenizer/token.svg)](https://npmcharts.com/compare/@tokenizer/token?interval=30) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# @tokenizer/token -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +TypeScript definition of an [strtok3](https://github.com/Borewit/strtok3) token. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +## Licence -## chalk - 5.6.2 -**Repository URL**: https://github.com/chalk/chalk -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +(The MIT License) -Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) 2020 Borewit -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## chokidar - 5.0.0 -**Repository URL**: https://github.com/paulmillr/chokidar +## @tootallnate/quickjs-emscripten - 0.23.0 +**Repository URL**: https://github.com/justjake/quickjs-emscripten **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) +MIT License -Copyright (c) 2012 Paul Miller (https://paulmillr.com), Elan Shanker +quickjs-emscripten copyright (c) 2019 Jake Teton-Landis Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## chownr - 3.0.0 -**Repository URL**: https://github.com/isaacs/chownr -**License Type(s)**: BlueOak-1.0.0 -### License: https://spdx.org/licenses/BlueOak-1.0.0.html +## @types/hast - 3.0.4 +**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -All packages under `src/` are licensed according to the terms in -their respective `LICENSE` or `LICENSE.md` files. - -The remainder of this project is licensed under the Blue Oak -Model License, as follows: - ------ - -# Blue Oak Model License - -Version 1.0.0 - -## Purpose - -This license gives everyone as much permission to work with -this software as possible, while protecting contributors -from liability. - -## Acceptance - -In order to receive this license, you must agree to its -rules. The rules of this license are both obligations -under that agreement and conditions to your license. -You must not do anything with this software that triggers -a rule that you cannot or will not follow. - -## Copyright - -Each contributor licenses you to do everything with this -software that would otherwise infringe that contributor's -copyright in it. - -## Notices +MIT License -You must ensure that everyone who gets a copy of -any part of this software from you, with or without -changes, also gets the text of this license or a link to -. + Copyright (c) Microsoft Corporation. -## Excuse + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -If anyone notifies you in writing that you have not -complied with [Notices](#notices), you can keep your -license by taking all practical steps to comply within 30 -days after the notice. If you do not do so, your license -ends immediately. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -## Patent + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE``` -Each contributor licenses you to do everything with this -software that would otherwise infringe any patent claims -they can license or become able to license. +## @types/istanbul-lib-coverage - 2.0.6 +**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -## Reliability + Copyright (c) Microsoft Corporation. -No contributor can revoke this license. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -## No Liability + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -***As far as the law allows, this software comes as is, -without any warranty or condition, and no contributor -will be liable to anyone for any damages related to this -software or this license, under any kind of legal claim.***``` + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE``` -## cli-highlight - 2.1.11 -**Repository URL**: https://github.com/felixfbecker/cli-highlight -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html +## @types/mime-types - 2.1.4 +**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -ISC License +MIT License -Copyright (c) 2016, Felix Frederick Becker + Copyright (c) Microsoft Corporation. -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -## cliui - 6.0.0 -**Repository URL**: https://github.com/yargs/cliui -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html -``` -Copyright (c) 2015, Contributors + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE``` -Permission to use, copy, modify, and/or distribute this software -for any purpose with or without fee is hereby granted, provided -that the above copyright notice and this permission notice -appear in all copies. +## @types/node - 20.19.40 +**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` + Copyright (c) Microsoft Corporation. -## cliui - 7.0.4 -**Repository URL**: https://github.com/yargs/cliui -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html -``` -Copyright (c) 2015, Contributors + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -Permission to use, copy, modify, and/or distribute this software -for any purpose with or without fee is hereby granted, provided -that the above copyright notice and this permission notice -appear in all copies. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE``` -## cliui - 8.0.1 -**Repository URL**: https://github.com/yargs/cliui -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html +## @types/retry - 0.12.0 +**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2015, Contributors +MIT License -Permission to use, copy, modify, and/or distribute this software -for any purpose with or without fee is hereby granted, provided -that the above copyright notice and this permission notice -appear in all copies. + Copyright (c) Microsoft Corporation. All rights reserved. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -## color-convert - 2.0.1 -**Repository URL**: https://github.com/Qix-/color-convert + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE``` + +## @types/unist - 3.0.3 +**Repository URL**: https://github.com/DefinitelyTyped/DefinitelyTyped **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2011-2016 Heather Arthur +MIT License -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + Copyright (c) Microsoft Corporation. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -## color-name - 1.1.4 -**Repository URL**: https://github.com/colorjs/color-name + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE``` + +## @types/yauzl - 2.10.3 +**Repository URL**: https://www.npmjs.com/package/@types/yauzl **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) -Copyright (c) 2015 Dmitry Ivanov +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + Copyright (c) Microsoft Corporation. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE``` -## combined-stream - 1.0.8 -**Repository URL**: https://github.com/felixge/node-combined-stream +## abort-controller - 3.0.0 +**Repository URL**: https://github.com/mysticatea/abort-controller **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2011 Debuggable Limited +MIT License + +Copyright (c) 2017 Toru Nagashima Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23760,25 +13818,26 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## commander - 14.0.3 -**Repository URL**: https://github.com/tj/commander.js +## accepts - 2.0.0 +**Repository URL**: https://github.com/jshttp/accepts **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -23799,14 +13858,14 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## content-disposition - 1.1.0 -**Repository URL**: https://github.com/jshttp/content-disposition +## agent-base - 7.1.4 +**Repository URL**: https://github.com/TooTallNate/proxy-agents **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright (c) 2013 Nathan Rajlich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -23827,14 +13886,14 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## content-type - 1.0.5 -**Repository URL**: https://github.com/jshttp/content-type +## agent-base - 9.0.0 +**Repository URL**: https://github.com/TooTallNate/proxy-agents **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2013 Nathan Rajlich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -23855,180 +13914,111 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## convert-source-map - 2.0.0 -**Repository URL**: https://github.com/thlorenz/convert-source-map -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright 2013 Thorsten Lorenz. -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE.``` - -## cookie - 0.7.2 -**Repository URL**: https://github.com/jshttp/cookie +## ajv - 8.20.0 +**Repository URL**: https://github.com/ajv-validator/ajv **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -(The MIT License) +The MIT License (MIT) -Copyright (c) 2012-2014 Roman Shtylman -Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2015-2021 Evgeny Poberezkin -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## cookie-signature - 1.2.2 -**Repository URL**: https://github.com/visionmedia/node-cookie-signature +## ajv-formats - 3.0.1 +**Repository URL**: https://github.com/ajv-validator/ajv-formats **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -(The MIT License) - -Copyright (c) 2012–2024 LearnBoost and other contributors; - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +MIT License -## core-util-is - 1.0.3 -**Repository URL**: https://github.com/isaacs/core-util-is -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright Node.js contributors. All rights reserved. +Copyright (c) 2020 Evgeny Poberezkin Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE.``` +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## cors - 2.8.6 -**Repository URL**: https://github.com/expressjs/cors +## ansi-regex - 5.0.1 +**Repository URL**: https://github.com/chalk/ansi-regex **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -(The MIT License) +MIT License -Copyright (c) 2013 Troy Goode +Copyright (c) Sindre Sorhus (sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## ansi-regex - 6.2.2 +**Repository URL**: https://github.com/chalk/ansi-regex +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Copyright (c) Sindre Sorhus (https://sindresorhus.com) -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -## croner - 10.0.1 -**Repository URL**: https://github.com/hexagon/croner +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## ansi-styles - 4.3.0 +**Repository URL**: https://github.com/chalk/ansi-styles **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) +MIT License -Copyright (c) 2015-2021 Hexagon +Copyright (c) Sindre Sorhus (sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## cross-spawn - 7.0.6 -**Repository URL**: https://github.com/moxystudio/node-cross-spawn +## any-promise - 1.3.0 +**Repository URL**: https://github.com/kevinbeaty/any-promise **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) - -Copyright (c) 2018 Made With MOXY Lda +Copyright (C) 2014-2016 Kevin Beaty Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24048,200 +14038,303 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## css-select - 5.2.2 -**Repository URL**: https://github.com/fb55/css-select -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html +## argparse - 2.0.1 +**Repository URL**: https://github.com/nodeca/argparse +**License Type(s)**: Python-2.0 +### License: https://spdx.org/licenses/Python-2.0.html ``` -Copyright (c) Felix Böhm -All rights reserved. +A. HISTORY OF THE SOFTWARE +========================== -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. -THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +All Python releases are Open Source (see http://www.opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. -## css-what - 6.2.2 -**Repository URL**: https://github.com/fb55/css-what -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html -``` -Copyright (c) Felix Böhm -All rights reserved. + Release Derived Year Owner GPL- + from compatible? (1) -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Footnotes: -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. -THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. -## cssom - 0.5.0 -**Repository URL**: https://github.com/NV/CSSOM -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) Nikita Vasilyev +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- -## data-uri-to-buffer - 4.0.1 -**Repository URL**: https://github.com/TooTallNate/node-data-uri-to-buffer -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -data-uri-to-buffer -================== -### Generate a Buffer instance from a [Data URI][rfc] string -[![Build Status](https://travis-ci.org/TooTallNate/node-data-uri-to-buffer.svg?branch=master)](https://travis-ci.org/TooTallNate/node-data-uri-to-buffer) +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. -This module accepts a ["data" URI][rfc] String of data, and returns a -node.js `Buffer` instance with the decoded data. +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. -Installation ------------- +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. -Install with `npm`: +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. -``` bash -$ npm install data-uri-to-buffer -``` +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. -Example -------- +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. -``` js -import dataUriToBuffer from 'data-uri-to-buffer'; -// plain-text data is supported -let uri = 'data:,Hello%2C%20World!'; -let decoded = dataUriToBuffer(uri); -console.log(decoded.toString()); -// 'Hello, World!' +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. -// base64-encoded data is supported -uri = 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D'; -decoded = dataUriToBuffer(uri); -console.log(decoded.toString()); -// 'Hello, World!' -``` +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. -API ---- +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- -### dataUriToBuffer(String uri) → Buffer +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. -The `type` property on the Buffer instance gets set to the main type portion of -the "mediatype" portion of the "data" URI, or defaults to `"text/plain"` if not -specified. +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". -The `typeFull` property on the Buffer instance gets set to the entire -"mediatype" portion of the "data" URI (including all parameters), or defaults -to `"text/plain;charset=US-ASCII"` if not specified. +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. -The `charset` property on the Buffer instance gets set to the Charset portion of -the "mediatype" portion of the "data" URI, or defaults to `"US-ASCII"` if the -entire type is not specified, or defaults to `""` otherwise. +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. -*Note*: If the only the main type is specified but not the charset, e.g. -`"data:text/plain,abc"`, the charset is set to the empty string. The spec only -defaults to US-ASCII as charset if the entire type is not specified. +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. -License -------- +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. -(The MIT License) + ACCEPT -Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net> -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. -[rfc]: http://tools.ietf.org/html/rfc2397``` +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` -## data-uri-to-buffer - 6.0.2 -**Repository URL**: https://github.com/TooTallNate/proxy-agents +## asn1.js - 5.4.1 +**Repository URL**: https://github.com/indutny/asn1.js **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -(The MIT License) +MIT License -Copyright (c) 2014 Nathan Rajlich +Copyright (c) 2017 Fedor Indutny -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## data-uri-to-buffer - 8.0.0 -**Repository URL**: https://github.com/TooTallNate/proxy-agents +## ast-types - 0.13.4 +**Repository URL**: https://github.com/benjamn/ast-types **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -(The MIT License) - -Copyright (c) 2014 Nathan Rajlich +Copyright (c) 2013 Ben Newman Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including +"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -24250,7 +14343,7 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY @@ -24258,39 +14351,43 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## debug - 4.4.3 -**Repository URL**: https://github.com/debug-js/debug +## balanced-match - 4.0.4 +**Repository URL**: https://github.com/juliangruber/balanced-match **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -(The MIT License) +(MIT) -Copyright (c) 2014-2017 TJ Holowaychuk -Copyright (c) 2018-2021 Josh Junon +Original code Copyright Julian Gruber -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Port to TypeScript Copyright Isaac Z. Schlueter -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -## decamelize - 1.2.0 -**Repository URL**: https://github.com/sindresorhus/decamelize +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` + +## base64-js - 1.5.1 +**Repository URL**: https://github.com/beatgammit/base64-js **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` The MIT License (MIT) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2014 Jameson Little Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24310,14 +14407,12 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## define-data-property - 1.1.4 -**Repository URL**: https://github.com/ljharb/define-data-property +## basic-ftp - 5.3.1 +**Repository URL**: https://github.com/patrickjuchli/basic-ftp **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License - -Copyright (c) 2023 Jordan Harband +Copyright (c) 2019 Patrick Juchli Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24337,14 +14432,43 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## define-properties - 1.2.1 -**Repository URL**: https://github.com/ljharb/define-properties +## bignumber.js - 9.3.1 +**Repository URL**: https://github.com/MikeMcl/bignumber.js +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) +===================== + +Copyright © `<2025>` `Michael Mclaughlin` + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the “Software”), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE.``` + +## bn.js - 4.12.3 +**Repository URL**: https://github.com/indutny/bn.js **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) - -Copyright (C) 2015 Jordan Harband +Copyright Fedor Indutny, 2015. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24353,174 +14477,213 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## degenerator - 5.0.1 -**Repository URL**: https://github.com/TooTallNate/proxy-agents +## body-parser - 2.2.2 +**Repository URL**: https://github.com/expressjs/body-parser **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -degenerator -=========== -### Compiles sync functions into async functions +(The MIT License) -Sometimes you need to write sync looking code that's really async under the hood. -This module takes a String to one or more synchronous JavaScript functions, and -returns a new String that with those JS functions transpiled into `async` -functions. +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson -So this: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -```js -function foo() { - return a('bar') || b(); -} -``` +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -Gets compiled into: +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -```js -async function foo() { - return await a('bar') || await b(); -} +## boolbase - 1.0.0 +**Repository URL**: https://github.com/fb55/boolbase +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html ``` +#boolbase +This very simple module provides two basic functions, one that always returns true (`trueFunc`) and one that always returns false (`falseFunc`). -With the compiled output code, you can evaluate the code using the `vm` module -in Node.js, or save the code to a file and require it, or whatever. +###WTF? -Example -------- +By having only a single instance of these functions around, it's possible to do some nice optimizations. Eg. [`CSSselect`](https://github.com/fb55/CSSselect) uses these functions to determine whether a selector won't match any elements. If that's the case, the DOM doesn't even have to be touched. -You must explicitly specify the names of the functions that should be -"asyncified". So say we wanted to expose a `get(url)` function that did -and HTTP request and returned the response body. +###And why is this a separate module? -The user has provided us with this implementation: +I'm trying to modularize `CSSselect` and most modules depend on these functions. IMHO, having a separate module is the easiest solution to this problem.``` -``` js -function myFn() { - const one = get('https://google.com'); - const two = get('http://nodejs.org'); - const three = JSON.parse(get('http://jsonip.org')); - return [one, two, three]; -} +## bottleneck - 2.19.5 +**Repository URL**: https://github.com/SGrondin/bottleneck +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +The MIT License (MIT) -Now we can compile this into an asyncronous function, implement the -async `get()` function, and finally evaluate it into a real JavaScript function -instance with the `vm` module: +Copyright (c) 2014 Simon Grondin +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -```typescript -import vm from 'vm'; -import { degenerator } from 'degenerator'; +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -// The `get()` function is Promise-based (error handling omitted for brevity) -function get(endpoint: string) { - return new Promise((resolve, reject) => { - var mod = 0 == endpoint.indexOf('https:') ? require('https') : require('http'); - var req = mod.get(endpoint); - req.on('response', function (res) { - var data = ''; - res.setEncoding('utf8'); - res.on('data', function (b) { data += b; }); - res.on('end', function () { - resolve(data); - }); - }); - }); -} +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -// Convert the JavaScript string provided from the user (assumed to be `str` var) -str = degenerator(str, [ 'get' ]); +## bowser - 2.14.1 +**Repository URL**: https://github.com/bowser-js/bowser +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright 2015, Dustin Diaz (the "Original Author") +All rights reserved. -// Turn the JS String into a real async function instance -const asyncFn = vm.runInNewContext(`(${str})`, { get }); +MIT License -// Now we can invoke the function asynchronously -asyncFn().then((res) => { - // Do something with `res`... -}); -``` +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -API ---- +Distributions of all or part of the Software intended to be used +by the recipients as they would use the unmodified Software, +containing modifications that substantially alter, remove, or +disable functionality of the Software, outside of the documented +configuration mechanisms provided by the Software, shall be +modified such that the Original Author's bug reporting email +addresses and urls are either replaced with the contact information +of the parties responsible for the changes, or removed entirely. -### degenerator(code: string, names: Array): String +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. -Returns a "degeneratorified" JavaScript string, with `async`/`await` transplanted. +Except where noted, this license applies to any and all software +programs and associated documentation files created by the +Original Author, when distributed with the Software.``` -License -------- +## brace-expansion - 5.0.6 +**Repository URL**: https://github.com/juliangruber/brace-expansion +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -(The MIT License) +Copyright Julian Gruber -Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> +TypeScript port Copyright Isaac Z. Schlueter -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## degenerator - 7.0.1 -**Repository URL**: https://github.com/TooTallNate/proxy-agents +## buffer-crc32 - 0.2.13 +**Repository URL**: https://github.com/brianloveswords/buffer-crc32 **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -(The MIT License) +The MIT License -Copyright (c) 2013 Nathan Rajlich +Copyright (c) 2013 Brian J. Brennan -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## buffer-equal-constant-time - 1.0.1 +**Repository URL**: https://github.com/goinstant/buffer-equal-constant-time +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html +``` +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -## delayed-stream - 1.0.0 -**Repository URL**: https://github.com/felixge/node-delayed-stream +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## buffer-from - 1.1.2 +**Repository URL**: https://github.com/LinusU/buffer-from **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2011 Debuggable Limited +MIT License + +Copyright (c) 2016, 2018 Linus Unnebäck Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24529,25 +14692,26 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## depd - 2.0.0 -**Repository URL**: https://github.com/dougwilson/nodejs-depd +## bytes - 3.1.2 +**Repository URL**: https://github.com/visionmedia/bytes.js **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2014-2018 Douglas Christopher Wilson +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -24568,459 +14732,308 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## diff - 8.0.4 -**Repository URL**: https://github.com/kpdecker/jsdiff -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html +## c8 - 11.0.0 +**Repository URL**: https://github.com/bcoe/c8 +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html ``` -BSD 3-Clause License - -Copyright (c) 2009-2015, Kevin Decker -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Copyright (c) 2017, Contributors -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` -## dijkstrajs - 1.0.3 -**Repository URL**: https://github.com/tcort/dijkstrajs +## call-bind-apply-helpers - 1.0.2 +**Repository URL**: https://github.com/ljharb/call-bind-apply-helpers **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -``` -Dijkstra path-finding functions. Adapted from the Dijkstar Python project. +MIT License -Copyright (C) 2008 - Wyatt Baldwin - All rights reserved +Copyright (c) 2024 Jordan Harband -Licensed under the MIT license. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.opensource.org/licenses/mit-license.php +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -`````` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## dom-serializer - 2.0.0 -**Repository URL**: https://github.com/cheeriojs/dom-serializer +## call-bound - 1.0.4 +**Repository URL**: https://github.com/ljharb/call-bound **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -License - -(The MIT License) - -Copyright (c) 2014 The cheeriojs contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## domelementtype - 2.3.0 -**Repository URL**: https://github.com/fb55/domelementtype -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html -``` -Copyright (c) Felix Böhm -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## domhandler - 5.0.3 -**Repository URL**: https://github.com/fb55/domhandler -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html -``` -Copyright (c) Felix Böhm -All rights reserved. +MIT License -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +Copyright (c) 2024 Jordan Harband -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## domutils - 3.2.2 -**Repository URL**: https://github.com/fb55/domutils -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html +## camelcase - 5.3.1 +**Repository URL**: https://github.com/sindresorhus/camelcase +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) Felix Böhm -All rights reserved. +MIT License -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +Copyright (c) Sindre Sorhus (sindresorhus.com) -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## dotenv - 16.6.1 -**Repository URL**: https://github.com/motdotla/dotenv -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html +## chalk - 4.1.2 +**Repository URL**: https://github.com/chalk/chalk +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2015, Scott Motte -All rights reserved. +MIT License -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Copyright (c) Sindre Sorhus (sindresorhus.com) -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## dotenv - 17.4.2 -**Repository URL**: https://github.com/motdotla/dotenv -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html +## chalk - 5.6.2 +**Repository URL**: https://github.com/chalk/chalk +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2015, Scott Motte -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +MIT License -## dunder-proto - 1.0.1 -**Repository URL**: https://github.com/es-shims/dunder-proto +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## chokidar - 5.0.0 +**Repository URL**: https://github.com/paulmillr/chokidar **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License +The MIT License (MIT) -Copyright (c) 2024 ECMAScript Shims +Copyright (c) 2012 Paul Miller (https://paulmillr.com), Elan Shanker Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal +of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.``` -## ecdsa-sig-formatter - 1.0.11 -**Repository URL**: https://github.com/Brightspace/node-ecdsa-sig-formatter -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## chownr - 3.0.0 +**Repository URL**: https://github.com/isaacs/chownr +**License Type(s)**: BlueOak-1.0.0 +### License: https://spdx.org/licenses/BlueOak-1.0.0.html ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +All packages under `src/` are licensed according to the terms in +their respective `LICENSE` or `LICENSE.md` files. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +The remainder of this project is licensed under the Blue Oak +Model License, as follows: - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +----- - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +# Blue Oak Model License - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Version 1.0.0 - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +## Purpose - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +## Acceptance - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +## Copyright - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +## Notices - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +## Excuse - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +## Patent - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +## Reliability - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +No contributor can revoke this license. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +## No Liability - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.***``` - END OF TERMS AND CONDITIONS +## cli-highlight - 2.1.11 +**Repository URL**: https://github.com/felixfbecker/cli-highlight +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html +``` +ISC License - APPENDIX: How to apply the Apache License to your work. +Copyright (c) 2016, Felix Frederick Becker - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. - Copyright 2015 D2L Corporation +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +## cliui - 6.0.0 +**Repository URL**: https://github.com/yargs/cliui +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html +``` +Copyright (c) 2015, Contributors - http://www.apache.org/licenses/LICENSE-2.0 +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` -## ee-first - 1.1.1 -**Repository URL**: https://github.com/jonathanong/ee-first -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## cliui - 7.0.4 +**Repository URL**: https://github.com/yargs/cliui +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html ``` -The MIT License (MIT) +Copyright (c) 2015, Contributors -Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +## cliui - 8.0.1 +**Repository URL**: https://github.com/yargs/cliui +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html +``` +Copyright (c) 2015, Contributors -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. -## emoji-regex - 8.0.0 -**Repository URL**: https://github.com/mathiasbynens/emoji-regex +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` + +## color-convert - 2.0.1 +**Repository URL**: https://github.com/Qix-/color-convert **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright Mathias Bynens +Copyright (c) 2011-2016 Heather Arthur Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -25041,14 +15054,28 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## encodeurl - 2.0.0 -**Repository URL**: https://github.com/pillarjs/encodeurl +## color-name - 1.1.4 +**Repository URL**: https://github.com/colorjs/color-name +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## commander - 14.0.3 +**Repository URL**: https://github.com/tj/commander.js **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2016 Douglas Christopher Wilson +Copyright (c) 2011 TJ Holowaychuk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -25069,200 +15096,70 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## end-of-stream - 1.4.5 -**Repository URL**: https://github.com/mafintosh/end-of-stream -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) 2014 Mathias Buus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` - -## entities - 4.5.0 -**Repository URL**: https://github.com/fb55/entities -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html -``` -Copyright (c) Felix Böhm -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## entities - 7.0.1 -**Repository URL**: https://github.com/fb55/entities -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html -``` -Copyright (c) Felix Böhm -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## es-define-property - 1.0.1 -**Repository URL**: https://github.com/ljharb/es-define-property -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2024 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## es-errors - 1.3.0 -**Repository URL**: https://github.com/ljharb/es-errors -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2024 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## es-object-atoms - 1.1.1 -**Repository URL**: https://github.com/ljharb/es-object-atoms -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2024 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## es-set-tostringtag - 2.1.0 -**Repository URL**: https://github.com/es-shims/es-set-tostringtag +## content-disposition - 1.1.0 +**Repository URL**: https://github.com/jshttp/content-disposition **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License +(The MIT License) -Copyright (c) 2022 ECMAScript Shims +Copyright (c) 2014-2017 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## escalade - 3.2.0 -**Repository URL**: https://github.com/lukeed/escalade +## content-type - 1.0.5 +**Repository URL**: https://github.com/jshttp/content-type **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License +(The MIT License) -Copyright (c) Luke Edwards (lukeed.com) +Copyright (c) 2015 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## escape-html - 1.0.3 -**Repository URL**: https://github.com/component/escape-html +## content-type - 2.0.0 +**Repository URL**: https://github.com/jshttp/content-type **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2012-2013 TJ Holowaychuk -Copyright (c) 2015 Andreas Lubbe -Copyright (c) 2015 Tiancheng "Timothy" Gu +Copyright (c) 2015 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -25283,133 +15180,125 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## escape-string-regexp - 4.0.0 -**Repository URL**: https://github.com/sindresorhus/escape-string-regexp +## convert-source-map - 2.0.0 +**Repository URL**: https://github.com/thlorenz/convert-source-map **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright 2013 Thorsten Lorenz. +All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE.``` -## escodegen - 2.1.0 -**Repository URL**: https://github.com/estools/escodegen -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html +## cookie - 0.7.2 +**Repository URL**: https://github.com/jshttp/cookie +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Copyright (C) 2012 Yusuke Suzuki (twitter: @Constellation) and other contributors. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +(The MIT License) - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -## esprima - 4.0.1 -**Repository URL**: https://github.com/jquery/esprima -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html -``` -Copyright JS Foundation and other contributors, https://js.foundation/ +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +## cookie-signature - 1.2.2 +**Repository URL**: https://github.com/visionmedia/node-cookie-signature +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(The MIT License) -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +Copyright (c) 2012–2024 LearnBoost and other contributors; -## estraverse - 5.3.0 -**Repository URL**: https://github.com/estools/estraverse -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html -``` -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## esutils - 2.0.3 -**Repository URL**: https://github.com/estools/esutils -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html +## core-util-is - 1.0.3 +**Repository URL**: https://github.com/isaacs/core-util-is +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Copyright Node.js contributors. All rights reserved. - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -## etag - 1.8.1 -**Repository URL**: https://github.com/jshttp/etag +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE.``` + +## cors - 2.8.6 +**Repository URL**: https://github.com/expressjs/cors **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2014-2016 Douglas Christopher Wilson +Copyright (c) 2013 Troy Goode Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -25430,14 +15319,14 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## event-target-shim - 5.0.1 -**Repository URL**: https://github.com/mysticatea/event-target-shim +## croner - 10.0.1 +**Repository URL**: https://github.com/hexagon/croner **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` The MIT License (MIT) -Copyright (c) 2015 Toru Nagashima +Copyright (c) 2015-2021 Hexagon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25457,14 +15346,14 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## eventemitter3 - 4.0.7 -**Repository URL**: https://github.com/primus/eventemitter3 +## cross-spawn - 7.0.6 +**Repository URL**: https://github.com/moxystudio/node-cross-spawn **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` The MIT License (MIT) -Copyright (c) 2014 Arnout Kazemier +Copyright (c) 2018 Made With MOXY Lda Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25473,52 +15362,57 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.``` -## eventemitter3 - 5.0.4 -**Repository URL**: https://github.com/primus/eventemitter3 -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## css-select - 5.2.2 +**Repository URL**: https://github.com/fb55/css-select +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html ``` -The MIT License (MIT) +Copyright (c) Felix Böhm +All rights reserved. -Copyright (c) 2014 Arnout Kazemier +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -## eventsource - 3.0.7 -**Repository URL**: git://git@github.com/EventSource/eventsource +## css-what - 6.2.2 +**Repository URL**: https://github.com/fb55/css-what +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html +``` +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## cssom - 0.5.0 +**Repository URL**: https://github.com/NV/CSSOM **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License - -Copyright (c) EventSource GitHub organisation +Copyright (c) Nikita Vasilyev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -25539,101 +15433,82 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## eventsource-parser - 3.0.8 -**Repository URL**: https://github.com/rexxars/eventsource-parser +## data-uri-to-buffer - 4.0.1 +**Repository URL**: https://github.com/TooTallNate/node-data-uri-to-buffer **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License +data-uri-to-buffer +================== +### Generate a Buffer instance from a [Data URI][rfc] string +[![Build Status](https://travis-ci.org/TooTallNate/node-data-uri-to-buffer.svg?branch=master)](https://travis-ci.org/TooTallNate/node-data-uri-to-buffer) -Copyright (c) 2026 Espen Hovlandsdal +This module accepts a ["data" URI][rfc] String of data, and returns a +node.js `Buffer` instance with the decoded data. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Installation +------------ -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +Install with `npm`: -## express - 5.2.1 -**Repository URL**: https://github.com/expressjs/express -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +``` bash +$ npm install data-uri-to-buffer ``` -(The MIT License) -Copyright (c) 2009-2014 TJ Holowaychuk -Copyright (c) 2013-2014 Roman Shtylman -Copyright (c) 2014-2015 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Example +------- -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +``` js +import dataUriToBuffer from 'data-uri-to-buffer'; -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +// plain-text data is supported +let uri = 'data:,Hello%2C%20World!'; +let decoded = dataUriToBuffer(uri); +console.log(decoded.toString()); +// 'Hello, World!' -## express-rate-limit - 8.5.1 -**Repository URL**: https://github.com/express-rate-limit/express-rate-limit -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +// base64-encoded data is supported +uri = 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D'; +decoded = dataUriToBuffer(uri); +console.log(decoded.toString()); +// 'Hello, World!' ``` -# MIT License -Copyright 2023 Nathan Friedly, Vedant K -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +API +--- -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +### dataUriToBuffer(String uri) → Buffer -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +The `type` property on the Buffer instance gets set to the main type portion of +the "mediatype" portion of the "data" URI, or defaults to `"text/plain"` if not +specified. -## extend - 3.0.2 -**Repository URL**: https://github.com/justmoon/node-extend -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) +The `typeFull` property on the Buffer instance gets set to the entire +"mediatype" portion of the "data" URI (including all parameters), or defaults +to `"text/plain;charset=US-ASCII"` if not specified. -Copyright (c) 2014 Stefan Thomas +The `charset` property on the Buffer instance gets set to the Charset portion of +the "mediatype" portion of the "data" URI, or defaults to `"US-ASCII"` if the +entire type is not specified, or defaults to `""` otherwise. + +*Note*: If the only the main type is specified but not the charset, e.g. +`"data:text/plain,abc"`, the charset is set to the empty string. The spec only +defaults to US-ASCII as charset if the entire type is not specified. + + +License +------- + +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including +'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -25642,170 +15517,105 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## extract-zip - 2.0.1 -**Repository URL**: https://github.com/maxogden/extract-zip -**License Type(s)**: BSD-2-Clause -### License: https://spdx.org/licenses/BSD-2-Clause.html -``` -Copyright (c) 2014 Max Ogden and other contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - -## fast-deep-equal - 3.1.3 -**Repository URL**: https://github.com/epoberezkin/fast-deep-equal -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2017 Evgeny Poberezkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +[rfc]: http://tools.ietf.org/html/rfc2397``` -## fast-string-truncated-width - 3.0.3 -**Repository URL**: https://github.com/fabiospampinato/fast-string-truncated-width +## data-uri-to-buffer - 6.0.2 +**Repository URL**: https://github.com/TooTallNate/proxy-agents **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) +(The MIT License) -Copyright (c) 2024-present Fabio Spampinato +Copyright (c) 2014 Nathan Rajlich -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## fast-string-width - 3.0.2 -**Repository URL**: https://github.com/fabiospampinato/fast-string-width +## data-uri-to-buffer - 8.0.0 +**Repository URL**: https://github.com/TooTallNate/proxy-agents **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) +(The MIT License) -Copyright (c) 2024-present Fabio Spampinato +Copyright (c) 2014 Nathan Rajlich -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## fast-uri - 3.1.2 -**Repository URL**: https://github.com/fastify/fast-uri -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html +## debug - 4.4.3 +**Repository URL**: https://github.com/debug-js/debug +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae -Copyright (c) 2021-present The Fastify team -All rights reserved. +(The MIT License) -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * The names of any contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: - * * * +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. -The complete list of contributors can be found at: -- https://github.com/garycourt/uri-js/graphs/contributors``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## fast-wrap-ansi - 0.2.0 -**Repository URL**: https://github.com/43081j/fast-wrap-ansi +## decamelize - 1.2.0 +**Repository URL**: https://github.com/sindresorhus/decamelize **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License - -Copyright (c) 2025 James Garbutt +The MIT License (MIT) -Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25814,25 +15624,25 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.``` -## fast-xml-builder - 1.2.0 -**Repository URL**: https://github.com/NaturalIntelligence/fast-xml-builder +## define-data-property - 1.1.4 +**Repository URL**: https://github.com/ljharb/define-data-property **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` MIT License -Copyright (c) 2026 Natural Intelligence +Copyright (c) 2023 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25852,14 +15662,14 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## fast-xml-parser - 5.7.2 -**Repository URL**: https://github.com/NaturalIntelligence/fast-xml-parser +## define-properties - 1.2.1 +**Repository URL**: https://github.com/ljharb/define-properties **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License +The MIT License (MIT) -Copyright (c) 2017 Amit Kumar Gupta +Copyright (C) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25868,109 +15678,148 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.``` -## fd-slicer - 1.1.0 -**Repository URL**: https://github.com/andrewrk/node-fd-slicer +## degenerator - 5.0.1 +**Repository URL**: https://github.com/TooTallNate/proxy-agents **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2014 Andrew Kelley +degenerator +=========== +### Compiles sync functions into async functions -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation files -(the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of the Software, -and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Sometimes you need to write sync looking code that's really async under the hood. +This module takes a String to one or more synchronous JavaScript functions, and +returns a new String that with those JS functions transpiled into `async` +functions. + +So this: + +```js +function foo() { + return a('bar') || b(); +} +``` + +Gets compiled into: + +```js +async function foo() { + return await a('bar') || await b(); +} +``` + +With the compiled output code, you can evaluate the code using the `vm` module +in Node.js, or save the code to a file and require it, or whatever. + +Example +------- + +You must explicitly specify the names of the functions that should be +"asyncified". So say we wanted to expose a `get(url)` function that did +and HTTP request and returned the response body. + +The user has provided us with this implementation: + +``` js +function myFn() { + const one = get('https://google.com'); + const two = get('http://nodejs.org'); + const three = JSON.parse(get('http://jsonip.org')); + return [one, two, three]; +} +``` + +Now we can compile this into an asyncronous function, implement the +async `get()` function, and finally evaluate it into a real JavaScript function +instance with the `vm` module: + + +```typescript +import vm from 'vm'; +import { degenerator } from 'degenerator'; + +// The `get()` function is Promise-based (error handling omitted for brevity) +function get(endpoint: string) { + return new Promise((resolve, reject) => { + var mod = 0 == endpoint.indexOf('https:') ? require('https') : require('http'); + var req = mod.get(endpoint); + req.on('response', function (res) { + var data = ''; + res.setEncoding('utf8'); + res.on('data', function (b) { data += b; }); + res.on('end', function () { + resolve(data); + }); + }); + }); +} -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +// Convert the JavaScript string provided from the user (assumed to be `str` var) +str = degenerator(str, [ 'get' ]); -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +// Turn the JS String into a real async function instance +const asyncFn = vm.runInNewContext(`(${str})`, { get }); -## fetch-blob - 3.2.0 -**Repository URL**: https://github.com/node-fetch/fetch-blob -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +// Now we can invoke the function asynchronously +asyncFn().then((res) => { + // Do something with `res`... +}); ``` -MIT License - -Copyright (c) 2019 David Frank - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` -## file-type - 21.3.4 -**Repository URL**: https://github.com/sindresorhus/file-type -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +API +--- -Copyright (c) Sindre Sorhus (https://sindresorhus.com) +### degenerator(code: string, names: Array): String -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Returns a "degeneratorified" JavaScript string, with `async`/`await` transplanted. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +License +------- -## file-type - 22.0.1 -**Repository URL**: https://github.com/sindresorhus/file-type -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +(The MIT License) -Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## finalhandler - 2.1.1 -**Repository URL**: https://github.com/pillarjs/finalhandler +## degenerator - 7.0.1 +**Repository URL**: https://github.com/TooTallNate/proxy-agents **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2014-2022 Douglas Christopher Wilson +Copyright (c) 2013 Nathan Rajlich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -25991,196 +15840,199 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## find-up - 4.1.0 -**Repository URL**: https://github.com/sindresorhus/find-up +## depd - 2.0.0 +**Repository URL**: https://github.com/dougwilson/nodejs-depd **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License +(The MIT License) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2014-2018 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## find-up - 5.0.0 -**Repository URL**: https://github.com/sindresorhus/find-up -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## diff - 8.0.4 +**Repository URL**: https://github.com/kpdecker/jsdiff +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html ``` -MIT License +BSD 3-Clause License -Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) 2009-2015, Kevin Decker +All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -## follow-redirects - 1.16.0 -**Repository URL**: https://github.com/follow-redirects/follow-redirects +## dijkstrajs - 1.0.3 +**Repository URL**: https://github.com/tcort/dijkstrajs **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh +``` +Dijkstra path-finding functions. Adapted from the Dijkstar Python project. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Copyright (C) 2008 + Wyatt Baldwin + All rights reserved -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Licensed under the MIT license. + + http://www.opensource.org/licenses/mit-license.php THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +`````` -## foreground-child - 3.3.1 -**Repository URL**: https://github.com/tapjs/foreground-child -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html +## dom-serializer - 2.0.0 +**Repository URL**: https://github.com/cheeriojs/dom-serializer +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -The ISC License +License -Copyright (c) 2015-2023 Isaac Z. Schlueter and Contributors +(The MIT License) -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Copyright (c) 2014 The cheeriojs contributors -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -## form-data - 4.0.5 -**Repository URL**: https://github.com/form-data/form-data -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## domelementtype - 2.3.0 +**Repository URL**: https://github.com/fb55/domelementtype +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html ``` -Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors +Copyright (c) Felix Böhm +All rights reserved. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE.``` +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -## formdata-polyfill - 4.0.10 -**Repository URL**: git+https://jimmywarting@github.com/jimmywarting/FormData -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -Copyright (c) 2016 Jimmy Karl Roland Wärting +## domhandler - 5.0.3 +**Repository URL**: https://github.com/fb55/domhandler +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html +``` +Copyright (c) Felix Böhm +All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -## forwarded - 0.2.0 -**Repository URL**: https://github.com/jshttp/forwarded -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## domutils - 3.2.2 +**Repository URL**: https://github.com/fb55/domutils +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html ``` -(The MIT License) +Copyright (c) Felix Böhm +All rights reserved. -Copyright (c) 2014-2017 Douglas Christopher Wilson +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -## fresh - 2.0.0 -**Repository URL**: https://github.com/jshttp/fresh -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## dotenv - 17.4.2 +**Repository URL**: https://github.com/motdotla/dotenv +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html ``` -(The MIT License) +Copyright (c) 2015, Scott Motte +All rights reserved. -Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2016-2017 Douglas Christopher Wilson +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` -## function-bind - 1.1.2 -**Repository URL**: https://github.com/Raynos/function-bind +## dunder-proto - 1.0.1 +**Repository URL**: https://github.com/es-shims/dunder-proto **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2013 Raynos. +MIT License + +Copyright (c) 2024 ECMAScript Shims Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -26189,19 +16041,19 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## gaxios - 6.7.1 -**Repository URL**: https://github.com/googleapis/gaxios +## ecdsa-sig-formatter - 1.0.11 +**Repository URL**: https://github.com/Brightspace/node-ecdsa-sig-formatter **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -26385,7 +16237,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -26393,7 +16245,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2015 D2L Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26407,662 +16259,797 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## gaxios - 7.1.4 -**Repository URL**: https://github.com/googleapis/google-cloud-node-core -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## ee-first - 1.1.1 +**Repository URL**: https://github.com/jonathanong/ee-first +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.``` + +## emoji-regex - 8.0.0 +**Repository URL**: https://github.com/mathiasbynens/emoji-regex +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright Mathias Bynens + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## encodeurl - 2.0.0 +**Repository URL**: https://github.com/pillarjs/encodeurl +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(The MIT License) + +Copyright (c) 2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## end-of-stream - 1.4.5 +**Repository URL**: https://github.com/mafintosh/end-of-stream +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.``` + +## entities - 4.5.0 +**Repository URL**: https://github.com/fb55/entities +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html +``` +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## entities - 7.0.1 +**Repository URL**: https://github.com/fb55/entities +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html +``` +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## es-define-property - 1.0.1 +**Repository URL**: https://github.com/ljharb/es-define-property +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +MIT License - 1. Definitions. +Copyright (c) 2024 Jordan Harband - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +## es-errors - 1.3.0 +**Repository URL**: https://github.com/ljharb/es-errors +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +Copyright (c) 2024 Jordan Harband - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +## es-object-atoms - 1.1.1 +**Repository URL**: https://github.com/ljharb/es-object-atoms +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +Copyright (c) 2024 Jordan Harband - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +## escalade - 3.2.0 +**Repository URL**: https://github.com/lukeed/escalade +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +Copyright (c) Luke Edwards (lukeed.com) - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +## escape-html - 1.0.3 +**Repository URL**: https://github.com/component/escape-html +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(The MIT License) - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +Copyright (c) 2012-2013 TJ Holowaychuk +Copyright (c) 2015 Andreas Lubbe +Copyright (c) 2015 Tiancheng "Timothy" Gu - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - END OF TERMS AND CONDITIONS +## escape-string-regexp - 4.0.0 +**Repository URL**: https://github.com/sindresorhus/escape-string-regexp +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - APPENDIX: How to apply the Apache License to your work. +Copyright (c) Sindre Sorhus (https://sindresorhus.com) - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - Copyright [yyyy] [name of copyright owner] +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - http://www.apache.org/licenses/LICENSE-2.0 +## escodegen - 2.1.0 +**Repository URL**: https://github.com/estools/escodegen +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html +``` +Copyright (C) 2012 Yusuke Suzuki (twitter: @Constellation) and other contributors. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -## gcp-metadata - 6.1.1 -**Repository URL**: https://github.com/googleapis/gcp-metadata -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + +## esprima - 4.0.1 +**Repository URL**: https://github.com/jquery/esprima +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright JS Foundation and other contributors, https://js.foundation/ - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - 1. Definitions. + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +## estraverse - 5.3.0 +**Repository URL**: https://github.com/estools/estraverse +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html +``` +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +## esutils - 2.0.3 +**Repository URL**: https://github.com/estools/esutils +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html +``` +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +## etag - 1.8.1 +**Repository URL**: https://github.com/jshttp/etag +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(The MIT License) - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +Copyright (c) 2014-2016 Douglas Christopher Wilson - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +## event-target-shim - 5.0.1 +**Repository URL**: https://github.com/mysticatea/event-target-shim +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +Copyright (c) 2015 Toru Nagashima - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` + +## eventsource - 3.0.7 +**Repository URL**: git://git@github.com/EventSource/eventsource +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +Copyright (c) EventSource GitHub organisation - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +## eventsource-parser - 3.0.8 +**Repository URL**: https://github.com/rexxars/eventsource-parser +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +Copyright (c) 2026 Espen Hovlandsdal - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - END OF TERMS AND CONDITIONS +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - APPENDIX: How to apply the Apache License to your work. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +## express - 5.2.1 +**Repository URL**: https://github.com/expressjs/express +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(The MIT License) - Copyright [yyyy] [name of copyright owner] +Copyright (c) 2009-2014 TJ Holowaychuk +Copyright (c) 2013-2014 Roman Shtylman +Copyright (c) 2014-2015 Douglas Christopher Wilson - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## gcp-metadata - 8.1.2 -**Repository URL**: https://github.com/googleapis/google-cloud-node-core -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## express-rate-limit - 8.5.2 +**Repository URL**: https://github.com/express-rate-limit/express-rate-limit +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +# MIT License - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright 2023 Nathan Friedly, Vedant K - 1. Definitions. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +## extend - 3.0.2 +**Repository URL**: https://github.com/justmoon/node-extend +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +Copyright (c) 2014 Stefan Thomas - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +## extract-zip - 2.0.1 +**Repository URL**: https://github.com/maxogden/extract-zip +**License Type(s)**: BSD-2-Clause +### License: https://spdx.org/licenses/BSD-2-Clause.html +``` +Copyright (c) 2014 Max Ogden and other contributors +All rights reserved. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +## fast-deep-equal - 3.1.3 +**Repository URL**: https://github.com/epoberezkin/fast-deep-equal +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +Copyright (c) 2017 Evgeny Poberezkin - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +## fast-string-truncated-width - 3.0.3 +**Repository URL**: https://github.com/fabiospampinato/fast-string-truncated-width +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +Copyright (c) 2024-present Fabio Spampinato - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE.``` - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +## fast-string-width - 3.0.2 +**Repository URL**: https://github.com/fabiospampinato/fast-string-width +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) - END OF TERMS AND CONDITIONS +Copyright (c) 2024-present Fabio Spampinato - APPENDIX: How to apply the Apache License to your work. +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - Copyright [yyyy] [name of copyright owner] +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE.``` - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +## fast-uri - 3.1.2 +**Repository URL**: https://github.com/fastify/fast-uri +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html +``` +Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae +Copyright (c) 2021-present The Fastify team +All rights reserved. - http://www.apache.org/licenses/LICENSE-2.0 +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -## get-caller-file - 2.0.5 -**Repository URL**: https://github.com/stefanpenner/get-caller-file -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html + * * * + +The complete list of contributors can be found at: +- https://github.com/garycourt/uri-js/graphs/contributors``` + +## fast-wrap-ansi - 0.2.0 +**Repository URL**: https://github.com/43081j/fast-wrap-ansi +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` -ISC License (ISC) -Copyright 2018 Stefan Penner +MIT License + +Copyright (c) 2025 James Garbutt + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## get-east-asian-width - 1.6.0 -**Repository URL**: https://github.com/sindresorhus/get-east-asian-width +## fast-xml-builder - 1.2.0 +**Repository URL**: https://github.com/NaturalIntelligence/fast-xml-builder **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` MIT License -Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) 2026 Natural Intelligence -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## get-intrinsic - 1.3.0 -**Repository URL**: https://github.com/ljharb/get-intrinsic +## fast-xml-parser - 5.7.3 +**Repository URL**: https://github.com/NaturalIntelligence/fast-xml-parser **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` MIT License -Copyright (c) 2020 Jordan Harband +Copyright (c) 2017 Amit Kumar Gupta Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -27082,14 +17069,41 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## get-proto - 1.0.1 -**Repository URL**: https://github.com/ljharb/get-proto +## fd-slicer - 1.1.0 +**Repository URL**: https://github.com/andrewrk/node-fd-slicer +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2014 Andrew Kelley + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation files +(the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` + +## fetch-blob - 3.2.0 +**Repository URL**: https://github.com/node-fetch/fetch-blob **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` MIT License -Copyright (c) 2025 Jordan Harband +Copyright (c) 2019 David Frank Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -27109,8 +17123,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## get-stream - 5.2.0 -**Repository URL**: https://github.com/sindresorhus/get-stream +## file-type - 21.3.4 +**Repository URL**: https://github.com/sindresorhus/file-type **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` @@ -27124,14 +17138,29 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## get-uri - 6.0.5 -**Repository URL**: https://github.com/TooTallNate/proxy-agents +## file-type - 22.0.1 +**Repository URL**: https://github.com/sindresorhus/file-type +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## finalhandler - 2.1.1 +**Repository URL**: https://github.com/pillarjs/finalhandler **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2014 Nathan Rajlich +Copyright (c) 2014-2022 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -27152,14 +17181,121 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## get-uri - 8.0.0 -**Repository URL**: https://github.com/TooTallNate/proxy-agents +## find-up - 4.1.0 +**Repository URL**: https://github.com/sindresorhus/find-up +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## find-up - 5.0.0 +**Repository URL**: https://github.com/sindresorhus/find-up +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## foreground-child - 3.3.1 +**Repository URL**: https://github.com/tapjs/foreground-child +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html +``` +The ISC License + +Copyright (c) 2015-2023 Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` + +## formdata-polyfill - 4.0.10 +**Repository URL**: git+https://jimmywarting@github.com/jimmywarting/FormData +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) 2016 Jimmy Karl Roland Wärting + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` + +## forwarded - 0.2.0 +**Repository URL**: https://github.com/jshttp/forwarded **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` (The MIT License) -Copyright (c) 2014 Nathan Rajlich +Copyright (c) 2014-2017 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## fresh - 2.0.0 +**Repository URL**: https://github.com/jshttp/fresh +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -27169,144 +17305,250 @@ distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## function-bind - 1.1.2 +**Repository URL**: https://github.com/Raynos/function-bind +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2013 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.``` + +## gaxios - 7.1.4 +**Repository URL**: https://github.com/googleapis/google-cloud-node-core +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + 1. Definitions. -## glob - 13.0.6 -**Repository URL**: https://github.com/isaacs/node-glob -**License Type(s)**: BlueOak-1.0.0 -### License: https://spdx.org/licenses/BlueOak-1.0.0.html -``` -All packages under `src/` are licensed according to the terms in -their respective `LICENSE` or `LICENSE.md` files. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -The remainder of this project is licensed under the Blue Oak -Model License, as follows: + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. ------ + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -# Blue Oak Model License + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Version 1.0.0 + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -## Purpose + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -This license gives everyone as much permission to work with -this software as possible, while protecting contributors -from liability. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -## Acceptance + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -In order to receive this license, you must agree to its -rules. The rules of this license are both obligations -under that agreement and conditions to your license. -You must not do anything with this software that triggers -a rule that you cannot or will not follow. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -## Copyright + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Each contributor licenses you to do everything with this -software that would otherwise infringe that contributor's -copyright in it. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -## Notices + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -You must ensure that everyone who gets a copy of -any part of this software from you, with or without -changes, also gets the text of this license or a link to -. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -## Excuse + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -If anyone notifies you in writing that you have not -complied with [Notices](#notices), you can keep your -license by taking all practical steps to comply within 30 -days after the notice. If you do not do so, your license -ends immediately. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -## Patent + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -Each contributor licenses you to do everything with this -software that would otherwise infringe any patent claims -they can license or become able to license. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -## Reliability + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -No contributor can revoke this license. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -## No Liability + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -***As far as the law allows, this software comes as is, -without any warranty or condition, and no contributor -will be liable to anyone for any damages related to this -software or this license, under any kind of legal claim.***``` + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -## global-agent - 4.1.3 -**Repository URL**: https://github.com/gajus/global-agent -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2026, Gajus Kuizinas (https://gajus.com/) -All rights reserved. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the Gajus Kuizinas (https://gajus.com/) nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL ANUARY BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` + END OF TERMS AND CONDITIONS -## globalthis - 1.0.4 -**Repository URL**: https://github.com/ljharb/System.global -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) + APPENDIX: How to apply the Apache License to your work. -Copyright (c) 2016 Jordan Harband + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.``` -## google-auth-library - 10.6.2 +## gcp-metadata - 8.1.2 **Repository URL**: https://github.com/googleapis/google-cloud-node-core **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -27513,215 +17755,286 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## google-auth-library - 9.15.1 -**Repository URL**: https://github.com/googleapis/google-auth-library-nodejs -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## get-caller-file - 2.0.5 +**Repository URL**: https://github.com/stefanpenner/get-caller-file +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html ``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +ISC License (ISC) +Copyright 2018 Stefan Penner - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - 1. Definitions. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.``` - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +## get-east-asian-width - 1.6.0 +**Repository URL**: https://github.com/sindresorhus/get-east-asian-width +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +Copyright (c) Sindre Sorhus (https://sindresorhus.com) - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +## get-intrinsic - 1.3.0 +**Repository URL**: https://github.com/ljharb/get-intrinsic +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Copyright (c) 2020 Jordan Harband - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +## get-proto - 1.0.1 +**Repository URL**: https://github.com/ljharb/get-proto +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +Copyright (c) 2025 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` + +## get-stream - 5.2.0 +**Repository URL**: https://github.com/sindresorhus/get-stream +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## get-uri - 6.0.5 +**Repository URL**: https://github.com/TooTallNate/proxy-agents +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## get-uri - 8.0.0 +**Repository URL**: https://github.com/TooTallNate/proxy-agents +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` + +## glob - 13.0.6 +**Repository URL**: https://github.com/isaacs/node-glob +**License Type(s)**: BlueOak-1.0.0 +### License: https://spdx.org/licenses/BlueOak-1.0.0.html +``` +All packages under `src/` are licensed according to the terms in +their respective `LICENSE` or `LICENSE.md` files. + +The remainder of this project is licensed under the Blue Oak +Model License, as follows: + +----- + +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +## Copyright - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +## Notices - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +## Excuse - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +## Patent - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +## Reliability - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +No contributor can revoke this license. - END OF TERMS AND CONDITIONS +## No Liability - APPENDIX: How to apply the Apache License to your work. +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.***``` - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +## global-agent - 4.1.3 +**Repository URL**: https://github.com/gajus/global-agent +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html +``` +Copyright (c) 2026, Gajus Kuizinas (https://gajus.com/) +All rights reserved. - Copyright [yyyy] [name of copyright owner] +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Gajus Kuizinas (https://gajus.com/) nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANUARY BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.``` - http://www.apache.org/licenses/LICENSE-2.0 +## globalthis - 1.0.4 +**Repository URL**: https://github.com/ljharb/System.global +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` +Copyright (c) 2016 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -## google-logging-utils - 0.0.2 -**Repository URL**: https://github.com/googleapis/gax-nodejs +## google-auth-library - 10.6.2 +**Repository URL**: https://github.com/googleapis/google-cloud-node-core **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -28209,33 +18522,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## gtoken - 7.1.0 -**Repository URL**: https://github.com/google/node-gtoken -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) 2014 Ryan Seys - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` - ## has-flag - 4.0.0 **Repository URL**: https://github.com/sindresorhus/has-flag **License Type(s)**: MIT @@ -28305,33 +18591,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## has-tostringtag - 1.0.2 -**Repository URL**: https://github.com/inspect-js/has-tostringtag -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2021 Inspect JS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - ## hasown - 2.0.3 **Repository URL**: https://github.com/inspect-js/hasOwn **License Type(s)**: MIT @@ -28801,40 +19060,15 @@ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE.``` - -## ip-address - 10.2.0 -**Repository URL**: https://github.com/beaugunderson/ip-address -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (C) 2011 by Beau Gunderson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE.``` -## ipaddr.js - 1.9.1 -**Repository URL**: https://github.com/whitequark/ipaddr.js +## ip-address - 10.2.0 +**Repository URL**: https://github.com/beaugunderson/ip-address **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright (C) 2011-2017 whitequark +Copyright (C) 2011 by Beau Gunderson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -28854,7 +19088,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## ipaddr.js - 2.4.0 +## ipaddr.js - 1.9.1 **Repository URL**: https://github.com/whitequark/ipaddr.js **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html @@ -28879,14 +19113,12 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## is-electron - 2.2.2 -**Repository URL**: https://github.com/cheton/is-electron +## ipaddr.js - 2.4.0 +**Repository URL**: https://github.com/whitequark/ipaddr.js **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) - -Copyright (c) 2016-2018 Cheton Wu +Copyright (C) 2011-2017 whitequark Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -28895,16 +19127,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.``` ## is-fullwidth-code-point - 3.0.0 **Repository URL**: https://github.com/sindresorhus/is-fullwidth-code-point @@ -28946,21 +19178,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## is-stream - 2.0.1 -**Repository URL**: https://github.com/sindresorhus/is-stream -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - ## isarray - 1.0.0 **Repository URL**: https://github.com/juliangruber/isarray **License Type(s)**: MIT @@ -29363,33 +19580,6 @@ SOFTWARE. [others]: https://github.com/json5/json5/contributors``` -## jsonwebtoken - 9.0.3 -**Repository URL**: https://github.com/auth0/node-jsonwebtoken -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) 2015 Auth0, Inc. (http://auth0.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - ## jszip - 3.10.1 **Repository URL**: https://github.com/Stuk/jszip **License Type(s)**: (MIT OR GPL-3.0-or-later) @@ -30093,393 +20283,152 @@ PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## lie - 3.3.0 -**Repository URL**: https://github.com/calvinmetcalf/lie +## koffi - 2.16.2 +**Repository URL**: https://www.npmjs.com/package/koffi **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -#Copyright (c) 2014-2018 Calvin Metcalf, Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.**``` - -## linkedom - 0.18.12 -**Repository URL**: https://github.com/WebReflection/linkedom -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html -``` -ISC License - -Copyright (c) 2021, Andrea Giammarchi, @WebReflection - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE.``` +MIT License -## linkify-it - 5.0.0 -**Repository URL**: https://github.com/markdown-it/linkify-it -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) 2015 Vitaly Puzrin. +Copyright (C) 2025 Niels Martignène -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE.``` - -## locate-path - 5.0.0 -**Repository URL**: https://github.com/sindresorhus/locate-path -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## locate-path - 6.0.0 -**Repository URL**: https://github.com/sindresorhus/locate-path -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## lodash.includes - 4.3.0 -**Repository URL**: https://github.com/lodash/lodash -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright jQuery Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -==== - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above.``` - -## lodash.isboolean - 3.0.3 -**Repository URL**: https://github.com/lodash/lodash -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright 2012-2016 The Dojo Foundation -Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## lodash.isinteger - 4.0.4 -**Repository URL**: https://github.com/lodash/lodash -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright jQuery Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -==== - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above.``` - -## lodash.isnumber - 3.0.3 -**Repository URL**: https://github.com/lodash/lodash -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright 2012-2016 The Dojo Foundation -Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE.``` -## lodash.isplainobject - 4.0.6 -**Repository URL**: https://github.com/lodash/lodash +## kysely - 0.29.0 +**Repository URL**: https://github.com/kysely-org/kysely **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright jQuery Foundation and other contributors +The MIT License (MIT) -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors +Copyright (c) 2022 Sami Koskimäki -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The following license applies to all parts of this software except as -documented below: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -==== +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +## lie - 3.3.0 +**Repository URL**: https://github.com/calvinmetcalf/lie +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +#Copyright (c) 2014-2018 Calvin Metcalf, Jordan Harband -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -==== +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.**``` -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. +## linkedom - 0.18.12 +**Repository URL**: https://github.com/WebReflection/linkedom +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html +``` +ISC License -CC0: http://creativecommons.org/publicdomain/zero/1.0/ +Copyright (c) 2021, Andrea Giammarchi, @WebReflection -==== +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above.``` +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE.``` -## lodash.isstring - 4.0.1 -**Repository URL**: https://github.com/lodash/lodash +## linkify-it - 5.0.0 +**Repository URL**: https://github.com/markdown-it/linkify-it **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright 2012-2016 The Dojo Foundation -Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors +Copyright (c) 2015 Vitaly Puzrin. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE.``` -## lodash.once - 4.1.1 -**Repository URL**: https://github.com/lodash/lodash +## locate-path - 5.0.0 +**Repository URL**: https://github.com/sindresorhus/locate-path **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -Copyright jQuery Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: +MIT License -==== +Copyright (c) Sindre Sorhus (sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -==== +## locate-path - 6.0.0 +**Repository URL**: https://github.com/sindresorhus/locate-path +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. +Copyright (c) Sindre Sorhus (https://sindresorhus.com) -CC0: http://creativecommons.org/publicdomain/zero/1.0/ +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -==== +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above.``` +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` ## long - 5.3.2 **Repository URL**: https://github.com/dcodeIO/long.js @@ -31026,35 +20975,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## mime-db - 1.52.0 -**Repository URL**: https://github.com/jshttp/mime-db -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015-2022 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - ## mime-db - 1.54.0 **Repository URL**: https://github.com/jshttp/mime-db **License Type(s)**: MIT @@ -31084,35 +21004,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## mime-types - 2.1.35 -**Repository URL**: https://github.com/jshttp/mime-types -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - ## mime-types - 3.0.2 **Repository URL**: https://github.com/jshttp/mime-types **License Type(s)**: MIT @@ -31339,33 +21230,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """``` -## mri - 1.2.0 -**Repository URL**: https://github.com/lukeed/mri -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) Luke Edwards (lukeed.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` - ## ms - 2.1.3 **Repository URL**: https://github.com/vercel/ms **License Type(s)**: MIT @@ -32189,68 +22053,14 @@ Apache License See the License for the specific language governing permissions and limitations under the License.``` -## openclaw - 2026.5.7 -**Repository URL**: https://github.com/openclaw/openclaw -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2025 Peter Steinberger - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## openshell - 0.1.0 -**Repository URL**: https://www.npmjs.com/package/openshell -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2026 Jason - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - -## p-finally - 1.0.0 -**Repository URL**: https://github.com/sindresorhus/p-finally +## openclaw - 2026.5.12 +**Repository URL**: https://github.com/openclaw/openclaw **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) +MIT License -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2025 Peter Steinberger Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -32259,16 +22069,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.``` +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.``` ## p-limit - 2.3.0 **Repository URL**: https://github.com/sindresorhus/p-limit @@ -32330,21 +22140,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## p-queue - 6.6.2 -**Repository URL**: https://github.com/sindresorhus/p-queue -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - ## p-retry - 4.6.2 **Repository URL**: https://github.com/sindresorhus/p-retry **License Type(s)**: MIT @@ -32360,36 +22155,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## p-timeout - 3.2.0 -**Repository URL**: https://github.com/sindresorhus/p-timeout -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - -## p-timeout - 4.1.0 -**Repository URL**: https://github.com/sindresorhus/p-timeout -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - ## p-try - 2.2.0 **Repository URL**: https://github.com/sindresorhus/p-try **License Type(s)**: MIT @@ -33058,7 +22823,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## playwright-core - 1.59.1 +## playwright-core - 1.60.0 **Repository URL**: https://github.com/microsoft/playwright **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -33357,7 +23122,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## protobufjs - 7.5.6 +## protobufjs - 7.5.8 **Repository URL**: https://github.com/protobufjs/protobuf.js **License Type(s)**: BSD-3-Clause ### License: https://spdx.org/licenses/BSD-3-Clause.html @@ -34622,33 +24387,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## safe-compare - 1.1.4 -**Repository URL**: https://github.com/Bruce17/safe-compare -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) 2016 Michael Raith - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - ## safer-buffer - 2.1.2 **Repository URL**: https://github.com/ChALkeR/safer-buffer **License Type(s)**: MIT @@ -34676,25 +24414,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## sandwich-stream - 2.0.2 -**Repository URL**: https://github.com/connrs/node-sandwich-stream -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Copyright 2013 Paul Connolley (connrs) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.``` - ## semver - 7.7.4 **Repository URL**: https://github.com/npm/node-semver **License Type(s)**: ISC @@ -35233,6 +24952,54 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` +## sqlite-vec - 0.1.9 +**Repository URL**: https://www.npmjs.com/package/sqlite-vec +**License Type(s)**: MIT OR Apache +### License: https://spdx.org/licenses/ +``` +(No license file read from locked npm artifact for sqlite-vec; see npm metadata.) +``` + +## sqlite-vec-darwin-arm64 - 0.1.9 +**Repository URL**: https://www.npmjs.com/package/sqlite-vec-darwin-arm64 +**License Type(s)**: MIT OR Apache +### License: https://spdx.org/licenses/ +``` +(No license file read from locked npm artifact for sqlite-vec-darwin-arm64; see npm metadata.) +``` + +## sqlite-vec-darwin-x64 - 0.1.9 +**Repository URL**: https://www.npmjs.com/package/sqlite-vec-darwin-x64 +**License Type(s)**: MIT OR Apache +### License: https://spdx.org/licenses/ +``` +(No license file read from locked npm artifact for sqlite-vec-darwin-x64; see npm metadata.) +``` + +## sqlite-vec-linux-arm64 - 0.1.9 +**Repository URL**: https://www.npmjs.com/package/sqlite-vec-linux-arm64 +**License Type(s)**: MIT OR Apache +### License: https://spdx.org/licenses/ +``` +(No license file read from locked npm artifact for sqlite-vec-linux-arm64; see npm metadata.) +``` + +## sqlite-vec-linux-x64 - 0.1.9 +**Repository URL**: https://www.npmjs.com/package/sqlite-vec-linux-x64 +**License Type(s)**: MIT OR Apache +### License: https://spdx.org/licenses/ +``` +(No license file read from locked npm artifact for sqlite-vec-linux-x64; see npm metadata.) +``` + +## sqlite-vec-windows-x64 - 0.1.9 +**Repository URL**: https://www.npmjs.com/package/sqlite-vec-windows-x64 +**License Type(s)**: MIT OR Apache +### License: https://spdx.org/licenses/ +``` +(No license file read from locked npm artifact for sqlite-vec-windows-x64; see npm metadata.) +``` + ## statuses - 2.0.2 **Repository URL**: https://github.com/jshttp/statuses **License Type(s)**: MIT @@ -35261,33 +25028,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## std-env - 3.10.0 -**Repository URL**: https://github.com/unjs/std-env -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) Pooya Parsa - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - ## string-width - 4.2.3 **Repository URL**: https://github.com/sindresorhus/string-width **License Type(s)**: MIT @@ -35456,7 +25196,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` ## tar - 7.5.13 -**Repository URL**: https://github.com/isaacs/node-tar +**Repository URL**: https://www.npmjs.com/package/tar **License Type(s)**: BlueOak-1.0.0 ### License: https://spdx.org/licenses/BlueOak-1.0.0.html ``` @@ -35516,33 +25256,66 @@ without any warranty or condition, and no contributor will be liable to anyone for any damages related to this software or this license, under any kind of legal claim.***``` -## telegraf - 4.16.3 -**Repository URL**: https://github.com/telegraf/telegraf -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## tar - 7.5.15 +**Repository URL**: https://github.com/isaacs/node-tar +**License Type(s)**: BlueOak-1.0.0 +### License: https://spdx.org/licenses/BlueOak-1.0.0.html ``` -The MIT License (MIT) +# Blue Oak Model License -Copyright (c) 2016-2019 Vitaly Domnikov -Copyright (c) 2020-2023 The Telegraf Contributors +Version 1.0.0 -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +## Purpose -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.***``` ## test-exclude - 8.0.0 **Repository URL**: https://github.com/istanbuljs/test-exclude @@ -35692,7 +25465,7 @@ SOFTWARE.``` **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -(No license file read from node_modules for tr46; see npm metadata.) +(No license file read from locked npm artifact for tr46; see npm metadata.) ``` ## tree-sitter-bash - 0.25.1 @@ -35794,33 +25567,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## tsscmp - 1.0.6 -**Repository URL**: https://github.com/suryagh/tsscmp -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) 2016 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.``` - ## type-fest - 0.20.2 **Repository URL**: https://github.com/sindresorhus/type-fest **License Type(s)**: (MIT OR CC0-1.0) @@ -35836,7 +25582,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## type-is - 2.0.1 +## type-is - 2.1.0 **Repository URL**: https://github.com/jshttp/type-is **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html @@ -35865,7 +25611,7 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## typebox - 1.1.37 +## typebox - 1.1.38 **Repository URL**: https://github.com/sinclairzx81/typebox **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html @@ -36378,21 +26124,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## uuid - 9.0.1 -**Repository URL**: https://github.com/uuidjs/uuid -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License (MIT) - -Copyright (c) 2010-2020 Robert Kieffer and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - ## v8-to-istanbul - 9.3.0 **Repository URL**: https://github.com/istanbuljs/v8-to-istanbul **License Type(s)**: ISC @@ -36971,7 +26702,7 @@ without any warranty or condition, and no contributor will be liable to anyone for any damages related to this software or this license, under any kind of legal claim.***``` -## yaml - 2.8.4 +## yaml - 2.9.0 **Repository URL**: https://github.com/eemeli/yaml **License Type(s)**: ISC ### License: https://spdx.org/licenses/ISC.html @@ -37173,21 +26904,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` -## yoctocolors - 2.1.2 -**Repository URL**: https://github.com/sindresorhus/yoctocolors -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.``` - ## zod - 4.4.3 **Repository URL**: https://github.com/colinhacks/zod **License Type(s)**: MIT diff --git a/ATTRIBUTIONS-Python.md b/ATTRIBUTIONS-Python.md index d08622c4..c10c363b 100644 --- a/ATTRIBUTIONS-Python.md +++ b/ATTRIBUTIONS-Python.md @@ -642,7 +642,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## anthropic (0.101.0) +## anthropic (0.102.0) ### Licenses License: `MIT` @@ -3794,7 +3794,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## langchain (1.2.18) +## langchain (1.3.0) ### Licenses License: `MIT` @@ -3854,7 +3854,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## langchain-core (1.3.3) +## langchain-core (1.4.0) ### Licenses License: `MIT` @@ -3954,7 +3954,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## langgraph (1.1.10) +## langgraph (1.2.0) ### Licenses License: `MIT` @@ -3984,7 +3984,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## langgraph-checkpoint (4.0.3) +## langgraph-checkpoint (4.1.0) ### Licenses License: `MIT` @@ -4014,7 +4014,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## langgraph-prebuilt (1.0.13) +## langgraph-prebuilt (1.1.0) ### Licenses License: `MIT` @@ -9007,7 +9007,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## urllib3 (2.6.3) +## urllib3 (2.7.0) ### Licenses License: `MIT` diff --git a/ATTRIBUTIONS-Rust.md b/ATTRIBUTIONS-Rust.md index 43c15c3d..725f4f47 100644 --- a/ATTRIBUTIONS-Rust.md +++ b/ATTRIBUTIONS-Rust.md @@ -40653,6 +40653,274 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a limitations under the License. +``` + +## zerocopy-derive - 0.8.48 +**Repository URL**: https://github.com/google/zerocopy +**License Type(s)**: BSD-2-Clause OR Apache-2.0 OR MIT +### License: https://spdx.org/licenses/ +### License File: LICENSE-APACHE +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 The Fuchsia Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +### License File: LICENSE-BSD +``` +Copyright 2019 The Fuchsia Authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +### License File: LICENSE-MIT +``` +Copyright 2023 The Fuchsia Authors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + ``` ## zerofrom - 0.1.7 diff --git a/Cargo.lock b/Cargo.lock index 60db83d5..4ecc97fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -285,12 +285,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - [[package]] name = "chrono" version = "0.4.44" @@ -683,10 +677,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -1097,12 +1089,6 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - [[package]] name = "matchit" version = "0.8.4" @@ -1217,6 +1203,8 @@ dependencies = [ "opentelemetry-http", "opentelemetry-otlp", "opentelemetry_sdk", + "reqwest", + "rustls", "schemars", "serde", "serde_json", @@ -1266,6 +1254,7 @@ dependencies = [ "http-body-util", "nemo-flow", "reqwest", + "rustls", "serde", "serde_json", "serde_yaml", @@ -1702,61 +1691,6 @@ dependencies = [ "serde", ] -[[package]] -name = "quinn" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" -dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", -] - [[package]] name = "quote" version = "1.0.45" @@ -1888,7 +1822,6 @@ dependencies = [ "log", "percent-encoding", "pin-project-lite", - "quinn", "rustls", "rustls-native-certs", "rustls-pki-types", @@ -1923,12 +1856,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rustc-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - [[package]] name = "rustix" version = "1.1.4" @@ -1974,7 +1901,6 @@ version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ - "web-time", "zeroize", ] @@ -2403,21 +2329,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "tinyvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" version = "1.51.1" @@ -2900,16 +2811,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "winapi-util" version = "0.1.11" @@ -2984,7 +2885,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2993,16 +2894,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -3020,31 +2912,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -3053,96 +2928,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" version = "0.7.15" diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 7d777b8b..14969c06 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -28,7 +28,8 @@ futures-util = "0.3" http = "1" http-body-util = "0.1" dialoguer = { version = "0.11", default-features = false } -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls-native-roots", "stream"] } +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls-native-roots-no-provider", "stream"] } +rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"] } serde = { version = "1", features = ["derive"] } serde_json = "1" serde_yaml = "0.9" diff --git a/crates/cli/src/doctor.rs b/crates/cli/src/doctor.rs index c21f149b..11a3e981 100644 --- a/crates/cli/src/doctor.rs +++ b/crates/cli/src/doctor.rs @@ -651,6 +651,7 @@ fn check_dir_writable(dir: &Path) -> Result<(), std::io::Error> { } async fn probe_http_named(name: &'static str, url: &str) -> Check { + crate::tls::install_rustls_crypto_provider(); let client = match reqwest::Client::builder().timeout(NETWORK_TIMEOUT).build() { Ok(c) => c, Err(err) => { diff --git a/crates/cli/src/installer.rs b/crates/cli/src/installer.rs index 6b3d8942..6e60af4e 100644 --- a/crates/cli/src/installer.rs +++ b/crates/cli/src/installer.rs @@ -130,6 +130,7 @@ async fn send_hook_forward_request( url: String, input: String, ) -> Result, CliError> { + crate::tls::install_rustls_crypto_provider(); Ok(reqwest::Client::builder() .timeout(HOOK_FORWARD_TIMEOUT) .build()? diff --git a/crates/cli/src/launcher.rs b/crates/cli/src/launcher.rs index 96c37868..32b4b70f 100644 --- a/crates/cli/src/launcher.rs +++ b/crates/cli/src/launcher.rs @@ -696,6 +696,7 @@ fn exit_code(status: std::process::ExitStatus) -> ExitCode { // Polls the ephemeral gateway health endpoint for roughly one second before launching the agent. // Startup failures return a launcher error so the child command is never run against a dead proxy. async fn wait_for_health(gateway_url: &str) -> Result<(), CliError> { + crate::tls::install_rustls_crypto_provider(); let client = Client::new(); let url = format!("{}/healthz", gateway_url.trim_end_matches('/')); for _ in 0..50 { diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 4122ac49..8f723059 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -17,6 +17,7 @@ mod plugins; mod server; mod session; mod setup; +mod tls; use std::process::ExitCode; diff --git a/crates/cli/src/server.rs b/crates/cli/src/server.rs index 2ea6dac8..9e937152 100644 --- a/crates/cli/src/server.rs +++ b/crates/cli/src/server.rs @@ -105,6 +105,7 @@ pub(crate) fn router(config: GatewayConfig) -> Router { impl AppState { fn new(config: GatewayConfig) -> Self { + crate::tls::install_rustls_crypto_provider(); let sessions = SessionManager::new(config.clone()); let http = Client::builder() .connect_timeout(HTTP_CONNECT_TIMEOUT) diff --git a/crates/cli/src/tls.rs b/crates/cli/src/tls.rs new file mode 100644 index 00000000..f64860ac --- /dev/null +++ b/crates/cli/src/tls.rs @@ -0,0 +1,6 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +pub(crate) fn install_rustls_crypto_provider() { + let _ = rustls::crypto::ring::default_provider().install_default(); +} diff --git a/crates/cli/tests/coverage/gateway_tests.rs b/crates/cli/tests/coverage/gateway_tests.rs index 45818856..6f46c382 100644 --- a/crates/cli/tests/coverage/gateway_tests.rs +++ b/crates/cli/tests/coverage/gateway_tests.rs @@ -11,6 +11,11 @@ use axum::http::{HeaderMap, HeaderValue, Method, Request, StatusCode}; use http_body_util::BodyExt; use reqwest::Client; +fn test_http_client() -> Client { + crate::tls::install_rustls_crypto_provider(); + Client::new() +} + #[test] fn removes_hop_by_hop_headers() { assert!(!should_forward_request_header(&HeaderName::from_static( @@ -297,7 +302,7 @@ fn preserves_jwt_when_no_replacement_key_available() { fn injects_openai_bearer_when_inbound_has_no_auth() { // NMF-86 mitigation: codex now sends no credentials, so the gateway must inject // `Authorization: Bearer ${OPENAI_API_KEY}` on outbound forwards to api.openai.com. - let http = Client::new(); + let http = test_http_client(); let inbound = HeaderMap::new(); let env = |k: &str| match k { "OPENAI_API_KEY" => Some("sk-test-123".into()), @@ -316,7 +321,7 @@ fn injects_openai_bearer_when_inbound_has_no_auth() { #[test] fn injects_anthropic_x_api_key_for_anthropic_routes() { - let http = Client::new(); + let http = test_http_client(); let inbound = HeaderMap::new(); let env = |k: &str| match k { "ANTHROPIC_API_KEY" => Some("sk-ant-test".into()), @@ -338,7 +343,7 @@ fn injects_anthropic_x_api_key_for_anthropic_routes() { fn skips_injection_when_inbound_already_has_authorization() { // If the agent (e.g., a future codex version, or anyone using the gateway directly) sends // its own auth, we must not stomp on it. - let http = Client::new(); + let http = test_http_client(); let mut inbound = HeaderMap::new(); inbound.insert( "authorization", @@ -358,7 +363,7 @@ fn skips_injection_when_inbound_already_has_authorization() { #[test] fn skips_injection_when_env_var_unset() { - let http = Client::new(); + let http = test_http_client(); let inbound = HeaderMap::new(); let env = |_: &str| None; let builder = http.post("http://upstream/v1/responses"); @@ -441,7 +446,7 @@ async fn passthrough_rejects_unsupported_provider_path_directly() { }; let state = AppState { config: config.clone(), - http: Client::new(), + http: test_http_client(), sessions: SessionManager::new(config), }; let request = Request::builder() @@ -467,7 +472,7 @@ async fn models_rejects_non_get_requests_directly() { }; let state = AppState { config: config.clone(), - http: Client::new(), + http: test_http_client(), sessions: SessionManager::new(config), }; let request = Request::builder() diff --git a/crates/cli/tests/coverage/launcher_tests.rs b/crates/cli/tests/coverage/launcher_tests.rs index 77da6dd8..b8727fac 100644 --- a/crates/cli/tests/coverage/launcher_tests.rs +++ b/crates/cli/tests/coverage/launcher_tests.rs @@ -619,6 +619,8 @@ fn cursor_dry_run_does_not_write_hooks() { #[tokio::test] async fn run_starts_gateway_injects_env_and_returns_agent_exit_code() { let temp = tempfile::tempdir().unwrap(); + let config = temp.path().join("config.toml"); + std::fs::write(&config, "[upstream]\n").unwrap(); let output = temp.path().join("env.txt"); let command_argv = fake_agent_command(temp.path(), &output); let command = RunCommand { @@ -627,7 +629,7 @@ async fn run_starts_gateway_injects_env_and_returns_agent_exit_code() { // command as pass-through after the configured/default binary — not what this test // wants, since it specifically asserts that argv[0] is the fake script. agent: None, - config: None, + config: Some(config), openai_base_url: None, anthropic_base_url: None, session_metadata: None, diff --git a/crates/cli/tests/coverage/server_tests.rs b/crates/cli/tests/coverage/server_tests.rs index c2e41136..d49b1efe 100644 --- a/crates/cli/tests/coverage/server_tests.rs +++ b/crates/cli/tests/coverage/server_tests.rs @@ -30,6 +30,11 @@ const GENERIC_TEST_PLUGIN_KIND: &str = "cli-test-generic-plugin"; static GENERIC_TEST_PLUGIN_REGISTRATIONS: AtomicUsize = AtomicUsize::new(0); static GENERIC_TEST_PLUGIN_DEREGISTRATIONS: AtomicUsize = AtomicUsize::new(0); +fn test_http_client() -> reqwest::Client { + crate::tls::install_rustls_crypto_provider(); + reqwest::Client::new() +} + struct GenericTestPlugin; impl Plugin for GenericTestPlugin { @@ -180,7 +185,7 @@ async fn serve_listener_activates_plugin_config_and_clears_on_shutdown() { wait_for_gateway(&url).await; assert!(nemo_flow::plugin::active_plugin_report().is_some()); - let client = reqwest::Client::new(); + let client = test_http_client(); for hook_event_name in ["on_session_start", "on_session_finalize"] { let response = client .post(format!("{url}/hooks/hermes")) @@ -253,7 +258,7 @@ async fn serve_listener_observability_plugin_records_non_hermes_hooks() { tokio::spawn(async move { serve_listener(listener, config, Some(shutdown_rx)).await }); wait_for_gateway(&url).await; - let client = reqwest::Client::new(); + let client = test_http_client(); for (path, session_id, start_event, end_event) in [ ( "/hooks/codex", @@ -332,7 +337,7 @@ async fn serve_listener_activates_any_registered_plugin_kind() { wait_for_gateway(&url).await; assert_eq!(GENERIC_TEST_PLUGIN_REGISTRATIONS.load(Ordering::SeqCst), 1); - let response = reqwest::Client::new() + let response = test_http_client() .post(format!("{url}/hooks/codex")) .json(&json!({ "session_id": "generic-plugin-session", @@ -727,7 +732,7 @@ async fn gateway_forwards_anthropic_count_tokens_without_llm_codec() { } async fn wait_for_gateway(url: &str) { - let client = reqwest::Client::new(); + let client = test_http_client(); for _ in 0..50 { if let Ok(response) = client.get(format!("{url}/healthz")).send().await && response.status().is_success() diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 5818924f..3501448d 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -24,6 +24,8 @@ otel = [ "dep:opentelemetry-http", "dep:opentelemetry-otlp", "dep:opentelemetry_sdk", + "dep:reqwest", + "dep:rustls", "dep:tonic", "dep:web-sys", "dep:wasm-bindgen", @@ -38,6 +40,8 @@ openinference = [ "dep:opentelemetry-http", "dep:opentelemetry-otlp", "dep:opentelemetry_sdk", + "dep:reqwest", + "dep:rustls", "dep:tonic", "dep:web-sys", "dep:wasm-bindgen", @@ -104,5 +108,7 @@ path = "tests/integration/api_surface_tests.rs" opentelemetry-otlp = { version = "0.31.1", default-features = false, features = ["trace", "http-proto"], optional = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -opentelemetry-otlp = { version = "0.31.1", default-features = false, features = ["trace", "http-proto", "reqwest-blocking-client", "reqwest-rustls", "grpc-tonic"], optional = true } +opentelemetry-otlp = { version = "0.31.1", default-features = false, features = ["trace", "http-proto", "reqwest-blocking-client", "grpc-tonic"], optional = true } +reqwest = { version = "0.12", default-features = false, features = ["rustls-tls-native-roots-no-provider"], optional = true } +rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"], optional = true } tonic = { version = "0.14.1", default-features = false, optional = true } diff --git a/crates/core/src/observability/openinference.rs b/crates/core/src/observability/openinference.rs index 3146d16a..5c3e11ec 100644 --- a/crates/core/src/observability/openinference.rs +++ b/crates/core/src/observability/openinference.rs @@ -377,6 +377,8 @@ fn http_error(message: impl Into) -> HttpError { fn build_tracer_provider(config: &OpenInferenceConfig) -> Result { let exporter = match config.transport { OtlpTransport::HttpBinary => { + #[cfg(not(target_arch = "wasm32"))] + install_rustls_crypto_provider(); let mut builder = SpanExporter::builder() .with_http() .with_protocol(Protocol::HttpBinary) @@ -458,6 +460,11 @@ fn build_tracer_provider(config: &OpenInferenceConfig) -> Result) -> Result { let mut metadata = MetadataMap::new(); diff --git a/crates/core/src/observability/otel.rs b/crates/core/src/observability/otel.rs index 992619ee..96a28b3e 100644 --- a/crates/core/src/observability/otel.rs +++ b/crates/core/src/observability/otel.rs @@ -375,6 +375,8 @@ fn http_error(message: impl Into) -> HttpError { fn build_tracer_provider(config: &OpenTelemetryConfig) -> Result { let exporter = match config.transport { OtlpTransport::HttpBinary => { + #[cfg(not(target_arch = "wasm32"))] + install_rustls_crypto_provider(); let mut builder = SpanExporter::builder() .with_http() .with_protocol(Protocol::HttpBinary) @@ -455,6 +457,11 @@ fn build_tracer_provider(config: &OpenTelemetryConfig) -> Result) -> Result { let mut metadata = MetadataMap::new(); diff --git a/integrations/openclaw/package.json b/integrations/openclaw/package.json index ce4fcb9d..bbeb6394 100644 --- a/integrations/openclaw/package.json +++ b/integrations/openclaw/package.json @@ -37,12 +37,12 @@ "./dist/index.js" ], "compat": { - "pluginApi": ">=2026.5.6", - "minGatewayVersion": "2026.5.6" + "pluginApi": ">=2026.5.12", + "minGatewayVersion": "2026.5.12" }, "build": { - "openclawVersion": "2026.5.6", - "pluginSdkVersion": "2026.5.6" + "openclawVersion": "2026.5.12", + "pluginSdkVersion": "2026.5.12" } }, "scripts": { @@ -55,7 +55,7 @@ "test:live": "npm run build:test && node scripts/test-live.mjs" }, "peerDependencies": { - "openclaw": ">=2026.5.6" + "openclaw": ">=2026.5.12" }, "dependencies": { "nemo-flow-node": "0.2.0" diff --git a/integrations/openclaw/src/openclaw-hook-types.ts b/integrations/openclaw/src/openclaw-hook-types.ts index f50fda81..eb745ae6 100644 --- a/integrations/openclaw/src/openclaw-hook-types.ts +++ b/integrations/openclaw/src/openclaw-hook-types.ts @@ -4,7 +4,7 @@ /** * Structural OpenClaw hook payload types consumed by this plugin. * - * OpenClaw 2026.5.6 does not expose these hook contracts through a public package + * OpenClaw 2026.5.12 does not expose these hook contracts through a public package * subpath. Keep these aliases structural and remove them once OpenClaw exports * stable plugin hook types. */ @@ -109,7 +109,7 @@ export type PluginHookSessionEndEvent = { sessionKey?: string; messageCount: number; durationMs?: number; - reason?: "new" | "reset" | "idle" | "daily" | "compaction" | "deleted" | "unknown"; + reason?: "new" | "reset" | "idle" | "daily" | "compaction" | "deleted" | "shutdown" | "restart" | "unknown"; sessionFile?: string; transcriptArchived?: boolean; nextSessionId?: string; diff --git a/package-lock.json b/package-lock.json index 1d778347..8d3458f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -845,7 +845,7 @@ "typescript": "^5.8.2" }, "peerDependencies": { - "openclaw": ">=2026.5.6" + "openclaw": ">=2026.5.12" } }, "node_modules/@agentclientprotocol/sdk": { @@ -859,9 +859,9 @@ } }, "node_modules/@anthropic-ai/sdk": { - "version": "0.93.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.93.0.tgz", - "integrity": "sha512-q9vaSZQVFx6B/gPxetGYfLXSJD5v0sOmh0OpZDq7yCrTSA+Rscvrtyol7JJTW40wEpQB4U1B4JXzxQitbQ3CAA==", + "version": "0.91.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz", + "integrity": "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==", "license": "MIT", "peer": true, "dependencies": { @@ -879,17 +879,6 @@ } } }, - "node_modules/@anthropic-ai/vertex-sdk": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/vertex-sdk/-/vertex-sdk-0.16.0.tgz", - "integrity": "sha512-ntxemtRkwPsjVzGQJsmBPRW38tfas6VuVlD1v6pHffDJKLPtCdaiN9KUQeraJ/F34tjxEWlsaCnl3t/orJm1Xw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@anthropic-ai/sdk": ">=0.50.3 <1", - "google-auth-library": "^9.4.2" - } - }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -921,20 +910,6 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", @@ -972,176 +947,34 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-bedrock": { - "version": "3.1042.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock/-/client-bedrock-3.1042.0.tgz", - "integrity": "sha512-oEVjGU8wgW+eTF7ApdRU4jTs/iMVl4OdfpLmiNLuB082UVxxN/fQ5GIX2Ktbyt+x0mPlI3fug36XnOyf7oCo+Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/credential-provider-node": "^3.972.39", - "@aws-sdk/middleware-host-header": "^3.972.10", - "@aws-sdk/middleware-logger": "^3.972.10", - "@aws-sdk/middleware-recursion-detection": "^3.972.11", - "@aws-sdk/middleware-user-agent": "^3.972.38", - "@aws-sdk/region-config-resolver": "^3.972.13", - "@aws-sdk/token-providers": "3.1042.0", - "@aws-sdk/types": "^3.973.8", - "@aws-sdk/util-endpoints": "^3.996.8", - "@aws-sdk/util-user-agent-browser": "^3.972.10", - "@aws-sdk/util-user-agent-node": "^3.973.24", - "@smithy/config-resolver": "^4.4.17", - "@smithy/core": "^3.23.17", - "@smithy/fetch-http-handler": "^5.3.17", - "@smithy/hash-node": "^4.2.14", - "@smithy/invalid-dependency": "^4.2.14", - "@smithy/middleware-content-length": "^4.2.14", - "@smithy/middleware-endpoint": "^4.4.32", - "@smithy/middleware-retry": "^4.5.7", - "@smithy/middleware-serde": "^4.2.20", - "@smithy/middleware-stack": "^4.2.14", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/node-http-handler": "^4.6.1", - "@smithy/protocol-http": "^5.3.14", - "@smithy/smithy-client": "^4.12.13", - "@smithy/types": "^4.14.1", - "@smithy/url-parser": "^4.2.14", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.49", - "@smithy/util-defaults-mode-node": "^4.2.54", - "@smithy/util-endpoints": "^3.4.2", - "@smithy/util-middleware": "^4.2.14", - "@smithy/util-retry": "^4.3.6", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@aws-sdk/client-bedrock-runtime": { - "version": "3.1042.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1042.0.tgz", - "integrity": "sha512-uYJ/HDSQvorlgYqZSwRFGolEx5wygqyuBRfemXJ3Bla2yiRj9maSVOvWP88i/hDC2BKoH6NQw8GPB9Z4RYAnwQ==", + "version": "3.1047.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1047.0.tgz", + "integrity": "sha512-b9yUBRqYQ9ADb1ta8nLXKby9pWo0lKozsauPeAT3IemBfReoY7PG7bSqGCoXkljL/H2mjBQXAbMinPaw6xhigA==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/credential-provider-node": "^3.972.39", - "@aws-sdk/eventstream-handler-node": "^3.972.14", - "@aws-sdk/middleware-eventstream": "^3.972.10", - "@aws-sdk/middleware-host-header": "^3.972.10", + "@aws-sdk/core": "^3.974.10", + "@aws-sdk/credential-provider-node": "^3.972.41", + "@aws-sdk/eventstream-handler-node": "^3.972.15", + "@aws-sdk/middleware-eventstream": "^3.972.11", + "@aws-sdk/middleware-host-header": "^3.972.11", "@aws-sdk/middleware-logger": "^3.972.10", - "@aws-sdk/middleware-recursion-detection": "^3.972.11", - "@aws-sdk/middleware-user-agent": "^3.972.38", - "@aws-sdk/middleware-websocket": "^3.972.16", - "@aws-sdk/region-config-resolver": "^3.972.13", - "@aws-sdk/token-providers": "3.1042.0", + "@aws-sdk/middleware-recursion-detection": "^3.972.12", + "@aws-sdk/middleware-user-agent": "^3.972.40", + "@aws-sdk/middleware-websocket": "^3.972.18", + "@aws-sdk/region-config-resolver": "^3.972.14", + "@aws-sdk/token-providers": "3.1047.0", "@aws-sdk/types": "^3.973.8", - "@aws-sdk/util-endpoints": "^3.996.8", - "@aws-sdk/util-user-agent-browser": "^3.972.10", - "@aws-sdk/util-user-agent-node": "^3.973.24", - "@smithy/config-resolver": "^4.4.17", - "@smithy/core": "^3.23.17", - "@smithy/eventstream-serde-browser": "^4.2.14", - "@smithy/eventstream-serde-config-resolver": "^4.3.14", - "@smithy/eventstream-serde-node": "^4.2.14", - "@smithy/fetch-http-handler": "^5.3.17", - "@smithy/hash-node": "^4.2.14", - "@smithy/invalid-dependency": "^4.2.14", - "@smithy/middleware-content-length": "^4.2.14", - "@smithy/middleware-endpoint": "^4.4.32", - "@smithy/middleware-retry": "^4.5.7", - "@smithy/middleware-serde": "^4.2.20", - "@smithy/middleware-stack": "^4.2.14", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/node-http-handler": "^4.6.1", - "@smithy/protocol-http": "^5.3.14", - "@smithy/smithy-client": "^4.12.13", + "@aws-sdk/util-endpoints": "^3.996.9", + "@aws-sdk/util-user-agent-browser": "^3.972.11", + "@aws-sdk/util-user-agent-node": "^3.973.26", + "@smithy/core": "^3.24.1", + "@smithy/fetch-http-handler": "^5.4.1", + "@smithy/node-http-handler": "^4.7.1", "@smithy/types": "^4.14.1", - "@smithy/url-parser": "^4.2.14", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.49", - "@smithy/util-defaults-mode-node": "^4.2.54", - "@smithy/util-endpoints": "^3.4.2", - "@smithy/util-middleware": "^4.2.14", - "@smithy/util-retry": "^4.3.6", - "@smithy/util-stream": "^4.5.25", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.1045.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1045.0.tgz", - "integrity": "sha512-3OEn8zvtfJoN0jFfjVJ9jF2GVRDL3IjDfk6CAgVTAqjfCVjajiUD0iFAGQ4cOzdcv1LGsZ0b/snJDWalY3OePQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/credential-provider-node": "^3.972.39", - "@aws-sdk/middleware-host-header": "^3.972.10", - "@aws-sdk/middleware-logger": "^3.972.10", - "@aws-sdk/middleware-recursion-detection": "^3.972.11", - "@aws-sdk/middleware-user-agent": "^3.972.38", - "@aws-sdk/region-config-resolver": "^3.972.13", - "@aws-sdk/types": "^3.973.8", - "@aws-sdk/util-endpoints": "^3.996.8", - "@aws-sdk/util-user-agent-browser": "^3.972.10", - "@aws-sdk/util-user-agent-node": "^3.973.24", - "@smithy/config-resolver": "^4.4.17", - "@smithy/core": "^3.23.17", - "@smithy/fetch-http-handler": "^5.3.17", - "@smithy/hash-node": "^4.2.14", - "@smithy/invalid-dependency": "^4.2.14", - "@smithy/middleware-content-length": "^4.2.14", - "@smithy/middleware-endpoint": "^4.4.32", - "@smithy/middleware-retry": "^4.5.7", - "@smithy/middleware-serde": "^4.2.20", - "@smithy/middleware-stack": "^4.2.14", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/node-http-handler": "^4.6.1", - "@smithy/protocol-http": "^5.3.14", - "@smithy/smithy-client": "^4.12.13", - "@smithy/types": "^4.14.1", - "@smithy/url-parser": "^4.2.14", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.49", - "@smithy/util-defaults-mode-node": "^4.2.54", - "@smithy/util-endpoints": "^3.4.2", - "@smithy/util-middleware": "^4.2.14", - "@smithy/util-retry": "^4.3.6", - "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1149,41 +982,16 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.974.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.8.tgz", - "integrity": "sha512-njR2qoG6ZuB0kvAS2FyICsFZJ6gmCcf2X/7JcD14sUvGDm26wiZ5BrA6LOiUxKFEF+IVe7kdroxyE00YlkiYsw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/types": "^3.973.8", - "@aws-sdk/xml-builder": "^3.972.22", - "@smithy/core": "^3.23.17", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/property-provider": "^4.2.14", - "@smithy/protocol-http": "^5.3.14", - "@smithy/signature-v4": "^5.3.14", - "@smithy/smithy-client": "^4.12.13", - "@smithy/types": "^4.14.1", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-middleware": "^4.2.14", - "@smithy/util-retry": "^4.3.6", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.972.31", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.31.tgz", - "integrity": "sha512-W5JtzDp3ejzhOOknXlnt+vJsNN2GZdAcBK+hR7HQ1DCacXqS0UpmnIyihIU7CK0IB+XYWeBaN3bBv4pXavp7Vg==", + "version": "3.974.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.10.tgz", + "integrity": "sha512-ZGFFlYynBR78Y/F8b/7y4i4sgW/iGwJSjoM7AZo5Et6vyr4/L0bunN+uzKMsvecCZyqcPp4RRK7Rs17l0kMujg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/nested-clients": "^3.997.6", "@aws-sdk/types": "^3.973.8", - "@smithy/property-provider": "^4.2.14", + "@aws-sdk/xml-builder": "^3.972.24", + "@smithy/core": "^3.24.1", + "@smithy/signature-v4": "^5.4.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1192,15 +1000,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.34", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.34.tgz", - "integrity": "sha512-XT0jtf8Fw9JE6ppsQeoNnZRiG+jqRixMT1v1ZR17G60UvVdsQmTG8nbEyHuEPfMxDXEhfdARaM/XiEhca4lGHQ==", + "version": "3.972.36", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.36.tgz", + "integrity": "sha512-gE+CGuPZD1eqUWGSrM8CXDjlwuPujIuwI+IlorD1wE2RcANKKT4jscB9GY1nTJbjmXzD18sycsYbgCG5m3n4/g==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.974.8", + "@aws-sdk/core": "^3.974.10", "@aws-sdk/types": "^3.973.8", - "@smithy/property-provider": "^4.2.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1209,21 +1017,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.36", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.36.tgz", - "integrity": "sha512-DPoGWfy7J7RKxvbf5kOKIGQkD2ek3dbKgzKIGrnLuvZBz5myU+Im/H6pmc14QcnFbqHMqxvtWSgRDSJW3qXLQg==", + "version": "3.972.38", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.38.tgz", + "integrity": "sha512-cHZo3bV6zN9joDQ2AYVctfzHTKStxWKwnGu0z7GwCUC+DAtB3qL/+26l+a63RbmFbVvb1JK+0vJKodN3hRMwyw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.974.8", + "@aws-sdk/core": "^3.974.10", "@aws-sdk/types": "^3.973.8", - "@smithy/fetch-http-handler": "^5.3.17", - "@smithy/node-http-handler": "^4.6.1", - "@smithy/property-provider": "^4.2.14", - "@smithy/protocol-http": "^5.3.14", - "@smithy/smithy-client": "^4.12.13", + "@smithy/core": "^3.24.1", + "@smithy/fetch-http-handler": "^5.4.1", + "@smithy/node-http-handler": "^4.7.1", "@smithy/types": "^4.14.1", - "@smithy/util-stream": "^4.5.25", "tslib": "^2.6.2" }, "engines": { @@ -1231,24 +1036,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.38.tgz", - "integrity": "sha512-oDzUBu2MGJFgoar05sPMCwSrhw44ASyccrHzj66vO69OZqi7I6hZZxXfuPLC8OCzW7C+sU+bI73XHij41yekgQ==", + "version": "3.972.40", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.40.tgz", + "integrity": "sha512-0NFGS9I3PD2yMveQqqpwpRdyZVStzgk0Yr2rZHh80kV/QNqQCK5lSrksvU3nBcRNSUF5Uk8rL3Xk0EVR+UVAnA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/credential-provider-env": "^3.972.34", - "@aws-sdk/credential-provider-http": "^3.972.36", - "@aws-sdk/credential-provider-login": "^3.972.38", - "@aws-sdk/credential-provider-process": "^3.972.34", - "@aws-sdk/credential-provider-sso": "^3.972.38", - "@aws-sdk/credential-provider-web-identity": "^3.972.38", - "@aws-sdk/nested-clients": "^3.997.6", + "@aws-sdk/core": "^3.974.10", + "@aws-sdk/credential-provider-env": "^3.972.36", + "@aws-sdk/credential-provider-http": "^3.972.38", + "@aws-sdk/credential-provider-login": "^3.972.40", + "@aws-sdk/credential-provider-process": "^3.972.36", + "@aws-sdk/credential-provider-sso": "^3.972.40", + "@aws-sdk/credential-provider-web-identity": "^3.972.40", + "@aws-sdk/nested-clients": "^3.997.8", "@aws-sdk/types": "^3.973.8", - "@smithy/credential-provider-imds": "^4.2.14", - "@smithy/property-provider": "^4.2.14", - "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/core": "^3.24.1", + "@smithy/credential-provider-imds": "^4.3.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1257,18 +1061,16 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.38.tgz", - "integrity": "sha512-g1NosS8qe4OF++G2UFCM5ovSkgipC7YYor5KCWatG0UoMSO5YFj9C8muePlyVmOBV/WTI16Jo3/s1NUo/o1Bww==", + "version": "3.972.40", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.40.tgz", + "integrity": "sha512-IEIl+UQnrEjZP53TSl91e8LBephi4i1Mt9WZrMgN8pOg6xPOLZdkN1GhsEzjkMD1TQy4Fp2dwWA/9ToTQFOlLA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/nested-clients": "^3.997.6", + "@aws-sdk/core": "^3.974.10", + "@aws-sdk/nested-clients": "^3.997.8", "@aws-sdk/types": "^3.973.8", - "@smithy/property-provider": "^4.2.14", - "@smithy/protocol-http": "^5.3.14", - "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1277,22 +1079,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.39", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.39.tgz", - "integrity": "sha512-HEswDQyxUtadoZ/bJsPPENHg7R0Lzym5LuMksJeHvqhCOpP+rtkDLKI4/ZChH4w3cf5kG8n6bZuI8PzajoiqMg==", + "version": "3.972.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.41.tgz", + "integrity": "sha512-h6BlclpsPGkx7Pv7ukr8oKVqN3jvxnH5n9ZIUQa8focr1ZkKd2MYiPJ2Nv9GI97dohJVJBfZAsTp/qoZL5R1pw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.34", - "@aws-sdk/credential-provider-http": "^3.972.36", - "@aws-sdk/credential-provider-ini": "^3.972.38", - "@aws-sdk/credential-provider-process": "^3.972.34", - "@aws-sdk/credential-provider-sso": "^3.972.38", - "@aws-sdk/credential-provider-web-identity": "^3.972.38", + "@aws-sdk/credential-provider-env": "^3.972.36", + "@aws-sdk/credential-provider-http": "^3.972.38", + "@aws-sdk/credential-provider-ini": "^3.972.40", + "@aws-sdk/credential-provider-process": "^3.972.36", + "@aws-sdk/credential-provider-sso": "^3.972.40", + "@aws-sdk/credential-provider-web-identity": "^3.972.40", "@aws-sdk/types": "^3.973.8", - "@smithy/credential-provider-imds": "^4.2.14", - "@smithy/property-provider": "^4.2.14", - "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/core": "^3.24.1", + "@smithy/credential-provider-imds": "^4.3.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1301,16 +1102,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.34", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.34.tgz", - "integrity": "sha512-T3IFs4EVmVi1dVN5RciFnklCANSzvrQd/VuHY9ThHSQmYkTogjcGkoJEr+oNUPQZnso52183088NqysMPji1/Q==", + "version": "3.972.36", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.36.tgz", + "integrity": "sha512-eDQ6X7clTAOxXegOx4rGT1hyfusGEYdJGCGo0Ym2+CKeMQBjk+SJSxSVev11NJew5xJHJ/c3hryl2awKaxuSEA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.974.8", + "@aws-sdk/core": "^3.974.10", "@aws-sdk/types": "^3.973.8", - "@smithy/property-provider": "^4.2.14", - "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1319,37 +1119,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.38.tgz", - "integrity": "sha512-5ZxG+t0+3Q3QPh8KEjX6syskhgNf7I0MN7oGioTf6Lm1NTjfP7sIcYGNsthXC2qR8vcD3edNZwCr2ovfSSWuRA==", + "version": "3.972.40", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.40.tgz", + "integrity": "sha512-jaABbsoOkGlKg5kaHetYmUV6mWM57H89ia0Yksom1XxC847mfjmEVb4p7VijS1sjPbXjUii4cftJuwsl4MXkRg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/nested-clients": "^3.997.6", - "@aws-sdk/token-providers": "3.1041.0", + "@aws-sdk/core": "^3.974.10", + "@aws-sdk/nested-clients": "^3.997.8", + "@aws-sdk/token-providers": "3.1047.0", "@aws-sdk/types": "^3.973.8", - "@smithy/property-provider": "^4.2.14", - "@smithy/shared-ini-file-loader": "^4.4.9", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { - "version": "3.1041.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1041.0.tgz", - "integrity": "sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/nested-clients": "^3.997.6", - "@aws-sdk/types": "^3.973.8", - "@smithy/property-provider": "^4.2.14", - "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1358,49 +1138,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.38.tgz", - "integrity": "sha512-lYHFF30DGI20jZcYX8cm6Ns0V7f1dDN6g/MBDLTyD/5iw+bXs3yBr2iAiHDkx4RFU5JgsnZvCHYKiRVPRdmOgw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/nested-clients": "^3.997.6", - "@aws-sdk/types": "^3.973.8", - "@smithy/property-provider": "^4.2.14", - "@smithy/shared-ini-file-loader": "^4.4.9", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.1045.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.1045.0.tgz", - "integrity": "sha512-J+it58HUGyMIAquB6pWtvmO4m0E/gQ/Tz9Xcoogk3Rety13likU5U8HioeIgE+aN1DDOAB//MARoIdLZS1Mpfw==", + "version": "3.972.40", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.40.tgz", + "integrity": "sha512-bfIrM8IIzbRtXRQWx/vNEUBLTImLZyX5uKk8uSdeSAZ4Mj3Yi4UnRJLK4FkQLWErbM3McpVLQ1DaM6XO66Ed5g==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.1045.0", - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/credential-provider-cognito-identity": "^3.972.31", - "@aws-sdk/credential-provider-env": "^3.972.34", - "@aws-sdk/credential-provider-http": "^3.972.36", - "@aws-sdk/credential-provider-ini": "^3.972.38", - "@aws-sdk/credential-provider-login": "^3.972.38", - "@aws-sdk/credential-provider-node": "^3.972.39", - "@aws-sdk/credential-provider-process": "^3.972.34", - "@aws-sdk/credential-provider-sso": "^3.972.38", - "@aws-sdk/credential-provider-web-identity": "^3.972.38", - "@aws-sdk/nested-clients": "^3.997.6", + "@aws-sdk/core": "^3.974.10", + "@aws-sdk/nested-clients": "^3.997.8", "@aws-sdk/types": "^3.973.8", - "@smithy/config-resolver": "^4.4.17", - "@smithy/core": "^3.23.17", - "@smithy/credential-provider-imds": "^4.2.14", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/property-provider": "^4.2.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1409,14 +1156,14 @@ } }, "node_modules/@aws-sdk/eventstream-handler-node": { - "version": "3.972.14", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.14.tgz", - "integrity": "sha512-m4X56gxG76/CKfxNVbOFuYwnAZcHgS6HOH8lgp15HoGHIAVTcZfZrXvcYzJFOMLEJgVn+JHBu6EiNV+xSNXXFg==", + "version": "3.972.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.15.tgz", + "integrity": "sha512-Al7z1qKPUIRILnB3Ggd1Tz88wjSkQjDErajR7YY33mquTbeN0gTDtJtclNtyhQMWr7ZRpQk0v5/xop4fjT0sug==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-sdk/types": "^3.973.8", - "@smithy/eventstream-codec": "^4.2.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1425,14 +1172,14 @@ } }, "node_modules/@aws-sdk/middleware-eventstream": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.10.tgz", - "integrity": "sha512-QUqLs7Af1II9X4fCRAu+EGHG3KHyOp4RkuLhRKoA3NuFlh6TL8i+zXBl8w2LUxqm44B/Kom45hgSlwA1SpTsXQ==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.11.tgz", + "integrity": "sha512-A0Z45YInBwsAabF8jf9hEQjXDuq4gFHNNqxCYuk8iREFZ7hw0NZ6+7FFlYa11gJ+i6y79C4J6giQ7fa1EDRYxw==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-sdk/types": "^3.973.8", - "@smithy/protocol-http": "^5.3.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1441,14 +1188,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.10.tgz", - "integrity": "sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.11.tgz", + "integrity": "sha512-CBC6+tVYaOJo7QXgN1zJ4Ba2f3/Cpy4eRViYFimXW/O5Mn8hBmgXXzHu4vy4ubT80YWnp8aCFygr7dTOa14yQg==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-sdk/types": "^3.973.8", - "@smithy/protocol-http": "^5.3.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1472,42 +1219,16 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.11", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.11.tgz", - "integrity": "sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==", + "version": "3.972.12", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.12.tgz", + "integrity": "sha512-5eltYxKB4MfdQv7/VhWxRbAVQKow5dz9votRFigTYrWJHMQXwLMltlbk7KFWSZh5NDBySfmjT7Jv/DWfYCmDng==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-sdk/types": "^3.973.8", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.14", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.37", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.37.tgz", - "integrity": "sha512-Km7M+i8DrLArVzrid1gfxeGhYHBd3uxvE77g0s5a52zPSVosxzQBnJ0gwWb6NIp/DOk8gsBMhi7V+cpJG0ndTA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/types": "^3.973.8", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.17", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/protocol-http": "^5.3.14", - "@smithy/signature-v4": "^5.3.14", - "@smithy/smithy-client": "^4.12.13", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.14", - "@smithy/util-stream": "^4.5.25", - "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1515,19 +1236,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.38.tgz", - "integrity": "sha512-iz+B29TXcAZsJpwB+AwG/TTGA5l/VnmMZ2UxtiySOZjI6gCdmviXPwdgzcmuazMy16rXoPY4mYCGe7zdNKfx5A==", + "version": "3.972.40", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.40.tgz", + "integrity": "sha512-QLpD+HNQtL1Mc49/GRa6RmZvi/TEYBWPevC9F3L+j96IoG3xOSRctdQfbkX0lETb3TX9QQXU1oGYDmAB+YJprA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.974.8", + "@aws-sdk/core": "^3.974.10", "@aws-sdk/types": "^3.973.8", - "@aws-sdk/util-endpoints": "^3.996.8", - "@smithy/core": "^3.23.17", - "@smithy/protocol-http": "^5.3.14", + "@aws-sdk/util-endpoints": "^3.996.9", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", - "@smithy/util-retry": "^4.3.6", "tslib": "^2.6.2" }, "engines": { @@ -1535,23 +1254,18 @@ } }, "node_modules/@aws-sdk/middleware-websocket": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.16.tgz", - "integrity": "sha512-86+S9oCyRVGzoMRpQhxkArp7kD2K75GPmaNevd9B6EyNhWoNvnCZZ3WbgN4j7ZT+jvtvBCGZvI2XHsWZJ+BRIg==", + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.18.tgz", + "integrity": "sha512-MlaAUTAoUYDjHpRJULrxwA13guIknZG540ae3xsJIQT7m63lkmCPtuaVnWV8W5SpPSElvmI94+Q4LrMjNuJEUA==", "license": "Apache-2.0", "peer": true, "dependencies": { + "@aws-sdk/core": "^3.974.10", "@aws-sdk/types": "^3.973.8", - "@aws-sdk/util-format-url": "^3.972.10", - "@smithy/eventstream-codec": "^4.2.14", - "@smithy/eventstream-serde-browser": "^4.2.14", - "@smithy/fetch-http-handler": "^5.3.17", - "@smithy/protocol-http": "^5.3.14", - "@smithy/signature-v4": "^5.3.14", + "@smithy/core": "^3.24.1", + "@smithy/fetch-http-handler": "^5.4.1", + "@smithy/signature-v4": "^5.4.1", "@smithy/types": "^4.14.1", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1559,50 +1273,29 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.997.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.6.tgz", - "integrity": "sha512-WBDnqatJl+kGObpfmfSxqnXeYTu3Me8wx8WCtvoxX3pfWrrTv8I4WTMSSs7PZqcRcVh8WeUKMgGFjMG+52SR1w==", + "version": "3.997.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.8.tgz", + "integrity": "sha512-/Vw2M27w+0APfMDzDpvv8auA4WiJ4D22+lC61pMS2M8Wk+4IydeRqh5utbrh+A5gQRxgUYd/xz3tdv8nQlmiHg==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/middleware-host-header": "^3.972.10", + "@aws-sdk/core": "^3.974.10", + "@aws-sdk/middleware-host-header": "^3.972.11", "@aws-sdk/middleware-logger": "^3.972.10", - "@aws-sdk/middleware-recursion-detection": "^3.972.11", - "@aws-sdk/middleware-user-agent": "^3.972.38", - "@aws-sdk/region-config-resolver": "^3.972.13", - "@aws-sdk/signature-v4-multi-region": "^3.996.25", + "@aws-sdk/middleware-recursion-detection": "^3.972.12", + "@aws-sdk/middleware-user-agent": "^3.972.40", + "@aws-sdk/region-config-resolver": "^3.972.14", + "@aws-sdk/signature-v4-multi-region": "^3.996.26", "@aws-sdk/types": "^3.973.8", - "@aws-sdk/util-endpoints": "^3.996.8", - "@aws-sdk/util-user-agent-browser": "^3.972.10", - "@aws-sdk/util-user-agent-node": "^3.973.24", - "@smithy/config-resolver": "^4.4.17", - "@smithy/core": "^3.23.17", - "@smithy/fetch-http-handler": "^5.3.17", - "@smithy/hash-node": "^4.2.14", - "@smithy/invalid-dependency": "^4.2.14", - "@smithy/middleware-content-length": "^4.2.14", - "@smithy/middleware-endpoint": "^4.4.32", - "@smithy/middleware-retry": "^4.5.7", - "@smithy/middleware-serde": "^4.2.20", - "@smithy/middleware-stack": "^4.2.14", - "@smithy/node-config-provider": "^4.3.14", - "@smithy/node-http-handler": "^4.6.1", - "@smithy/protocol-http": "^5.3.14", - "@smithy/smithy-client": "^4.12.13", + "@aws-sdk/util-endpoints": "^3.996.9", + "@aws-sdk/util-user-agent-browser": "^3.972.11", + "@aws-sdk/util-user-agent-node": "^3.973.26", + "@smithy/core": "^3.24.1", + "@smithy/fetch-http-handler": "^5.4.1", + "@smithy/node-http-handler": "^4.7.1", "@smithy/types": "^4.14.1", - "@smithy/url-parser": "^4.2.14", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.49", - "@smithy/util-defaults-mode-node": "^4.2.54", - "@smithy/util-endpoints": "^3.4.2", - "@smithy/util-middleware": "^4.2.14", - "@smithy/util-retry": "^4.3.6", - "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1610,15 +1303,14 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.13", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.13.tgz", - "integrity": "sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==", + "version": "3.972.14", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.14.tgz", + "integrity": "sha512-VuLXVmm7+lKVxqFcOItPkXhjbJ02iUfxkxheRu41SfWf6/xrZup2A2SwHZos/LeQGu3SBHeqTQht80Uo3ienPA==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-sdk/types": "^3.973.8", - "@smithy/config-resolver": "^4.4.17", - "@smithy/node-config-provider": "^4.3.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1627,16 +1319,15 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.25", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.25.tgz", - "integrity": "sha512-+CMIt3e1VzlklAECmG+DtP1sV8iKq25FuA0OKpnJ4KA0kxUtd7CgClY7/RU6VzJBQwbN4EJ9Ue6plvqx1qGadw==", + "version": "3.996.26", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.26.tgz", + "integrity": "sha512-2N62veqdMZBCwQUHsbhtnaovOFjOa5Dn3dAD1nRqFTUXR4QmirT3HZnfus/L1DS08Vm5CkoKmL0iMVt6YbqEag==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.37", "@aws-sdk/types": "^3.973.8", - "@smithy/protocol-http": "^5.3.14", - "@smithy/signature-v4": "^5.3.14", + "@smithy/core": "^3.24.1", + "@smithy/signature-v4": "^5.4.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1645,17 +1336,16 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1042.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1042.0.tgz", - "integrity": "sha512-rOEGTVOrceb/1CfIWK0zl1v2WS70f/i5bDirLl5xdFAbVQ5znub6Ezf2ugmJEg+rionO0IkwbKX3Dh3T/oZjbA==", + "version": "3.1047.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1047.0.tgz", + "integrity": "sha512-GwJUeMijpeO2SOGGLRg4q2Nj9foBUBd7hTALYVId+m8fQmA4P2hITp5dmrZFd4AjEkSVmt2eFqmk3TttF7HZeQ==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.974.8", - "@aws-sdk/nested-clients": "^3.997.6", + "@aws-sdk/core": "^3.974.10", + "@aws-sdk/nested-clients": "^3.997.8", "@aws-sdk/types": "^3.973.8", - "@smithy/property-provider": "^4.2.14", - "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1677,45 +1367,15 @@ "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.8.tgz", - "integrity": "sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/types": "^3.973.8", - "@smithy/types": "^4.14.1", - "@smithy/url-parser": "^4.2.14", - "@smithy/util-endpoints": "^3.4.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-format-url": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.10.tgz", - "integrity": "sha512-DEKiHNJVtNxdyTeQspzY+15Po/kHm6sF0Cs4HV9Q2+lplB63+DrvdeiSoOSdWEWAoO2RcY1veoXVDz2tWxWCgQ==", + "version": "3.996.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.9.tgz", + "integrity": "sha512-ibx8Vd73rCTHekNGeXX8cpGWoBKbNAlwKHL3yjSxxttu5QnNDaSAM7/0MFYDjU31/F4lyrPoQcGirT0ew61xcg==", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-sdk/types": "^3.973.8", - "@smithy/querystring-builder": "^4.2.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, @@ -1737,9 +1397,9 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.10.tgz", - "integrity": "sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.11.tgz", + "integrity": "sha512-kq3RS6XQtHMrLFShbkem6h+8fxazB3jEIsbMC6aaSInOciRGE+eGAqTgJ+obO7Euo/pjM8thVqLiLISEH9X9DA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -1750,17 +1410,16 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.973.24", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.24.tgz", - "integrity": "sha512-ZWwlkjcIp7cEL8ZfTpTAPNkwx25p7xol0xlKoWVVf22+nsjwmLcHYtTPjIV1cSpmB/b6DaK4cb1fSkvCXHgRdw==", + "version": "3.973.26", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.26.tgz", + "integrity": "sha512-9bHR/EERjhrUGyo1qW620ogbGBtCglYB/pEtcm85sVd4/Ah+bwdLI3g1aJf75oNwNwh7+fw+8wOk/OCWHjzVmA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.38", + "@aws-sdk/middleware-user-agent": "^3.972.40", "@aws-sdk/types": "^3.973.8", - "@smithy/node-config-provider": "^4.3.14", + "@smithy/core": "^3.24.1", "@smithy/types": "^4.14.1", - "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1776,42 +1435,21 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.22", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.22.tgz", - "integrity": "sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA==", + "version": "3.972.24", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.24.tgz", + "integrity": "sha512-V8z5YcDPfsvzrBlj0xR1vhRtocblhYbqdreCJB/voGd4Sr5zjNAeWxexbnqVtskTJe0vFb5KMqbSL++ePl+zRw==", "license": "Apache-2.0", "peer": true, "dependencies": { "@nodable/entities": "2.1.0", "@smithy/types": "^4.14.1", - "fast-xml-parser": "5.7.2", + "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws/bedrock-token-generator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@aws/bedrock-token-generator/-/bedrock-token-generator-1.1.0.tgz", - "integrity": "sha512-i+DkWnfdA4j4sffy9dI4k3OGoOWqN8CTGdtO4IZ3c0kpKYFr6KyqzqLQmoRNrF3ACFcWj6u+J6cbBQ97j9wx5w==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/credential-providers": "^3.525.0", - "@aws-sdk/util-format-url": ">=3.525.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/hash-node": ">=2.1.3", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": ">=3.2.1", - "@smithy/signature-v4": ">=2.1.3", - "@smithy/types": ">=2.11.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws/lambda-invoke-store": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", @@ -1873,7 +1511,47 @@ "node": ">= 20.12.0" } }, - "node_modules/@google/genai": { + "node_modules/@earendil-works/pi-agent-core": { + "version": "0.74.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.74.0.tgz", + "integrity": "sha512-6GMR7/wwjEJ1EsXLWEz03QOWin4AMrJ/AZoMpgm5DJ6GHsF6q6GOhQbj5Zip4dow3vo/TmBAVqM+vmGfrjGAFQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@earendil-works/pi-ai": "^0.74.0", + "typebox": "^1.1.24" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-ai": { + "version": "0.74.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.74.0.tgz", + "integrity": "sha512-7M7qcrZY/KEkH4wFkX3eqzvmKru4O88wezNKoN0KD2m4aAOmp9tdW2xCmUgSTSWlKB7b2Xw9QtAgrzHtg6t6iw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@anthropic-ai/sdk": "^0.91.1", + "@aws-sdk/client-bedrock-runtime": "^3.1030.0", + "@google/genai": "^1.40.0", + "@mistralai/mistralai": "^2.2.0", + "chalk": "^5.6.2", + "openai": "6.26.0", + "partial-json": "^0.1.7", + "proxy-agent": "^6.5.0", + "typebox": "^1.1.24", + "undici": "^7.19.1", + "zod-to-json-schema": "^3.24.6" + }, + "bin": { + "pi-ai": "dist/cli.js" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-ai/node_modules/@google/genai": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.52.0.tgz", "integrity": "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==", @@ -1898,7 +1576,7 @@ } } }, - "node_modules/@google/genai/node_modules/agent-base": { + "node_modules/@earendil-works/pi-ai/node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", @@ -1908,75 +1586,61 @@ "node": ">= 14" } }, - "node_modules/@google/genai/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "node_modules/@earendil-works/pi-ai/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "license": "MIT", "peer": true, "engines": { - "node": ">= 12" + "node": ">= 14" } }, - "node_modules/@google/genai/node_modules/gaxios": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", - "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", - "license": "Apache-2.0", + "node_modules/@earendil-works/pi-ai/node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", "peer": true, "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, "engines": { - "node": ">=18" + "node": ">= 14" } }, - "node_modules/@google/genai/node_modules/gcp-metadata": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", - "license": "Apache-2.0", + "node_modules/@earendil-works/pi-ai/node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", "peer": true, "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" }, "engines": { - "node": ">=18" + "node": ">= 14" } }, - "node_modules/@google/genai/node_modules/google-auth-library": { - "version": "10.6.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", - "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", - "license": "Apache-2.0", + "node_modules/@earendil-works/pi-ai/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", "peer": true, "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^7.1.4", - "gcp-metadata": "8.1.2", - "google-logging-utils": "1.1.3", - "jws": "^4.0.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@google/genai/node_modules/google-logging-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=14" + "node": ">= 14" } }, - "node_modules/@google/genai/node_modules/https-proxy-agent": { + "node_modules/@earendil-works/pi-ai/node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", @@ -1990,277 +1654,7 @@ "node": ">= 14" } }, - "node_modules/@google/genai/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "peer": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/@grammyjs/runner": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@grammyjs/runner/-/runner-2.0.3.tgz", - "integrity": "sha512-nckmTs1dPWfVQteK9cxqxzE+0m1VRvluLWB8UgFzsjg62w3qthPJt0TYtJBEdG7OedvfQq4vnFAyE6iaMkR42A==", - "license": "MIT", - "peer": true, - "dependencies": { - "abort-controller": "^3.0.0" - }, - "engines": { - "node": ">=12.20.0 || >=14.13.1" - }, - "peerDependencies": { - "grammy": "^1.13.1" - } - }, - "node_modules/@grammyjs/transformer-throttler": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@grammyjs/transformer-throttler/-/transformer-throttler-1.2.1.tgz", - "integrity": "sha512-CpWB0F3rJdUiKsq7826QhQsxbZi4wqfz1ccKX+fr+AOC+o8K7ZvS+wqX0suSu1QCsyUq2MDpNiKhyL2ZOJUS4w==", - "license": "MIT", - "peer": true, - "dependencies": { - "bottleneck": "^2.0.0" - }, - "engines": { - "node": "^12.20.0 || >=14.13.1" - }, - "peerDependencies": { - "grammy": "^1.0.0" - } - }, - "node_modules/@grammyjs/types": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@grammyjs/types/-/types-3.26.0.tgz", - "integrity": "sha512-jlnyfxfev/2o68HlvAGRocAXgdPPX5QabG7jZlbqC2r9DZyWBfzTlg+nu3O3Fy4EhgLWu28hZ/8wr7DsNamP9A==", - "license": "MIT", - "peer": true - }, - "node_modules/@homebridge/ciao": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.3.8.tgz", - "integrity": "sha512-lNhpCsZVbdbjz2trFjQdzQ3cUIMZQMIMksi7wd3ntTIYgdaGLqT1Ms97DfVIJYHzRuduf56ISvgU8RRLTpK/ng==", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.4.3", - "fast-deep-equal": "^3.1.3", - "source-map-support": "^0.5.21", - "tslib": "^2.8.1" - }, - "bin": { - "ciao-bcs": "lib/bonjour-conformance-testing.js" - } - }, - "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@lydell/node-pty": { - "version": "1.2.0-beta.12", - "resolved": "https://registry.npmjs.org/@lydell/node-pty/-/node-pty-1.2.0-beta.12.tgz", - "integrity": "sha512-qIK890UwPupoj07osVvgOIa++1mxeHbcGry4PKRHhNVNs81V2SCG34eJr46GybiOmBtc8Sj5PB1/GGM5PL549g==", - "license": "MIT", - "peer": true, - "optionalDependencies": { - "@lydell/node-pty-darwin-arm64": "1.2.0-beta.12", - "@lydell/node-pty-darwin-x64": "1.2.0-beta.12", - "@lydell/node-pty-linux-arm64": "1.2.0-beta.12", - "@lydell/node-pty-linux-x64": "1.2.0-beta.12", - "@lydell/node-pty-win32-arm64": "1.2.0-beta.12", - "@lydell/node-pty-win32-x64": "1.2.0-beta.12" - } - }, - "node_modules/@mariozechner/jiti": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@mariozechner/jiti/-/jiti-2.6.5.tgz", - "integrity": "sha512-faGUlTcXka5l7rv0lP3K3vGW/ejRuOS24RR2aSFWREUQqzjgdsuWNo/IiPqL3kWRGt6Ahl2+qcDAwtdeWeuGUw==", - "license": "MIT", - "peer": true, - "dependencies": { - "std-env": "^3.10.0", - "yoctocolors": "^2.1.2" - }, - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/@mariozechner/pi-agent-core": { - "version": "0.73.0", - "resolved": "https://registry.npmjs.org/@mariozechner/pi-agent-core/-/pi-agent-core-0.73.0.tgz", - "integrity": "sha512-ugcpvq0X9fr9fTSK29/3S4+KU/eeVMrBb7ZU3HqiF3xD7I1GlgumLj4FYmDrYSEA6+rzgNWlJUKwjKh9o0Z6AA==", - "deprecated": "please use @earendil-works/pi-agent-core instead going forward", - "license": "MIT", - "peer": true, - "dependencies": { - "@mariozechner/pi-ai": "^0.73.0", - "typebox": "^1.1.24" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mariozechner/pi-ai": { - "version": "0.73.0", - "resolved": "https://registry.npmjs.org/@mariozechner/pi-ai/-/pi-ai-0.73.0.tgz", - "integrity": "sha512-phKOpcde/ssz6UYszkmaGJ9LF9mgt/AP8LrtSwsfap+kMSeFfSQ2/mCSBT1mLJ2BqVuff9uXs1/+op1aQeaafQ==", - "deprecated": "please use @earendil-works/pi-ai instead going forward", - "license": "MIT", - "peer": true, - "dependencies": { - "@anthropic-ai/sdk": "^0.91.1", - "@aws-sdk/client-bedrock-runtime": "^3.1030.0", - "@google/genai": "^1.40.0", - "@mistralai/mistralai": "^2.2.0", - "chalk": "^5.6.2", - "openai": "6.26.0", - "partial-json": "^0.1.7", - "proxy-agent": "^6.5.0", - "typebox": "^1.1.24", - "undici": "^7.19.1", - "zod-to-json-schema": "^3.24.6" - }, - "bin": { - "pi-ai": "dist/cli.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mariozechner/pi-ai/node_modules/@anthropic-ai/sdk": { - "version": "0.91.1", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz", - "integrity": "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==", - "license": "MIT", - "peer": true, - "dependencies": { - "json-schema-to-ts": "^3.1.1" - }, - "bin": { - "anthropic-ai-sdk": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/@mariozechner/pi-ai/node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@mariozechner/pi-ai/node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@mariozechner/pi-ai/node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@mariozechner/pi-ai/node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "license": "MIT", - "peer": true, - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@mariozechner/pi-ai/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@mariozechner/pi-ai/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@mariozechner/pi-ai/node_modules/lru-cache": { + "node_modules/@earendil-works/pi-ai/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", @@ -2270,7 +1664,7 @@ "node": ">=12" } }, - "node_modules/@mariozechner/pi-ai/node_modules/openai": { + "node_modules/@earendil-works/pi-ai/node_modules/openai": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/openai/-/openai-6.26.0.tgz", "integrity": "sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==", @@ -2292,7 +1686,7 @@ } } }, - "node_modules/@mariozechner/pi-ai/node_modules/pac-proxy-agent": { + "node_modules/@earendil-works/pi-ai/node_modules/pac-proxy-agent": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", @@ -2312,7 +1706,7 @@ "node": ">= 14" } }, - "node_modules/@mariozechner/pi-ai/node_modules/pac-resolver": { + "node_modules/@earendil-works/pi-ai/node_modules/pac-resolver": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", @@ -2326,7 +1720,7 @@ "node": ">= 14" } }, - "node_modules/@mariozechner/pi-ai/node_modules/proxy-agent": { + "node_modules/@earendil-works/pi-ai/node_modules/proxy-agent": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", @@ -2346,14 +1740,14 @@ "node": ">= 14" } }, - "node_modules/@mariozechner/pi-ai/node_modules/proxy-from-env": { + "node_modules/@earendil-works/pi-ai/node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT", "peer": true }, - "node_modules/@mariozechner/pi-ai/node_modules/socks-proxy-agent": { + "node_modules/@earendil-works/pi-ai/node_modules/socks-proxy-agent": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", @@ -2368,7 +1762,7 @@ "node": ">= 14" } }, - "node_modules/@mariozechner/pi-ai/node_modules/undici": { + "node_modules/@earendil-works/pi-ai/node_modules/undici": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", @@ -2378,18 +1772,16 @@ "node": ">=20.18.1" } }, - "node_modules/@mariozechner/pi-coding-agent": { - "version": "0.73.0", - "resolved": "https://registry.npmjs.org/@mariozechner/pi-coding-agent/-/pi-coding-agent-0.73.0.tgz", - "integrity": "sha512-Fs2dRIgtjDT8X5VDGNGzxj251B0FvkRsgX03YJv1FK4wg5Maj+jkf8/5A6tbPnPcXsCgs41xxJRf3tF5vJRccA==", - "deprecated": "please use @earendil-works/pi-coding-agent instead going forward", + "node_modules/@earendil-works/pi-coding-agent": { + "version": "0.74.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-coding-agent/-/pi-coding-agent-0.74.0.tgz", + "integrity": "sha512-Q5GikbB5vRBrsrrf/uvet53rPSQ1sn5I5mO+l7sIobdXYpS04/X2oOc2UHFm90fNdkl3yU+ANTZL0zOtHbnqRw==", "license": "MIT", "peer": true, "dependencies": { - "@mariozechner/jiti": "^2.6.2", - "@mariozechner/pi-agent-core": "^0.73.0", - "@mariozechner/pi-ai": "^0.73.0", - "@mariozechner/pi-tui": "^0.73.0", + "@earendil-works/pi-agent-core": "^0.74.0", + "@earendil-works/pi-ai": "^0.74.0", + "@earendil-works/pi-tui": "^0.74.0", "@silvia-odwyer/photon-node": "^0.3.4", "chalk": "^5.5.0", "cli-highlight": "^2.1.11", @@ -2399,6 +1791,7 @@ "glob": "^13.0.1", "hosted-git-info": "^9.0.2", "ignore": "^7.0.5", + "jiti": "^2.7.0", "marked": "^15.0.12", "minimatch": "^10.2.3", "proper-lockfile": "^4.1.2", @@ -2418,7 +1811,7 @@ "@mariozechner/clipboard": "^0.3.5" } }, - "node_modules/@mariozechner/pi-coding-agent/node_modules/file-type": { + "node_modules/@earendil-works/pi-coding-agent/node_modules/file-type": { "version": "21.3.4", "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==", @@ -2437,7 +1830,7 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, - "node_modules/@mariozechner/pi-coding-agent/node_modules/undici": { + "node_modules/@earendil-works/pi-coding-agent/node_modules/undici": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", @@ -2447,11 +1840,10 @@ "node": ">=20.18.1" } }, - "node_modules/@mariozechner/pi-tui": { - "version": "0.73.0", - "resolved": "https://registry.npmjs.org/@mariozechner/pi-tui/-/pi-tui-0.73.0.tgz", - "integrity": "sha512-St1W+tMPKHatfK+lblsKfL+SsFyFVMK2tW6xHpBfCiMuevbOCRo/CMatso7mu1642UO04ncmfCrrpUK5L9aoog==", - "deprecated": "please use @earendil-works/pi-tui instead going forward", + "node_modules/@earendil-works/pi-tui": { + "version": "0.74.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.74.0.tgz", + "integrity": "sha512-1aIfXZp7D/z+1VlZX8BZcs6pgO8rjmil7kwyhctNDsWvce3Yfl8GVgu4eq+I0Mjhr8Cj+ipBiv9CLIzdoyCOIQ==", "license": "MIT", "peer": true, "dependencies": { @@ -2468,20 +1860,346 @@ "koffi": "^2.9.0" } }, - "node_modules/@mistralai/mistralai": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.2.1.tgz", - "integrity": "sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==", + "node_modules/@google/genai": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-2.0.1.tgz", + "integrity": "sha512-trxxbVePM9J8Cuni5x7+xvApoqb2y6Zk27/wugjT2cuwHOT78nFGdf/Ni29MkDxzWwrj90OQpno1Ana6dm3D2A==", + "hasInstallScript": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "ws": "^8.18.0", - "zod": "^3.25.0 || ^4.0.0", - "zod-to-json-schema": "^3.25.0" - } - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", + "google-auth-library": "^10.3.0", + "p-retry": "^4.6.2", + "protobufjs": "^7.5.4", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.25.2" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } + } + }, + "node_modules/@grammyjs/runner": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@grammyjs/runner/-/runner-2.0.3.tgz", + "integrity": "sha512-nckmTs1dPWfVQteK9cxqxzE+0m1VRvluLWB8UgFzsjg62w3qthPJt0TYtJBEdG7OedvfQq4vnFAyE6iaMkR42A==", + "license": "MIT", + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0" + }, + "engines": { + "node": ">=12.20.0 || >=14.13.1" + }, + "peerDependencies": { + "grammy": "^1.13.1" + } + }, + "node_modules/@grammyjs/transformer-throttler": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@grammyjs/transformer-throttler/-/transformer-throttler-1.2.1.tgz", + "integrity": "sha512-CpWB0F3rJdUiKsq7826QhQsxbZi4wqfz1ccKX+fr+AOC+o8K7ZvS+wqX0suSu1QCsyUq2MDpNiKhyL2ZOJUS4w==", + "license": "MIT", + "peer": true, + "dependencies": { + "bottleneck": "^2.0.0" + }, + "engines": { + "node": "^12.20.0 || >=14.13.1" + }, + "peerDependencies": { + "grammy": "^1.0.0" + } + }, + "node_modules/@grammyjs/types": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@grammyjs/types/-/types-3.26.0.tgz", + "integrity": "sha512-jlnyfxfev/2o68HlvAGRocAXgdPPX5QabG7jZlbqC2r9DZyWBfzTlg+nu3O3Fy4EhgLWu28hZ/8wr7DsNamP9A==", + "license": "MIT", + "peer": true + }, + "node_modules/@homebridge/ciao": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.3.8.tgz", + "integrity": "sha512-lNhpCsZVbdbjz2trFjQdzQ3cUIMZQMIMksi7wd3ntTIYgdaGLqT1Ms97DfVIJYHzRuduf56ISvgU8RRLTpK/ng==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.3", + "fast-deep-equal": "^3.1.3", + "source-map-support": "^0.5.21", + "tslib": "^2.8.1" + }, + "bin": { + "ciao-bcs": "lib/bonjour-conformance-testing.js" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.14", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", + "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "peer": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@lydell/node-pty": { + "version": "1.2.0-beta.12", + "resolved": "https://registry.npmjs.org/@lydell/node-pty/-/node-pty-1.2.0-beta.12.tgz", + "integrity": "sha512-qIK890UwPupoj07osVvgOIa++1mxeHbcGry4PKRHhNVNs81V2SCG34eJr46GybiOmBtc8Sj5PB1/GGM5PL549g==", + "license": "MIT", + "peer": true, + "optionalDependencies": { + "@lydell/node-pty-darwin-arm64": "1.2.0-beta.12", + "@lydell/node-pty-darwin-x64": "1.2.0-beta.12", + "@lydell/node-pty-linux-arm64": "1.2.0-beta.12", + "@lydell/node-pty-linux-x64": "1.2.0-beta.12", + "@lydell/node-pty-win32-arm64": "1.2.0-beta.12", + "@lydell/node-pty-win32-x64": "1.2.0-beta.12" + } + }, + "node_modules/@mariozechner/clipboard": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard/-/clipboard-0.3.5.tgz", + "integrity": "sha512-D3F+UrU9CR7roJt0zDLp6Oc+4/KlLDIrN4frH+6V90SJNW2KKUec1oCQIPaaDjCqeOsQyX9dyqYbImIQIM45PA==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@mariozechner/clipboard-darwin-arm64": "0.3.2", + "@mariozechner/clipboard-darwin-universal": "0.3.2", + "@mariozechner/clipboard-darwin-x64": "0.3.2", + "@mariozechner/clipboard-linux-arm64-gnu": "0.3.2", + "@mariozechner/clipboard-linux-arm64-musl": "0.3.2", + "@mariozechner/clipboard-linux-riscv64-gnu": "0.3.2", + "@mariozechner/clipboard-linux-x64-gnu": "0.3.2", + "@mariozechner/clipboard-linux-x64-musl": "0.3.2", + "@mariozechner/clipboard-win32-arm64-msvc": "0.3.2", + "@mariozechner/clipboard-win32-x64-msvc": "0.3.2" + } + }, + "node_modules/@mariozechner/clipboard-darwin-arm64": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-darwin-arm64/-/clipboard-darwin-arm64-0.3.2.tgz", + "integrity": "sha512-uBf6K7Je1ihsgvmWxA8UCGCeI+nbRVRXoarZdLjl6slz94Zs1tNKFZqx7aCI5O1i3e0B6ja82zZ06BWrl0MCVw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mariozechner/clipboard-darwin-universal": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-darwin-universal/-/clipboard-darwin-universal-0.3.2.tgz", + "integrity": "sha512-mxSheKTW2U9LsBdXy0SdmdCAE5HqNS9QUmpNHLnfJ+SsbFKALjEZc5oRrVMXxGQSirDvYf5bjmRyT0QYYonnlg==", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mariozechner/clipboard-darwin-x64": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-darwin-x64/-/clipboard-darwin-x64-0.3.2.tgz", + "integrity": "sha512-U1BcVEoidvwIp95+HJswSW+xr28EQiHR7rZjH6pn8Sja5yO4Yoe3yCN0Zm8Lo72BbSOK/fTSq0je7CJpaPCspg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mariozechner/clipboard-linux-arm64-gnu": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-arm64-gnu/-/clipboard-linux-arm64-gnu-0.3.2.tgz", + "integrity": "sha512-BsinwG3yWTIjdgNCxsFlip7LkfwPk+ruw/aFCXHUg/fb5XC/Ksp+YMQ7u0LUtiKzIv/7LMXgZInJQH6gxbAaqQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mariozechner/clipboard-linux-arm64-musl": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-arm64-musl/-/clipboard-linux-arm64-musl-0.3.2.tgz", + "integrity": "sha512-0/Gi5Xq2V6goXBop19ePoHvXsmJD9SzFlO3S+d6+T2b+BlPcpOu3Oa0wTjl+cZrLAAEzA86aPNBI+VVAFDFPKw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mariozechner/clipboard-linux-riscv64-gnu": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-riscv64-gnu/-/clipboard-linux-riscv64-gnu-0.3.2.tgz", + "integrity": "sha512-2AFFiXB24qf0zOZsxI1GJGb9wQGlOJyN6UwoXqmKS3dpQi/l6ix30IzDDA4c4ZcCcx4D+9HLYXhC1w7Sov8pXA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mariozechner/clipboard-linux-x64-gnu": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-x64-gnu/-/clipboard-linux-x64-gnu-0.3.2.tgz", + "integrity": "sha512-v6fVnsn7WMGg73Dab8QMwyFce7tzGfgEixKgzLP8f1GJqkJZi5zO4k4FOHzSgUufgLil63gnxvMpjWkgfeQN7A==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mariozechner/clipboard-linux-x64-musl": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-x64-musl/-/clipboard-linux-x64-musl-0.3.2.tgz", + "integrity": "sha512-xVUtnoMQ8v2JVyfJLKKXACA6avdnchdbBkTsZs8BgJQo29qwCp5NIHAUO8gbJ40iaEGToW5RlmVk2M9V0HsHEw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mariozechner/clipboard-win32-arm64-msvc": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-win32-arm64-msvc/-/clipboard-win32-arm64-msvc-0.3.2.tgz", + "integrity": "sha512-AEgg95TNi8TGgak2wSXZkXKCvAUTjWoU1Pqb0ON7JHrX78p616XUFNTJohtIon3e0w6k0pYPZeCuqRCza/Tqeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mariozechner/clipboard-win32-x64-msvc": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-win32-x64-msvc/-/clipboard-win32-x64-msvc-0.3.2.tgz", + "integrity": "sha512-tGRuYpZwDOD7HBrCpyRuhGnHHSCknELvqwKKUG4JSfSB7JIU7LKRh6zx6fMUOQd8uISK35TjFg5UcNih+vJhFA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mistralai/mistralai": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.2.1.tgz", + "integrity": "sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "ws": "^8.18.0", + "zod": "^3.25.0 || ^4.0.0", + "zod-to-json-schema": "^3.25.0" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", "license": "MIT", @@ -2544,6 +2262,38 @@ "license": "MIT", "peer": true }, + "node_modules/@openclaw/fs-safe": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.2.4.tgz", + "integrity": "sha512-Fo3WTQhxu0asD/rZqIKBqhX6fuZfjyHxSW5yTKfcRx+D9BRAcz0AGoVh+3ur/4XRvZkvsh3Ud8XTw006yRYLgg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20.11" + }, + "optionalDependencies": { + "jszip": "^3.10.1", + "tar": "7.5.13" + } + }, + "node_modules/@openclaw/fs-safe/node_modules/tar": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "license": "BlueOak-1.0.0", + "optional": true, + "peer": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -2609,692 +2359,151 @@ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@silvia-odwyer/photon-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@silvia-odwyer/photon-node/-/photon-node-0.3.4.tgz", - "integrity": "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@slack/bolt": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-4.7.2.tgz", - "integrity": "sha512-ALHtaS2iaP2WAWgX08yXsoCxEDitC6AqZs26ot6smXJQzBFMM4slVP+w3blLwzUV551xZ/+9RlBmWHsZDJJ5HA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@slack/logger": "^4.0.1", - "@slack/oauth": "^3.0.5", - "@slack/socket-mode": "^2.0.7", - "@slack/types": "^2.20.1", - "@slack/web-api": "^7.15.1", - "axios": "^1.12.0", - "express": "^5.0.0", - "path-to-regexp": "^8.1.0", - "raw-body": "^3", - "tsscmp": "^1.0.6" - }, - "engines": { - "node": ">=18", - "npm": ">=8.6.0" - }, - "peerDependencies": { - "@types/express": "^5.0.0" - } - }, - "node_modules/@slack/logger": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.1.tgz", - "integrity": "sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": ">=18" - }, - "engines": { - "node": ">= 18", - "npm": ">= 8.6.0" - } - }, - "node_modules/@slack/oauth": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-3.0.5.tgz", - "integrity": "sha512-exqFQySKhNDptWYSWhvRUJ4/+ndu2gayIy7vg/JfmJq3wGtGdHk531P96fAZyBm5c1Le3yaPYqv92rL4COlU3A==", - "license": "MIT", - "peer": true, - "dependencies": { - "@slack/logger": "^4.0.1", - "@slack/web-api": "^7.15.0", - "@types/jsonwebtoken": "^9", - "@types/node": ">=18", - "jsonwebtoken": "^9" - }, - "engines": { - "node": ">=18", - "npm": ">=8.6.0" - } - }, - "node_modules/@slack/socket-mode": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-2.0.7.tgz", - "integrity": "sha512-qYy07je71WnEHgRwmw12DlAnZLi5HXmdlI2WUzUK2LH/rYXQpP6uEg462S5CwfE8FoCKUdIigHtYnOOfzZH1lQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@slack/logger": "^4.0.1", - "@slack/web-api": "^7.15.0", - "@types/node": ">=18", - "@types/ws": "^8", - "eventemitter3": "^5", - "ws": "^8" - }, - "engines": { - "node": ">= 18", - "npm": ">= 8.6.0" - } - }, - "node_modules/@slack/types": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.21.1.tgz", - "integrity": "sha512-I8vmSjNYWsaxuWPx6dz4yeh0h7vRBWbgAMK14LEmblbZ404BtrPbXs6jDPx4cYgGf8msDGF4A9opLZBu21FViQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" - } - }, - "node_modules/@slack/web-api": { - "version": "7.15.2", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-7.15.2.tgz", - "integrity": "sha512-/m9qVFkiq85Oa/FSQwYIRDa/AO4qNYkDh4sRBK1WqEc2+RyG7w4tbU6rBIwUOcc/TmWOIr24Nraquxg7um5mYw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@slack/logger": "^4.0.1", - "@slack/types": "^2.21.0", - "@types/node": ">=18", - "@types/retry": "0.12.0", - "axios": "^1.15.0", - "eventemitter3": "^5.0.1", - "form-data": "^4.0.4", - "is-electron": "2.2.2", - "is-stream": "^2", - "p-queue": "^6", - "p-retry": "^4", - "retry": "^0.13.1" - }, - "engines": { - "node": ">= 18", - "npm": ">= 8.6.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.5.0.tgz", - "integrity": "sha512-m5PNfr7xKdIegNG8DlLz+Gf/DlAhHWFGmFbe0DZo9pnvBwuZ3P/9OMtQU0UyWMYy8zjl+HDFVS7rdD9p2xEFjQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.0.tgz", - "integrity": "sha512-rZ5YfycIXX6puoGjthnDiMpUgtKNOq3c7CndQYkCNYQTv26AiCrZQOJPy7ANSfZ6Okk3UvCRnmO1OYWlLnYZgg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.0.tgz", - "integrity": "sha512-5gi+28FH+RurB2+tcRH1CK7KiLJ0dVnabjWLY3DgeFLiU45dbyrsq7NOYvMUcHgu9LVZH5F7G+Qk1GdXF0y6jg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.3.0.tgz", - "integrity": "sha512-vBxRIMKUGxS6sifVJOhV50PY1w+4esgSgS6cgEa/EB0lJL3BuRP1oP6A1yTOX9j9eEwHi4bRHC94A2yhG/l0+Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.3.0.tgz", - "integrity": "sha512-JlY17/ZwBJ2O7FK/bKt8PZR+HBkyFwvgssgT6LiB0xYtz5/E5XG/HeKr5q2NMaVm8u8xjFfGk/6DVlbBe1qNkA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.4.0.tgz", - "integrity": "sha512-1Pg7aqxIdMilTbGJKCHTx0toIkKSrHdO6VHCh9oCncWJG+1wkJa90O/xb9mmRPuoOFCg2DLZAqnRyuBiUQnNIA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.3.0.tgz", - "integrity": "sha512-Xte1Td6CQpc/D0WnPZ2k98CvF7y1GopylMoGY/r26a9wbRHV5xusRbT6O9vouSeZlvtxoVb4ON/1fLRofO7m4Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.0.tgz", - "integrity": "sha512-yxurumLvHfgYgM0FVtjOVIyBSJXfno4xKKOgD43wOk9Qh+2lTKfP9Qhu4JHU7IUwrqVPa888byUzomHMgvKVMg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.3.0.tgz", - "integrity": "sha512-4a+KoVqr1SZtw7cZvY24XU1S5OL+c23MdDQ3jFmMCQ5s9diBFdMG/UIgp5dNqlwvDrWA0U5KO+z3Gzq1ize+LA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.3.0.tgz", - "integrity": "sha512-TaoGtqi2ZNdGzxUgYcLczjW8rb/h5DQ8vlCMYDSdZ4LRzGQrrEYgUjlZVM9dAagTsLK5gZx1f7+44sFTjz5vuQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.3.0.tgz", - "integrity": "sha512-IbSiS/3nOxsimCthzElEoBrjQo+Na4bsQ63qyC8qSI8lkMjOv9+VlosDQd8gfNolAD9XmC5tLqYTI0bJGJsscg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.5.0.tgz", - "integrity": "sha512-ux8LgN/m/X7ET2ISRc8G4aKFI1QhINZtkKpoayNPTrhwpsCVxb47mlpYFuWceTlesc0Wmb0S9y6DP195ReQoXA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.6.0.tgz", - "integrity": "sha512-8CtxY9aHT4f3UvZUbU2O0bccRckqTDfTKk3t1DawUZa5DWRZdV2AMABLsdMTdj7KE1uumhzEaT0X7/jTcOtoBw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.3.0.tgz", - "integrity": "sha512-c+V02hZlIStscI4ie2VllJjM4DLxdI2SymIBvXmqCqicrNb0NAbgDXDTBiwcMiruaBOqEFYxpKXbz6JjsNEN3Q==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.3.0.tgz", - "integrity": "sha512-KtYcs+sJn7AiT0YdM53/6MT0dKsaW2MSAr9MpprRVSfwN9qyKQf2dBIuCXt18/nEZaWerol/bGaQ63G949aovw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.4.0.tgz", - "integrity": "sha512-5RutFJsYoqK4tWYZOjGQrPLowGf2Ku8rbNuVeGkNJ5axIDO4LV/fydBojPtwcDz2zf87YNCOXfNyuEyAwYgI7A==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.0.tgz", - "integrity": "sha512-PxF57Jr3dPm+RgZWekOL+o96FPdaT62xZUyDfi47uMRFi5rHpwO/ewFbrztrASQ/7H8moNi1sspIHihHpfoKsQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.3.0.tgz", - "integrity": "sha512-/YBWtO2SdvPSAUk/Ke1Xpdg1E1lfaNGblla7mnIVGtaGkSQ5bK7KBZqpuj5IokHlU9UcLDvt2QwTLV7oRzBUTA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.4.0.tgz", - "integrity": "sha512-WG0LgSZg+WbvWYD04uwIYVyMEpyd0cPx1lkqx61JxunxiFti+wGoFiDKr6wswun1r25Z2f8yUoMQWyxjMnnXtw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.3.0.tgz", - "integrity": "sha512-w1EVgJXg1R/f5iJlQatMBt7sP9tHhEscvK0lv62j/esnqRgdoQqlkcgHotfOJpg1CTtY8eUvze3v3EU91631IQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.5.0.tgz", - "integrity": "sha512-xATpw6gcurFztdsUrMNaKb2ugqk3545Whhqg7ZD4sxTg+zI27THjg3IY+InXsVWturOWdCdV+UHQx11g9Sp5Kw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.0.tgz", - "integrity": "sha512-nkdB9T8JS6iD5PukE5TB8KqcvMEPVPHVUY7J0odYJgyIM40Du2msUhBdoPNRqRArDDcGQqVQcbzu0CZA7b+Nkw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.13.0.tgz", - "integrity": "sha512-lysfoRCr7PdD9CsPp9VQuJYRGI5mWYb8FRkbdBSQttxpQmW7tZsFgmpBNKVcgvBsAgBCkYX/UQs0NmznuBcZQQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.1.tgz", - "integrity": "sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.3.0.tgz", - "integrity": "sha512-I5tCWs/ndLrJrbvlnsN1cOt8PVAbQEqg0nNeQqebD5ynQcbhgch9uA7KmpX9vfq/vEudq0iVYAOxt+4aBkUlWA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.4.0.tgz", - "integrity": "sha512-puJITyefgQ9a5F+wKylCLkf0VCwesWbaN4O3YCEalRin4N0CTPQu/XA3kz/QsMOTgd3knhd0BQwGCBm/tv0Y1A==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.3.0.tgz", - "integrity": "sha512-83U8xa8EmdExGzFuqBzgXvtmbLQIYcCuCNm5no4rlPqpGdOPGUufzMvLdlw+sPTb01qHIsDDNwOecm4s8ROOPw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "peer": true }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.3.0.tgz", - "integrity": "sha512-Ok2v9zPFfd6uOJMTIIJ8HFdCpARD77q4OHYhwhG9y5X1Y9oeQ0CHUQVJD6LhT6l8FUkFYisqcUaZSg7SArFUTA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/core": "^3.24.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "license": "BSD-3-Clause", + "peer": true }, - "node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "node_modules/@silvia-odwyer/photon-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@silvia-odwyer/photon-node/-/photon-node-0.3.4.tgz", + "integrity": "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==", "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } + "peer": true }, - "node_modules/@smithy/util-config-provider": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.3.0.tgz", - "integrity": "sha512-kAC6/UB9qW9r2xQAOko2iDxAXmRD2VGMZjnXSEacAhQySdJs58CwvoOE0tHWdtc/lWF4g78X6Z9ucLanJnuVUw==", + "node_modules/@smithy/core": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.2.tgz", + "integrity": "sha512-IKS7qX59fAGCYBmt5JChcDswQDupZqT2Yn2ZBA3UgTlsjRNNkQzZobbn95xoAAdtTyJmBiJB3Y02qR3rgy3Zog==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.24.0", + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.4.0.tgz", - "integrity": "sha512-jKezW5Taa+N2gbkB02UVijH1rFlEJC+cskZzwasFqFJMBBi/bcVgHqcYOX0WOnUk6MDZfHf0gEsr5Br4XMHiAg==", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.2.tgz", + "integrity": "sha512-iYr9ekBjmZ+FwkiHEopqGscBbl78X62cq3p5Dd0eC+gNd7fybNZFQQdDuOQjTVmFymleuA8YRWZnuXWZ8B3kKA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.24.0", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.3.0.tgz", - "integrity": "sha512-xYRuNHHIztu5AzruMJ8kTyA1JsBL/yZKvX5z/A7OHUxsf+rkEESZFZWJDcAj5dDWSu6brWFe5KH6qJNTVztX/w==", + "node_modules/@smithy/fetch-http-handler": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.2.tgz", + "integrity": "sha512-3wF40g8OOCA5BnwQUvwtzZqYBbWWftDjpAlWIUo6Yld3ZzJaMAKqg7MWQBPjE8oLaqvZQUE7tVGlZPsae6A4bQ==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.24.0", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-endpoints": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.5.0.tgz", - "integrity": "sha512-pcvTCp9Wch/9UnWWfRGoG5GJogDXFPjevE+CqALxtPFGA4GqFQRD6eUtgJhHN+NPtohcozI12u1skF2/iubGrQ==", + "node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.24.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.3.0.tgz", - "integrity": "sha512-ZkAHu0SAsXPkVpaP6dhzu+DO/i4mlAMmwa4tejbGv9shozy/m4a2vIAk6HjPy7fKuGpANE1tZczGfCSLgyw5jA==", + "node_modules/@smithy/node-http-handler": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.2.tgz", + "integrity": "sha512-EdksTZ8UXYxGUgQ4mpIKrHoaj9WVGsp66TpZuixLAz1Jex8YDLnS4RH9ktGED5aOpN0OJlEtrsC9IGt76go1eA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.24.0", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-middleware": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.3.0.tgz", - "integrity": "sha512-X/DNQxgUCbjjs3HosLmt5Yi1NocxjRFiiOgHml4tVV3w4mIbqZxPR8kq7apGPEMnhIpyxeTgFyypMrfxfn2DlQ==", + "node_modules/@smithy/signature-v4": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.2.tgz", + "integrity": "sha512-1km1OjdLRFuITWpCPofjFqzZ+tbeWuB72ZhcYjbjkCxZ21tTPfIs4GUxRrelMyKMLxLghGD58RENnXorU/O8cw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.24.0", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-retry": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.4.0.tgz", - "integrity": "sha512-pV/Kq4jUuP9raOqwSPeBiut2IWmwbc9vM+nE3ly4YUkzPHbBZvfhikwMOyudER+KHPjakuc8r4TecEPMsI7nVg==", + "node_modules/@smithy/types": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.1.tgz", + "integrity": "sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.24.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-stream": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.6.0.tgz", - "integrity": "sha512-BlWg46UASokl3O5YqWmbLpINE5stmAxynXlyOe1nE4dx+tvwgqtT4ug/rPcRg0xVcBnj68XlcOqbXeaGGcH0DA==", + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.24.0", + "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, "node_modules/@smithy/util-utf8": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.3.0.tgz", - "integrity": "sha512-5hrmCc+dTgZkiFhX72Q16LemYPkvZ1M4pFMOhk0X9tQnLY7dn7zC1+C+aAJn0dw6CXldbqY/KMbMYCwm8yw14g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.24.0", + "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@telegraf/types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@telegraf/types/-/types-7.1.0.tgz", - "integrity": "sha512-kGevOIbpMcIlCDeorKGpwZmdH7kHbqlk/Yj6dEpJMKEQw5lk0KVQY0OLXaCswy8GqlIVLd5625OB+rAntP9xVw==", - "license": "MIT", - "peer": true - }, "node_modules/@tokenizer/inflate": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", @@ -3327,70 +2536,6 @@ "license": "MIT", "peer": true }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", - "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, "node_modules/@types/mime-types": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", @@ -3398,13 +2543,6 @@ "license": "MIT", "peer": true }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT", - "peer": true - }, "node_modules/@types/node": { "version": "20.19.40", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.40.tgz", @@ -3414,20 +2552,6 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT", - "peer": true - }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -3435,32 +2559,12 @@ "license": "MIT", "peer": true }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "license": "MIT", + "optional": true, "peer": true, "dependencies": { "@types/node": "*" @@ -3605,25 +2709,6 @@ "node": ">=4" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT", - "peer": true - }, - "node_modules/axios": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", - "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", - "license": "MIT", - "peer": true, - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "proxy-from-env": "^2.1.0" - } - }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -3739,24 +2824,6 @@ "node": "18 || 20 || >=22" } }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "license": "MIT", - "peer": true - }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -3774,13 +2841,6 @@ "license": "BSD-3-Clause", "peer": true }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "license": "MIT", - "peer": true - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3970,19 +3030,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "peer": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", @@ -4225,16 +3272,6 @@ "quickjs-wasi": "^2.2.0" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4437,22 +3474,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "peer": true, - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4558,13 +3579,6 @@ "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT", - "peer": true - }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", @@ -4633,9 +3647,9 @@ } }, "node_modules/express-rate-limit": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.1.tgz", - "integrity": "sha512-5O6KYmyJEpuPJV5hNTXKbAHWRqrzyu+OI3vUnSd2kXFubIVpG7ezpgxQy76Zo5GQZtrQBg86hF+CM/NX+cioiQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", + "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", "license": "MIT", "peer": true, "dependencies": { @@ -4748,9 +3762,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", - "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", + "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", "funding": [ { "type": "github", @@ -4761,7 +3775,7 @@ "peer": true, "dependencies": { "@nodable/entities": "^2.1.0", - "fast-xml-builder": "^1.1.5", + "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, @@ -4858,67 +3872,6 @@ "node": ">=8" } }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -4963,20 +3916,18 @@ } }, "node_modules/gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", + "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", "license": "Apache-2.0", "peer": true, "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" + "node-fetch": "^3.3.2" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/gaxios/node_modules/agent-base": { @@ -4989,6 +3940,16 @@ "node": ">= 14" } }, + "node_modules/gaxios/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/gaxios/node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -5003,34 +3964,38 @@ "node": ">= 14" } }, - "node_modules/gaxios/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/gaxios/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "peer": true, - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/gcp-metadata": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "gaxios": "^6.1.1", - "google-logging-utils": "^0.0.2", + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/get-caller-file": { @@ -5176,27 +4141,27 @@ } }, "node_modules/google-auth-library": { - "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", + "version": "10.6.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", + "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", "license": "Apache-2.0", "peer": true, "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", + "gaxios": "^7.1.4", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", "jws": "^4.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/google-logging-utils": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", "license": "Apache-2.0", "peer": true, "engines": { @@ -5239,20 +4204,6 @@ "node": "^12.20.0 || >=14.13.1" } }, - "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "license": "MIT", - "peer": true, - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5288,22 +4239,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", @@ -5531,13 +4466,6 @@ "node": ">= 10" } }, - "node_modules/is-electron": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", - "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", - "license": "MIT", - "peer": true - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -5554,19 +4482,6 @@ "license": "MIT", "peer": true }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5651,29 +4566,6 @@ "node": ">=6" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "peer": true, - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -5710,6 +4602,28 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/koffi": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/koffi/-/koffi-2.16.2.tgz", + "integrity": "sha512-owU0MRwv6xkrVqCd+33uw6BaYppkTRXbO/rVdJNI2dvZG0gzyRhYwW25eWtc5pauwK8TGh3AbkFONSezdykfSA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, + "node_modules/kysely": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.29.0.tgz", + "integrity": "sha512-LrQfPUeTW7MXbMvT62moEMnpMTuj9TO3lqjCeLKjM975PJ4Alrl/43f2tlDX7xOsNptKgH4LSNGwIbXwEkLg4g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=22.0.0" + } + }, "node_modules/lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -5767,55 +4681,6 @@ "node": ">=8" } }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT", - "peer": true - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT", - "peer": true - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT", - "peer": true - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT", - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT", - "peer": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT", - "peer": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT", - "peer": true - }, "node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", @@ -5998,16 +4863,6 @@ "node": ">= 18" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6321,122 +5176,75 @@ } }, "node_modules/openclaw": { - "version": "2026.5.7", - "resolved": "https://registry.npmjs.org/openclaw/-/openclaw-2026.5.7.tgz", - "integrity": "sha512-hjvpgconK20YltQPrzDY6cehjM8ijQyZnLKhqLBTngiFEPum9gmXwCDsrisPEXVRFtzuMhap+w6zSEmSQ1047Q==", + "version": "2026.5.12", + "resolved": "https://registry.npmjs.org/openclaw/-/openclaw-2026.5.12.tgz", + "integrity": "sha512-hHg88OFSF0rhDNUbmjMEJO0UdnGn4mNq0F23Hk/NmTKY3OaPCUXiHutd8Ea6S5TGouponytMMWCYgPRrwsW2Xg==", "hasInstallScript": true, "license": "MIT", "peer": true, "dependencies": { "@agentclientprotocol/sdk": "0.21.0", - "@anthropic-ai/sdk": "0.93.0", - "@anthropic-ai/vertex-sdk": "^0.16.0", - "@aws-sdk/client-bedrock": "3.1042.0", - "@aws-sdk/client-bedrock-runtime": "3.1042.0", - "@aws-sdk/credential-provider-node": "3.972.39", - "@aws/bedrock-token-generator": "^1.1.0", - "@clack/prompts": "^1.3.0", - "@google/genai": "^1.51.0", - "@grammyjs/runner": "^2.0.3", - "@grammyjs/transformer-throttler": "^1.2.1", - "@homebridge/ciao": "^1.3.8", + "@clack/core": "1.3.0", + "@clack/prompts": "1.3.0", + "@earendil-works/pi-agent-core": "0.74.0", + "@earendil-works/pi-ai": "0.74.0", + "@earendil-works/pi-coding-agent": "0.74.0", + "@earendil-works/pi-tui": "0.74.0", + "@google/genai": "2.0.1", + "@grammyjs/runner": "2.0.3", + "@grammyjs/transformer-throttler": "1.2.1", + "@homebridge/ciao": "1.3.8", "@lydell/node-pty": "1.2.0-beta.12", - "@mariozechner/pi-agent-core": "0.73.0", - "@mariozechner/pi-ai": "0.73.0", - "@mariozechner/pi-coding-agent": "0.73.0", - "@mariozechner/pi-tui": "0.73.0", "@modelcontextprotocol/sdk": "1.29.0", - "@mozilla/readability": "^0.6.0", - "@slack/bolt": "^4.7.2", - "@slack/types": "^2.21.0", - "@slack/web-api": "^7.15.2", - "ajv": "^8.20.0", - "chalk": "^5.6.2", - "chokidar": "^5.0.0", - "commander": "^14.0.3", - "croner": "^10.0.1", - "dotenv": "^17.4.2", + "@mozilla/readability": "0.6.0", + "@openclaw/fs-safe": "0.2.4", + "ajv": "8.20.0", + "chalk": "5.6.2", + "chokidar": "5.0.0", + "commander": "14.0.3", + "croner": "10.0.1", + "dotenv": "17.4.2", "express": "5.2.1", "file-type": "22.0.1", - "global-agent": "^4.1.3", - "grammy": "^1.42.0", - "https-proxy-agent": "^9.0.0", - "ipaddr.js": "^2.4.0", - "jiti": "^2.6.1", - "json5": "^2.2.3", - "jszip": "^3.10.1", - "linkedom": "^0.18.12", + "global-agent": "4.1.3", + "grammy": "1.42.0", + "https-proxy-agent": "9.0.0", + "ipaddr.js": "2.4.0", + "jiti": "2.7.0", + "json5": "2.2.3", + "jszip": "3.10.1", + "kysely": "0.29.0", + "linkedom": "0.18.12", "markdown-it": "14.1.1", "minimatch": "10.2.5", - "node-edge-tts": "^1.2.10", - "openai": "^6.36.0", - "openshell": "0.1.0", - "pdfjs-dist": "^5.7.284", - "playwright-core": "1.59.1", - "proxy-agent": "^8.0.1", + "node-edge-tts": "1.2.10", + "openai": "6.37.0", + "pdfjs-dist": "5.7.284", + "playwright-core": "1.60.0", + "proxy-agent": "8.0.1", "qrcode": "1.5.4", - "tar": "7.5.13", + "tar": "7.5.15", "tokenjuice": "0.7.0", - "tree-sitter-bash": "^0.25.1", - "tslog": "^4.10.2", - "typebox": "1.1.37", + "tree-sitter-bash": "0.25.1", + "tslog": "4.10.2", + "typebox": "1.1.38", "undici": "8.2.0", - "web-push": "^3.6.7", - "web-tree-sitter": "^0.26.8", - "ws": "^8.20.0", - "yaml": "^2.8.4", - "zod": "^4.4.3" + "web-push": "3.6.7", + "web-tree-sitter": "0.26.8", + "ws": "8.20.0", + "yaml": "2.9.0", + "zod": "4.4.3" }, "bin": { "openclaw": "openclaw.mjs" }, "engines": { - "node": ">=22.14.0" + "node": ">=22.16.0" }, "optionalDependencies": { "sqlite-vec": "0.1.9" } }, - "node_modules/openshell": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/openshell/-/openshell-0.1.0.tgz", - "integrity": "sha512-B7jLewH+d73hraWcrSFgNOjvd+frW5JPejkTpqgj2EJBjX/Yk1Y4blgP5pDl4FwrBxfmwsTKR08Uwgrdo+xpSg==", - "license": "MIT", - "peer": true, - "dependencies": { - "dotenv": "^16.5.0", - "telegraf": "^4.16.3" - }, - "bin": { - "openshell": "bin/openshell.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/openshell/node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -6466,30 +5274,6 @@ "node": ">=8" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT", - "peer": true - }, "node_modules/p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", @@ -6504,19 +5288,6 @@ "node": ">=8" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", - "peer": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -6704,9 +5475,9 @@ } }, "node_modules/playwright-core": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", "license": "Apache-2.0", "peer": true, "bin": { @@ -6756,9 +5527,9 @@ } }, "node_modules/protobufjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz", - "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.8.tgz", + "integrity": "sha512-dvpCIeLPbXZS/Ete7yLaO7RenOdken2NHKykBXbsaGxZT0UTltcarBciw+A78SRQs9iMAAVpsYA+l8b1hTePIA==", "hasInstallScript": true, "license": "BSD-3-Clause", "peer": true, @@ -7136,16 +5907,6 @@ "license": "MIT", "peer": true }, - "node_modules/safe-compare": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz", - "integrity": "sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-alloc": "^1.2.0" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -7153,16 +5914,6 @@ "license": "MIT", "peer": true }, - "node_modules/sandwich-stream": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sandwich-stream/-/sandwich-stream-2.0.2.tgz", - "integrity": "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -7432,6 +6183,91 @@ "source-map": "^0.6.0" } }, + "node_modules/sqlite-vec": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/sqlite-vec/-/sqlite-vec-0.1.9.tgz", + "integrity": "sha512-L7XJWRIBNvR9O5+vh1FQ+IGkh/3D2AzVksW5gdtk28m78Hy8skFD0pqReKH1Yp0/BUKRGcffgKvyO/EON5JXpA==", + "license": "MIT OR Apache", + "optional": true, + "peer": true, + "optionalDependencies": { + "sqlite-vec-darwin-arm64": "0.1.9", + "sqlite-vec-darwin-x64": "0.1.9", + "sqlite-vec-linux-arm64": "0.1.9", + "sqlite-vec-linux-x64": "0.1.9", + "sqlite-vec-windows-x64": "0.1.9" + } + }, + "node_modules/sqlite-vec-darwin-arm64": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/sqlite-vec-darwin-arm64/-/sqlite-vec-darwin-arm64-0.1.9.tgz", + "integrity": "sha512-jSsZpE42OfBkGL/ItyJTVCUwl6o6Ka3U5rc4j+UBDIQzC1ulSSKMEhQLthsOnF/MdAf1MuAkYhkdKmmcjaIZQg==", + "cpu": [ + "arm64" + ], + "license": "MIT OR Apache", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/sqlite-vec-darwin-x64": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/sqlite-vec-darwin-x64/-/sqlite-vec-darwin-x64-0.1.9.tgz", + "integrity": "sha512-KDlVyqQT7pnOhU1ymB9gs7dMbSoVmKHitT+k1/xkjarcX8bBqPxWrGlK/R+C5WmWkfvWwyq5FfXfiBYCBs6PlA==", + "cpu": [ + "x64" + ], + "license": "MIT OR Apache", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/sqlite-vec-linux-arm64": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/sqlite-vec-linux-arm64/-/sqlite-vec-linux-arm64-0.1.9.tgz", + "integrity": "sha512-5wXVJ9c9kR4CHm/wVqXb/R+XUHTdpZ4nWbPHlS+gc9qQFVHs92Km4bPnCKX4rtcPMzvNis+SIzMJR1SCEwpuUw==", + "cpu": [ + "arm64" + ], + "license": "MIT OR Apache", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/sqlite-vec-linux-x64": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/sqlite-vec-linux-x64/-/sqlite-vec-linux-x64-0.1.9.tgz", + "integrity": "sha512-w3tCH8xK2finW8fQJ/m8uqKodXUZ9KAuAar2UIhz4BHILfpE0WM/MTGCRfa7RjYbrYim5Luk3guvMOGI7T7JQA==", + "cpu": [ + "x64" + ], + "license": "MIT OR Apache", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/sqlite-vec-windows-x64": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/sqlite-vec-windows-x64/-/sqlite-vec-windows-x64-0.1.9.tgz", + "integrity": "sha512-y3gEIyy/17bq2QFPQOWLE68TYWcRZkBQVA2XLrTPHNTOp55xJi/BBBmOm40tVMDMjtP+Elpk6UBUXdaq+46b0Q==", + "cpu": [ + "x64" + ], + "license": "MIT OR Apache", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -7442,13 +6278,6 @@ "node": ">= 0.8" } }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "license": "MIT", - "peer": true - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -7560,9 +6389,9 @@ } }, "node_modules/tar": { - "version": "7.5.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", - "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", "license": "BlueOak-1.0.0", "peer": true, "dependencies": { @@ -7576,39 +6405,6 @@ "node": ">=18" } }, - "node_modules/telegraf": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.16.3.tgz", - "integrity": "sha512-yjEu2NwkHlXu0OARWoNhJlIjX09dRktiMQFsM678BAH/PEPVwctzL67+tvXqLCRQQvm3SDtki2saGO9hLlz68w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@telegraf/types": "^7.1.0", - "abort-controller": "^3.0.0", - "debug": "^4.3.4", - "mri": "^1.2.0", - "node-fetch": "^2.7.0", - "p-timeout": "^4.1.0", - "safe-compare": "^1.1.4", - "sandwich-stream": "^2.0.2" - }, - "bin": { - "telegraf": "lib/cli.mjs" - }, - "engines": { - "node": "^12.20.0 || >=14.13.1" - } - }, - "node_modules/telegraf/node_modules/p-timeout": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", - "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -7732,16 +6528,6 @@ "url": "https://github.com/fullstack-build/tslog?sponsor=1" } }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.6.x" - } - }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -7756,24 +6542,42 @@ } }, "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", "license": "MIT", "peer": true, "dependencies": { - "content-type": "^1.0.5", + "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/typebox": { - "version": "1.1.37", - "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.37.tgz", - "integrity": "sha512-jb7jp6KvOvvy5sd+11AfJ0/e0F0AS9RcOXd55oGi2ZnRHIGmFvrTaNF+ZidRmGBmmNTkM5KKl0Z37KzxJ+owEQ==", + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.38.tgz", + "integrity": "sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==", "license": "MIT", "peer": true }, @@ -8078,9 +6882,9 @@ } }, "node_modules/yaml": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz", - "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -8132,19 +6936,6 @@ "fd-slicer": "~1.1.0" } }, - "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zod": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", diff --git a/pyproject.toml b/pyproject.toml index 7b7d652a..f9167b20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,14 +75,14 @@ docs = [ [project.optional-dependencies] langchain = [ - "langchain>=1.2.11,<2.0.0", + "langchain>=1.3.0,<2.0.0", "langchain-core", "langgraph", # allow any compatible version ] langgraph = [ "nemo-flow[langchain]", - "langgraph>=1.1.10,<2.0.0", + "langgraph>=1.2.0,<2.0.0", ] deepagents = [ diff --git a/scripts/licensing/attributions_lockfile_md.py b/scripts/licensing/attributions_lockfile_md.py index e7635e90..8210f6f7 100755 --- a/scripts/licensing/attributions_lockfile_md.py +++ b/scripts/licensing/attributions_lockfile_md.py @@ -5,13 +5,17 @@ from __future__ import annotations import argparse +import base64 +import binascii import hashlib +import hmac import io import json import re import subprocess import sys import tarfile +import tomllib import urllib.request import zipfile from email.parser import Parser @@ -28,6 +32,7 @@ NODE = ROOT MARKDOWN_CODE_FENCE = "```\n" MARKDOWN_CODE_BLOCK_END = "```\n\n" +_NODE_TARBALL_LICENSE_CACHE: dict[tuple[str, str], str | None] = {} class RenderedPythonPackage(TypedDict): @@ -47,6 +52,18 @@ class LicenseInventoryEntry(TypedDict): license: str +class NodeAttributionPackage(TypedDict): + """Normalized Node.js package data ready to be rendered into markdown.""" + + name: str + version: str + license_name: str + key: str + resolved: str + integrity: str + platform_gated: bool + + RUST_HEADER = ( ATTRIBUTIONS_MD_LICENSE_PREFIX + "\n# Third-Party Software Attributions\n\n" @@ -239,8 +256,40 @@ def _cargo_workspace_members() -> set[str]: return {str(member) for member in metadata.get("workspace_members", [])} +def _cargo_fetch_locked() -> None: + """Ensure locked registry crate sources are available for fallback license file reads.""" + subprocess.run( # noqa: S607 + ["cargo", "fetch", "--locked", "--manifest-path", str(ROOT / "Cargo.toml")], + cwd=ROOT, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + check=True, + ) + + +def _cargo_metadata() -> dict[str, Any]: + """Return full Cargo metadata for the all-features workspace graph.""" + _cargo_fetch_locked() + proc = subprocess.run( # noqa: S607 + [ + "cargo", + "metadata", + "--format-version=1", + "--all-features", + "--manifest-path", + str(ROOT / "Cargo.toml"), + ], + cwd=ROOT, + capture_output=True, + text=True, + check=True, + ) + return cast(dict[str, Any], json.loads(proc.stdout)) + + def _cargo_about_json() -> dict[str, Any]: """Generate cargo-about JSON for the workspace dependency graph.""" + _cargo_fetch_locked() proc = subprocess.run( # noqa: S607 [ "cargo", @@ -262,6 +311,119 @@ def _cargo_about_json() -> dict[str, Any]: return cast(dict[str, Any], json.loads(proc.stdout)) +def _rust_package_key(name: str, version: str) -> tuple[str, str]: + """Return the stable key used to reconcile Cargo.lock, metadata, and cargo-about rows.""" + return name, version + + +def _cargo_lock_registry_package_keys() -> set[tuple[str, str]]: + """Return third-party package keys from Cargo.lock.""" + with open(ROOT / "Cargo.lock", "rb") as f: + lock: dict[str, Any] = tomllib.load(f) + + keys: set[tuple[str, str]] = set() + for pkg in cast(list[dict[str, Any]], lock.get("package", [])): + name = str(pkg.get("name") or "") + version = str(pkg.get("version") or "") + source = str(pkg.get("source") or "") + if name and version and source: + keys.add(_rust_package_key(name, version)) + return keys + + +def _cargo_metadata_packages_by_key() -> dict[tuple[str, str], dict[str, Any]]: + """Return Cargo metadata package records keyed by package name and version.""" + metadata = _cargo_metadata() + packages: dict[tuple[str, str], dict[str, Any]] = {} + for pkg in cast(list[dict[str, Any]], metadata.get("packages", [])): + name = str(pkg.get("name") or "") + version = str(pkg.get("version") or "") + source = str(pkg.get("source") or "") + if name and version and source: + packages.setdefault(_rust_package_key(name, version), pkg) + return packages + + +def _rust_license_files(crate: dict[str, Any]) -> list[tuple[str, str]]: + """Return root license files from a downloaded Cargo package.""" + manifest_path = str(crate.get("manifest_path") or "") + if not manifest_path: + return [] + package_dir = Path(manifest_path).parent + candidates: list[Path] = [] + + license_file = str(crate.get("license_file") or "") + if license_file: + p = Path(license_file) + candidates.append(p if p.is_absolute() else package_dir / p) + + if package_dir.is_dir(): + for child in package_dir.iterdir(): + name = child.name.lower() + if child.is_file() and (name.startswith(("license", "licence")) or name.startswith("copying")): + candidates.append(child) + + seen: set[Path] = set() + texts: list[tuple[str, str]] = [] + for path in sorted(candidates, key=lambda item: item.name.lower()): + resolved = path.resolve() + if resolved in seen or not path.is_file(): + continue + seen.add(resolved) + try: + text = path.read_text(encoding="utf-8") + except UnicodeDecodeError: + text = path.read_text(encoding="utf-8", errors="replace") + label = path.name if path.parent == package_dir else str(path) + if _is_useful_license_text(text): + texts.append((label, text)) + return texts + + +def _render_rust_metadata_fallback_attribution(crate: dict[str, Any]) -> tuple[str, str, str]: + """Render one Rust Cargo.lock package omitted by cargo-about.""" + name = str(crate.get("name") or "unknown") + version = str(crate.get("version") or "") + repo = str(crate.get("repository") or "").strip() + if not repo: + repo = f"https://crates.io/crates/{name}" + license_name = _normalize_license_name(str(crate.get("license") or "UNKNOWN")) + + parts = [ + f"## {name} - {version}\n", + f"**Repository URL**: {repo}\n", + f"**License Type(s)**: {license_name}\n", + f"### License: {spdx_url(license_name, fallback='https://spdx.org/licenses/')}\n", + ] + license_files = _rust_license_files(crate) + if license_files: + for label, text in license_files: + parts.append(f"### License File: {label}\n") + parts.append(MARKDOWN_CODE_FENCE) + parts.append(text if text.endswith("\n") else text + "\n") + parts.append(MARKDOWN_CODE_BLOCK_END) + else: + parts.append(MARKDOWN_CODE_FENCE) + parts.append(f"License expression from Cargo metadata: {license_name}\n") + parts.append("No package license file was found in the downloaded crate archive.\n") + parts.append(MARKDOWN_CODE_BLOCK_END) + + return name, version, "".join(parts) + + +def _rust_missing_cargo_about_packages(rendered_keys: set[tuple[str, str]]) -> list[dict[str, Any]]: + """Return Cargo.lock packages that cargo-about did not render.""" + lock_keys = _cargo_lock_registry_package_keys() + metadata_by_key = _cargo_metadata_packages_by_key() + missing: list[dict[str, Any]] = [] + for key in sorted(lock_keys - rendered_keys, key=lambda item: (item[0].lower(), item[1])): + pkg = metadata_by_key.get(key) + if pkg is None: + raise RuntimeError(f"Cargo.lock package {key[0]} {key[1]} is missing from cargo metadata") + missing.append(pkg) + return missing + + def _render_rust_crate_attribution( crate: dict[str, Any], *, license_id: str, license_text: str, workspace_members: set[str] ) -> tuple[str, str, str] | None: @@ -291,9 +453,10 @@ def _render_rust_crate_attribution( def _render_rust_attributions(data: dict[str, Any], workspace_members: set[str]) -> str: - """Render cargo-about output while omitting local workspace crates.""" + """Render Rust attributions for every non-workspace package in Cargo.lock.""" parts: list[str] = [RUST_HEADER] rendered_crates: list[tuple[str, str, str]] = [] + rendered_keys: set[tuple[str, str]] = set() for license_group in cast(list[dict[str, Any]], data.get("licenses", [])): license_id = str(license_group.get("id") or "UNKNOWN") license_text = str(license_group.get("text") or "") @@ -305,8 +468,14 @@ def _render_rust_attributions(data: dict[str, Any], workspace_members: set[str]) workspace_members=workspace_members, ) if rendered: + rendered_keys.add(_rust_package_key(rendered[0], rendered[1])) rendered_crates.append(rendered) + for crate in _rust_missing_cargo_about_packages(rendered_keys): + rendered = _render_rust_metadata_fallback_attribution(crate) + rendered_keys.add(_rust_package_key(rendered[0], rendered[1])) + rendered_crates.append(rendered) + for _, _, rendered in sorted(rendered_crates, key=lambda row: (row[0].lower(), row[1])): parts.append(rendered) @@ -324,7 +493,7 @@ def _rendered_python_package_inventory(pkg: RenderedPythonPackage) -> LicenseInv def _rust_license_inventory(data: dict[str, Any], workspace_members: set[str]) -> list[LicenseInventoryEntry]: - """Return minimal Rust dependency license rows while omitting local workspace crates.""" + """Return Rust license rows for every non-workspace package in Cargo.lock.""" rows: dict[tuple[str, str], set[str]] = {} for license_group in cast(list[dict[str, Any]], data.get("licenses", [])): license_id = str(license_group.get("id") or "UNKNOWN") @@ -334,7 +503,13 @@ def _rust_license_inventory(data: dict[str, Any], workspace_members: set[str]) - continue name = str(crate.get("name") or "unknown") version = str(crate.get("version") or "") - rows.setdefault((name, version), set()).add(license_id) + rows.setdefault(_rust_package_key(name, version), set()).add(license_id) + + for crate in _rust_missing_cargo_about_packages(set(rows)): + name = str(crate.get("name") or "unknown") + version = str(crate.get("version") or "") + license_name = _normalize_license_name(str(crate.get("license") or "UNKNOWN")) + rows.setdefault(_rust_package_key(name, version), set()).add(license_name) return [ _license_inventory_entry(name, version, " OR ".join(sorted(licenses))) @@ -796,6 +971,112 @@ def _node_license_checker_data() -> tuple[dict[str, dict[str, str]], set[str]]: return data, workspace_package_keys +def _node_attribution_packages(lock: dict[str, Any], workspace_package_keys: set[str]) -> list[NodeAttributionPackage]: + """Return all third-party Node.js packages from package-lock.json. + + `license-checker` only sees packages installed for the current platform. The + lockfile is the source of truth for attribution so platform-gated optional + packages stay present on every machine that regenerates this file. + """ + packages = lock.get("packages") or {} + if not isinstance(packages, dict): + return [] + + rows: dict[str, NodeAttributionPackage] = {} + for path, meta in packages.items(): + normalized_path = str(path).replace("\\", "/") + if "node_modules" not in normalized_path.split("/"): + continue + if not isinstance(meta, dict): + continue + if meta.get("extraneous"): + continue + version = str(meta.get("version") or "").strip() + if not version: + continue + name = str(meta.get("name") or _node_package_name_from_lock_path(normalized_path)).strip() + if not name: + continue + key = f"{name}@{version}" + if key in workspace_package_keys: + continue + license_name = str(meta.get("license") or "UNKNOWN") + rows[key] = { + "name": name, + "version": version, + "license_name": license_name, + "key": key, + "resolved": str(meta.get("resolved") or ""), + "integrity": str(meta.get("integrity") or ""), + "platform_gated": bool(meta.get("optional") or meta.get("os") or meta.get("cpu")), + } + + return sorted(rows.values(), key=lambda row: (row["name"].lower(), row["version"], row["license_name"])) + + +def _node_integrity_matches(data: bytes, integrity: str) -> bool: + """Validate downloaded npm artifact bytes against package-lock integrity.""" + if not integrity: + return True + algorithms = { + "sha1": hashlib.sha1, + "sha256": hashlib.sha256, + "sha384": hashlib.sha384, + "sha512": hashlib.sha512, + } + saw_supported = False + for token in integrity.split(): + algorithm, sep, encoded = token.partition("-") + if not sep or algorithm not in algorithms: + continue + saw_supported = True + try: + expected = base64.b64decode(encoded, validate=True) + except (ValueError, binascii.Error): + return False + if hmac.compare_digest(algorithms[algorithm](data).digest(), expected): + return True + return not saw_supported + + +def _node_license_text_from_tarball(resolved: str, integrity: str) -> str: + """Return license text from a locked npm tarball URL, if available.""" + if not resolved.startswith(("http://", "https://")): + return "" + cache_key = (resolved, integrity) + cached = _NODE_TARBALL_LICENSE_CACHE.get(cache_key) + if cached is not None: + return cached + if cache_key in _NODE_TARBALL_LICENSE_CACHE: + return "" + + try: + with urllib.request.urlopen(resolved, timeout=60) as response: # noqa: S310 + raw = response.read() + except OSError: + _NODE_TARBALL_LICENSE_CACHE[cache_key] = None + return "" + if not _node_integrity_matches(raw, integrity): + _NODE_TARBALL_LICENSE_CACHE[cache_key] = None + return "" + + try: + with tarfile.open(fileobj=io.BytesIO(raw), mode="r:*") as tf: + heuristic_candidates: list[tuple[str, str, str]] = [] + for member_name in _common_license_candidates(tf.getnames()): + text = _extract_tar_text(tf, member_name) + if text and _is_useful_license_text(text): + display_path = member_name.split("/", 1)[1] if "/" in member_name else member_name + heuristic_candidates.append((display_path, display_path, text)) + selected = _choose_heuristic_license(heuristic_candidates) + except (OSError, tarfile.TarError): + selected = None + + text = selected[1] if selected else "" + _NODE_TARBALL_LICENSE_CACHE[cache_key] = text or None + return text + + def _node_package_name_from_lock_path(path: str) -> str: """Infer an npm package name from a package-lock packages path.""" parts = path.replace("\\", "/").split("node_modules/") @@ -837,36 +1118,42 @@ def _node_license_inventory() -> list[LicenseInventoryEntry]: def cmd_node() -> int: - """Generate ATTRIBUTIONS-Node.md from package-lock.json via license-checker.""" + """Generate ATTRIBUTIONS-Node.md from package-lock.json.""" out = ROOT / "ATTRIBUTIONS-Node.md" + lockfile = _node_lockfile_path() + lock = cast(dict[str, Any], json.loads(lockfile.read_text(encoding="utf-8"))) data, workspace_package_keys = _node_license_checker_data() - package_rows = [(*_split_node_package_key(key), key) for key in data.keys() if key not in workspace_package_keys] - package_rows.sort(key=lambda row: (row[0].lower(), row[1])) + package_rows = _node_attribution_packages(lock, workspace_package_keys) parts: list[str] = [NODE_HEADER] - for name, ver, key in package_rows: - meta = data[key] + for pkg in package_rows: + name = pkg["name"] + ver = pkg["version"] + meta = {} if pkg["platform_gated"] else data.get(pkg["key"], {}) - lic = meta.get("licenses") or "UNKNOWN" + lic = meta.get("licenses") or pkg["license_name"] or "UNKNOWN" repo = (meta.get("repository") or "").strip() if not repo: repo = f"https://www.npmjs.com/package/{name}" lic_url = spdx_url(str(lic), fallback="https://opensource.org/licenses/") - text = "" - lf = meta.get("licenseFile") + text = _node_license_text_from_tarball(pkg["resolved"], pkg["integrity"]) if pkg["platform_gated"] else "" + lf = meta.get("licenseFile") if not text else None if lf: try: raw = Path(lf).read_text(encoding="utf-8", errors="replace").strip() text = "\n".join(line.rstrip() for line in raw.splitlines()) except OSError: text = "" + if not text: + text = _node_license_text_from_tarball(pkg["resolved"], pkg["integrity"]) parts.append(f"## {name} - {ver}\n") parts.append(f"**Repository URL**: {repo}\n") parts.append(f"**License Type(s)**: {lic}\n") parts.append(f"### License: {lic_url}\n") parts.append(MARKDOWN_CODE_FENCE) - parts.append(text if text else f"(No license file read from node_modules for {name}; see npm metadata.)\n") + fallback = f"(No license file read from locked npm artifact for {name}; see npm metadata.)\n" + parts.append(text if text else fallback) parts.append(MARKDOWN_CODE_BLOCK_END) out.write_text("".join(parts).rstrip("\n") + "\n", encoding="utf-8") diff --git a/uv.lock b/uv.lock index bef7c48c..f3ed0233 100644 --- a/uv.lock +++ b/uv.lock @@ -162,7 +162,7 @@ wheels = [ [[package]] name = "anthropic" -version = "0.101.0" +version = "0.102.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -174,9 +174,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/cb/9d0123243e749ac3a579972b2c398971bce1dc57bcc4efb08066df610360/anthropic-0.101.0.tar.gz", hash = "sha256:1116a6a87c55757e0fbe3e1ba40804fbd04de7963601a6dd6b539a889f18de3e", size = 758603, upload-time = "2026-05-11T15:46:33.944Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/47/cb2a71f70431fb09af4db83e3ea89eb2dd8e0e348d27af53ed32e6c599dd/anthropic-0.102.0.tar.gz", hash = "sha256:96f747cad11886c4ae12d4080131b94eebd68b202bd2190fe27959031bb1fa9c", size = 763697, upload-time = "2026-05-13T18:12:41.624Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/b2/74ff06762d005ecf1658929a292df0acb786d025f6a6c54fcb30e2dc7761/anthropic-0.101.0-py3-none-any.whl", hash = "sha256:cc3cc6576989471e2aa9132258034ad0ff0d8fe500b04ac499e4e46ed68c5ed0", size = 753594, upload-time = "2026-05-11T15:46:32.216Z" }, + { url = "https://files.pythonhosted.org/packages/87/75/0f6c603594876413bc858a00e7cc0d80a0cc14edf5c7b959a3ea6ec45e44/anthropic-0.102.0-py3-none-any.whl", hash = "sha256:ab96540bbd4b0f36564252d955a86f8abbe4f00944a24bc9931acc9b139bab6f", size = 763070, upload-time = "2026-05-13T18:12:43.474Z" }, ] [[package]] @@ -1075,16 +1075,16 @@ wheels = [ [[package]] name = "langchain" -version = "1.2.18" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "langgraph" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1d/4e/b651ecac63af474b28519384f7011294493d139937b1a9591581291eef34/langchain-1.2.18.tar.gz", hash = "sha256:7e829dbf117affadfd2067a0e97b4af20222f535f30fb812a28472d842c1074c", size = 582882, upload-time = "2026-05-08T13:59:19.895Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/74/03fd4c07993c49c4b80635bb4c723643ff78af81c9471d1266f879f68df1/langchain-1.3.0.tar.gz", hash = "sha256:8ec70ee0cef94255f3e522423b254093a3dd34509638d353c50f3d9dd498debc", size = 580604, upload-time = "2026-05-12T14:45:50.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/20/959f6098c79158afe5aedce7de05c3700f10d293890ef9e5dace6c3ad94b/langchain-1.2.18-py3-none-any.whl", hash = "sha256:8432d43a65540845ed6f1a783d38d869c4659a6b9405f9a510169ad40d2f7bae", size = 113643, upload-time = "2026-05-08T13:59:18.461Z" }, + { url = "https://files.pythonhosted.org/packages/7b/6f/b9a9721c27fbb6d29a6a7cd89d6a41eeffc7c79b49b9a5cf5beb1d60952d/langchain-1.3.0-py3-none-any.whl", hash = "sha256:9ce48828c706c00c586304b519fbd910e75d9f5ab3f319c31834e42107437f43", size = 114079, upload-time = "2026-05-12T14:45:48.818Z" }, ] [[package]] @@ -1103,7 +1103,7 @@ wheels = [ [[package]] name = "langchain-core" -version = "1.3.3" +version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch" }, @@ -1116,9 +1116,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "uuid-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d3/ae/8b74458fc3850ec3d150eb9f45e857db129dafa801fb5cf173dfc9f8bbf3/langchain_core-1.3.3.tar.gz", hash = "sha256:fa510a5db8efdc0c6ff41c0939fb5c00a0183c11f6b84233e892e3227ff69182", size = 915041, upload-time = "2026-05-05T19:02:36.612Z" } +sdist = { url = "https://files.pythonhosted.org/packages/59/de/679a53472c25860837e32c0442c962fa86e95317a36460e2c9d5c91b17c2/langchain_core-1.4.0.tar.gz", hash = "sha256:1dc341eed802ed9c117c0df3923c991e5e9e226571e5725c194eeb5bd93d1a7f", size = 920260, upload-time = "2026-05-11T18:42:35.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/01/4771b7ab2af1d1aba5b710bd8f13d9225c609425214b357590a17b01be77/langchain_core-1.3.3-py3-none-any.whl", hash = "sha256:18aae8506f37da7f74398492279a7d6efcee4f8e23c4c41c7af080eeb7ef7bd1", size = 543857, upload-time = "2026-05-05T19:02:34.52Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1a/86c38c27b81913a1c6c12448cab55defb5a1097c7dc9a4cea83f55477a2d/langchain_core-1.4.0-py3-none-any.whl", hash = "sha256:23cbbdb46e38ddd1dd5247e6167e96013eae74bea4c5949c550809970a9e565c", size = 548120, upload-time = "2026-05-11T18:42:33.992Z" }, ] [[package]] @@ -1165,7 +1165,7 @@ wheels = [ [[package]] name = "langgraph" -version = "1.1.10" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, @@ -1175,35 +1175,35 @@ dependencies = [ { name = "pydantic" }, { name = "xxhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/b3/7dec224369c7938eb3227ff69542a0d0f517862a0d27945b8c395f2a781f/langgraph-1.1.10.tar.gz", hash = "sha256:3115beb58203283c98d8752a90c034f3432177d2979a1fe205f76e5f1b744500", size = 560685, upload-time = "2026-04-27T17:19:10.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/61/d5d25e783035aa307d289b37e082258a6061c0fb4caa4a284f3bf1e87169/langgraph-1.2.0.tar.gz", hash = "sha256:4a9baaf62afc5d5f63144a50095140a34b9aa9b7cea695d25326d564775348e7", size = 690248, upload-time = "2026-05-12T03:46:39.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/07/057dc1aa7991115fca53f1fa6573a7cc0dd296c05360c672cc67fdb6245b/langgraph-1.1.10-py3-none-any.whl", hash = "sha256:8a4f163f72f4401648d0c11b48ee906947d938ba8cf1f474540fe591534f0d17", size = 173750, upload-time = "2026-04-27T17:19:09.073Z" }, + { url = "https://files.pythonhosted.org/packages/f6/e8/e3304ac0015c2bdb04ad9785e4ed65c788855ce7857ce6104dd2f5d322db/langgraph-1.2.0-py3-none-any.whl", hash = "sha256:03fd5895a8d4b70db1ff63ebc3bacead29dd20cd794a8b1a483e7ec9018f7a65", size = 234262, upload-time = "2026-05-12T03:46:37.971Z" }, ] [[package]] name = "langgraph-checkpoint" -version = "4.0.3" +version = "4.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "ormsgpack" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7c/e1/885e49cdafceb4c74dae4573bc5dd6054c6c640382ee73104532f33dca46/langgraph_checkpoint-4.0.3.tar.gz", hash = "sha256:a7b5e2ca18fb79b55edf19396d4ee446f8a53dcb7a4ec62ce6f1c7e00bb5af7f", size = 174009, upload-time = "2026-04-27T14:34:02.777Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/b4/6005c5dd88ad484fe6235d4c43a0d2cee7e91b08ad85a180985c2662df87/langgraph_checkpoint-4.1.0.tar.gz", hash = "sha256:e5bb304e30fc1363ac8fcb5f7dee5ca2185d77fe475b0d01de2c5f91324c2c21", size = 181942, upload-time = "2026-05-12T03:33:49.888Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/ee/ecd3fa2e893746dde3b768daca2a4935208bc77d09445437ccfffb4a8c9b/langgraph_checkpoint-4.0.3-py3-none-any.whl", hash = "sha256:b91b765712a2311a5b198760f714b7ab9b376d01c047ed78d9b9a3e80df802a3", size = 51682, upload-time = "2026-04-27T14:34:01.51Z" }, + { url = "https://files.pythonhosted.org/packages/93/74/d3be2b41955e20ccd624dba5f6fe9d38dcee385ba470a6e13ed86732fc86/langgraph_checkpoint-4.1.0-py3-none-any.whl", hash = "sha256:8bc2a0466a20c38b865ce6671b42093fd5c041133f32351cae4222e0eeaf7fb5", size = 56047, upload-time = "2026-05-12T03:33:48.548Z" }, ] [[package]] name = "langgraph-prebuilt" -version = "1.0.13" +version = "1.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "langgraph-checkpoint" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/a4/f8ac75fa7c503103f0cf7680944e28bbaaef74c19a8d163d7346869cc369/langgraph_prebuilt-1.0.13.tar.gz", hash = "sha256:ad219782a80e1718e7e7794de49e0ae307111d45cbcffab9a52725a66a609456", size = 172913, upload-time = "2026-04-30T01:48:15.742Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/66/ed9b93f56bc17ef22d551892f0ac2b225a97fe0fcf23a511b857f70d590b/langgraph_prebuilt-1.1.0.tar.gz", hash = "sha256:3c579cf6eed2d17f9c157c2d0fcaddcd8688524e7022d3b22b37a3bf4589d528", size = 178833, upload-time = "2026-05-12T03:37:49.332Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/ef/5ada0bef4013ef5ae53a0ca1de5736517f1076a54d313f156ca545ec65d5/langgraph_prebuilt-1.0.13-py3-none-any.whl", hash = "sha256:7055e9fad41fbd3593800aed0aea0a6e974b17f33ed51b80d3d3a031212dd7c0", size = 37214, upload-time = "2026-04-30T01:48:14.507Z" }, + { url = "https://files.pythonhosted.org/packages/e9/43/3fe1a700b8490ed02679cdbbc8c915eb23a092faf496c9c1118abcd10be3/langgraph_prebuilt-1.1.0-py3-none-any.whl", hash = "sha256:51e311747d755b751d5c6b39b0c1446124d3a7643d2515017e6714b323508fc9", size = 41043, upload-time = "2026-05-12T03:37:48.007Z" }, ] [[package]] @@ -1579,11 +1579,11 @@ test = [ [package.metadata] requires-dist = [ { name = "deepagents", marker = "extra == 'deepagents'", specifier = ">=0.5.3,<0.6.0" }, - { name = "langchain", marker = "extra == 'langchain'", specifier = ">=1.2.11,<2.0.0" }, + { name = "langchain", marker = "extra == 'langchain'", specifier = ">=1.3.0,<2.0.0" }, { name = "langchain-core", marker = "extra == 'langchain'" }, { name = "langchain-nvidia-ai-endpoints", marker = "extra == 'langchain-nvidia'", specifier = "~=1.0" }, { name = "langgraph", marker = "extra == 'langchain'" }, - { name = "langgraph", marker = "extra == 'langgraph'", specifier = ">=1.1.10,<2.0.0" }, + { name = "langgraph", marker = "extra == 'langgraph'", specifier = ">=1.2.0,<2.0.0" }, { name = "nemo-flow", extras = ["langchain"], marker = "extra == 'langchain-nvidia'" }, { name = "nemo-flow", extras = ["langchain"], marker = "extra == 'langgraph'" }, { name = "nemo-flow", extras = ["langgraph"], marker = "extra == 'deepagents'" }, @@ -2766,11 +2766,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.6.3" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]] From 681b3d7c64d082d531be17c992e3b6d818be913e Mon Sep 17 00:00:00 2001 From: Ajay Thorve Date: Thu, 14 May 2026 17:42:56 -0700 Subject: [PATCH 9/9] fix: support Cursor CLI hook config (#109) #### Overview Fix Cursor CLI hook configuration so current `cursor-agent` builds can execute NeMo Flow hook commands, and document the remaining Cursor CLI hook coverage limits. - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details - Generate Cursor `.cursor/hooks.json` entries as direct command entries with top-level `"version": 1`. - Preserve that Cursor-compatible shape when `nemo-flow run -- cursor-agent` temporarily patches project hooks. - Update `nemo-flow doctor cursor` to reject nested Cursor hook groups and missing or non-`1` top-level version fields. - Trim nullable fields from Cursor permission responses. - Update Cursor integration docs and packaged hooks to state the CLI limitation plainly: current Cursor CLI hook coverage is narrower than Cursor IDE hook coverage. #### Where should the reviewer start? Start with `crates/cli/src/installer.rs` for the hook-shape change, then `crates/cli/src/doctor.rs` for validation of user-managed Cursor hook files. #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Closes https://linear.app/nvidia/issue/NMF-122/fix-cursor-cli-hook-config-and-document-stream-json-limitation ## Summary by CodeRabbit * **Refactor** * Standardized Cursor hook JSON to require a top-level version (1) and direct command entries; merged/generated hook files now enforce this shape. * **New Features** * Added stricter validation for Cursor hook files with clear, actionable status messages and test coverage. * **Bug Fixes** * Cursor hook responses/endpoints no longer include legacy message fields. * **Documentation** * Expanded Cursor integration and troubleshooting guidance, plus CLI verification steps. [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NeMo-Flow/pull/109) Authors: - Ajay Thorve (https://github.com/AjayThorve) Approvers: - Will Killian (https://github.com/willkill07) URL: https://github.com/NVIDIA/NeMo-Flow/pull/109 --- crates/cli/src/adapters/cursor.rs | 4 +- crates/cli/src/doctor.rs | 103 ++++++++++ crates/cli/src/installer.rs | 44 +++-- crates/cli/src/launcher.rs | 10 +- crates/cli/tests/coverage/adapters_tests.rs | 2 + crates/cli/tests/coverage/doctor_tests.rs | 176 ++++++++++++++++++ crates/cli/tests/coverage/installer_tests.rs | 15 ++ crates/cli/tests/coverage/launcher_tests.rs | 11 ++ crates/cli/tests/coverage/server_tests.rs | 2 + .../coding-agent-cursor.md | 33 +++- .../coding-agents/cursor/.cursor/hooks.json | 142 +++----------- integrations/coding-agents/cursor/README.md | 21 ++- 12 files changed, 418 insertions(+), 145 deletions(-) diff --git a/crates/cli/src/adapters/cursor.rs b/crates/cli/src/adapters/cursor.rs index 3c1e39c0..72518baa 100644 --- a/crates/cli/src/adapters/cursor.rs +++ b/crates/cli/src/adapters/cursor.rs @@ -35,9 +35,7 @@ pub(crate) fn adapt(payload: Value, headers: &HeaderMap) -> AdapterOutcome { let response = match events.first() { Some(NormalizedEvent::ToolStarted(_)) => json!({ "continue": true, - "permission": "allow", - "user_message": null, - "agent_message": null + "permission": "allow" }), Some(NormalizedEvent::AgentEnded(_)) => json!({ "continue": true }), _ => json!({ "continue": true }), diff --git a/crates/cli/src/doctor.rs b/crates/cli/src/doctor.rs index 11a3e981..27203f87 100644 --- a/crates/cli/src/doctor.rs +++ b/crates/cli/src/doctor.rs @@ -406,6 +406,9 @@ fn hook_file_status( } }; match std::fs::read_to_string(&path) { + Ok(raw) if matches!(agent, CodingAgent::Cursor) => { + cursor_hook_file_status(&raw, &path, readiness_required, label) + } Ok(raw) if raw.contains(&format!("hook-forward {}", agent.as_arg())) => ( Status::Pass, format!("{label}: installed at {}", path.display()), @@ -431,6 +434,106 @@ fn hook_file_status( } } +fn cursor_hook_file_status( + raw: &str, + path: &Path, + readiness_required: bool, + label: &str, +) -> (Status, String) { + let has_nemo_hook = raw.contains("hook-forward cursor"); + if !has_nemo_hook { + if readiness_required { + return ( + Status::Fail, + format!("{label}: missing NeMo Flow hook in {}", path.display()), + ); + } + return ( + Status::Info, + format!("{label}: no NeMo Flow hook in {}", path.display()), + ); + } + + let parsed: Value = match serde_json::from_str(raw) { + Ok(parsed) => parsed, + Err(err) => { + return ( + Status::Fail, + format!( + "{label}: invalid Cursor hooks JSON in {}: {err}", + path.display() + ), + ); + } + }; + + if parsed.get("version").and_then(Value::as_u64) != Some(1) { + return ( + Status::Fail, + format!( + "{label}: Cursor hook file {} must set top-level `version` to 1", + path.display() + ), + ); + } + + let Some(hooks) = parsed.get("hooks").and_then(Value::as_object) else { + return ( + Status::Fail, + format!( + "{label}: Cursor hook file {} has no hooks object", + path.display() + ), + ); + }; + let has_direct_nemo_hook = hooks.values().any(cursor_event_has_direct_nemo_hook); + if has_nested_hook_group(&parsed) { + return ( + Status::Fail, + format!( + "{label}: Cursor hook file {} uses nested hook groups; Cursor CLI requires direct command entries", + path.display() + ), + ); + } + if !has_direct_nemo_hook { + return ( + Status::Fail, + format!( + "{label}: Cursor hook file {} has no direct NeMo Flow command entries", + path.display() + ), + ); + } + + ( + Status::Pass, + format!("{label}: installed at {}", path.display()), + ) +} + +fn cursor_event_has_direct_nemo_hook(event_hooks: &Value) -> bool { + event_hooks.as_array().is_some_and(|entries| { + entries.iter().any(|entry| { + entry + .get("command") + .and_then(Value::as_str) + .is_some_and(|command| command.contains("hook-forward cursor")) + }) + }) +} + +fn has_nested_hook_group(value: &Value) -> bool { + match value { + Value::Object(object) => { + let nested_here = object.get("hooks").is_some_and(Value::is_array); + nested_here || object.values().any(has_nested_hook_group) + } + Value::Array(items) => items.iter().any(has_nested_hook_group), + _ => false, + } +} + fn cursor_hooks_path() -> Result { let cwd = std::env::current_dir()?; let project = cwd diff --git a/crates/cli/src/installer.rs b/crates/cli/src/installer.rs index 6e60af4e..3d6d5069 100644 --- a/crates/cli/src/installer.rs +++ b/crates/cli/src/installer.rs @@ -198,8 +198,8 @@ fn resolve_hook_gateway_url( /// Generates native hook configuration for the selected agent. /// -/// The returned value always has a top-level `hooks` object, but Hermes uses its simpler command -/// group shape while Claude/Codex/Cursor use command hook groups with optional tool matchers. +/// The returned value always has a top-level `hooks` object. Claude/Codex use command hook +/// groups with optional tool matchers, while Cursor and Hermes use direct command entries. pub(crate) fn generated_hooks(agent: CodingAgent, command: &str) -> Value { match agent { CodingAgent::ClaudeCode => claude_hooks(command), @@ -228,11 +228,11 @@ fn codex_hooks(command: &str) -> Value { } fn cursor_hooks(command: &str) -> Value { - hooks_for_events(CURSOR_HOOK_EVENTS, command, true) + direct_command_hooks_for_events(CURSOR_HOOK_EVENTS, command) } // Generates Hermes YAML-compatible hook groups. Hermes expects direct command entries rather than -// the nested `type = command` group format used by Claude, Codex, and Cursor. +// the nested `type = command` group format used by Claude and Codex. pub(crate) fn hermes_hooks(command: &str) -> Value { let hooks: serde_json::Map = HERMES_HOOK_EVENTS .iter() @@ -249,7 +249,7 @@ pub(crate) fn hermes_hooks(command: &str) -> Value { json!({ "hooks": Value::Object(hooks) }) } -// Generates hook groups for all requested events and adds a wildcard matcher to tool events when +// Generates hook groups for Claude/Codex events and adds a wildcard matcher to tool events when // the target agent requires matcher-scoped tool hooks. Non-tool events omit matchers so they fire // for the full lifecycle. fn hooks_for_events(events: &[&str], command: &str, matcher_for_tools: bool) -> Value { @@ -277,21 +277,33 @@ fn hooks_for_events(events: &[&str], command: &str, matcher_for_tools: bool) -> json!({ "hooks": Value::Object(hooks) }) } +// Cursor CLI 2026.05 accepts direct command entries in `.cursor/hooks.json`; it does not execute +// the nested hook-group shape used by Claude Code and Codex. +fn direct_command_hooks_for_events(events: &[&str], command: &str) -> Value { + let hooks: serde_json::Map = events + .iter() + .map(|event| { + ( + (*event).to_string(), + json!([{ + "command": command, + "timeout": 30 + }]), + ) + }) + .collect(); + json!({ + "version": 1, + "hooks": Value::Object(hooks) + }) +} + // Identifies hook events that should receive wildcard tool matchers. The list includes current -// Claude/Codex spellings plus Cursor shell/MCP names so generated config stays agent-compatible. +// Claude/Codex spellings. Cursor uses direct command hooks and does not call this helper. fn event_matches_tools(event: &str) -> bool { matches!( event, - "PreToolUse" - | "PostToolUse" - | "PostToolUseFailure" - | "PermissionRequest" - | "preToolUse" - | "postToolUse" - | "beforeShellExecution" - | "afterShellExecution" - | "beforeMCPExecution" - | "afterMCPExecution" + "PreToolUse" | "PostToolUse" | "PostToolUseFailure" | "PermissionRequest" ) } diff --git a/crates/cli/src/launcher.rs b/crates/cli/src/launcher.rs index 32b4b70f..6ff4b5e7 100644 --- a/crates/cli/src/launcher.rs +++ b/crates/cli/src/launcher.rs @@ -823,14 +823,18 @@ fn write_merged_cursor_hooks(path: &Path) -> Result<(), CliError> { if let Some(parent) = path.parent() { std::fs::create_dir_all(parent)?; } - let contents = serde_json::to_string_pretty(&merge_hooks( + let mut merged = merge_hooks( read_json_file(path)?, generated_hooks( CodingAgent::Cursor, &hook_forward_command(&transparent_hook_executable(), CodingAgent::Cursor), ), - )?) - .map_err(|error| CliError::Launch(error.to_string()))?; + )?; + if let Some(root) = merged.as_object_mut() { + root.insert("version".to_string(), json!(1)); + } + let contents = serde_json::to_string_pretty(&merged) + .map_err(|error| CliError::Launch(error.to_string()))?; std::fs::write(path, contents)?; Ok(()) } diff --git a/crates/cli/tests/coverage/adapters_tests.rs b/crates/cli/tests/coverage/adapters_tests.rs index cd23816b..507c26f1 100644 --- a/crates/cli/tests/coverage/adapters_tests.rs +++ b/crates/cli/tests/coverage/adapters_tests.rs @@ -257,6 +257,8 @@ fn maps_cursor_subagent_and_permission_response() { event => panic!("unexpected event: {event:?}"), } assert_eq!(outcome.response["permission"], json!("allow")); + assert!(outcome.response.get("user_message").is_none()); + assert!(outcome.response.get("agent_message").is_none()); } #[test] diff --git a/crates/cli/tests/coverage/doctor_tests.rs b/crates/cli/tests/coverage/doctor_tests.rs index 0927a940..05f19226 100644 --- a/crates/cli/tests/coverage/doctor_tests.rs +++ b/crates/cli/tests/coverage/doctor_tests.rs @@ -412,6 +412,182 @@ fn check_directory_reports_pass_warn_and_fail() { assert_eq!(fail.status, Status::Fail); } +#[test] +fn cursor_hook_status_rejects_grouped_entries() { + let temp = tempfile::tempdir().unwrap(); + let hooks_path = temp.path().join("hooks.json"); + std::fs::write( + &hooks_path, + r#"{ + "version": 1, + "hooks": { + "beforeShellExecution": [ + { + "matcher": "*", + "hooks": [ + { + "type": "command", + "command": "nemo-flow hook-forward cursor", + "timeout": 30 + } + ] + } + ] + } + }"#, + ) + .unwrap(); + + let (status, details) = hook_file_status( + Ok(hooks_path), + CodingAgent::Cursor, + true, + "hooks: user-managed", + ); + + assert_eq!(status, Status::Fail); + assert!(details.contains("nested hook groups")); + assert!(details.contains("direct command entries")); +} + +#[test] +fn cursor_hook_status_rejects_any_grouped_entries_when_nemo_hook_is_direct() { + let temp = tempfile::tempdir().unwrap(); + let hooks_path = temp.path().join("hooks.json"); + std::fs::write( + &hooks_path, + r#"{ + "version": 1, + "hooks": { + "sessionStart": [ + { + "command": "nemo-flow hook-forward cursor", + "timeout": 30 + } + ], + "beforeShellExecution": [ + { + "matcher": "*", + "hooks": [ + { + "type": "command", + "command": "existing-audit-hook", + "timeout": 30 + } + ] + } + ] + } + }"#, + ) + .unwrap(); + + let (status, details) = hook_file_status( + Ok(hooks_path), + CodingAgent::Cursor, + true, + "hooks: user-managed", + ); + + assert_eq!(status, Status::Fail); + assert!(details.contains("nested hook groups")); + assert!(details.contains("direct command entries")); +} + +#[test] +fn cursor_hook_status_requires_version_one() { + let temp = tempfile::tempdir().unwrap(); + let hooks_path = temp.path().join("hooks.json"); + std::fs::write( + &hooks_path, + r#"{ + "hooks": { + "beforeShellExecution": [ + { + "command": "nemo-flow hook-forward cursor", + "timeout": 30 + } + ] + } + }"#, + ) + .unwrap(); + + let (status, details) = hook_file_status( + Ok(hooks_path), + CodingAgent::Cursor, + true, + "hooks: user-managed", + ); + + assert_eq!(status, Status::Fail); + assert!(details.contains("version")); + assert!(details.contains("1")); +} + +#[test] +fn cursor_hook_status_rejects_non_one_version() { + let temp = tempfile::tempdir().unwrap(); + let hooks_path = temp.path().join("hooks.json"); + std::fs::write( + &hooks_path, + r#"{ + "version": 2, + "hooks": { + "beforeShellExecution": [ + { + "command": "nemo-flow hook-forward cursor", + "timeout": 30 + } + ] + } + }"#, + ) + .unwrap(); + + let (status, details) = hook_file_status( + Ok(hooks_path), + CodingAgent::Cursor, + true, + "hooks: user-managed", + ); + + assert_eq!(status, Status::Fail); + assert!(details.contains("version")); + assert!(details.contains("1")); +} + +#[test] +fn cursor_hook_status_accepts_direct_versioned_entries() { + let temp = tempfile::tempdir().unwrap(); + let hooks_path = temp.path().join("hooks.json"); + std::fs::write( + &hooks_path, + r#"{ + "version": 1, + "hooks": { + "beforeShellExecution": [ + { + "command": "nemo-flow hook-forward cursor", + "timeout": 30 + } + ] + } + }"#, + ) + .unwrap(); + + let (status, details) = hook_file_status( + Ok(hooks_path), + CodingAgent::Cursor, + true, + "hooks: user-managed", + ); + + assert_eq!(status, Status::Pass); + assert!(details.contains("installed")); +} + #[tokio::test] async fn collect_observability_warns_for_missing_atif_dir_without_creating_it() { let temp = tempfile::tempdir().unwrap(); diff --git a/crates/cli/tests/coverage/installer_tests.rs b/crates/cli/tests/coverage/installer_tests.rs index 712a6b5e..a3262b76 100644 --- a/crates/cli/tests/coverage/installer_tests.rs +++ b/crates/cli/tests/coverage/installer_tests.rs @@ -139,6 +139,21 @@ fn generated_hook_dispatch_covers_all_agents() { ); } +#[test] +fn cursor_hooks_use_direct_command_entries() { + let hooks = cursor_hooks("nemo-flow hook-forward cursor"); + let before_shell = &hooks["hooks"]["beforeShellExecution"][0]; + + assert_eq!(hooks["version"], json!(1)); + assert_eq!( + before_shell["command"], + json!("nemo-flow hook-forward cursor") + ); + assert_eq!(before_shell["timeout"], json!(30)); + assert!(before_shell.get("hooks").is_none()); + assert!(before_shell.get("matcher").is_none()); +} + #[test] fn packaged_hook_configs_are_valid_json() { let root = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) diff --git a/crates/cli/tests/coverage/launcher_tests.rs b/crates/cli/tests/coverage/launcher_tests.rs index b8727fac..1f9ef129 100644 --- a/crates/cli/tests/coverage/launcher_tests.rs +++ b/crates/cli/tests/coverage/launcher_tests.rs @@ -455,6 +455,9 @@ fn cursor_patch_restore_restores_original_file() { .unwrap() .contains("hook-forward cursor") ); + let patched: serde_json::Value = + serde_json::from_str(&std::fs::read_to_string(".cursor/hooks.json").unwrap()).unwrap(); + assert_eq!(patched["version"], json!(1)); prepared.restore().unwrap(); assert_eq!( std::fs::read_to_string(".cursor/hooks.json").unwrap(), @@ -495,6 +498,11 @@ fn cursor_patch_restore_uses_nearest_project_cursor_dir() { .unwrap() .contains("hook-forward cursor") ); + let patched: serde_json::Value = serde_json::from_str( + &std::fs::read_to_string(temp.path().join(".cursor/hooks.json")).unwrap(), + ) + .unwrap(); + assert_eq!(patched["version"], json!(1)); assert!(!Path::new(".cursor/hooks.json").exists()); prepared.restore().unwrap(); std::env::set_current_dir(previous).unwrap(); @@ -520,6 +528,9 @@ fn cursor_patch_restore_removes_temporary_file() { ) .unwrap(); assert!(Path::new(".cursor/hooks.json").exists()); + let patched: serde_json::Value = + serde_json::from_str(&std::fs::read_to_string(".cursor/hooks.json").unwrap()).unwrap(); + assert_eq!(patched["version"], json!(1)); prepared.restore().unwrap(); assert!(!Path::new(".cursor/hooks.json").exists()); std::env::set_current_dir(previous).unwrap(); diff --git a/crates/cli/tests/coverage/server_tests.rs b/crates/cli/tests/coverage/server_tests.rs index d49b1efe..a2a8c142 100644 --- a/crates/cli/tests/coverage/server_tests.rs +++ b/crates/cli/tests/coverage/server_tests.rs @@ -464,6 +464,8 @@ async fn cursor_hook_returns_cursor_permission_fields() { let body: Value = serde_json::from_slice(&bytes).unwrap(); assert_eq!(body["continue"], json!(true)); assert_eq!(body["permission"], json!("allow")); + assert!(body.get("user_message").is_none()); + assert!(body.get("agent_message").is_none()); } #[tokio::test] diff --git a/docs/integrate-frameworks/coding-agent-cursor.md b/docs/integrate-frameworks/coding-agent-cursor.md index 67117d34..56b20b2d 100644 --- a/docs/integrate-frameworks/coding-agent-cursor.md +++ b/docs/integrate-frameworks/coding-agent-cursor.md @@ -15,9 +15,21 @@ and response lifecycle events through `.cursor/hooks.json`. Complete LLM lifecycle observability additionally requires Cursor model traffic to route through the gateway if your Cursor build exposes that configuration. -Cursor CLI support must be verified separately with `cursor-agent`. If CLI hooks -do not fire, treat Cursor CLI support as hook-limited and gateway-only where -model routing is configurable. +Cursor CLI support must be verified separately with `cursor-agent`. Current +Cursor CLI builds require `.cursor/hooks.json` to set top-level `"version": 1` +and use direct command entries such as +`{"command": "nemo-flow hook-forward cursor", "timeout": 30}`. The nested +`{"matcher": "*", "hooks": [...]}` group shape used by Claude Code and Codex +does not fire in Cursor CLI. If CLI hooks still do not fire with direct +versioned entries, treat that Cursor CLI version as hook-limited and +gateway-only where model routing is configurable. + +```{warning} +Cursor CLI hook coverage is not the same as Cursor IDE hook coverage. Current +headless CLI builds can emit fewer hook events than Cursor IDE sessions. Treat +missing CLI hook events as a Cursor CLI limitation after `nemo-flow doctor +cursor` confirms the hook file uses the direct versioned shape. +``` ## Transparent Run @@ -36,7 +48,8 @@ nemo-flow cursor -- agent --resume This shortcut is equivalent to `nemo-flow run -- cursor-agent`. The wrapper starts a gateway on a dynamic `127.0.0.1` port, temporarily merges NeMo Flow hook entries into the project `.cursor/hooks.json`, launches Cursor, and -restores the original hook file after the agent exits. +restores the original hook file after the agent exits. The temporary Cursor hook +file is written with top-level `"version": 1` and direct command entries. Inspect what would be launched without starting Cursor: @@ -118,9 +131,10 @@ printf '{"session_id":"smoke-cursor","hook_event_name":"sessionStart"}' \ ``` For Cursor CLI, run an equivalent `cursor-agent` session and verify the gateway -receives hook requests. If no hook requests arrive, document that CLI version as -hook-limited and rely only on gateway observability where provider routing is -available. +receives hook requests. If no hook requests arrive, confirm `.cursor/hooks.json` +uses top-level `"version": 1` with direct command entries, then document that +CLI version as hook-limited and rely only on gateway observability where +provider routing is available. ## Verify Export @@ -132,8 +146,9 @@ ls .nemo-flow/atif The gateway writes `.atif.json` on session end. If the file is missing, confirm Cursor loaded `.cursor/hooks.json`, the gateway binary is on -`PATH`, and `plugins.toml` enables the ATIF exporter with a writable -`output_directory`. +`PATH`, `--atif-dir` or `NEMO_FLOW_ATIF_DIR` is configured, `plugins.toml` +enables the ATIF exporter with a writable `output_directory`, and user-managed +Cursor hooks pass `nemo-flow doctor cursor`. ## Troubleshoot LLM Lifecycle diff --git a/integrations/coding-agents/cursor/.cursor/hooks.json b/integrations/coding-agents/cursor/.cursor/hooks.json index 0196f7da..c2dd52ed 100644 --- a/integrations/coding-agents/cursor/.cursor/hooks.json +++ b/integrations/coding-agents/cursor/.cursor/hooks.json @@ -1,175 +1,95 @@ { "SPDX-License-Identifier": "Apache-2.0", + "version": 1, "hooks": { "sessionStart": [ { - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "beforeSubmitPrompt": [ { - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "preToolUse": [ { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "beforeShellExecution": [ { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "beforeMCPExecution": [ { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "postToolUse": [ { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "afterShellExecution": [ { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "afterMCPExecution": [ { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "subagentStart": [ { - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "subagentStop": [ { - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "afterAgentResponse": [ { - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "afterAgentThought": [ { - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "preCompact": [ { - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "stop": [ { - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ], "sessionEnd": [ { - "hooks": [ - { - "type": "command", - "command": "nemo-flow-sidecar hook-forward cursor", - "timeout": 30 - } - ] + "command": "nemo-flow hook-forward cursor", + "timeout": 30 } ] } diff --git a/integrations/coding-agents/cursor/README.md b/integrations/coding-agents/cursor/README.md index 560ce063..edaf5d3b 100644 --- a/integrations/coding-agents/cursor/README.md +++ b/integrations/coding-agents/cursor/README.md @@ -15,6 +15,18 @@ lifecycle observability additionally requires Cursor model traffic to route through the gateway if the active Cursor build exposes provider base URL configuration. +Cursor CLI builds require `.cursor/hooks.json` to set top-level `"version": 1` +and use direct command entries such as +`{"command": "nemo-flow hook-forward cursor", "timeout": 30}`. The nested +`{"matcher": "*", "hooks": [...]}` group shape used by Claude Code and Codex +does not fire in Cursor CLI. + +> [!WARNING] +> Cursor CLI hook coverage is narrower than Cursor IDE hook coverage. Current +> headless CLI builds can emit fewer hook events than Cursor IDE sessions. Treat +> missing CLI hook events as a Cursor CLI limitation after `nemo-flow doctor +> cursor` confirms the hook file uses the direct versioned shape. + ## Files - `.cursor/hooks.json` contains hook entries that run @@ -44,7 +56,9 @@ nemo-flow run -- cursor-agent The wrapper starts a per-invocation gateway on a dynamic localhost port, temporarily merges NeMo Flow hooks into project `.cursor/hooks.json`, launches -Cursor, and restores or removes the temporary hook file when Cursor exits. +Cursor, and restores or removes the temporary hook file when Cursor exits. The +temporary Cursor hook file is written with top-level `"version": 1` and direct +command entries. Inspect the launch without starting Cursor: @@ -118,8 +132,9 @@ printf '{"session_id":"smoke-cursor","hook_event_name":"sessionStart"}' \ ``` If Cursor CLI hooks do not fire for the active `cursor-agent` version, treat -that CLI mode as hook-limited and rely on gateway observability where provider -routing is available. +that CLI mode as hook-limited after confirming `.cursor/hooks.json` uses direct +versioned entries. User-managed Cursor hook files can be checked with +`nemo-flow doctor cursor`. If LLM spans are present but attached to the top-level agent instead of a subagent, include `x-nemo-flow-subagent-id` on gateway requests or share