python-hwpx-automation 6.1.3__tar.gz → 6.2.1__tar.gz
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.
- {python_hwpx_automation-6.1.3/src/python_hwpx_automation.egg-info → python_hwpx_automation-6.2.1}/PKG-INFO +9 -8
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/README.md +7 -6
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/pyproject.toml +2 -2
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/content_edit.py +37 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwpx_ops.py +25 -0
- python_hwpx_automation-6.2.1/src/hwpx_automation/identity.json +263 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/content_layout.py +128 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/server.py +1 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/tool_bindings.py +1 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/tool_contract.py +11 -11
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1/src/python_hwpx_automation.egg-info}/PKG-INFO +9 -8
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/requires.txt +1 -1
- python_hwpx_automation-6.1.3/src/hwpx_automation/identity.json +0 -263
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/LICENSE +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/MANIFEST.in +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/NOTICE +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/setup.cfg +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/__init__.pyi +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/__main__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/agent_document.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/api.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/blind_eval.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/capabilities.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/compat.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/configuration.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/content.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/context.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/diff.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/document.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/formatting.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/handles.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/locations.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/locator.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/plan.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/resources.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/search.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/transactions.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/txn.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/document_state.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/errors.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/execution_lock.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/fastmcp_adapter.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/form_fill.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/form_output_models.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/_shared.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/agent_document.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/authoring.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/form_fill.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/layout_style.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/quality_render.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/read_export.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/specialized.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/tracked_changes.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/workflow.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwp_converter.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwp_support.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/identity.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ingest_adapters.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/markdown_plan.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/mcp_cli.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/metadata/tools_meta.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/mixed_form.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/mutation_models.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/network_policy.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/_batch_verification.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/bundle.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/catalog.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/dump.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/mapping.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/model.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/native.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/replay.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/catalog.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/cli.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/commands.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/document.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/form_plan.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/model.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/path.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/query.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/story.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/advanced_generators.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/builder/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/builder/core.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/builder/report.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/_support.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/composer.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/harvest.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/plan.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profile.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/body.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/info_table.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/title.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/profile.json +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/application_form/template.hwpx +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/body.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/title.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/profile.json +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/home_notice/template.hwpx +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/body.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/info_table.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/title.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/profile.json +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/official_notice/template.hwpx +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/body.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/info_table.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/title.xml +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/profile.json +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/validator.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/presets/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/presets/proposal.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/report_parser.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/style_profile.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/template_analyzer.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/compliance/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/compliance/official_lint.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/compliance/pii.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/comparison.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/mail_merge.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/redline.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/evalplan/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/evalplan/runtime.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/compose.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/ir.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/measure.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/parser.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/profile.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/classification.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fill_residue.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/apply.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/engine.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/measure.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/policy.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/report.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/seal.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/wordbox.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/guidance.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/quality.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/split_run.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/template_formfit.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/composition.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/data/bank.json +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/data/genres.json +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/quality/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/quality/page_guard.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_hancom_open_rate.ps1 +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_render_hwpx_mac.applescript +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/block_splits.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/detectors.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/diff.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/fixture_corpus.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/oracle.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/page_qa.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/qa_contracts.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/qa_metrics.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/worker.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/utilities/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/utilities/table_compute.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/_border_fill.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/composition.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/context.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/form_fields.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/media.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/memo_style.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/package_validation.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/planning.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/preview_export.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/read_query.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/save_policy.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/tables.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/transactions.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/preview_output_models.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/public-modules.json +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/py.typed +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/quality.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/quality_generation.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/runtime.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/runtime_services.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/storage.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/upstream.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/utils/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/utils/helpers.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/visual_qa.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/__init__.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/adapters.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/dispatcher.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/models.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/policy.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_contracts.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_metrics.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_queue.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_security.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_transport.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/rendering.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/service.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/state_machine.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/store.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workspace.py +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/SOURCES.txt +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/dependency_links.txt +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/entry_points.txt +0 -0
- {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-hwpx-automation
|
|
3
|
-
Version: 6.1
|
|
3
|
+
Version: 6.2.1
|
|
4
4
|
Summary: Task-oriented HWPX document automation for Python, with an optional MCP adapter.
|
|
5
5
|
Author: Kohkyuhyun
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -20,7 +20,7 @@ Requires-Python: >=3.10
|
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENSE
|
|
22
22
|
License-File: NOTICE
|
|
23
|
-
Requires-Dist: python-hwpx<6,>=5.
|
|
23
|
+
Requires-Dist: python-hwpx<6,>=5.2.0
|
|
24
24
|
Requires-Dist: pydantic<3,>=2.11
|
|
25
25
|
Requires-Dist: cryptography>=42.0
|
|
26
26
|
Requires-Dist: anyio>=4.0
|
|
@@ -74,11 +74,12 @@ Dynamic: license-file
|
|
|
74
74
|
|
|
75
75
|
<!-- release-state: release-approved -->
|
|
76
76
|
> [!NOTE]
|
|
77
|
-
> 이
|
|
78
|
-
>
|
|
79
|
-
> `python-hwpx 5.
|
|
80
|
-
> (계약 `
|
|
81
|
-
>
|
|
77
|
+
> 이 저장소의 main은 아직 공개되지 않은 6.2.1 후보 — release-approved 상태의 후보(수식 저작 `add_equation`,
|
|
78
|
+
> 계약 `342cf672f29cd183`, 129 도구)입니다. 현재 공개 트레인은
|
|
79
|
+
> `python-hwpx 5.1.1 → python-hwpx-automation 6.1.3 → hwpx-plugin 1.1.0`
|
|
80
|
+
> (계약 `ac1a422376b5ac84`, 2026-07-31 released)입니다. 공개 트레인은
|
|
81
|
+
> core·automation PyPI와 plugin GitHub
|
|
82
|
+
> Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격했으며, 기존
|
|
82
83
|
> 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와 상태
|
|
83
84
|
> 머신: [릴리스 runbook](docs/release-runbook.md)
|
|
84
85
|
|
|
@@ -134,7 +135,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
134
135
|
"command": "uvx",
|
|
135
136
|
"args": [
|
|
136
137
|
"--from",
|
|
137
|
-
"python-hwpx-automation[mcp]==6.
|
|
138
|
+
"python-hwpx-automation[mcp]==6.1.3",
|
|
138
139
|
"hwpx-automation-mcp"
|
|
139
140
|
],
|
|
140
141
|
"env": {
|
|
@@ -14,11 +14,12 @@
|
|
|
14
14
|
|
|
15
15
|
<!-- release-state: release-approved -->
|
|
16
16
|
> [!NOTE]
|
|
17
|
-
> 이
|
|
18
|
-
>
|
|
19
|
-
> `python-hwpx 5.
|
|
20
|
-
> (계약 `
|
|
21
|
-
>
|
|
17
|
+
> 이 저장소의 main은 아직 공개되지 않은 6.2.1 후보 — release-approved 상태의 후보(수식 저작 `add_equation`,
|
|
18
|
+
> 계약 `342cf672f29cd183`, 129 도구)입니다. 현재 공개 트레인은
|
|
19
|
+
> `python-hwpx 5.1.1 → python-hwpx-automation 6.1.3 → hwpx-plugin 1.1.0`
|
|
20
|
+
> (계약 `ac1a422376b5ac84`, 2026-07-31 released)입니다. 공개 트레인은
|
|
21
|
+
> core·automation PyPI와 plugin GitHub
|
|
22
|
+
> Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격했으며, 기존
|
|
22
23
|
> 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와 상태
|
|
23
24
|
> 머신: [릴리스 runbook](docs/release-runbook.md)
|
|
24
25
|
|
|
@@ -74,7 +75,7 @@ Gemini CLI는 `~/.gemini/settings.json`, Cursor·Windsurf는 각 에디터의 MC
|
|
|
74
75
|
"command": "uvx",
|
|
75
76
|
"args": [
|
|
76
77
|
"--from",
|
|
77
|
-
"python-hwpx-automation[mcp]==6.
|
|
78
|
+
"python-hwpx-automation[mcp]==6.1.3",
|
|
78
79
|
"hwpx-automation-mcp"
|
|
79
80
|
],
|
|
80
81
|
"env": {
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-hwpx-automation"
|
|
7
|
-
version = "6.1
|
|
7
|
+
version = "6.2.1"
|
|
8
8
|
description = "Task-oriented HWPX document automation for Python, with an optional MCP adapter."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "Kohkyuhyun" }]
|
|
@@ -29,7 +29,7 @@ dependencies = [
|
|
|
29
29
|
# the bounded major here is what makes "no valid install has two declarers"
|
|
30
30
|
# true rather than hopeful, and prevents the next core major from silently
|
|
31
31
|
# breaking an already-published automation line.
|
|
32
|
-
"python-hwpx>=5.
|
|
32
|
+
"python-hwpx>=5.2.0,<6", # HWPX object model, OXML/OPC, format-native primitives
|
|
33
33
|
|
|
34
34
|
"pydantic>=2.11,<3",
|
|
35
35
|
"cryptography>=42.0",
|
|
@@ -42,6 +42,7 @@ from ._shared import (
|
|
|
42
42
|
_normalize_fill_mappings,
|
|
43
43
|
_revision_guard,
|
|
44
44
|
_save_doc_verification,
|
|
45
|
+
_with_document_state,
|
|
45
46
|
_with_dry_run_verification,
|
|
46
47
|
_with_save_verification,
|
|
47
48
|
)
|
|
@@ -679,6 +680,41 @@ def add_page_break(
|
|
|
679
680
|
return _with_save_verification({"success": True}, verification)
|
|
680
681
|
|
|
681
682
|
|
|
683
|
+
def add_equation(
|
|
684
|
+
filename: str,
|
|
685
|
+
latex: str = None,
|
|
686
|
+
script: str = None,
|
|
687
|
+
paragraph_index: int = None,
|
|
688
|
+
table_index: int = None,
|
|
689
|
+
row: int = None,
|
|
690
|
+
col: int = None,
|
|
691
|
+
base_unit: int = 1100,
|
|
692
|
+
dry_run: bool = False,
|
|
693
|
+
expected_revision: str = None,
|
|
694
|
+
) -> dict:
|
|
695
|
+
"""네이티브 수식(<hp:equation>)을 삽입합니다. latex(권장) 또는 EqEdit script 중
|
|
696
|
+
하나만 지정 — LaTeX는 렌더 검증된 토큰셋만 EqEdit로 변환하고, 밖이면
|
|
697
|
+
EQUATION_LATEX_UNSUPPORTED로 거부합니다(무음 근사 없음). 산출 수식은 실한컴이
|
|
698
|
+
조판하고 기존 리더(eqedit_to_latex)가 되읽습니다(응답 readerLatex).
|
|
699
|
+
배치: 기본=문서 끝 새 문단, paragraph_index=기존 문단, tableIndex+row+col=표 셀."""
|
|
700
|
+
path = resolve_path(filename)
|
|
701
|
+
guard = _revision_guard(path, expected_revision)
|
|
702
|
+
if guard is not None:
|
|
703
|
+
return guard
|
|
704
|
+
result = RUNTIME_SERVICES.ops.add_equation(
|
|
705
|
+
path,
|
|
706
|
+
latex=latex,
|
|
707
|
+
script=script,
|
|
708
|
+
paragraph_index=paragraph_index,
|
|
709
|
+
table_index=table_index,
|
|
710
|
+
row=row,
|
|
711
|
+
col=col,
|
|
712
|
+
base_unit=base_unit,
|
|
713
|
+
dry_run=dry_run,
|
|
714
|
+
)
|
|
715
|
+
return _with_document_state(result, path)
|
|
716
|
+
|
|
717
|
+
|
|
682
718
|
def insert_picture(
|
|
683
719
|
filename: str,
|
|
684
720
|
image_base64: str,
|
|
@@ -1060,6 +1096,7 @@ __all__ = [
|
|
|
1060
1096
|
"insert_paragraph",
|
|
1061
1097
|
"delete_paragraph",
|
|
1062
1098
|
"add_page_break",
|
|
1099
|
+
"add_equation",
|
|
1063
1100
|
"apply_edits",
|
|
1064
1101
|
"undo_last_edit",
|
|
1065
1102
|
"replace_by_anchor",
|
{python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwpx_ops.py
RENAMED
|
@@ -517,6 +517,31 @@ class HwpxOps:
|
|
|
517
517
|
path, text, section_index=section_index, run_style=run_style
|
|
518
518
|
)
|
|
519
519
|
|
|
520
|
+
def add_equation(
|
|
521
|
+
self,
|
|
522
|
+
path: str,
|
|
523
|
+
*,
|
|
524
|
+
latex: Optional[str] = None,
|
|
525
|
+
script: Optional[str] = None,
|
|
526
|
+
paragraph_index: Optional[int] = None,
|
|
527
|
+
table_index: Optional[int] = None,
|
|
528
|
+
row: Optional[int] = None,
|
|
529
|
+
col: Optional[int] = None,
|
|
530
|
+
base_unit: int = 1100,
|
|
531
|
+
dry_run: bool = False,
|
|
532
|
+
) -> Dict[str, Any]:
|
|
533
|
+
return self._services.content_layout.add_equation(
|
|
534
|
+
path,
|
|
535
|
+
latex=latex,
|
|
536
|
+
script=script,
|
|
537
|
+
paragraph_index=paragraph_index,
|
|
538
|
+
table_index=table_index,
|
|
539
|
+
row=row,
|
|
540
|
+
col=col,
|
|
541
|
+
base_unit=base_unit,
|
|
542
|
+
dry_run=dry_run,
|
|
543
|
+
)
|
|
544
|
+
|
|
520
545
|
def insert_paragraphs_bulk(
|
|
521
546
|
self,
|
|
522
547
|
path: str,
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "python-hwpx-automation.identity/v1",
|
|
3
|
+
"product": "python-hwpx-automation",
|
|
4
|
+
"releaseMajor": 6,
|
|
5
|
+
"releaseState": {
|
|
6
|
+
"status": "release-approved",
|
|
7
|
+
"candidate": {
|
|
8
|
+
"pythonHwpx": "5.2.0",
|
|
9
|
+
"canonicalDistribution": "python-hwpx-automation",
|
|
10
|
+
"canonicalAutomation": "6.2.1",
|
|
11
|
+
"compatibilityDistribution": "hwpx-mcp-server",
|
|
12
|
+
"compatibility": "6.2.1",
|
|
13
|
+
"plugin": "1.2.0",
|
|
14
|
+
"contractHash": "342cf672f29cd183"
|
|
15
|
+
},
|
|
16
|
+
"currentPublic": {
|
|
17
|
+
"pythonHwpx": "5.1.1",
|
|
18
|
+
"primaryDistribution": "python-hwpx-automation",
|
|
19
|
+
"primaryApplication": "6.1.3",
|
|
20
|
+
"plugin": "1.1.0",
|
|
21
|
+
"contractHash": "ac1a422376b5ac84"
|
|
22
|
+
},
|
|
23
|
+
"promotionGate": "Three states are mandatory: unreleased-candidate while auditing; release-approved only after separate owner approval and while currentPublic still names the previously observed coherent stack; released only in a follow-up commit after remote truth is observed for core, canonical automation, the compatibility distribution, the plugin GitHub release, the marketplace entry, and a real marketplace install. The automation tag workflow publishes only release-approved, leaves currentPublic unchanged, and hands an attached receipt to plugin publication."
|
|
24
|
+
},
|
|
25
|
+
"identifiers": [
|
|
26
|
+
{
|
|
27
|
+
"surface": "repository",
|
|
28
|
+
"value": "airmang/python-hwpx-automation",
|
|
29
|
+
"classification": "canonical"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"surface": "distribution",
|
|
33
|
+
"value": "python-hwpx-automation",
|
|
34
|
+
"classification": "canonical"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"surface": "import-namespace",
|
|
38
|
+
"value": "hwpx_automation",
|
|
39
|
+
"classification": "canonical"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"surface": "task-console",
|
|
43
|
+
"value": "hwpx",
|
|
44
|
+
"classification": "canonical"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"surface": "mcp-console",
|
|
48
|
+
"value": "hwpx-automation-mcp",
|
|
49
|
+
"classification": "canonical"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"surface": "fastmcp-server-info-name",
|
|
53
|
+
"value": "python-hwpx-automation",
|
|
54
|
+
"classification": "canonical"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"surface": "host-config-key",
|
|
58
|
+
"value": "hwpx",
|
|
59
|
+
"classification": "host-local-alias"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"surface": "environment-prefix",
|
|
63
|
+
"value": "HWPX_AUTOMATION_",
|
|
64
|
+
"classification": "canonical"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"surface": "distribution",
|
|
68
|
+
"value": "hwpx-mcp-server",
|
|
69
|
+
"classification": "compatibility"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"surface": "import-namespace",
|
|
73
|
+
"value": "hwpx_mcp_server",
|
|
74
|
+
"classification": "compatibility"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"surface": "mcp-console",
|
|
78
|
+
"value": "hwpx-mcp-server",
|
|
79
|
+
"classification": "compatibility"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"surface": "environment-prefix",
|
|
83
|
+
"value": "HWPX_MCP_",
|
|
84
|
+
"classification": "compatibility"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"surface": "capability-version-field",
|
|
88
|
+
"value": "versions.automation",
|
|
89
|
+
"classification": "canonical"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"surface": "capability-version-field",
|
|
93
|
+
"value": "versions.mcp",
|
|
94
|
+
"classification": "compatibility-preserved"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"surface": "capability-floor-field",
|
|
98
|
+
"value": "minAutomationVersion",
|
|
99
|
+
"classification": "canonical"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"surface": "capability-floor-field",
|
|
103
|
+
"value": "minMcpVersion",
|
|
104
|
+
"classification": "compatibility-preserved"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"surface": "contract-floor-constant",
|
|
108
|
+
"value": "MIN_AUTOMATION_VERSION",
|
|
109
|
+
"classification": "canonical"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"surface": "contract-floor-constant",
|
|
113
|
+
"value": "MIN_MCP_VERSION",
|
|
114
|
+
"classification": "compatibility-preserved"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"surface": "protocol-error-schema",
|
|
118
|
+
"value": "hwpx.mcp-error/v1",
|
|
119
|
+
"classification": "compatibility-preserved"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"surface": "frozen-receipt-schema",
|
|
123
|
+
"value": "hwpx-mcp.authoring-runtime-owner/v1",
|
|
124
|
+
"classification": "compatibility-preserved"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"surface": "frozen-receipt-schema",
|
|
128
|
+
"value": "hwpx-mcp.compliance-quality-utilities-owner/v1",
|
|
129
|
+
"classification": "compatibility-preserved"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"surface": "frozen-receipt-schema",
|
|
133
|
+
"value": "hwpx-mcp.document-operations-owner/v1",
|
|
134
|
+
"classification": "compatibility-preserved"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"surface": "frozen-receipt-schema",
|
|
138
|
+
"value": "hwpx-mcp.evalplan-runtime-owner/v1",
|
|
139
|
+
"classification": "compatibility-preserved"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"surface": "frozen-receipt-schema",
|
|
143
|
+
"value": "hwpx-mcp.exam-runtime-owner/v1",
|
|
144
|
+
"classification": "compatibility-preserved"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"surface": "frozen-receipt-schema",
|
|
148
|
+
"value": "hwpx-mcp.form-fill-runtime-owner/v1",
|
|
149
|
+
"classification": "compatibility-preserved"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"surface": "frozen-receipt-schema",
|
|
153
|
+
"value": "hwpx-mcp.form-fill-runtime-parity/v1",
|
|
154
|
+
"classification": "compatibility-preserved"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"surface": "frozen-receipt-schema",
|
|
158
|
+
"value": "hwpx-mcp.visual-runtime-owner/v1",
|
|
159
|
+
"classification": "compatibility-preserved"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"surface": "frozen-parity-receipt-field",
|
|
163
|
+
"value": "mcpRuntimeMembers",
|
|
164
|
+
"classification": "compatibility-preserved"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"surface": "workflow-state-environment",
|
|
168
|
+
"value": "HWPX_AUTOMATION_WORKFLOW_STORE",
|
|
169
|
+
"classification": "canonical"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"surface": "workflow-state-environment",
|
|
173
|
+
"value": "HWPX_WORKFLOW_STORE",
|
|
174
|
+
"classification": "compatibility-preserved"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"surface": "workflow-state-path",
|
|
178
|
+
"value": "${XDG_STATE_HOME:-~/.local/state}/hwpx-mcp-server/workflows.sqlite3",
|
|
179
|
+
"classification": "compatibility-preserved"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"surface": "render-queue-principal",
|
|
183
|
+
"value": "hwpx-mcp-server",
|
|
184
|
+
"classification": "compatibility-preserved"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"surface": "render-integration-environment",
|
|
188
|
+
"value": "HWPX_RENDER_QUEUE_ROOT",
|
|
189
|
+
"classification": "integration-preserved"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"surface": "render-integration-environment",
|
|
193
|
+
"value": "HWPX_RENDER_QUEUE_URL",
|
|
194
|
+
"classification": "integration-preserved"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"surface": "render-integration-environment",
|
|
198
|
+
"value": "HWPX_RENDER_QUEUE_SECRET",
|
|
199
|
+
"classification": "integration-preserved"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"surface": "render-integration-environment",
|
|
203
|
+
"value": "HWPX_RENDER_TRANSPORT_AUTH",
|
|
204
|
+
"classification": "integration-preserved"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"surface": "render-integration-environment",
|
|
208
|
+
"value": "HWPX_RENDER_CA_FILE",
|
|
209
|
+
"classification": "integration-preserved"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"surface": "render-integration-environment",
|
|
213
|
+
"value": "HWPX_RENDER_CLIENT_CERT_FILE",
|
|
214
|
+
"classification": "integration-preserved"
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"surface": "render-integration-environment",
|
|
218
|
+
"value": "HWPX_RENDER_CLIENT_KEY_FILE",
|
|
219
|
+
"classification": "integration-preserved"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"surface": "workflow-security-environment",
|
|
223
|
+
"value": "HWPX_WORKFLOW_ENCRYPTION_KEY",
|
|
224
|
+
"classification": "capability-preserved"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"surface": "oracle-capability-environment",
|
|
228
|
+
"value": "HWPX_ORACLE_STRUCTURAL_ONLY",
|
|
229
|
+
"classification": "capability-preserved"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"surface": "oracle-capability-environment",
|
|
233
|
+
"value": "HWPX_ORACLE_BUDGET_SECONDS",
|
|
234
|
+
"classification": "capability-preserved"
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"surface": "plugin-integration-environment",
|
|
238
|
+
"value": "HWPX_SKILL_VERSION",
|
|
239
|
+
"classification": "integration-preserved"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"surface": "plugin-integration-environment",
|
|
243
|
+
"value": "HWPX_PLUGIN_ROOT",
|
|
244
|
+
"classification": "integration-preserved"
|
|
245
|
+
}
|
|
246
|
+
],
|
|
247
|
+
"compatibilityPolicy": {
|
|
248
|
+
"supportedThroughMajor": 6,
|
|
249
|
+
"removalNotBeforeMajor": 7,
|
|
250
|
+
"minimumPublicNoticeDays": 90,
|
|
251
|
+
"requiresObservedUsageWindow": true,
|
|
252
|
+
"requiresSeparateOwnerApproval": true,
|
|
253
|
+
"statePathMigrationInMajor6": false
|
|
254
|
+
},
|
|
255
|
+
"notes": {
|
|
256
|
+
"hostConfigKey": "The key is a host-local alias, not the MCP protocol identity.",
|
|
257
|
+
"environmentPrecedence": "HWPX_AUTOMATION_* wins; HWPX_MCP_* remains a 6.x fallback.",
|
|
258
|
+
"preservedWireIdentifiers": "The public hwpx.mcp-error/v1 schema, versions.mcp/minMcpVersion/MIN_MCP_VERSION aliases, frozen hwpx-mcp.* architecture receipt IDs, and mcpRuntimeMembers parity-receipt field remain exact in 6.x. They are compatibility identifiers, not statements that MCP owns the automation product.",
|
|
259
|
+
"preservedIntegrationEnvironment": "Product-neutral HWPX_RENDER_*, HWPX_WORKFLOW_ENCRYPTION_KEY, HWPX_ORACLE_*, HWPX_SKILL_VERSION, and HWPX_PLUGIN_ROOT names do not encode the former MCP product identity. They remain unchanged and are not aliases in the HWPX_AUTOMATION_ transition.",
|
|
260
|
+
"statePath": "HWPX_AUTOMATION_WORKFLOW_STORE wins over the prior HWPX_WORKFLOW_STORE override; the existing hwpx-mcp-server on-disk default remains in 6.x to avoid silent workflow loss.",
|
|
261
|
+
"renderQueuePrincipal": "The signed queue principal remains hwpx-mcp-server in 6.x so queued work and worker authorization do not split during the rename."
|
|
262
|
+
}
|
|
263
|
+
}
|
|
@@ -88,6 +88,134 @@ class ContentLayoutService:
|
|
|
88
88
|
self._save._save_document(document, resolved)
|
|
89
89
|
return {"paragraphIndex": index}
|
|
90
90
|
|
|
91
|
+
def _equation_script_from_input(
|
|
92
|
+
self, latex: Optional[str], script: Optional[str]
|
|
93
|
+
) -> str:
|
|
94
|
+
from hwpx.equation import (
|
|
95
|
+
EquationConversionError,
|
|
96
|
+
UnsupportedLatexError,
|
|
97
|
+
latex_to_eqedit,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
if (latex is None) == (script is None):
|
|
101
|
+
raise self._context._new_error(
|
|
102
|
+
"EQUATION_INPUT_INVALID",
|
|
103
|
+
"provide exactly one of latex or script",
|
|
104
|
+
)
|
|
105
|
+
if latex is None:
|
|
106
|
+
assert script is not None
|
|
107
|
+
return script
|
|
108
|
+
try:
|
|
109
|
+
return latex_to_eqedit(latex)
|
|
110
|
+
except UnsupportedLatexError as exc:
|
|
111
|
+
raise self._context._new_error(
|
|
112
|
+
"EQUATION_LATEX_UNSUPPORTED",
|
|
113
|
+
f"LaTeX outside the render-verified token set: {exc}",
|
|
114
|
+
details={"latex": latex},
|
|
115
|
+
) from exc
|
|
116
|
+
except EquationConversionError as exc:
|
|
117
|
+
raise self._context._new_error(
|
|
118
|
+
"EQUATION_INPUT_INVALID",
|
|
119
|
+
f"LaTeX input rejected: {exc}",
|
|
120
|
+
) from exc
|
|
121
|
+
|
|
122
|
+
def _resolve_equation_target(
|
|
123
|
+
self,
|
|
124
|
+
document: Any,
|
|
125
|
+
*,
|
|
126
|
+
paragraph_index: Optional[int],
|
|
127
|
+
table_index: Optional[int],
|
|
128
|
+
row: Optional[int],
|
|
129
|
+
col: Optional[int],
|
|
130
|
+
) -> Any:
|
|
131
|
+
cell_parts = (table_index, row, col)
|
|
132
|
+
use_cell = any(part is not None for part in cell_parts)
|
|
133
|
+
if use_cell and not all(part is not None for part in cell_parts):
|
|
134
|
+
raise self._context._new_error(
|
|
135
|
+
"EQUATION_TARGET_INVALID",
|
|
136
|
+
"provide tableIndex, row, and col together for a cell target",
|
|
137
|
+
)
|
|
138
|
+
if use_cell and paragraph_index is not None:
|
|
139
|
+
raise self._context._new_error(
|
|
140
|
+
"EQUATION_TARGET_INVALID",
|
|
141
|
+
"paragraphIndex cannot be combined with a cell target",
|
|
142
|
+
)
|
|
143
|
+
if use_cell:
|
|
144
|
+
assert table_index is not None and row is not None and col is not None
|
|
145
|
+
tables = self._context._iter_tables(document)
|
|
146
|
+
try:
|
|
147
|
+
table = tables[table_index]
|
|
148
|
+
except IndexError as exc:
|
|
149
|
+
raise self._context._new_error(
|
|
150
|
+
"TABLE_INDEX_OUT_OF_RANGE",
|
|
151
|
+
"tableIndex out of range",
|
|
152
|
+
details={"tableIndex": table_index},
|
|
153
|
+
) from exc
|
|
154
|
+
try:
|
|
155
|
+
return table.cell(row, col).paragraphs[-1]
|
|
156
|
+
except (IndexError, ValueError) as exc:
|
|
157
|
+
raise self._context._new_error(
|
|
158
|
+
"TABLE_CELL_OPERATION_FAILED",
|
|
159
|
+
f"failed to resolve table cell for the equation: {exc}",
|
|
160
|
+
) from exc
|
|
161
|
+
if paragraph_index is not None:
|
|
162
|
+
try:
|
|
163
|
+
return self._context._iter_paragraphs(document)[paragraph_index]
|
|
164
|
+
except IndexError as exc:
|
|
165
|
+
raise self._context._new_error(
|
|
166
|
+
"PARAGRAPH_INDEX_OUT_OF_RANGE",
|
|
167
|
+
"paragraphIndex out of range",
|
|
168
|
+
details={"paragraphIndex": paragraph_index},
|
|
169
|
+
) from exc
|
|
170
|
+
return None
|
|
171
|
+
|
|
172
|
+
def add_equation(
|
|
173
|
+
self,
|
|
174
|
+
path: str,
|
|
175
|
+
*,
|
|
176
|
+
latex: Optional[str] = None,
|
|
177
|
+
script: Optional[str] = None,
|
|
178
|
+
paragraph_index: Optional[int] = None,
|
|
179
|
+
table_index: Optional[int] = None,
|
|
180
|
+
row: Optional[int] = None,
|
|
181
|
+
col: Optional[int] = None,
|
|
182
|
+
base_unit: int = 1100,
|
|
183
|
+
dry_run: bool = False,
|
|
184
|
+
) -> Dict[str, Any]:
|
|
185
|
+
from hwpx.equation import EquationConversionError, eqedit_to_latex
|
|
186
|
+
|
|
187
|
+
script = self._equation_script_from_input(latex, script)
|
|
188
|
+
document, resolved = self._context._open_document(path)
|
|
189
|
+
paragraph = self._resolve_equation_target(
|
|
190
|
+
document,
|
|
191
|
+
paragraph_index=paragraph_index,
|
|
192
|
+
table_index=table_index,
|
|
193
|
+
row=row,
|
|
194
|
+
col=col,
|
|
195
|
+
)
|
|
196
|
+
try:
|
|
197
|
+
document.add_equation(script, paragraph=paragraph, base_unit=base_unit)
|
|
198
|
+
except ValueError as exc:
|
|
199
|
+
raise self._context._new_error(
|
|
200
|
+
"EQUATION_INPUT_INVALID", str(exc)
|
|
201
|
+
) from exc
|
|
202
|
+
try:
|
|
203
|
+
reader_latex = eqedit_to_latex(script)
|
|
204
|
+
except EquationConversionError:
|
|
205
|
+
reader_latex = None
|
|
206
|
+
result = {
|
|
207
|
+
"ok": True,
|
|
208
|
+
"filename": path,
|
|
209
|
+
"equation": {
|
|
210
|
+
"script": script,
|
|
211
|
+
"readerLatex": reader_latex,
|
|
212
|
+
"baseUnit": base_unit,
|
|
213
|
+
},
|
|
214
|
+
}
|
|
215
|
+
return self._transactions._with_transaction_verification(
|
|
216
|
+
result, document, resolved, dry_run=dry_run
|
|
217
|
+
)
|
|
218
|
+
|
|
91
219
|
def insert_paragraphs_bulk(
|
|
92
220
|
self,
|
|
93
221
|
path: str,
|
|
@@ -81,6 +81,7 @@ list_templates = TOOL_BINDINGS["list_templates"]
|
|
|
81
81
|
describe_template = TOOL_BINDINGS["describe_template"]
|
|
82
82
|
add_heading = TOOL_BINDINGS["add_heading"]
|
|
83
83
|
add_paragraph = TOOL_BINDINGS["add_paragraph"]
|
|
84
|
+
add_equation = TOOL_BINDINGS["add_equation"]
|
|
84
85
|
insert_paragraph = TOOL_BINDINGS["insert_paragraph"]
|
|
85
86
|
delete_paragraph = TOOL_BINDINGS["delete_paragraph"]
|
|
86
87
|
add_page_break = TOOL_BINDINGS["add_page_break"]
|
{python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/tool_bindings.py
RENAMED
|
@@ -64,6 +64,7 @@ def _build_tool_bindings() -> Mapping[str, Callable[..., Any]]:
|
|
|
64
64
|
"describe_template": authoring.describe_template,
|
|
65
65
|
"add_heading": content_edit.add_heading,
|
|
66
66
|
"add_paragraph": content_edit.add_paragraph,
|
|
67
|
+
"add_equation": content_edit.add_equation,
|
|
67
68
|
"insert_paragraph": content_edit.insert_paragraph,
|
|
68
69
|
"delete_paragraph": content_edit.delete_paragraph,
|
|
69
70
|
"add_page_break": content_edit.add_page_break,
|
{python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/tool_contract.py
RENAMED
|
@@ -20,20 +20,20 @@ from dataclasses import dataclass
|
|
|
20
20
|
from enum import Enum
|
|
21
21
|
from typing import Any, Callable, Mapping
|
|
22
22
|
|
|
23
|
-
MIN_PYTHON_HWPX = "5.
|
|
23
|
+
MIN_PYTHON_HWPX = "5.2.0"
|
|
24
24
|
# The 5.0 train: core drops the workflow surfaces and the `hwpx` console name,
|
|
25
25
|
# this package picks the name up, and the plugin pins both. The three move
|
|
26
26
|
# together — a mixed set is what "no valid install has two declarers" rules out.
|
|
27
|
-
MIN_AUTOMATION_VERSION = "6.
|
|
27
|
+
MIN_AUTOMATION_VERSION = "6.2.0"
|
|
28
28
|
# Compatibility alias retained in the 6.x contract payload for existing health
|
|
29
29
|
# and plugin consumers. New code and documentation use the automation name.
|
|
30
30
|
MIN_MCP_VERSION = MIN_AUTOMATION_VERSION
|
|
31
|
-
MIN_SKILL_VERSION = "1.
|
|
31
|
+
MIN_SKILL_VERSION = "1.2.0"
|
|
32
32
|
# Frozen release receipt for non-runtime services. Runtime construction still
|
|
33
33
|
# recomputes and verifies the bound callable/schema contract through
|
|
34
34
|
# ``contract_hash()``; this constant prevents those services from importing the
|
|
35
35
|
# runtime composer merely to stamp the approved release receipt.
|
|
36
|
-
RELEASED_CONTRACT_HASH = "
|
|
36
|
+
RELEASED_CONTRACT_HASH = "342cf672f29cd183"
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
def describe_callables(entries: Any) -> Any:
|
|
@@ -309,7 +309,7 @@ _MUTATING_TOOLS = {
|
|
|
309
309
|
"create_government_report_document", "create_proposal_document",
|
|
310
310
|
"create_comparison_table_document", "register_template",
|
|
311
311
|
"add_heading", "add_paragraph", "insert_paragraph", "delete_paragraph",
|
|
312
|
-
"add_page_break", "apply_edits", "undo_last_edit",
|
|
312
|
+
"add_page_break", "add_equation", "apply_edits", "undo_last_edit",
|
|
313
313
|
"replace_by_anchor", "replace_in_paragraph", "search_and_replace", "batch_replace",
|
|
314
314
|
"byte_preserving_patch", "insert_picture", "replace_picture",
|
|
315
315
|
"add_table", "set_table_cell_text", "merge_table_cells", "split_table_cell",
|
|
@@ -424,7 +424,7 @@ BASELINE_DOMAIN_SPECS: tuple[DomainSpec, ...] = (
|
|
|
424
424
|
"add_heading", "add_paragraph", "insert_paragraph", "delete_paragraph", "add_page_break",
|
|
425
425
|
"apply_edits", "undo_last_edit",
|
|
426
426
|
"replace_by_anchor", "replace_in_paragraph", "search_and_replace", "batch_replace",
|
|
427
|
-
"byte_preserving_patch", "insert_picture", "replace_picture",
|
|
427
|
+
"byte_preserving_patch", "insert_picture", "replace_picture", "add_equation",
|
|
428
428
|
),
|
|
429
429
|
),
|
|
430
430
|
DomainSpec(
|
|
@@ -589,18 +589,18 @@ TOOL_SPECS = tuple(spec for spec in BASELINE_TOOL_SPECS if spec.installed)
|
|
|
589
589
|
def _validate_classification() -> None:
|
|
590
590
|
counts = classification_counts()
|
|
591
591
|
expected = {
|
|
592
|
-
ToolClassification.PUBLIC.value:
|
|
592
|
+
ToolClassification.PUBLIC.value: 112,
|
|
593
593
|
ToolClassification.COMPATIBILITY.value: 6,
|
|
594
594
|
ToolClassification.ADVANCED.value: 8,
|
|
595
595
|
ToolClassification.DEPRECATED.value: 3,
|
|
596
596
|
ToolClassification.INTERNAL.value: 4,
|
|
597
597
|
}
|
|
598
|
-
if len(BASELINE_TOOL_SPECS) !=
|
|
598
|
+
if len(BASELINE_TOOL_SPECS) != 133 or counts != expected:
|
|
599
599
|
raise RuntimeError(
|
|
600
|
-
f"
|
|
600
|
+
f"133-tool classification must be disjoint and exhaustive: {counts!r} != {expected!r}"
|
|
601
601
|
)
|
|
602
|
-
if len(TOOL_SPECS) !=
|
|
603
|
-
raise RuntimeError(f"installed advanced surface must contain
|
|
602
|
+
if len(TOOL_SPECS) != 129:
|
|
603
|
+
raise RuntimeError(f"installed advanced surface must contain 129 tools, got {len(TOOL_SPECS)}")
|
|
604
604
|
if sum(spec.skill_required for spec in TOOL_SPECS) != 28:
|
|
605
605
|
raise RuntimeError(
|
|
606
606
|
"installed surface must contain exactly 28 skill-required tools"
|