1pub mod actions;
14pub mod components;
15pub mod contract;
16pub mod decoders;
17pub mod exposes;
18pub mod expressions;
19pub mod package;
20pub mod policy;
21pub mod calendar;
22pub mod query;
23pub mod record_macros;
24pub mod record_migrations;
25pub mod record_policy;
26pub mod record_transitions;
27pub mod record_store;
28pub mod host_params;
29pub mod records;
30pub mod router;
31pub mod screens;
32pub mod share;
33pub mod signature;
34pub mod sources;
35pub mod tests;
36pub mod tools;
37
38pub use actions::{
39 action_call_name, action_var_types, apply_record_batch, apply_record_batch_as, function_effect, is_action_name, run_action, validate_package_actions, validate_package_effects, ActionContext, ACTION_CALL_PREFIX, ACTION_LIMIT_ACTIONS, ACTION_LIMIT_MAX_STEPS, ACTION_LIMIT_STEPS, ACTION_NAME_PATTERN,
40 ACTION_STEP_KINDS, RECORDS_BATCH_FUNCTION,
41};
42pub use components::validate_package_components;
43pub use contract::*;
44pub use expressions::{literal_type, record_row_type, records_value_type, schema_type, validate_package_expressions, validate_record_computed};
45pub use exposes::{expose_action_access, expose_issues, expose_name_destructive, expose_template_paths, validate_package_exposes, validate_upstreams, ExposeIssue};
46pub use decoders::{decode_jsonl, mcp_action_call, messages_from_mcp_result, DecodeIssue, Decoded, JsonlDecoder, SseDecoder};
47pub use package::{
48 available_extensions, client_capabilities, merge_data, package_sources, source_allowed, supported_catalog_ids, template_messages, validate_package, validate_package_in, validate_package_with, version_satisfies, AvailableExtension, PackageIssue,
49 PACKAGE_FORMAT_VERSION,
50};
51pub use policy::{
52 combine_decisions, decide_function, decide_url, expand_link_base, image_dimensions, image_frames, image_header, is_builtin_function, is_private_host, media_image_check, ImageHeader, matches_pattern, media_image_within_limits, media_request, media_within_limits, package_policy, svg_dimensions,
53 police_text_links, safe_href, FunctionDecision, FunctionPolicy, MediaOptions, MediaRequest, MediaRule, TextLink, UrlDecision, UrlPolicy, BUILTIN_FUNCTIONS,
54};
55pub use router::{normalize_path, HostRouter, SurfaceInfo};
56pub use screens::{cross_app_target, cross_app_target_value, fill_screen_params, nav_screens, navigate_target, navigate_target_value, package_screens, resolve_screen, screen_data, validate_package_screens, NavigateTarget, ResolvedScreen, MAX_SCREENS, MAX_SCREEN_TITLE, MAX_EXPOSED_DESCRIPTION, NAVIGATE_FUNCTION, SCREEN_PARAMS_KEY};
57pub use query::{
58 computed_data, expand_query_source, fill_query_templates, kind_computed, kind_refs, month_days, month_label, parse_records_json, parse_records_query, parse_records_source, records_value, records_value_owned, shift_month, RecordRow, RecordRowRef, RecordsAggregate, RecordsAggregateOp, RecordsBefore, RecordsContext, RecordsDay, RecordsFilter, RecordsFilterOp, RecordsFilterValue, RecordsGroupKey, RecordsMonthView, RecordsOrder, RecordsQueryIssue, RecordsRunning, RecordsRunningOp,
59 RecordsQuery, RecordsSortKey, RECORDS_AGGREGATE_OPS, RECORDS_AGGREGATE_RESERVED, RECORDS_COMPUTED_MAX, RECORDS_COMPUTED_ROW_KEYS, RECORDS_FILTER_OPS, RECORDS_MONTHS, RECORDS_OP_ALIASES, RECORDS_RUNNING_OPS, RECORDS_RESERVED_PARAMS, RECORDS_ROW_KEYS, RECORDS_SCHEME, RECORDS_WEEKDAYS,
60};
61pub use record_migrations::{is_version_range, kind_changes, kind_changes_json, migrate_record, migration_refusal, package_migrations, range_holds, validate_migrations, KindChange, MigrateResult, MIGRATION_OP_NAMES, RECORD_MIGRATIONS_MAX, RECORD_MIGRATION_OPS_MAX};
62pub use record_transitions::{initial_states, kind_transitions, transition_refusal, transitions_from, validate_record_transitions, RecordTransitions, TransitionRefusal, TransitionViewer, RECORD_TRANSITIONS_ROW_KEY, TRANSITION_LEVELS};
63pub use record_policy::{
64 readable_rows, record_allowed, record_author_of, record_policy, record_policy_copy, record_refusal, validate_record_policy, RecordOp, RecordPolicy, RecordViewer, APP_ACCESS_LEVELS, DEFAULT_RECORD_POLICY, RECORD_POLICY_LEVELS, RECORD_POLICY_OPS,
65};
66pub use record_store::{MemoryRecordStore, RecordsDelta, RECORDS_FUNCTIONS};
67pub use host_params::{fill_host_params, host_params, with_host_params};
68pub use records::{is_record_kind, record_attachment_fields, record_attachment_id, record_attachment_ids, validate_record, validate_record_refs, validate_params_schema, validate_record_schema, without_nulls, RECORD_FIELD_TYPES, RECORD_FORMATS, RECORD_RESERVED_KEYS};
69pub use signature::{canonical_json, package_file_signed_bytes, AUTHOR_KEY_PREFIX, AUTHOR_NAME_MAX, PACKAGE_FILE_SIGNATURE_ALG, PACKAGE_FILE_SIGNATURE_CONTEXT};
70pub use sources::{parse_source, source_with_params, ParsedSource};
71pub use tests::{
72 package_test_issues, run_package_tests, test_failure, test_matches, validate_package_tests, PackageTestResult, PACKAGE_TEST_DEFAULT_AS, PACKAGE_TEST_DEFAULT_NOW, PACKAGE_TEST_DEFAULT_ROLE, PACKAGE_TEST_ROLES, PACKAGE_TEST_KINDS, PACKAGE_TEST_LIMIT_GOT_MAX, PACKAGE_TEST_LIMIT_TESTS,
73};
74pub use tools::{tool_call, tool_consent, tool_consent_key, validate_tools, ToolCall, ToolConsentRow, TOOL_KINDS};
75
76pub(crate) fn is_js_space(c: char) -> bool {
78 matches!(c, '\u{9}' | '\u{a}' | '\u{b}' | '\u{c}' | '\u{d}' | ' ' | '\u{a0}' | '\u{1680}' | '\u{2000}'..='\u{200a}' | '\u{2028}' | '\u{2029}' | '\u{202f}' | '\u{205f}' | '\u{3000}' | '\u{feff}')
79}
80
81pub(crate) fn js_trim(s: &str) -> &str {
83 s.trim_matches(is_js_space)
84}
85
86pub(crate) fn utf16_cmp(a: &str, b: &str) -> std::cmp::Ordering {
92 if a.is_ascii() || b.is_ascii() {
93 return a.as_bytes().cmp(b.as_bytes());
94 }
95 a.encode_utf16().cmp(b.encode_utf16())
96}
97
98pub(crate) fn js_truthy(value: &serde_json::Value) -> bool {
100 use serde_json::Value;
101 match value {
102 Value::Null => false,
103 Value::Bool(b) => *b,
104 Value::Number(n) => n.as_f64().is_some_and(|f| f != 0.0 && !f.is_nan()),
105 Value::String(s) => !s.is_empty(),
106 _ => true,
107 }
108}