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.
Files changed (224) hide show
  1. {python_hwpx_automation-6.1.3/src/python_hwpx_automation.egg-info → python_hwpx_automation-6.2.1}/PKG-INFO +9 -8
  2. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/README.md +7 -6
  3. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/pyproject.toml +2 -2
  4. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/content_edit.py +37 -0
  5. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwpx_ops.py +25 -0
  6. python_hwpx_automation-6.2.1/src/hwpx_automation/identity.json +263 -0
  7. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/content_layout.py +128 -0
  8. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/server.py +1 -0
  9. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/tool_bindings.py +1 -0
  10. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/tool_contract.py +11 -11
  11. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1/src/python_hwpx_automation.egg-info}/PKG-INFO +9 -8
  12. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/requires.txt +1 -1
  13. python_hwpx_automation-6.1.3/src/hwpx_automation/identity.json +0 -263
  14. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/LICENSE +0 -0
  15. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/MANIFEST.in +0 -0
  16. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/NOTICE +0 -0
  17. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/setup.cfg +0 -0
  18. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/__init__.py +0 -0
  19. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/__init__.pyi +0 -0
  20. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/__main__.py +0 -0
  21. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/agent_document.py +0 -0
  22. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/api.py +0 -0
  23. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/blind_eval.py +0 -0
  24. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/capabilities.py +0 -0
  25. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/compat.py +0 -0
  26. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/configuration.py +0 -0
  27. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/__init__.py +0 -0
  28. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/content.py +0 -0
  29. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/context.py +0 -0
  30. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/diff.py +0 -0
  31. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/document.py +0 -0
  32. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/formatting.py +0 -0
  33. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/handles.py +0 -0
  34. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/locations.py +0 -0
  35. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/locator.py +0 -0
  36. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/plan.py +0 -0
  37. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/resources.py +0 -0
  38. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/search.py +0 -0
  39. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/transactions.py +0 -0
  40. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/core/txn.py +0 -0
  41. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/document_state.py +0 -0
  42. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/errors.py +0 -0
  43. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/execution_lock.py +0 -0
  44. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/fastmcp_adapter.py +0 -0
  45. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/form_fill.py +0 -0
  46. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/form_output_models.py +0 -0
  47. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/__init__.py +0 -0
  48. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/_shared.py +0 -0
  49. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/agent_document.py +0 -0
  50. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/authoring.py +0 -0
  51. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/form_fill.py +0 -0
  52. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/layout_style.py +0 -0
  53. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/quality_render.py +0 -0
  54. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/read_export.py +0 -0
  55. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/specialized.py +0 -0
  56. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/tracked_changes.py +0 -0
  57. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/handlers/workflow.py +0 -0
  58. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwp_converter.py +0 -0
  59. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/hwp_support.py +0 -0
  60. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/identity.py +0 -0
  61. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ingest_adapters.py +0 -0
  62. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/markdown_plan.py +0 -0
  63. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/mcp_cli.py +0 -0
  64. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/metadata/tools_meta.py +0 -0
  65. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/mixed_form.py +0 -0
  66. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/mutation_models.py +0 -0
  67. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/network_policy.py +0 -0
  68. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/__init__.py +0 -0
  69. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/__init__.py +0 -0
  70. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/_batch_verification.py +0 -0
  71. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/__init__.py +0 -0
  72. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/bundle.py +0 -0
  73. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/catalog.py +0 -0
  74. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/dump.py +0 -0
  75. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/mapping.py +0 -0
  76. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/model.py +0 -0
  77. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/native.py +0 -0
  78. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/blueprint/replay.py +0 -0
  79. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/catalog.py +0 -0
  80. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/cli.py +0 -0
  81. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/commands.py +0 -0
  82. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/document.py +0 -0
  83. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/form_plan.py +0 -0
  84. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/model.py +0 -0
  85. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/path.py +0 -0
  86. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/query.py +0 -0
  87. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/agent/story.py +0 -0
  88. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/__init__.py +0 -0
  89. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/advanced_generators.py +0 -0
  90. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/builder/__init__.py +0 -0
  91. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/builder/core.py +0 -0
  92. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/builder/report.py +0 -0
  93. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/__init__.py +0 -0
  94. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/_support.py +0 -0
  95. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/composer.py +0 -0
  96. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/harvest.py +0 -0
  97. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/plan.py +0 -0
  98. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profile.py +0 -0
  99. {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
  100. {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
  101. {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
  102. {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
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/profile.json +0 -0
  121. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
  122. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/design/validator.py +0 -0
  123. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/presets/__init__.py +0 -0
  124. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/presets/proposal.py +0 -0
  125. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/report_parser.py +0 -0
  126. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/style_profile.py +0 -0
  127. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/authoring/template_analyzer.py +0 -0
  128. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/compliance/__init__.py +0 -0
  129. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/compliance/official_lint.py +0 -0
  130. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/compliance/pii.py +0 -0
  131. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/__init__.py +0 -0
  132. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/comparison.py +0 -0
  133. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/mail_merge.py +0 -0
  134. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/document_ops/redline.py +0 -0
  135. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/evalplan/__init__.py +0 -0
  136. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/evalplan/runtime.py +0 -0
  137. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/__init__.py +0 -0
  138. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/compose.py +0 -0
  139. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/ir.py +0 -0
  140. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/measure.py +0 -0
  141. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/parser.py +0 -0
  142. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/exam/profile.py +0 -0
  143. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/__init__.py +0 -0
  144. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/classification.py +0 -0
  145. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fill_residue.py +0 -0
  146. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/__init__.py +0 -0
  147. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/apply.py +0 -0
  148. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/engine.py +0 -0
  149. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/measure.py +0 -0
  150. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/policy.py +0 -0
  151. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/report.py +0 -0
  152. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/seal.py +0 -0
  153. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/fit/wordbox.py +0 -0
  154. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/guidance.py +0 -0
  155. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/quality.py +0 -0
  156. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/split_run.py +0 -0
  157. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/form_fill/template_formfit.py +0 -0
  158. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/__init__.py +0 -0
  159. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/composition.py +0 -0
  160. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/data/bank.json +0 -0
  161. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/house_style/data/genres.json +0 -0
  162. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/quality/__init__.py +0 -0
  163. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/quality/page_guard.py +0 -0
  164. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/__init__.py +0 -0
  165. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_hancom_open_rate.ps1 +0 -0
  166. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +0 -0
  167. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_render_hwpx.ps1 +0 -0
  168. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/_render_hwpx_mac.applescript +0 -0
  169. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/block_splits.py +0 -0
  170. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/detectors.py +0 -0
  171. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/diff.py +0 -0
  172. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/fixture_corpus.py +0 -0
  173. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/oracle.py +0 -0
  174. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/page_qa.py +0 -0
  175. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/qa_contracts.py +0 -0
  176. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/qa_metrics.py +0 -0
  177. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/rendering/worker.py +0 -0
  178. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/utilities/__init__.py +0 -0
  179. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/office/utilities/table_compute.py +0 -0
  180. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/__init__.py +0 -0
  181. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/_border_fill.py +0 -0
  182. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/composition.py +0 -0
  183. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/context.py +0 -0
  184. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/form_fields.py +0 -0
  185. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/media.py +0 -0
  186. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/memo_style.py +0 -0
  187. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/package_validation.py +0 -0
  188. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/planning.py +0 -0
  189. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/preview_export.py +0 -0
  190. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/read_query.py +0 -0
  191. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/save_policy.py +0 -0
  192. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/tables.py +0 -0
  193. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/ops_services/transactions.py +0 -0
  194. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/preview_output_models.py +0 -0
  195. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/public-modules.json +0 -0
  196. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/py.typed +0 -0
  197. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/quality.py +0 -0
  198. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/quality_generation.py +0 -0
  199. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/runtime.py +0 -0
  200. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/runtime_services.py +0 -0
  201. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/storage.py +0 -0
  202. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/upstream.py +0 -0
  203. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/utils/__init__.py +0 -0
  204. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/utils/helpers.py +0 -0
  205. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/visual_qa.py +0 -0
  206. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/__init__.py +0 -0
  207. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/adapters.py +0 -0
  208. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/dispatcher.py +0 -0
  209. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/models.py +0 -0
  210. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/policy.py +0 -0
  211. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_contracts.py +0 -0
  212. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_metrics.py +0 -0
  213. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_queue.py +0 -0
  214. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_security.py +0 -0
  215. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/render_transport.py +0 -0
  216. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/rendering.py +0 -0
  217. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/service.py +0 -0
  218. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/state_machine.py +0 -0
  219. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workflow/store.py +0 -0
  220. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/hwpx_automation/workspace.py +0 -0
  221. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/SOURCES.txt +0 -0
  222. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/dependency_links.txt +0 -0
  223. {python_hwpx_automation-6.1.3 → python_hwpx_automation-6.2.1}/src/python_hwpx_automation.egg-info/entry_points.txt +0 -0
  224. {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
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.1.0
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
- > 이 소스 트리는 아직 공개되지 않은 6.1.3 후보입니다(누름틀 필드 저작
78
- > `add_form_field`, 계약 `ac1a422376b5ac84`, 128 도구). 현재 공개 트레인은
79
- > `python-hwpx 5.0.2 → python-hwpx-automation 6.0.4 → hwpx-plugin 1.0.1`
80
- > (계약 `0ce938371f0b55a6`)입니다. core·automation PyPI와 plugin GitHub
81
- > Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격하며, 기존
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.0.4",
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
- > 이 소스 트리는 아직 공개되지 않은 6.1.3 후보입니다(누름틀 필드 저작
18
- > `add_form_field`, 계약 `ac1a422376b5ac84`, 128 도구). 현재 공개 트레인은
19
- > `python-hwpx 5.0.2 → python-hwpx-automation 6.0.4 → hwpx-plugin 1.0.1`
20
- > (계약 `0ce938371f0b55a6`)입니다. core·automation PyPI와 plugin GitHub
21
- > Release·marketplace·실제 marketplace 설치까지 확인한 뒤 승격하며, 기존
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.0.4",
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.3"
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.1.0,<6", # HWPX object model, OXML/OPC, format-native primitives
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",
@@ -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"]
@@ -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,
@@ -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.1.0"
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.1.0"
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.1.0"
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 = "ac1a422376b5ac84"
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: 111,
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) != 132 or counts != expected:
598
+ if len(BASELINE_TOOL_SPECS) != 133 or counts != expected:
599
599
  raise RuntimeError(
600
- f"132-tool classification must be disjoint and exhaustive: {counts!r} != {expected!r}"
600
+ f"133-tool classification must be disjoint and exhaustive: {counts!r} != {expected!r}"
601
601
  )
602
- if len(TOOL_SPECS) != 128:
603
- raise RuntimeError(f"installed advanced surface must contain 128 tools, got {len(TOOL_SPECS)}")
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"