@shundoo-ai/dsh-cosmic 1.0.19 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cordis.patch.yml +5 -5
- package/package.json +1 -1
- package/skills/cosmic-build/CHANGELOG.md +4 -0
- package/skills/cosmic-build/LOCAL-PATCHES.md +91 -40
- package/skills/cosmic-build/SKILL.md +46 -13
- package/skills/cosmic-build/assets/platform-report-filters/TypedReportFilterFields.java +169 -0
- package/skills/cosmic-build/assets/platform-report-filters/platform.patch +98 -0
- package/skills/cosmic-build/assets/report-algo-benchmark/ReportAlgoBenchmark.java +48 -0
- package/skills/cosmic-build/assets/report-algo-benchmark/ReportBenchmarkLogFactory.java +7 -0
- package/skills/cosmic-build/examples/java-rules/CosmicEntryQuery.java +26 -0
- package/skills/cosmic-build/examples/java-rules/CosmicReportAggregation.java +35 -0
- package/skills/cosmic-build/examples/java-rules/CosmicReportFilters.java +77 -0
- package/skills/cosmic-build/examples/java-rules/CosmicTimeAdapter.java +25 -0
- package/skills/cosmic-build/examples/java-rules/CosmicTimeAdapterCheck.java +26 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/api/algo/GroupbyDataSet.md +47 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/api/entity/report/FilterInfo.md +12 -12
- package/skills/cosmic-build/knowledge/cosmic/platform/api/entity/report/FilterItemInfo.md +2 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/form-plugin.md +2 -4
- package/skills/cosmic-build/knowledge/cosmic/platform/java-type-contracts.md +11 -2
- package/skills/cosmic-build/knowledge/cosmic/platform/list-plugin.md +18 -14
- package/skills/cosmic-build/knowledge/cosmic/platform/operation-plugin.md +4 -4
- package/skills/cosmic-build/knowledge/cosmic/platform/reportlistdata-plugin.md +17 -9
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/cross-entity-aggregate-writeback.md +2 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/pre-post-operation.md +15 -7
- package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-algo.md +24 -68
- package/skills/cosmic-build/knowledge/cosmic/platform/workflow-plugin.md +2 -7
- package/skills/cosmic-build/references/application-context.md +35 -1
- package/skills/cosmic-build/references/common-reference.md +1 -1
- package/skills/cosmic-build/references/compile-guide.md +55 -68
- package/skills/cosmic-build/references/delivery.md +59 -7
- package/skills/cosmic-build/references/execution-contract.md +38 -0
- package/skills/cosmic-build/references/form-discovery.md +7 -1
- package/skills/cosmic-build/references/java-plugin-delivery.md +32 -162
- package/skills/cosmic-build/references/operation-dispatch.md +17 -0
- package/skills/cosmic-build/references/plugin-handoff-input.md +131 -0
- package/skills/cosmic-build/references/plugin-runtime-routing.md +1 -1
- package/skills/cosmic-build/references/report-filter-contract.md +78 -0
- package/skills/cosmic-build/references/sdk-inspection.md +23 -0
- package/skills/cosmic-build/schemas/data-model-authoring.schema.json +2 -3
- package/skills/cosmic-build/scripts/_http_client.py +55 -55
- package/skills/cosmic-build/scripts/appconfig_load.py +2 -2
- package/skills/cosmic-build/scripts/apply_report_filter_extension.py +39 -0
- package/skills/cosmic-build/scripts/bootstrap_cosmic_context.py +37 -2
- package/skills/cosmic-build/scripts/compile_plugin_source.py +279 -156
- package/skills/cosmic-build/scripts/execution_binding.py +40 -0
- package/skills/cosmic-build/scripts/inspect_platform_sdk.py +169 -0
- package/skills/cosmic-build/scripts/kd_api.py +23 -22
- package/skills/cosmic-build/scripts/kd_auth.py +1 -1
- package/skills/cosmic-build/scripts/kd_env_loader.py +19 -10
- package/skills/cosmic-build/scripts/kd_token_cache.py +2 -2
- package/skills/cosmic-build/scripts/kingscript_sdk_sync.py +350 -0
- package/skills/cosmic-build/scripts/kingscript_source_gate.py +11 -8
- package/skills/cosmic-build/scripts/platform_api_contract.py +246 -11
- package/skills/cosmic-build/scripts/plugin_corpus/build_index.py +403 -0
- package/skills/cosmic-build/scripts/plugin_corpus/jvm_classfile.py +281 -0
- package/skills/cosmic-build/scripts/plugin_corpus/measure_api_usage.py +446 -0
- package/skills/cosmic-build/scripts/plugin_source_gate.py +48 -7
- package/skills/cosmic-build/scripts/plugin_target_sdk.py +45 -0
- package/skills/cosmic-build/scripts/prepare_plugin_handoff.py +493 -47
- package/skills/cosmic-build/scripts/preview_url.py +35 -6
- package/skills/cosmic-build/scripts/query_plugin_handoff.py +250 -0
- package/skills/cosmic-build/scripts/register_plugins.py +28 -2
- package/skills/cosmic-build/scripts/render_output_cards.py +42 -9
- package/skills/cosmic-build/scripts/report_algo_benchmark.py +46 -0
- package/skills/cosmic-build/scripts/run.py +2 -2
- package/skills/cosmic-build/scripts/sync_generated_locale_assets.py +43 -0
- package/skills/cosmic-build/scripts/test/fixtures/ReportSdkCheck.java +64 -0
- package/skills/cosmic-build/scripts/test/fixtures/java_context_booking_native.json +541 -0
- package/skills/cosmic-build/scripts/test/test_add_rule_business_contract.py +85 -14
- package/skills/cosmic-build/scripts/test/test_batch5_drift_governance.py +12 -3
- package/skills/cosmic-build/scripts/test/test_build_meta_order.py +0 -16
- package/skills/cosmic-build/scripts/test/test_cli_continuation.py +87 -0
- package/skills/cosmic-build/scripts/test/test_compile_plugin_source.py +224 -3
- package/skills/cosmic-build/scripts/test/test_control_authoring.py +123 -4
- package/skills/cosmic-build/scripts/test/test_cosmic_sdk_examples.py +141 -0
- package/skills/cosmic-build/scripts/test/test_data_model_contract.py +30 -5
- package/skills/cosmic-build/scripts/test/test_delivery_stage_boundary.py +2 -10
- package/skills/cosmic-build/scripts/test/test_dym_sync_background.py +11 -0
- package/skills/cosmic-build/scripts/test/test_dynamic_form_metadata_only_contract.py +59 -1
- package/skills/cosmic-build/scripts/test/test_guide_skeleton_contract.py +87 -43
- package/skills/cosmic-build/scripts/test/test_inspect_platform_sdk.py +71 -0
- package/skills/cosmic-build/scripts/test/test_kd_api.py +67 -19
- package/skills/cosmic-build/scripts/test/test_kingscript_sdk_sync.py +221 -0
- package/skills/cosmic-build/scripts/test/test_kingscript_source_gate.py +10 -0
- package/skills/cosmic-build/scripts/test/test_list_configuration_closure.py +18 -0
- package/skills/cosmic-build/scripts/test/test_long_session_regressions.py +116 -0
- package/skills/cosmic-build/scripts/test/test_mcp_cli.py +524 -0
- package/skills/cosmic-build/scripts/test/test_modeling_input_recovery.py +141 -0
- package/skills/cosmic-build/scripts/test/test_open_world_cli_catalog.py +36 -2
- package/skills/cosmic-build/scripts/test/test_platform_api_contract.py +161 -1
- package/skills/cosmic-build/scripts/test/test_plugin_business_contract.py +91 -0
- package/skills/cosmic-build/scripts/test/test_plugin_corpus.py +195 -0
- package/skills/cosmic-build/scripts/test/test_plugin_handoff.py +346 -1
- package/skills/cosmic-build/scripts/test/test_plugin_target_sdk.py +70 -0
- package/skills/cosmic-build/scripts/test/test_preview_url.py +44 -1
- package/skills/cosmic-build/scripts/test/test_property_batch.py +22 -0
- package/skills/cosmic-build/scripts/test/test_property_input_discovery.py +13 -11
- package/skills/cosmic-build/scripts/test/test_query_plugin_handoff.py +160 -0
- package/skills/cosmic-build/scripts/test/test_register_plugins.py +31 -1
- package/skills/cosmic-build/scripts/test/test_render_output_cards.py +50 -4
- package/skills/cosmic-build/scripts/test/test_report_business_contract.py +27 -0
- package/skills/cosmic-build/scripts/test/test_report_doc_contract_sync.py +5 -4
- package/skills/cosmic-build/scripts/test/test_report_sdk_optimization.py +36 -0
- package/skills/cosmic-build/scripts/test/test_rule_batch_evidence.py +1 -1
- package/skills/cosmic-build/scripts/test/test_rule_domain_contract.py +20 -0
- package/skills/cosmic-build/scripts/test/test_rule_function_formula.py +16 -6
- package/skills/cosmic-build/scripts/test/test_skill_entry_contract.py +1 -0
- package/skills/cosmic-build/scripts/test/test_test_environment.py +45 -0
- package/skills/cosmic-build/scripts/test/test_verify_plugin_loading.py +79 -0
- package/skills/cosmic-build/scripts/test_environment.py +49 -0
- package/skills/cosmic-build/scripts/verify_plugin_loading.py +71 -0
- package/skills/cosmic-build/skills/cosmic-coding-impl/SKILL.md +86 -162
- package/skills/cosmic-build/skills/cosmic-coding-script/ATTRIBUTION.md +1 -1
- package/skills/cosmic-build/skills/cosmic-coding-script/SKILL.md +45 -14
- package/skills/cosmic-build/skills/cosmic-coding-script/references/kwc-controller-authoring.md +6 -0
- package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/README.md +29 -19
- package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/docs//350/204/232/346/234/254SDK.md +3 -4
- package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/indexes/package-index.md +1 -1
- package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/strategy.md +27 -18
- package/skills/cosmic-build/skills/cosmic-meta-api/SKILL.md +11 -17
- package/skills/cosmic-build/skills/cosmic-meta-api/apis/ai_meta.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/apis/app_menu.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/apis/meta_log.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/control-authoring.json +45 -4
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/form-control-traits.json +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/layout-ui.json +18 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/menu-publish.json +8 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/property-batch.json +7 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/property-input-index.json +3 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/report-write-contracts.json +1 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-domain.json +37 -5
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-event-contract.json +24 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/run-build-meta.json +61 -12
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/dropdown-menu.schema.json +69 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/report-write.schema.json +2 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/rule-set.schema.json +1 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/rule-write.schema.json +14 -7
- package/skills/cosmic-build/skills/cosmic-meta-api/docs/api-summary.md +2 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/app-action/SKILL.md +6 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/develop/SKILL.md +1 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/export/SKILL.md +5 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/init/SKILL.md +13 -36
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/SKILL.md +8 -9
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/config.json.example +5 -15
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/reset/SKILL.md +6 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/usage/SKILL.md +20 -148
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/verify/SKILL.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/build_receipts.py +171 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_apps.py +25 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_controls.py +55 -21
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_fields.py +10 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_formactions.py +63 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_forms.py +59 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_listui.py +8 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_metaops.py +36 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_plugins.py +115 -90
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_properties.py +666 -4
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_rules.py +1415 -87
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/commands.py +6 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/config.py +28 -15
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/execution_errors.py +40 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/formatters.py +32 -5
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/property_policy_contract.py +6 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/report_ops.py +113 -17
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/reset.py +3 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/rule_contract.py +107 -26
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/build_meta_order.py +50 -49
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/cosmic_api.py +856 -150
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/field_decorator.py +47 -14
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_receipt_resume.py +374 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_cli_failure_contract.py +24 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_creation_identity_boundary.py +4 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_dropdown_menu_contract.py +382 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_existing_form_ui.py +0 -25
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_field_decorator.py +50 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_functional_group_resolution.py +83 -16
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_identity_template_resolution.py +103 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_plugin_contract.py +28 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_readback_derivation.py +22 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_typed_filters.py +65 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_write_closure.py +1041 -15
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_post_build_recovery.py +65 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_verification_evidence.py +17 -0
- package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/api-param-checklist.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/rule-modeling-guide.md +7 -4
- package/skills/cosmic-build/skills/cosmic-meta-modeling/SKILL.md +61 -13
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/app-menu/SKILL.md +8 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/formtemplate/SKILL.md +5 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/formtemplate/dynamic-form-artifact-schema.md +5 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/SKILL.md +21 -9
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-entity-graphs.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-storage-constraints.md +5 -3
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-ui-composition.md +6 -3
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/creation-recovery.md +13 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/parse-core.md +3 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_contract.py +6 -1
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_emit.py +135 -87
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/field_type_registry.py +11 -1
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/isv_resolver.py +1 -3
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/report_validator.py +29 -0
- package/skills/cosmic-build/skills/cosmic-meta-modifier/SKILL.md +4 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/context/SKILL.md +2 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/execute/SKILL.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/SKILL.md +5 -4
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/operation-write.md +6 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/validation.md +2 -0
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/SKILL.md +20 -5
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/complex-apis.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/policy-grammar.md +4 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/report-op/SKILL.md +9 -0
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/SKILL.md +61 -4
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/raw-rule-authoring.md +3 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/rule-actions.md +2 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/rule-reference.md +6 -6
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/state.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/unit/SKILL.md +6 -3
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/verify/usage-guide.md +4 -4
- package/skills/cosmic-build/skills/cosmic-meta-modifier/references/list-filter-modification.md +4 -1
- package/skills/cosmic-build/skills/cosmic-meta-ui/SKILL.md +9 -1
- package/skills/cosmic-build/skills/cosmic-meta-ui/modules/button/SKILL.md +3 -0
- package/skills/cosmic-build/skills/mcp-server/SKILL.md +210 -0
- package/skills/cosmic-build/skills/mcp-server/scripts/mcp_cli.py +431 -0
- package/skills/cosmic-build/skills/openapi-gen/SKILL.md +3 -3
- package/skills/cosmic-build/skills/openapi-gen/scripts/api/gen_runner.py +2 -2
- package/skills/cosmic-dev-best-practices/references/bill-dev-convention.md +19 -9
- package/skills/cosmic-dev-best-practices/references/cosmic-meta-api.md +14 -11
- package/skills/cosmic-dev-best-practices/references/design-examples/basedata-design-example.md +1 -1
- package/skills/cosmic-dev-best-practices/references/design-examples/bill-design-example.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/AssistantField.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/BasedataField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/BasedataPropField.md +3 -3
- package/skills/cosmic-dev-best-practices/references/elements/CreaterField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/CurrencyField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/CustomerField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/FlexField.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/MaterielField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/OrgField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/SupplierField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/UnitField.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/UserField.md +3 -3
- package/skills/cosmic-dev-best-practices/references/elements/common-field-property-conventions.md +16 -11
- package/skills/cosmic-dev-best-practices/references/layout-control-convention.md +5 -4
- package/skills/erp-analysis/references/delivery-contract.md +4 -2
- package/skills/erp-analysis/templates/AGENTS.template.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/.dsh/cosmic/.kd/config.json +0 -21
|
@@ -59,6 +59,8 @@ _FORM_ACTION_KEY_MAP = {
|
|
|
59
59
|
"visible": "Visible",
|
|
60
60
|
"expression": "Expression",
|
|
61
61
|
"ret": "RET",
|
|
62
|
+
"events": "events",
|
|
63
|
+
"addevents": "addEvents",
|
|
62
64
|
"seq": "Seq",
|
|
63
65
|
"fieldname": "FieldName",
|
|
64
66
|
"displaystyles": "DisplayStyles",
|
|
@@ -70,6 +72,7 @@ _BIZ_ACTION_KEY_MAP = {
|
|
|
70
72
|
"actiontype": "ActionType", "description": "Description",
|
|
71
73
|
"expression": "Expression", "fieldname": "FieldName",
|
|
72
74
|
"ret": "RET", "seq": "Seq",
|
|
75
|
+
"events": "events", "addevents": "addEvents",
|
|
73
76
|
}
|
|
74
77
|
|
|
75
78
|
_ADVANCED_TAKE_VALUE_ACTIONS = frozenset({
|
|
@@ -86,35 +89,41 @@ def _single_casefold_value(source: dict, name: str):
|
|
|
86
89
|
|
|
87
90
|
|
|
88
91
|
def _normalize_take_value_list(value, *, path, resolve_target=None):
|
|
89
|
-
if not isinstance(value, list) or
|
|
92
|
+
if not isinstance(value, list) or not value or not all(isinstance(item, dict) for item in value):
|
|
90
93
|
raise ValueError(
|
|
91
|
-
f"RULE_ACTION_TAKE_VALUE_INVALID: {path} must contain
|
|
94
|
+
f"RULE_ACTION_TAKE_VALUE_INVALID: {path} must contain one or more mapping objects"
|
|
92
95
|
)
|
|
93
96
|
key_map = {
|
|
94
97
|
"targetfield": "TargetField", "srcfield": "SrcField",
|
|
95
98
|
"targetfieldname": "TargetFieldName", "srcfieldname": "SrcFieldName",
|
|
96
99
|
"onlyemptyrow": "OnlyEmptyRow",
|
|
97
100
|
}
|
|
98
|
-
item = {"_Type_": "TakeValueId"}
|
|
99
|
-
for key, raw in value[0].items():
|
|
100
|
-
canonical = key_map.get(str(key).casefold(), key)
|
|
101
|
-
if canonical == "_Type_":
|
|
102
|
-
continue
|
|
103
|
-
compiled = copy.deepcopy(raw)
|
|
104
|
-
if resolve_target and isinstance(compiled, str):
|
|
105
|
-
compiled = resolve_target(compiled)
|
|
106
|
-
item[canonical] = compiled
|
|
107
101
|
required = (
|
|
108
102
|
("TargetField", "SrcField")
|
|
109
103
|
if path == "Expression"
|
|
110
104
|
else ("TargetFieldName", "SrcFieldName")
|
|
111
105
|
)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
)
|
|
117
|
-
|
|
106
|
+
normalized = []
|
|
107
|
+
targets = set()
|
|
108
|
+
for index, mapping in enumerate(value):
|
|
109
|
+
item = {"_Type_": "TakeValueId"}
|
|
110
|
+
for key, raw in mapping.items():
|
|
111
|
+
canonical = key_map.get(str(key).casefold(), key)
|
|
112
|
+
if canonical == "_Type_":
|
|
113
|
+
continue
|
|
114
|
+
compiled = copy.deepcopy(raw)
|
|
115
|
+
if resolve_target and isinstance(compiled, str):
|
|
116
|
+
compiled = resolve_target(compiled)
|
|
117
|
+
item[canonical] = compiled
|
|
118
|
+
missing = [key for key in required if not str(item.get(key) or "").strip()]
|
|
119
|
+
if missing:
|
|
120
|
+
raise ValueError(f"RULE_ACTION_TAKE_VALUE_INVALID: {path}[{index}] missing {missing}")
|
|
121
|
+
target = str(item[required[0]]).strip()
|
|
122
|
+
if target in targets:
|
|
123
|
+
raise ValueError(f"RULE_ACTION_TAKE_VALUE_DUPLICATE_TARGET: {path}[{index}] {target!r}")
|
|
124
|
+
targets.add(target)
|
|
125
|
+
normalized.append(item)
|
|
126
|
+
return normalized
|
|
118
127
|
|
|
119
128
|
|
|
120
129
|
def normalize_biz_rule_action(
|
|
@@ -137,6 +146,14 @@ def normalize_biz_rule_action(
|
|
|
137
146
|
if not action_type:
|
|
138
147
|
raise ValueError("RULE_ACTION_TYPE_REQUIRED: bizRule ActionType is required")
|
|
139
148
|
_validate_action_type(action_type)
|
|
149
|
+
events = normalized.pop("events", None)
|
|
150
|
+
add_events = normalized.pop("addEvents", None)
|
|
151
|
+
if events is not None and add_events is not None:
|
|
152
|
+
raise ValueError("RULE_EVENTS_CONFLICT: choose events or addEvents")
|
|
153
|
+
if events is not None and "RET" in normalized:
|
|
154
|
+
raise ValueError("RULE_EVENTS_CONFLICT: choose events or RET")
|
|
155
|
+
if add_events is not None and "RET" not in normalized:
|
|
156
|
+
raise ValueError(f"RULE_EVENT_BASE_RET_REQUIRED: {action_type} needs the current RET with addEvents")
|
|
140
157
|
if action_type in _ADVANCED_TAKE_VALUE_ACTIONS:
|
|
141
158
|
normalized["Expression"] = _normalize_take_value_list(
|
|
142
159
|
normalized.get("Expression"), path="Expression", resolve_target=resolve_target
|
|
@@ -144,6 +161,8 @@ def normalize_biz_rule_action(
|
|
|
144
161
|
normalized["FieldName"] = _normalize_take_value_list(
|
|
145
162
|
normalized.get("FieldName"), path="FieldName", resolve_target=resolve_target
|
|
146
163
|
)
|
|
164
|
+
if len(normalized["Expression"]) != len(normalized["FieldName"]):
|
|
165
|
+
raise ValueError("RULE_ACTION_TAKE_VALUE_LENGTH_MISMATCH: Expression and FieldName must align")
|
|
147
166
|
if action_type == "TakeBaseProAction":
|
|
148
167
|
normalized["_Type_"] = "TakeBasePropertyAction"
|
|
149
168
|
elif action_type in {"FormulaAction", "ClearValueAction", "CallFieldChangeAction"}:
|
|
@@ -164,11 +183,16 @@ def normalize_biz_rule_action(
|
|
|
164
183
|
normalized["Expression"] = expression.strip()
|
|
165
184
|
default_ret = {
|
|
166
185
|
"FormulaAction": 253, "ClearValueAction": 253,
|
|
186
|
+
"CallFieldChangeAction": 773,
|
|
167
187
|
"TakeBaseProAction": 253, "SetEqutionAction": 1021,
|
|
168
188
|
"FillQtyAction": 249,
|
|
169
189
|
}.get(action_type)
|
|
170
190
|
if default_ret is not None:
|
|
171
191
|
normalized.setdefault("RET", default_ret)
|
|
192
|
+
if events is not None:
|
|
193
|
+
normalized["RET"] = select_action_events(action_type, events)
|
|
194
|
+
if add_events is not None:
|
|
195
|
+
normalized["RET"] = merge_action_events(action_type, normalized["RET"], add_events)
|
|
172
196
|
normalized.setdefault("Seq", default_seq)
|
|
173
197
|
if "RET" in normalized:
|
|
174
198
|
validate_action_ret(action_type, normalized["RET"])
|
|
@@ -204,6 +228,14 @@ def normalize_form_rule_action(
|
|
|
204
228
|
)
|
|
205
229
|
normalized[canonical] = copy.deepcopy(value)
|
|
206
230
|
normalized["ActionType"] = action_type
|
|
231
|
+
events = normalized.pop("events", None)
|
|
232
|
+
add_events = normalized.pop("addEvents", None)
|
|
233
|
+
if events is not None and add_events is not None:
|
|
234
|
+
raise ValueError("RULE_EVENTS_CONFLICT: choose events or addEvents")
|
|
235
|
+
if events is not None and "RET" in normalized:
|
|
236
|
+
raise ValueError("RULE_EVENTS_CONFLICT: choose events or RET")
|
|
237
|
+
if add_events is not None and "RET" not in normalized:
|
|
238
|
+
raise ValueError(f"RULE_EVENT_BASE_RET_REQUIRED: {action_type} needs the current RET with addEvents")
|
|
207
239
|
|
|
208
240
|
raw_targets = normalized.pop("FieldKey", None)
|
|
209
241
|
if raw_targets is not None:
|
|
@@ -431,12 +463,16 @@ def normalize_form_rule_action(
|
|
|
431
463
|
|
|
432
464
|
if action_type in _TARGETED_FORM_ACTIONS:
|
|
433
465
|
normalized.pop("FieldName", None)
|
|
434
|
-
if action_type == "SetRowStyleAction" and "RET" not in normalized:
|
|
466
|
+
if action_type == "SetRowStyleAction" and "RET" not in normalized and events is None:
|
|
435
467
|
raise ValueError(
|
|
436
468
|
"RULE_ACTION_RET_REQUIRED: SetRowStyleAction has report-specific event "
|
|
437
469
|
"masks; pass the exact verified RET for the target report"
|
|
438
470
|
)
|
|
439
471
|
normalized.setdefault("RET", FORM_RULE_DEFAULT_RET)
|
|
472
|
+
if events is not None:
|
|
473
|
+
normalized["RET"] = select_action_events(action_type, events)
|
|
474
|
+
if add_events is not None:
|
|
475
|
+
normalized["RET"] = merge_action_events(action_type, normalized["RET"], add_events)
|
|
440
476
|
normalized.setdefault("Seq", default_seq)
|
|
441
477
|
validate_action_ret(action_type, normalized["RET"])
|
|
442
478
|
return normalized
|
|
@@ -455,6 +491,22 @@ def _validate_action_type(action_type: str) -> None:
|
|
|
455
491
|
)
|
|
456
492
|
|
|
457
493
|
|
|
494
|
+
def runtime_action_warnings(rule_config: dict) -> list[dict]:
|
|
495
|
+
warnings = _EVENT_CONTRACT.get("runtimeWarnings") or {}
|
|
496
|
+
actions = normalize_rule_config(rule_config)
|
|
497
|
+
kinds = {
|
|
498
|
+
action.get("ActionType")
|
|
499
|
+
for branch in ("trueActions", "falseActions")
|
|
500
|
+
for action in (actions.get(branch) or [])
|
|
501
|
+
if isinstance(action, dict)
|
|
502
|
+
}
|
|
503
|
+
return [
|
|
504
|
+
{"actionType": kind, "message": warnings[kind]}
|
|
505
|
+
for kind in sorted(kinds)
|
|
506
|
+
if kind in warnings
|
|
507
|
+
]
|
|
508
|
+
|
|
509
|
+
|
|
458
510
|
def validate_action_ret(action_type: str, requested) -> None:
|
|
459
511
|
if isinstance(requested, bool) or not isinstance(requested, int) or requested < 1:
|
|
460
512
|
raise ValueError(
|
|
@@ -468,14 +520,43 @@ def validate_action_ret(action_type: str, requested) -> None:
|
|
|
468
520
|
f"unknown bits {unknown_bits} outside legal union {legal_union}"
|
|
469
521
|
)
|
|
470
522
|
_validate_action_type(action_type)
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
if
|
|
475
|
-
raise ValueError(
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
def _event_mask(events) -> int:
|
|
526
|
+
if not isinstance(events, (list, tuple)) or not events:
|
|
527
|
+
raise ValueError("RULE_EVENTS_INVALID: provide a non-empty array of event names")
|
|
528
|
+
bits = {name: int(bit) for bit, name in _EVENT_CONTRACT["eventBits"].items()}
|
|
529
|
+
aliases = _EVENT_CONTRACT.get("eventAliases") or {}
|
|
530
|
+
aliases_by_casefold = {key.casefold(): value for key, value in aliases.items()}
|
|
531
|
+
canonical_by_casefold = {key.casefold(): key for key in bits}
|
|
532
|
+
selected = 0
|
|
533
|
+
for name in events:
|
|
534
|
+
if not isinstance(name, str):
|
|
535
|
+
raise ValueError("RULE_EVENTS_INVALID: event names must be strings")
|
|
536
|
+
supplied = name.strip()
|
|
537
|
+
canonical = (aliases.get(supplied)
|
|
538
|
+
or aliases_by_casefold.get(supplied.casefold())
|
|
539
|
+
or canonical_by_casefold.get(supplied.casefold())
|
|
540
|
+
or supplied)
|
|
541
|
+
if canonical not in bits:
|
|
542
|
+
raise ValueError(f"RULE_EVENT_UNKNOWN: {name!r}; expected {sorted(bits)}")
|
|
543
|
+
selected |= bits[canonical]
|
|
544
|
+
return selected
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
def select_action_events(action_type: str, events) -> int:
|
|
548
|
+
"""Compile exactly the requested event timings for a new action."""
|
|
549
|
+
selected = _event_mask(events)
|
|
550
|
+
validate_action_ret(action_type, selected)
|
|
551
|
+
return selected
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
def merge_action_events(action_type: str, current: int, events) -> int:
|
|
555
|
+
"""Append named events without clearing existing or non-checkbox bits."""
|
|
556
|
+
validate_action_ret(action_type, current)
|
|
557
|
+
merged = current | _event_mask(events)
|
|
558
|
+
validate_action_ret(action_type, merged)
|
|
559
|
+
return merged
|
|
479
560
|
|
|
480
561
|
|
|
481
562
|
def trigger_field_selectors(rule_config: dict) -> list[str]:
|
|
@@ -93,6 +93,20 @@ def collect_ref_bill_targets(data: dict[str, Any]) -> set[str]:
|
|
|
93
93
|
return targets
|
|
94
94
|
|
|
95
95
|
|
|
96
|
+
def validate_ref_bill_owner(data):
|
|
97
|
+
"""Reject the unsupported Base-form deferred writer before creating its shell."""
|
|
98
|
+
entities = data.get("entities") or []
|
|
99
|
+
if not any(entity.get("type") == "BaseEntity" for entity in entities if isinstance(entity, dict)):
|
|
100
|
+
return []
|
|
101
|
+
return [
|
|
102
|
+
"REF_BILL_OWNER_UNSUPPORTED: the current RefBillField writer requires a bill form; "
|
|
103
|
+
"resolve model/reference semantics before creating this BaseEntity (no automatic type substitution)"
|
|
104
|
+
for entity in entities if isinstance(entity, dict)
|
|
105
|
+
for field in entity.get("fields") or []
|
|
106
|
+
if isinstance(field, dict) and field.get("dataType") == "RefBillField"
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
|
|
96
110
|
def bind_ref_bill_ids(
|
|
97
111
|
data: dict[str, Any],
|
|
98
112
|
form_ids: dict[str, str],
|
|
@@ -330,23 +344,13 @@ def _infer_form_number(data: dict[str, Any], path: str, isv: str) -> str:
|
|
|
330
344
|
return os.path.splitext(os.path.basename(path))[0].lower()
|
|
331
345
|
|
|
332
346
|
|
|
333
|
-
def
|
|
347
|
+
def collect_build_dependencies(
|
|
334
348
|
artifact_files: list[str],
|
|
335
349
|
*,
|
|
336
350
|
manifest: dict[str, Any] | None = None,
|
|
337
351
|
isv: str = "",
|
|
338
|
-
) ->
|
|
339
|
-
"""
|
|
340
|
-
|
|
341
|
-
Dependencies: artifact A depends on B when A references B's formNumber and
|
|
342
|
-
B is also in this batch. References to forms outside the batch are ignored
|
|
343
|
-
(assumed already on platform).
|
|
344
|
-
"""
|
|
345
|
-
if not artifact_files:
|
|
346
|
-
return []
|
|
347
|
-
if len(artifact_files) == 1:
|
|
348
|
-
return [list(artifact_files)]
|
|
349
|
-
|
|
352
|
+
) -> dict[str, set[str]]:
|
|
353
|
+
"""Exact prerequisites within this batch, keyed by normalized artifact path."""
|
|
350
354
|
norm_paths = [os.path.normpath(os.path.abspath(p)) for p in artifact_files]
|
|
351
355
|
path_set = set(norm_paths)
|
|
352
356
|
m_map = _manifest_path_to_form(manifest)
|
|
@@ -365,10 +369,7 @@ def plan_build_waves(
|
|
|
365
369
|
form_to_path[fn] = p
|
|
366
370
|
path_refs[p] = _collect_form_refs(data)
|
|
367
371
|
|
|
368
|
-
|
|
369
|
-
in_deg: dict[str, int] = {p: 0 for p in norm_paths}
|
|
370
|
-
dependents: dict[str, list[str]] = {p: [] for p in norm_paths}
|
|
371
|
-
|
|
372
|
+
dependencies = {p: set() for p in norm_paths}
|
|
372
373
|
for p in norm_paths:
|
|
373
374
|
own = path_form.get(p, "")
|
|
374
375
|
for ref in path_refs.get(p) or set():
|
|
@@ -376,8 +377,20 @@ def plan_build_waves(
|
|
|
376
377
|
continue
|
|
377
378
|
dep_path = form_to_path.get(ref)
|
|
378
379
|
if dep_path and dep_path in path_set and dep_path != p:
|
|
379
|
-
|
|
380
|
-
|
|
380
|
+
dependencies[p].add(dep_path)
|
|
381
|
+
return dependencies
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def plan_build_waves(artifact_files, *, manifest=None, isv="", dependencies=None):
|
|
385
|
+
"""Topological waves; external references are resolved by the writer."""
|
|
386
|
+
graph = dependencies if dependencies is not None else collect_build_dependencies(
|
|
387
|
+
artifact_files, manifest=manifest, isv=isv)
|
|
388
|
+
norm_paths = list(graph)
|
|
389
|
+
in_deg = {path: len(parents) for path, parents in graph.items()}
|
|
390
|
+
dependents = {path: [] for path in graph}
|
|
391
|
+
for path, parents in graph.items():
|
|
392
|
+
for parent in parents:
|
|
393
|
+
dependents[parent].append(path)
|
|
381
394
|
|
|
382
395
|
waves: list[list[str]] = []
|
|
383
396
|
q = deque([p for p in norm_paths if in_deg[p] == 0])
|
|
@@ -406,6 +419,24 @@ def plan_build_waves(
|
|
|
406
419
|
return waves
|
|
407
420
|
|
|
408
421
|
|
|
422
|
+
def partition_build_wave(wave, dependencies, succeeded):
|
|
423
|
+
"""Schedule only artifacts whose actual prerequisites verified successfully."""
|
|
424
|
+
ready, blocked = [], []
|
|
425
|
+
for path in wave:
|
|
426
|
+
missing = sorted(dependencies.get(path, set()) - succeeded)
|
|
427
|
+
if not missing:
|
|
428
|
+
ready.append(path)
|
|
429
|
+
continue
|
|
430
|
+
blocked.append({
|
|
431
|
+
"artifact": os.path.basename(path), "artifactPath": path,
|
|
432
|
+
"ok": False, "phase": "dependency", "writeAttempted": False,
|
|
433
|
+
"errorCode": "DEPENDENCY_FAILED", "blockedByArtifacts": missing,
|
|
434
|
+
"errors": ["Required artifacts did not verify successfully; this artifact was not written"],
|
|
435
|
+
"elapsed_sec": 0.0,
|
|
436
|
+
})
|
|
437
|
+
return ready, blocked
|
|
438
|
+
|
|
439
|
+
|
|
409
440
|
def describe_build_plan(
|
|
410
441
|
waves: list[list[str]],
|
|
411
442
|
*,
|
|
@@ -425,33 +456,3 @@ def describe_build_plan(
|
|
|
425
456
|
for p in wave]
|
|
426
457
|
lines.append(f" wave {i}: {', '.join(names)}")
|
|
427
458
|
return "\n".join(lines)
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
def dependency_blocked_results(
|
|
431
|
-
waves: list[list[str]],
|
|
432
|
-
*,
|
|
433
|
-
failed_wave_index: int,
|
|
434
|
-
) -> list[dict[str, Any]]:
|
|
435
|
-
"""Return stable machine results for waves blocked by a failed prerequisite.
|
|
436
|
-
|
|
437
|
-
``failed_wave_index`` is one-based, matching the CLI's wave labels.
|
|
438
|
-
"""
|
|
439
|
-
blocked: list[dict[str, Any]] = []
|
|
440
|
-
for wave_index, wave in enumerate(waves, 1):
|
|
441
|
-
if wave_index <= failed_wave_index:
|
|
442
|
-
continue
|
|
443
|
-
for path in wave:
|
|
444
|
-
blocked.append(
|
|
445
|
-
{
|
|
446
|
-
"artifact": os.path.basename(path),
|
|
447
|
-
"ok": False,
|
|
448
|
-
"phase": "dependency",
|
|
449
|
-
"errorCode": "DEPENDENCY_WAVE_FAILED",
|
|
450
|
-
"blockedByWave": failed_wave_index,
|
|
451
|
-
"errors": [
|
|
452
|
-
f"prerequisite wave {failed_wave_index} failed; artifact was not written"
|
|
453
|
-
],
|
|
454
|
-
"elapsed_sec": 0.0,
|
|
455
|
-
}
|
|
456
|
-
)
|
|
457
|
-
return blocked
|