MoonBit mini-app UI framework with Rabbita-style authoring and modular platform adapters.
moon run cmd/main -- helpmoon run cmd/mainmoon run cmd/main -- --out /tmp/bunnia-agent-mapmoon run cmd/main -- build --target wechat --example moontown_miniapp --strict --budget large --render-budget large
moon run cmd/main -- inspect --target wechat --example moontown_miniapp --budget large --render-budget large
sh scripts/validate_moontown_ordinary_copy.shnode examples/moontown_miniapp/backend/local_backend.mjs --reset-state
node examples/moontown_miniapp/backend/local_backend.mjs --smokemoon run cmd/main -- build --target wechat --strictmoon run cmd/main -- build --target wechat --strict --budget tightmoon run cmd/main -- watch --target wechat --example agent_map --strictmoon run cmd/main -- snapshot --target wechat --example agent_map --strictmoon run cmd/main -- inspect --target wechat --example agent_map --budget tight --render-budget tightmoon run cmd/main -- limits --target wechatmoon run cmd/main -- ci-plan
moon run cmd/main -- ci-plan --script
sh scripts/scaffold_smoke.sh
sh scripts/ci.shmoon run cmd/main -- ci-plan --example moontown_miniapp --budget large --render-budget largemoon run cmd/main -- build --target alipay --example agent_map --strict
moon run cmd/main -- build --target tiktok --example agent_map --strict///|
test {
let root = @bunnia.page([@bunnia.button("Open", "open-detail")])
let alipay = @bunnia.generate_alipay_project(name="Adapter", root~)
let tiktok = @bunnia.generate_tiktok_project(name="Adapter", root~)
assert_true(alipay.files[2].path.has_suffix(".axml"))
assert_true(tiktok.files[2].path.has_suffix(".ttml"))
assert_eq(alipay.page.plan.node_count, tiktok.page.plan.node_count)
}///|
test {
let limits = @bunnia.platform_limits(target="wechat")
assert_eq(limits.generator_status_id, "available")
assert_eq(limits.generator_available, true)
assert_eq(limits.event_mappings[0].platform_event, "bindtap")
assert_eq(limits.request_mappings[0].platform_api, "wx.request")
assert_true(limits.summary.contains("components=9"))
let alipay = @bunnia.platform_limits(target="alipay")
assert_eq(alipay.generator_status_id, "available")
assert_eq(alipay.event_mappings[0].platform_event, "onTap")
assert_eq(alipay.request_mappings[0].platform_api, "my.request")
}moon run cmd/main -- init --name my_miniapp --module local/my_miniapp --out /tmp/my-miniappmoon run cmd/main -- --example wenyu_overview///|
test {
let page = @bunnia.page([
@bunnia.view([
@bunnia.text("Demo Dashboard"),
@bunnia.button("Open Detail", "open-detail"),
]),
])
let plan = @bunnia.plan(page, @bunnia.wechat())
assert_eq(plan.node_count, 5)
}///|
test {
let plan = @bunnia.plan_scene_assets_with_budget_and_policy(
[
@bunnia.remote_image_asset(
"remote-ok", "https://cdn.example.test/tile.png",
),
@bunnia.remote_image_asset(
"remote-bad", "https://assets.example.test/tile.png",
),
],
@bunnia.default_scene_asset_budget(),
@bunnia.scene_asset_policy(approved_remote_domains=["cdn.example.test"]),
)
assert_eq(plan.remote_assets, 2)
assert_eq(plan.unapproved_remote_asset_count, 1)
}///|
test {
let app = @bunnia.program(
id="counter",
model=0,
view=fn(count) {
@bunnia.page([
@bunnia.text("Count \{count}"),
@bunnia.button("Increment", "inc"),
])
},
update=fn(count, msg) {
if msg == "inc" {
@bunnia.step(model=count + 1)
} else {
@bunnia.step(model=count)
}
},
)
let next = @bunnia.apply(app, "inc")
let output = @bunnia.generate_wechat_page(
"Counter",
@bunnia.current_view(next),
)
assert_true(output.wxml.contains("Count 1"))
}///|
test {
let trace = @bunnia.communication_trace([
@bunnia.handoff(
id="handoff-1",
thread_id="thread-a",
from_actor_id="agent-a",
to_actor_id="operator",
text="Please review this result.",
open_message="open-review",
),
])
let output = @bunnia.generate_wechat_page("Trace", @bunnia.page([trace]))
assert_true(output.wxml.contains("bunnia-communication-handoff"))
assert_true(output.wxml.contains("open-review"))
}///|
test {
let runtime = @bunnia.wechat_runtime(initial_data_json="{\"counter\":0}", event_patches=[
@bunnia.wechat_event_patch("open-detail", [@bunnia.set_json("counter", "1")]),
])
let project = @bunnia.generate_wechat_project_with_runtime(
name="Budgeted",
root=@bunnia.page([@bunnia.button("Open", "open-detail")]),
runtime~,
)
let report = @bunnia.report_wechat_project(project, runtime)
assert_eq(report.file_count, 10)
assert_true(project.manifest.summary.contains("app_files=9"))
assert_true(report.initial_data_bytes > 0)
assert_true(report.event_patch_bytes > 0)
}///|
test {
let contract = @bunnia.backend_contract(id="agent-backend", endpoints=[
@bunnia.agent_message_endpoint(
"send-agent-message", "/agent/message", "message", "messageResult",
),
@bunnia.review_decision_endpoint(
"review-decision", "/review/decision", "review", "reviewResult",
),
])
let plan = @bunnia.plan_backend_contract(contract)
let effects = @bunnia.plan_backend_effects_for_platform(
contract,
@bunnia.wechat(),
)
let js = @bunnia.generate_wechat_request_adapter(contract)
assert_eq(plan.endpoint_count, 2)
assert_eq(effects.effect_count, 2)
assert_true(js.contains("wx.request"))
assert_true(!js.contains("secret"))
}///|
test {
let plan = @bunnia.plan_snapshot_deltas([
@bunnia.set_snapshot_section_delta(
"home", "buildings", "[{\"id\":\"hall\"}]",
),
@bunnia.append_snapshot_item_delta(
"home", "messages", "msg-1", "{\"id\":\"msg-1\"}",
),
])
assert_eq(plan.section_update_count, 1)
assert_eq(plan.append_item_count, 1)
assert_eq(plan.full_snapshot_count, 0)
assert_true(plan.patch_plan.total_estimated_bytes < 128)
}///|
test {
let assets = [@bunnia.sprite_asset("agent", "/assets/agent.png", 2048)]
let map = @bunnia.static_scene_view(
@bunnia.scene(
"overview",
@bunnia.scene_size(640, 480),
[
@bunnia.layer("districts", 1, [], regions=[
@bunnia.region(
id="district-a",
label="District A",
x=48,
y=64,
width=240,
height=160,
status="review",
tap_message="select-district-a",
),
]),
@bunnia.layer("actors", 10, [
@bunnia.marker(
id="actor-a",
label="Agent A",
x=120,
y=180,
status="running",
asset_ref="agent",
tap_message="select-actor-a",
),
]),
],
assets~,
),
)
let patches = @bunnia.plan_patches([
@bunnia.select_scene_region("overview", "district-a"),
@bunnia.set_scene_marker_status("overview", "actor-a", "selected"),
])
let output = @bunnia.generate_wechat_page("Map", @bunnia.page([map]))
assert_true(output.wxml.contains("data-region-id=\"district-a\""))
assert_true(output.wxml.contains("bunnia-scene-sprite"))
assert_true(patches.total_estimated_bytes < 96)
}///|
test {
let map = @bunnia.scene(
"ops-map",
@bunnia.scene_size(640, 420),
[
@bunnia.layer("markers", 1, [
@bunnia.marker(
id="agent",
label="Agent",
x=120,
y=140,
status="running",
tap_message="select-agent",
asset_ref="agent",
),
]),
],
assets=[@bunnia.sprite_asset("agent", "/assets/agent.png", 2048)],
)
let quality = @bunnia.plan_scene_visual_quality(map)
assert_eq(quality.degraded, false)
assert_eq(quality.diagnostics.length(), 0)
}///|
test {
let feed = @bunnia.message_feed([
@bunnia.message(
id="msg-1",
actor_id="agent-a",
thread_id="thread-a",
text="Working",
artifact_ref="artifact://result-a",
),
])
let map = @bunnia.static_scene_view(
@bunnia.scene("overview", @bunnia.scene_size(640, 480), [
@bunnia.layer("actors", 10, [
@bunnia.marker(
id="actor-a",
label="Agent A",
x=120,
y=180,
status="running",
tap_message="select-actor-a",
),
]),
]),
)
let output = @bunnia.generate_wechat_page("Demo", @bunnia.page([feed, map]))
assert_true(output.wxml.contains("select-actor-a"))
assert_true(output.js.contains("__bunnia.lastMessage"))
}fn agent_cancel_endpoint(id : String, path : String, payload_key : String, response_key : String) -> BackendEndpointfn agent_message_endpoint(id : String, path : String, payload_key : String, response_key : String) -> BackendEndpointfn agent_retry_endpoint(id : String, path : String, payload_key : String, response_key : String) -> BackendEndpointfn agent_stream_endpoint(id : String, path : String, payload_key : String, response_key : String) -> BackendEndpointfn anchored_scene_thread_overlay_with_viewport(input : Scene, viewport : SceneViewport, links : Array[SceneThreadLink]) -> Nodefn append_snapshot_item_delta(scope : String, section : String, item_id : String, value_json : String) -> SnapshotDeltafn append_stream_chunk_delta(target_path : String, chunk_id : String, text : String, status? : RunStatus) -> AgentDeltafn approval(id~ : String, thread_id~ : String, from_actor_id~ : String, to_actor_id~ : String, text~ : String, artifact_ref? : String, open_message? : String) -> Communicationfn backend_budget(max_endpoints~ : Int, max_streaming~ : Int, max_review_required~ : Int) -> BackendBudgetfn backend_contract(id~ : String, base_url_key? : String, session_token_key? : String, session_header_key? : String, endpoints~ : Array[BackendEndpoint]) -> BackendContractfn backend_endpoint(id~ : String, kind~ : BackendEndpointKind, http_method~ : HttpMethod, path~ : String, payload_key? : String, response_key? : String, timeout_ms? : Int, streaming? : Bool, requires_review? : Bool) -> BackendEndpointfn backend_request(id~ : String, endpoint~ : BackendEndpoint, payload_json? : String, replay_key? : String) -> BackendRequestfn broadcast(id~ : String, thread_id~ : String, from_actor_id~ : String, text~ : String, open_message? : String) -> Communicationfn build_profile_budget(max_route_diagnostic_routes~ : Int, max_route_diagnostics~ : Int, max_unwindowed_list_children~ : Int, max_unkeyed_list_children~ : Int, max_duplicate_list_keys~ : Int, max_communication_unresolved_reviews~ : Int, max_tool_result_missing_acks~ : Int, max_agent_duplicate_stream_chunks~ : Int, max_snapshot_full_replaces~ : Int, max_scene_thread_orphans~ : Int, max_scene_camera_clamped~ : Int, max_scene_surface_fallbacks~ : Int, max_scene_insecure_remote_assets~ : Int, max_scene_unapproved_remote_assets~ : Int, max_scene_deferred_assets~ : Int, max_scene_quality_issues~ : Int, max_degraded_scenes~ : Int) -> BuildProfileBudgetfn ci_plan(target? : String, budget_profile? : String, render_budget_profile? : String, examples? : Array[String], snapshot_dir? : String, post_build_steps? : Array[CiPlanStep]) -> CiPlanfn communication(id~ : String, thread_id~ : String, kind~ : CommunicationKind, from_actor_id~ : String, to_actor_id? : String, text~ : String, artifact_ref? : String, timestamp? : String, status? : RunStatus, open_message? : String) -> Communicationfn communication_budget(max_visible_count? : Int, max_review_request_count? : Int, max_unresolved_review_count? : Int, max_artifact_ref_count? : Int) -> CommunicationBudgetfn communication_filter(thread_id? : String, actor_id? : String, kind_id? : String, include_resolved_reviews? : Bool) -> CommunicationFilterfn effect(id~ : String, kind~ : EffectKind, target~ : String, payload_key? : String, message? : String) -> Effectfn filter_communications(items : Array[Communication], filter : CommunicationFilter) -> Array[Communication]fn gate_build_profile(profile : BuildProfile, budget : BuildProfileBudget, budget_profile? : String) -> BuildProfileGatefn gate_miniapp_inspection(inspection : MiniappInspection, budget : MiniappInspectionBudget, budget_profile? : String) -> MiniappInspectionGatefn gate_project_inspection(inspection : ProjectInspection, budget : ProjectInspectionBudget, budget_profile? : String) -> ProjectInspectionGatefn generate_miniapp_page_with_budget(name : String, root : Node, platform~ : Platform, render_budget~ : RenderBudget) -> MiniappPagefn generate_miniapp_project(name~ : String, route? : String, root~ : Node, platform~ : Platform) -> MiniappProjectfn generate_miniapp_project_with_budget(name~ : String, route? : String, root~ : Node, platform~ : Platform, render_budget~ : RenderBudget) -> MiniappProjectfn generate_wechat_page_with_runtime(name : String, root : Node, runtime : WechatRuntime) -> WechatPagefn generate_wechat_page_with_runtime_and_budget(name : String, root : Node, runtime : WechatRuntime, render_budget : RenderBudget) -> WechatPagefn generate_wechat_project_from_pages(name~ : String, pages~ : Array[WechatProjectPage]) -> WechatProjectfn generate_wechat_project_from_pages_with_backend(name~ : String, pages~ : Array[WechatProjectPage], backend_contract~ : BackendContract) -> WechatProjectfn generate_wechat_project_with_runtime(name~ : String, route? : String, root~ : Node, runtime~ : WechatRuntime) -> WechatProjectfn generate_wechat_project_with_runtime_and_backend(name~ : String, route? : String, root~ : Node, runtime~ : WechatRuntime, backend_contract~ : BackendContract) -> WechatProjectfn generate_wechat_project_with_runtime_and_budget(name~ : String, route? : String, root~ : Node, runtime~ : WechatRuntime, render_budget~ : RenderBudget) -> WechatProjectfn generate_wechat_project_with_runtime_and_budget_and_backend(name~ : String, route? : String, root~ : Node, runtime~ : WechatRuntime, render_budget~ : RenderBudget, backend_contract~ : BackendContract) -> WechatProjectfn generic_endpoint(id : String, path : String, http_method : HttpMethod, payload_key? : String, response_key? : String) -> BackendEndpointfn handoff(id~ : String, thread_id~ : String, from_actor_id~ : String, to_actor_id~ : String, text~ : String, open_message? : String) -> Communicationfn handoff_submit_endpoint(id : String, path : String, payload_key : String, response_key : String) -> BackendEndpointfn inspect_miniapp_project(target~ : String, example~ : String, project : MiniappProject) -> MiniappInspectionfn inspect_wechat_project(target~ : String, example~ : String, project : WechatProject, report : WechatBuildReport) -> ProjectInspectionfn inspection_budget(max_route_risk_score~ : Int, max_update_payload_bytes~ : Int, max_update_operations~ : Int, max_unwindowed_list_children~ : Int, max_unkeyed_list_children~ : Int, max_duplicate_list_keys~ : Int, max_backend_events~ : Int, max_backend_streams~ : Int, max_backend_reviews~ : Int, max_backend_cancels~ : Int, max_backend_retries~ : Int, max_scene_assets~ : Int, max_scene_remote_assets~ : Int, max_scene_package_bytes~ : Int) -> ProjectInspectionBudgetfn layer(id : String, z_index : Int, markers : Array[SceneMarker], regions? : Array[SceneRegion]) -> SceneLayerfn marker(id~ : String, label~ : String, x~ : Int, y~ : Int, status? : String, tap_message? : String, asset_ref? : String, hit_width? : Int, hit_height? : Int) -> SceneMarkerfn message_event(id~ : String, thread_id~ : String, from_actor_id~ : String, text~ : String, artifact_ref? : String, open_message? : String) -> Communicationfn miniapp_inspection_budget(max_pages~ : Int, max_files~ : Int, max_total_bytes~ : Int, max_route_diagnostic_routes~ : Int, max_route_diagnostics~ : Int, max_nodes~ : Int, max_depth~ : Int, max_events~ : Int, max_scene_markers~ : Int, max_scene_regions~ : Int, max_scene_assets~ : Int) -> MiniappInspectionBudgetfn miniapp_release_readiness_report(target~ : String, example~ : String, budget_profile~ : String, project : MiniappProject, inspection : MiniappInspection, inspection_gate : MiniappInspectionGate) -> ReleaseReadinessReportfn operator_submit_endpoint(id : String, path : String, payload_key : String, response_key : String) -> BackendEndpointfn plan_agent_deltas_with_budget(deltas : Array[AgentDelta], budget : PatchBudget) -> AgentDeltaPlanfn plan_backend_contract_with_budget(contract : BackendContract, budget : BackendBudget) -> BackendPlanfn plan_backend_effects_for_adapter(contract : BackendContract, adapter : PlatformAdapter) -> EffectPlanfn plan_communications_with_budget(items : Array[Communication], budget : CommunicationBudget) -> CommunicationPlanfn plan_filtered_communications(items : Array[Communication], filter : CommunicationFilter, budget? : CommunicationBudget) -> CommunicationPlanfn plan_for_adapter_with_budget(root : Node, adapter : PlatformAdapter, budget : RenderBudget) -> RenderPlanfn plan_scene_assets_with_budget(assets : Array[SceneAsset], budget : SceneAssetBudget) -> SceneAssetPlanfn plan_scene_assets_with_budget_and_policy(assets : Array[SceneAsset], budget : SceneAssetBudget, policy : SceneAssetPolicy) -> SceneAssetPlanfn plan_scene_camera_with_budget(input : Scene, camera : SceneCamera, budget : SceneCameraBudget) -> SceneCameraPlanfn plan_scene_render_viewport(input : Scene, viewport : SceneViewport, budget : SceneRenderBudget) -> SceneRenderPlanfn plan_scene_surface(input : Scene, adapter : PlatformAdapter, preference? : SceneSurfacePreference, budget? : SceneRenderBudget) -> SceneSurfacePlanfn plan_scene_surface_for_platform(input : Scene, platform : Platform, preference? : SceneSurfacePreference, budget? : SceneRenderBudget) -> SceneSurfacePlanfn plan_scene_threads_viewport(input : Scene, viewport : SceneViewport, links : Array[SceneThreadLink]) -> SceneThreadPlanfn plan_scene_threads_viewport_with_budget(input : Scene, viewport : SceneViewport, links : Array[SceneThreadLink], budget : SceneThreadBudget) -> SceneThreadPlanfn plan_scene_threads_with_budget(input : Scene, links : Array[SceneThreadLink], budget : SceneThreadBudget) -> SceneThreadPlanfn plan_scene_visual_quality_viewport(input : Scene, viewport : SceneViewport, render_budget : SceneRenderBudget, asset_budget : SceneAssetBudget, quality_budget : SceneVisualQualityBudget) -> SceneVisualQualityPlanfn plan_scene_visual_quality_with_budget(input : Scene, render_budget : SceneRenderBudget, asset_budget : SceneAssetBudget, quality_budget : SceneVisualQualityBudget) -> SceneVisualQualityPlanfn plan_snapshot_deltas_with_budget(deltas : Array[SnapshotDelta], budget : PatchBudget) -> SnapshotDeltaPlanfn plan_tool_result_cards_with_budget(cards : Array[ToolResultCard], budget : ToolResultBudget) -> ToolResultPlanfn platform_adapter(platform~ : Platform, id~ : String, page_component~ : String, tap_event~ : String, component_prefix? : String, app_launch_lifecycle? : String, page_load_lifecycle? : String, page_ready_lifecycle? : String, request_api? : String, supports_canvas? : Bool, supports_cloud? : Bool, supports_stream? : Bool) -> PlatformAdapterfn platform_limits_for_adapter(adapter : PlatformAdapter, generator_available? : Bool) -> PlatformLimitsReportfn platform_target_support_for_adapter(adapter : PlatformAdapter, generator_available? : Bool) -> PlatformTargetSupportfn profile_wechat_project(project : WechatProject, patches : PatchPlan, effect_plans? : Array[EffectPlan], communication_plans? : Array[CommunicationPlan], tool_result_plans? : Array[ToolResultPlan], agent_delta_plans? : Array[AgentDeltaPlan], backend_plans? : Array[BackendPlan], snapshot_plans? : Array[SnapshotDeltaPlan], asset_plans? : Array[SceneAssetPlan], thread_plans? : Array[SceneThreadPlan], camera_plans? : Array[SceneCameraPlan], scene_plans? : Array[SceneRenderPlan], surface_plans? : Array[SceneSurfacePlan], quality_plans? : Array[SceneVisualQualityPlan]) -> BuildProfilefn recovery_notice(id~ : String, thread_id~ : String, from_actor_id~ : String, text~ : String, open_message? : String) -> Communicationfn region(id~ : String, label~ : String, x~ : Int, y~ : Int, width~ : Int, height~ : Int, status? : String, tap_message? : String) -> SceneRegionfn release_readiness_report(target~ : String, example~ : String, budget_profile~ : String, project : WechatProject, profile : BuildProfile, profile_gate : BuildProfileGate, inspection : ProjectInspection, inspection_gate : ProjectInspectionGate) -> ReleaseReadinessReportfn render_budget(max_nodes~ : Int, max_depth~ : Int, max_events~ : Int, max_initial_data_bytes~ : Int, max_unwindowed_list_children? : Int, max_scene_markers? : Int, max_scene_regions? : Int, max_scene_assets? : Int, max_degraded_scenes? : Int) -> RenderBudgetfn report_wechat_project_with_budget(project : WechatProject, runtime : WechatRuntime, budget : WechatBuildBudget) -> WechatBuildReportfn review_action(id~ : String, label~ : String, approve_message~ : String, reject_message~ : String, state? : ReviewState) -> ReviewActionfn review_decision_endpoint(id : String, path : String, payload_key : String, response_key : String) -> BackendEndpointfn review_request(id~ : String, thread_id~ : String, from_actor_id~ : String, to_actor_id~ : String, text~ : String, artifact_ref? : String, open_message? : String) -> Communicationfn scene(id : String, size : SceneSize, layers : Array[SceneLayer], assets? : Array[SceneAsset]) -> Scenefn scene_asset(id~ : String, kind~ : SceneAssetKind, src~ : String, estimated_bytes? : Int, remote? : Bool) -> SceneAssetfn scene_asset_budget(max_assets~ : Int, max_package_bytes~ : Int, max_remote_assets~ : Int) -> SceneAssetBudgetfn scene_asset_policy(approved_remote_domains~ : Array[String], require_https? : Bool) -> SceneAssetPolicyfn scene_camera(scene_id~ : String, x~ : Int, y~ : Int, width~ : Int, height~ : Int, zoom_percent? : Int) -> SceneCamerafn scene_camera_budget(min_zoom_percent? : Int, max_zoom_percent? : Int, min_viewport_width? : Int, min_viewport_height? : Int) -> SceneCameraBudgetfn scene_camera_from_viewport(scene_id : String, viewport : SceneViewport, zoom_percent? : Int) -> SceneCamerafn scene_marker_thread_link(id~ : String, scene_id~ : String, marker_id~ : String, thread_id~ : String, subject_ref? : String, status? : String, unread_count? : Int, open_message? : String) -> SceneThreadLinkfn scene_region_thread_link(id~ : String, scene_id~ : String, region_id~ : String, thread_id~ : String, subject_ref? : String, status? : String, unread_count? : Int, open_message? : String) -> SceneThreadLinkfn scene_render_budget(max_layers~ : Int, max_markers~ : Int, max_static_assets~ : Int, max_regions? : Int) -> SceneRenderBudgetfn scene_thread_budget(max_visible_links? : Int, max_unread_total? : Int, max_orphan_links? : Int, max_links_without_open_message? : Int) -> SceneThreadBudgetfn scene_thread_link(id~ : String, scene_id~ : String, subject_kind~ : String, subject_id~ : String, thread_id~ : String, subject_ref? : String, status? : String, unread_count? : Int, open_message? : String) -> SceneThreadLinkfn scene_visual_quality_budget(min_width~ : Int, min_height~ : Int, max_markers_without_status~ : Int, max_markers_without_tap~ : Int, max_markers_without_asset_ref~ : Int, max_unresolved_asset_refs~ : Int, max_regions_without_status? : Int, max_regions_without_tap? : Int, min_hit_width? : Int, min_hit_height? : Int, max_small_hit_targets? : Int) -> SceneVisualQualityBudgetfn select_scene_thread(scene_id : String, subject_kind : String, subject_id : String, thread_id : String) -> Patchfn set_snapshot_section_delta(scope : String, section : String, value_json : String) -> SnapshotDeltafn set_stream_chunk_delta(target_path : String, chunk_id : String, text : String, status? : RunStatus) -> AgentDeltafn snapshot_miniapp_project(target~ : String, example~ : String, project : MiniappProject, inspection : MiniappInspection, inspection_gate : MiniappInspectionGate, release : ReleaseReadinessReport, budget_profile? : String, render_budget_profile? : String) -> GeneratedSnapshotfn snapshot_wechat_project(target~ : String, example~ : String, project : WechatProject, profile : BuildProfile) -> GeneratedSnapshotfn snapshot_wechat_project_with_report(target~ : String, example~ : String, project : WechatProject, report : WechatBuildReport, profile : BuildProfile, budget_profile? : String, render_budget_profile? : String) -> GeneratedSnapshotfn static_scene_view_with_camera(input : Scene, camera : SceneCamera, budget? : SceneRenderBudget, camera_budget? : SceneCameraBudget) -> Nodefn static_scene_view_with_viewport(input : Scene, viewport : SceneViewport, budget? : SceneRenderBudget) -> Nodefn static_scene_with_windowed_threads(input : Scene, links : Array[SceneThreadLink], total_count~ : Int, offset? : Int) -> Nodefn surface_status(kind~ : SurfaceStatusKind, label~ : String, detail? : String, action_message? : String) -> SurfaceStatusfn tool_result(id~ : String, thread_id~ : String, from_actor_id~ : String, text~ : String, artifact_ref~ : String, open_message? : String) -> Communicationfn tool_result_budget(max_visible_count? : Int, max_pending_ack_count? : Int, max_missing_ack_count? : Int, max_artifact_ref_count? : Int) -> ToolResultBudgetfn tool_result_card(id~ : String, tool_name~ : String, title~ : String, summary~ : String, artifact_ref? : String, status? : RunStatus, open_message? : String, acknowledge_message? : String) -> ToolResultCardfn wechat_build_budget(max_pages~ : Int, max_files~ : Int, max_total_bytes~ : Int, max_wxml_bytes~ : Int, max_wxss_bytes~ : Int, max_js_bytes~ : Int, max_initial_data_bytes~ : Int, max_event_patch_bytes~ : Int, max_event_patch_operations~ : Int, max_page_first_screen_bytes~ : Int, max_page_update_payload_bytes~ : Int, max_page_update_operations~ : Int) -> WechatBuildBudgetfn wechat_project_page(name~ : String, route~ : String, root~ : Node, runtime? : WechatRuntime, render_budget? : RenderBudget) -> WechatProjectPagefn wechat_project_page_with_runtime(page : WechatProjectPage, runtime : WechatRuntime) -> WechatProjectPagefn wechat_runtime(initial_data_json? : String, event_patches? : Array[WechatEventPatch], page_methods_js? : String) -> WechatRuntimefn windowed_anchored_scene_thread_overlay(input : Scene, links : Array[SceneThreadLink], total_count~ : Int, offset? : Int) -> Nodefn windowed_anchored_scene_thread_overlay_with_viewport(input : Scene, viewport : SceneViewport, links : Array[SceneThreadLink], total_count~ : Int, offset? : Int) -> Nodefn windowed_communication_trace(items : Array[Communication], total_count~ : Int, offset? : Int) -> Nodefn windowed_scene_thread_overlay(links : Array[SceneThreadLink], total_count~ : Int, offset? : Int) -> Nodefn windowed_tool_result_card_list(cards : Array[ToolResultCard], total_count~ : Int, offset? : Int) -> NodeMoonBit mini-app UI framework with Rabbita-style authoring and modular platform adapters.