python-hwpx-automation 6.4.2__tar.gz → 6.6.4__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.4.2/src/python_hwpx_automation.egg-info → python_hwpx_automation-6.6.4}/PKG-INFO +13 -11
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/README.md +11 -9
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/pyproject.toml +2 -2
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/capabilities.py +56 -1
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/fastmcp_adapter.py +26 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/form_fill.py +26 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/quality_render.py +11 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/specialized.py +90 -1
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/hwpx_ops.py +8 -0
- python_hwpx_automation-6.6.4/src/hwpx_automation/identity.json +263 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/dump.py +7 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/native.py +19 -4
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/commands.py +52 -17
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/document.py +57 -15
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/__init__.py +18 -2
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/builder/core.py +56 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/house_style/composition.py +9 -11
- python_hwpx_automation-6.6.4/src/hwpx_automation/office/house_style/org_chart.py +273 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/form_fields.py +26 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/public-modules.json +6 -4
- python_hwpx_automation-6.6.4/src/hwpx_automation/resources.py +139 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/runtime.py +3 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/server.py +4 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/tool_bindings.py +4 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/tool_contract.py +19 -14
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4/src/python_hwpx_automation.egg-info}/PKG-INFO +13 -11
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/python_hwpx_automation.egg-info/SOURCES.txt +2 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/python_hwpx_automation.egg-info/requires.txt +1 -1
- python_hwpx_automation-6.4.2/src/hwpx_automation/identity.json +0 -263
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/LICENSE +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/MANIFEST.in +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/NOTICE +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/setup.cfg +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/__init__.pyi +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/__main__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/agent_document.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/api.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/blind_eval.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/compat.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/configuration.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/content.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/context.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/diff.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/document.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/formatting.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/handles.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/locations.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/locator.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/plan.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/resources.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/search.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/transactions.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/core/txn.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/document_state.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/errors.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/execution_lock.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/form_fill.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/form_output_models.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/_shared.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/agent_document.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/authoring.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/content_edit.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/layout_style.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/read_export.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/tracked_changes.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/handlers/workflow.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/hwp_converter.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/hwp_support.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/identity.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ingest_adapters.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/markdown_plan.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/mcp_cli.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/metadata/tools_meta.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/mixed_form.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/mutation_models.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/network_policy.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/_batch_verification.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/bundle.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/catalog.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/mapping.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/model.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/blueprint/replay.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/catalog.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/cli.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/form_plan.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/model.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/path.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/query.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/agent/story.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/advanced_generators.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/builder/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/builder/report.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/_support.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/composer.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/harvest.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/plan.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profile.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/body.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/info_table.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/fragments/title.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/profile.json +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/application_form/template.hwpx +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/body.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/fragments/title.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/profile.json +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/home_notice/template.hwpx +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/body.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/info_table.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/fragments/title.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/profile.json +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/official_notice/template.hwpx +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/body.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/heading.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/info_table.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/fragments/title.xml +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/profile.json +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/design/validator.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/presets/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/presets/proposal.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/report_parser.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/style_profile.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/authoring/template_analyzer.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/charting/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/compliance/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/compliance/official_lint.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/compliance/pii.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/document_ops/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/document_ops/comparison.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/document_ops/mail_merge.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/document_ops/redline.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/evalplan/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/evalplan/runtime.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/compose.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/ir.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/measure.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/parser.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/exam/profile.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/classification.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fill_residue.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/apply.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/engine.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/measure.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/policy.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/report.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/seal.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/fit/wordbox.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/guidance.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/quality.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/split_run.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/form_fill/template_formfit.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/house_style/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/house_style/data/bank.json +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/house_style/data/genres.json +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/quality/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/quality/page_guard.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/_hancom_open_rate.ps1 +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/_render_hwpx_mac.applescript +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/block_splits.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/detectors.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/diff.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/fixture_corpus.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/oracle.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/page_qa.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/qa_contracts.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/qa_metrics.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/rendering/worker.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/utilities/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/office/utilities/table_compute.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/_border_fill.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/composition.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/content_layout.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/context.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/media.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/memo_style.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/package_validation.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/planning.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/preview_export.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/read_query.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/save_policy.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/tables.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/ops_services/transactions.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/preview_output_models.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/py.typed +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/quality.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/quality_generation.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/runtime_services.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/storage.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/upstream.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/utils/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/utils/helpers.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/visual_qa.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/__init__.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/adapters.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/dispatcher.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/models.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/policy.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_contracts.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_metrics.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_queue.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_security.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/render_transport.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/rendering.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/service.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/state_machine.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workflow/store.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/workspace.py +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/python_hwpx_automation.egg-info/dependency_links.txt +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/python_hwpx_automation.egg-info/entry_points.txt +0 -0
- {python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/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.4
|
|
3
|
+
Version: 6.6.4
|
|
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.6.0
|
|
24
24
|
Requires-Dist: pydantic<3,>=2.11
|
|
25
25
|
Requires-Dist: cryptography>=42.0
|
|
26
26
|
Requires-Dist: anyio>=4.0
|
|
@@ -74,15 +74,17 @@ Dynamic: license-file
|
|
|
74
74
|
|
|
75
75
|
<!-- release-state: release-approved -->
|
|
76
76
|
> [!NOTE]
|
|
77
|
-
> 이
|
|
78
|
-
> `
|
|
79
|
-
>
|
|
80
|
-
> `python-hwpx 5.
|
|
81
|
-
> (계약 `
|
|
82
|
-
>
|
|
83
|
-
> Release·marketplace·실제 marketplace 설치까지 확인한
|
|
84
|
-
> 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와
|
|
85
|
-
> 머신: [릴리스 runbook](docs/release-runbook.md)
|
|
77
|
+
> 이 소스 트리는 **아직 공개되지 않은 6.6.4 후보**입니다(에이전트 계약 표면:
|
|
78
|
+
> `run_edit_plan` 선언적 편집 계획 실행기 + MCP resources +
|
|
79
|
+
> `describe_capabilities` 확장, 134 도구, core 바닥 5.6.0). 현재 공개
|
|
80
|
+
> 트레인은 여전히 `python-hwpx 5.5.0 → python-hwpx-automation 6.5.1 → hwpx-plugin 1.5.0`
|
|
81
|
+
> (계약 `f61d2c60c0aa0413`)이며, 후보는 core·automation
|
|
82
|
+
> PyPI와 plugin GitHub
|
|
83
|
+
> Release·marketplace·실제 marketplace 설치까지 확인한 뒤에만 승격합니다.
|
|
84
|
+
> 기존 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와
|
|
85
|
+
> 상태 머신: [릴리스 runbook](docs/release-runbook.md)
|
|
86
|
+
> 현재 상태는 release-approved입니다 — 원격 진실(3스택·marketplace 설치) 관찰 전까지
|
|
87
|
+
> currentPublic은 그대로입니다.
|
|
86
88
|
|
|
87
89
|
[python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
|
|
88
90
|
양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
|
|
@@ -14,15 +14,17 @@
|
|
|
14
14
|
|
|
15
15
|
<!-- release-state: release-approved -->
|
|
16
16
|
> [!NOTE]
|
|
17
|
-
> 이
|
|
18
|
-
> `
|
|
19
|
-
>
|
|
20
|
-
> `python-hwpx 5.
|
|
21
|
-
> (계약 `
|
|
22
|
-
>
|
|
23
|
-
> Release·marketplace·실제 marketplace 설치까지 확인한
|
|
24
|
-
> 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와
|
|
25
|
-
> 머신: [릴리스 runbook](docs/release-runbook.md)
|
|
17
|
+
> 이 소스 트리는 **아직 공개되지 않은 6.6.4 후보**입니다(에이전트 계약 표면:
|
|
18
|
+
> `run_edit_plan` 선언적 편집 계획 실행기 + MCP resources +
|
|
19
|
+
> `describe_capabilities` 확장, 134 도구, core 바닥 5.6.0). 현재 공개
|
|
20
|
+
> 트레인은 여전히 `python-hwpx 5.5.0 → python-hwpx-automation 6.5.1 → hwpx-plugin 1.5.0`
|
|
21
|
+
> (계약 `f61d2c60c0aa0413`)이며, 후보는 core·automation
|
|
22
|
+
> PyPI와 plugin GitHub
|
|
23
|
+
> Release·marketplace·실제 marketplace 설치까지 확인한 뒤에만 승격합니다.
|
|
24
|
+
> 기존 5.x 설치는 별도 발행된 `hwpx-mcp-server 5.1.1`이 보호합니다. 절차와
|
|
25
|
+
> 상태 머신: [릴리스 runbook](docs/release-runbook.md)
|
|
26
|
+
> 현재 상태는 release-approved입니다 — 원격 진실(3스택·marketplace 설치) 관찰 전까지
|
|
27
|
+
> currentPublic은 그대로입니다.
|
|
26
28
|
|
|
27
29
|
[python-hwpx](https://github.com/airmang/python-hwpx) 엔진 위에서 문서 저작·
|
|
28
30
|
양식 채움·시험지 조판·안전한 에이전트 워크플로를 제공하는 응용 계층입니다.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-hwpx-automation"
|
|
7
|
-
version = "6.4
|
|
7
|
+
version = "6.6.4"
|
|
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.6.0,<6", # HWPX object model, OXML/OPC, format-native primitives
|
|
33
33
|
|
|
34
34
|
"pydantic>=2.11,<3",
|
|
35
35
|
"cryptography>=42.0",
|
{python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/capabilities.py
RENAMED
|
@@ -107,4 +107,59 @@ def tool_domain(name: str) -> str | None:
|
|
|
107
107
|
return None
|
|
108
108
|
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
def core_self_description() -> dict[str, Any]:
|
|
111
|
+
"""설치된 core의 `hwpx.capabilities/v1` 자기서술 — 없으면 정직 degrade.
|
|
112
|
+
|
|
113
|
+
core 5.6+가 제공한다. 구버전 core 위에서는 없다는 사실 자체를 보고하지,
|
|
114
|
+
자기서술을 지어내지 않는다.
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
from hwpx.experimental import describe_capabilities as core_caps
|
|
119
|
+
except ImportError:
|
|
120
|
+
return {
|
|
121
|
+
"available": False,
|
|
122
|
+
"reason": (
|
|
123
|
+
"installed python-hwpx does not expose hwpx.capabilities "
|
|
124
|
+
"(needs >= 5.6.0)"
|
|
125
|
+
),
|
|
126
|
+
}
|
|
127
|
+
report = dict(core_caps())
|
|
128
|
+
report["available"] = True
|
|
129
|
+
return report
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def render_oracle_availability() -> dict[str, Any]:
|
|
133
|
+
"""실한컴 렌더 오라클 가용성 — **무실행 프로브만**(세션·렌더 발사 없음).
|
|
134
|
+
|
|
135
|
+
resolve_oracle 캐스케이드(Windows COM → Mac GUI → Null; STRUCTURAL_ONLY는
|
|
136
|
+
Null 단락)와 imaging/pymupdf 프로브를 그대로 보고한다. available=False는
|
|
137
|
+
결함이 아니라 이 환경의 사실이며, 그때 render 게이트는 renderChecked=false
|
|
138
|
+
로 정직하게 degrade한다.
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
from .office.rendering import detectors, diff
|
|
142
|
+
from .office.rendering.oracle import resolve_oracle
|
|
143
|
+
|
|
144
|
+
oracle = resolve_oracle()
|
|
145
|
+
try:
|
|
146
|
+
available = bool(oracle.available())
|
|
147
|
+
except Exception:
|
|
148
|
+
available = False
|
|
149
|
+
return {
|
|
150
|
+
"oracle": type(oracle).__name__,
|
|
151
|
+
"available": available,
|
|
152
|
+
"imaging": bool(detectors.imaging_available()),
|
|
153
|
+
"pymupdf": bool(diff.pymupdf_available()),
|
|
154
|
+
"note": "probe-only — 어떤 렌더 세션도 시작하지 않는다",
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
__all__ = [
|
|
159
|
+
"DOMAINS",
|
|
160
|
+
"build_capability_report",
|
|
161
|
+
"core_self_description",
|
|
162
|
+
"coverage_against",
|
|
163
|
+
"render_oracle_availability",
|
|
164
|
+
"tool_domain",
|
|
165
|
+
]
|
{python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/fastmcp_adapter.py
RENAMED
|
@@ -616,6 +616,32 @@ def register_canonical_tool(
|
|
|
616
616
|
return _register(mcp, name=name, func=func, description=description, meta=meta)
|
|
617
617
|
|
|
618
618
|
|
|
619
|
+
def register_canonical_resource(
|
|
620
|
+
mcp: Any,
|
|
621
|
+
*,
|
|
622
|
+
uri: str,
|
|
623
|
+
name: str,
|
|
624
|
+
description: str,
|
|
625
|
+
mime_type: str,
|
|
626
|
+
func: Callable[[], str],
|
|
627
|
+
) -> None:
|
|
628
|
+
"""Register one canonical read-only resource through the public SDK hook.
|
|
629
|
+
|
|
630
|
+
이 어댑터가 유일한 FastMCP 호환 seam이라는 계약(모듈 docstring)은 리소스
|
|
631
|
+
표면에도 그대로 적용된다 — 다른 모듈은 이 함수를 부르지, SDK의
|
|
632
|
+
``resource`` 데코레이터를 직접 만지지 않는다.
|
|
633
|
+
"""
|
|
634
|
+
|
|
635
|
+
try:
|
|
636
|
+
mcp.resource(uri, name=name, description=description, mime_type=mime_type)(
|
|
637
|
+
func
|
|
638
|
+
)
|
|
639
|
+
except Exception as exc: # pragma: no cover - SDK 계약 위반은 등록 시점 하드 실패
|
|
640
|
+
raise FastMcpAdapterError(
|
|
641
|
+
f"failed to register canonical resource {uri!r}: {exc}"
|
|
642
|
+
) from exc
|
|
643
|
+
|
|
644
|
+
|
|
619
645
|
def snapshot_runtime_tools(mcp: Any) -> Mapping[str, FastMcpToolSnapshot]:
|
|
620
646
|
"""Return an insertion-ordered, read-only snapshot of the live registry."""
|
|
621
647
|
|
|
@@ -136,6 +136,32 @@ def apply_template_formfit(
|
|
|
136
136
|
)
|
|
137
137
|
|
|
138
138
|
|
|
139
|
+
def run_edit_plan(
|
|
140
|
+
plan: dict,
|
|
141
|
+
dry_run: bool = False,
|
|
142
|
+
) -> dict:
|
|
143
|
+
"""선언적 편집 계획(hwpx.edit-plan/v1)을 all-or-nothing으로 실행합니다.
|
|
144
|
+
|
|
145
|
+
plan.steps는 기존 바이트-스플라이스 op 이름 그대로(fill_cells·
|
|
146
|
+
apply_table_ops·apply_body_ops·paragraph_patch·recolor_runs_by_color·
|
|
147
|
+
strip_runs_by_color·strip_trailing_table_captions)를 지시합니다. 실행은
|
|
148
|
+
정적 선검증→전 체인 인메모리→최종 open-safety 검증→단 1회 원자 쓰기 —
|
|
149
|
+
중간 step 실패 시 output·source는 바이트 불변이고 ok=false 리포트
|
|
150
|
+
(failedStepId·step error)가 돌아옵니다. dry_run=true는 동일 체인을 전부
|
|
151
|
+
실행하되 쓰기만 생략합니다(미리보기=실행 정의상 동일). 반환은
|
|
152
|
+
hwpx.plan-report/v1(step별+원본→최종 mutation-report/v1 실측 사영 포함).
|
|
153
|
+
스키마는 hwpx://schemas/edit-plan-v1 리소스로 구독 가능합니다."""
|
|
154
|
+
|
|
155
|
+
resolved = dict(plan) if plan else {}
|
|
156
|
+
for key in ("source", "output", "journalPath"):
|
|
157
|
+
value = resolved.get(key)
|
|
158
|
+
if isinstance(value, str) and value:
|
|
159
|
+
resolved[key] = resolve_path(value)
|
|
160
|
+
if not dry_run:
|
|
161
|
+
quality_contract.assert_write_capability()
|
|
162
|
+
return RUNTIME_SERVICES.ops.run_edit_plan(resolved, dry_run=dry_run)
|
|
163
|
+
|
|
164
|
+
|
|
139
165
|
def apply_table_ops(
|
|
140
166
|
filename: str,
|
|
141
167
|
ops: list[TableOperation],
|
|
@@ -258,6 +258,17 @@ def describe_capabilities(domain: str | None = None) -> dict:
|
|
|
258
258
|
advanced=advanced,
|
|
259
259
|
registry_validation=validation,
|
|
260
260
|
)
|
|
261
|
+
# additive(6.6): core 자기서술·오라클 가용성·리소스 카탈로그를 합성한다 —
|
|
262
|
+
# 자기서술 도구를 둘로 쪼개지 않는다(진실 이원화 방지).
|
|
263
|
+
from ..capabilities import core_self_description, render_oracle_availability
|
|
264
|
+
from ..resources import CANONICAL_RESOURCES
|
|
265
|
+
|
|
266
|
+
report["core"] = core_self_description()
|
|
267
|
+
report["renderOracle"] = render_oracle_availability()
|
|
268
|
+
report["resources"] = [
|
|
269
|
+
{"uri": spec.uri, "name": spec.name, "mimeType": spec.mime_type}
|
|
270
|
+
for spec in CANONICAL_RESOURCES
|
|
271
|
+
]
|
|
261
272
|
return report
|
|
262
273
|
|
|
263
274
|
|
|
@@ -7,7 +7,7 @@ import os
|
|
|
7
7
|
import re
|
|
8
8
|
import tempfile
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
10
|
+
from typing import Any, Literal, cast
|
|
11
11
|
|
|
12
12
|
from ..core.content import (
|
|
13
13
|
collect_full_text,
|
|
@@ -23,6 +23,11 @@ from ..office.authoring.advanced_generators import (
|
|
|
23
23
|
build_organization_chart as build_hwpx_organization_chart,
|
|
24
24
|
)
|
|
25
25
|
from ..office.compliance import DEFAULT_POLICY, detect_pii, mask_value
|
|
26
|
+
from ..office.house_style import load_bank, load_genres
|
|
27
|
+
from ..office.house_style.composition import (
|
|
28
|
+
compose_section_chip as compose_house_section_chip,
|
|
29
|
+
)
|
|
30
|
+
from ..office.house_style.org_chart import lower_boxed_org_chart
|
|
26
31
|
from ..office.document_ops import (
|
|
27
32
|
build_mail_merge as build_hwpx_mail_merge,
|
|
28
33
|
)
|
|
@@ -217,6 +222,90 @@ def build_organization_chart(
|
|
|
217
222
|
}
|
|
218
223
|
|
|
219
224
|
|
|
225
|
+
def add_boxed_org_chart(
|
|
226
|
+
filename: str,
|
|
227
|
+
hierarchy: dict,
|
|
228
|
+
accent_color: str = None,
|
|
229
|
+
dry_run: bool = False,
|
|
230
|
+
expected_revision: str = None,
|
|
231
|
+
) -> dict:
|
|
232
|
+
"""계층 트리를 실물 관례의 박스 조직도(표 캔버스+병합 박스+셀 테두리
|
|
233
|
+
커넥터)로 문서 끝에 그립니다. 각 노드는 {"label", "sublabel"?,
|
|
234
|
+
"children"?[]} 매핑이며 깊이 4·박스 40 초과는 typed 거부.
|
|
235
|
+
accent_color는 루트 박스 배경색. dry_run=True이면 저장하지 않습니다."""
|
|
236
|
+
path = resolve_path(filename)
|
|
237
|
+
guard = _revision_guard(path, expected_revision)
|
|
238
|
+
if guard is not None:
|
|
239
|
+
return guard
|
|
240
|
+
doc = open_doc(path)
|
|
241
|
+
summary = lower_boxed_org_chart(doc, hierarchy or {}, accent_color=accent_color)
|
|
242
|
+
result = {"orgChart": summary}
|
|
243
|
+
if dry_run:
|
|
244
|
+
return _with_dry_run_verification(result, doc, path)
|
|
245
|
+
verification = _save_doc_verification(doc, path)
|
|
246
|
+
return _with_save_verification(result, verification)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def compose_section_chip(
|
|
250
|
+
number: str,
|
|
251
|
+
title: str,
|
|
252
|
+
style: str = "box",
|
|
253
|
+
accent_color: str = None,
|
|
254
|
+
) -> dict:
|
|
255
|
+
"""운영계획 장르의 섹션 구분자(섹션칩)를 범용 document_plan block으로
|
|
256
|
+
합성합니다. style="box"(1×3 accent 칩) 또는 "inline"(번호 제목 헤딩).
|
|
257
|
+
파일은 쓰지 않습니다 — 반환 block을 document_plan에 끼워 넣으십시오."""
|
|
258
|
+
if style not in ("box", "inline"):
|
|
259
|
+
raise ValueError('style must be "box" or "inline"')
|
|
260
|
+
chip_style = cast('Literal["box", "inline"]', style)
|
|
261
|
+
block = compose_house_section_chip(
|
|
262
|
+
number, title, style=chip_style, accent_color=accent_color
|
|
263
|
+
)
|
|
264
|
+
result: dict = {"block": block, "next_tool": "validate_document_plan"}
|
|
265
|
+
if style == "box" and accent_color:
|
|
266
|
+
result["styling"] = {
|
|
267
|
+
"accentColor": accent_color,
|
|
268
|
+
"how": (
|
|
269
|
+
"문서 생성 후 이 칩 표의 번호 셀에 "
|
|
270
|
+
"format_table(fill_color=accentColor, row=0, col=0)을 적용"
|
|
271
|
+
),
|
|
272
|
+
}
|
|
273
|
+
return result
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def get_genre_grammar(genre: str) -> dict:
|
|
277
|
+
"""장르 구조 문법·타이포 역할(하우스 스타일 뱅크)을 반환하는 read-only
|
|
278
|
+
조회입니다. 스킬이 per-문서 인스턴스화(번호 체계·칩 렌더·블록 선택·색)
|
|
279
|
+
판단에 사용합니다. 미보유 장르는 사용 가능 목록과 함께 typed 거부."""
|
|
280
|
+
catalog = load_genres()
|
|
281
|
+
genres = catalog.genres if hasattr(catalog, "genres") else {}
|
|
282
|
+
if genre not in genres:
|
|
283
|
+
raise ValueError(
|
|
284
|
+
f"unknown genre {genre!r}; available: {sorted(genres)}"
|
|
285
|
+
)
|
|
286
|
+
bank = load_bank()
|
|
287
|
+
entry = genres[genre]
|
|
288
|
+
payload = entry if isinstance(entry, dict) else entry.model_dump()
|
|
289
|
+
inherits = None
|
|
290
|
+
typography = payload.get("typography") if isinstance(payload, dict) else None
|
|
291
|
+
if isinstance(typography, dict):
|
|
292
|
+
inherits = typography.get("inherits")
|
|
293
|
+
profiles = bank.profiles if hasattr(bank, "profiles") else {}
|
|
294
|
+
inherited_profile = None
|
|
295
|
+
if inherits and inherits in profiles:
|
|
296
|
+
base = profiles[inherits]
|
|
297
|
+
inherited_profile = base if isinstance(base, dict) else base.model_dump()
|
|
298
|
+
return {
|
|
299
|
+
"genre": genre,
|
|
300
|
+
"grammar": payload,
|
|
301
|
+
"inheritedProfile": {"name": inherits, "profile": inherited_profile}
|
|
302
|
+
if inherited_profile
|
|
303
|
+
else None,
|
|
304
|
+
"sectionChipTool": "compose_section_chip",
|
|
305
|
+
"orgChartTool": "add_boxed_org_chart",
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
|
|
220
309
|
def scan_personal_info(filename: str | None = None, text: str | None = None) -> dict:
|
|
221
310
|
"""문서/텍스트의 개인정보(PII)를 탐지하는 read-only 감사 (원본값 미노출).
|
|
222
311
|
|
{python_hwpx_automation-6.4.2 → python_hwpx_automation-6.6.4}/src/hwpx_automation/hwpx_ops.py
RENAMED
|
@@ -939,6 +939,14 @@ class HwpxOps:
|
|
|
939
939
|
publication_sink=publication_sink,
|
|
940
940
|
)
|
|
941
941
|
|
|
942
|
+
def run_edit_plan(
|
|
943
|
+
self,
|
|
944
|
+
plan: Dict[str, Any],
|
|
945
|
+
*,
|
|
946
|
+
dry_run: bool = False,
|
|
947
|
+
) -> Dict[str, Any]:
|
|
948
|
+
return self._services.form_fields.run_edit_plan(plan, dry_run=dry_run)
|
|
949
|
+
|
|
942
950
|
def apply_table_ops(
|
|
943
951
|
self,
|
|
944
952
|
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.6.0",
|
|
9
|
+
"canonicalDistribution": "python-hwpx-automation",
|
|
10
|
+
"canonicalAutomation": "6.6.4",
|
|
11
|
+
"compatibilityDistribution": "hwpx-mcp-server",
|
|
12
|
+
"compatibility": "6.6.4",
|
|
13
|
+
"plugin": "1.6.0",
|
|
14
|
+
"contractHash": "19898dba41495c47"
|
|
15
|
+
},
|
|
16
|
+
"currentPublic": {
|
|
17
|
+
"pythonHwpx": "5.5.0",
|
|
18
|
+
"primaryDistribution": "python-hwpx-automation",
|
|
19
|
+
"primaryApplication": "6.5.1",
|
|
20
|
+
"plugin": "1.5.0",
|
|
21
|
+
"contractHash": "f61d2c60c0aa0413"
|
|
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
|
+
}
|
|
@@ -276,6 +276,13 @@ def _host_run_path(record: NodeRecord, selected: Mapping[str, NodeRecord]) -> st
|
|
|
276
276
|
run_element = candidate.native.element
|
|
277
277
|
if parent is run_element or (element is not None and any(child is element for child in run_element)):
|
|
278
278
|
return candidate.path
|
|
279
|
+
# core 5.5.0+: notes are ctrl-wrapped inside the run (the real-Hancom
|
|
280
|
+
# contract) — the run hosts the wrapper, one hop above the note.
|
|
281
|
+
if element is not None and any(
|
|
282
|
+
child.tag.endswith("}ctrl") and any(grand is element for grand in child)
|
|
283
|
+
for child in run_element
|
|
284
|
+
):
|
|
285
|
+
return candidate.path
|
|
279
286
|
return None
|
|
280
287
|
|
|
281
288
|
|