python-hwpx-automation 6.0.3__py3-none-any.whl

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 (217) hide show
  1. hwpx_automation/__init__.py +61 -0
  2. hwpx_automation/__init__.pyi +27 -0
  3. hwpx_automation/__main__.py +8 -0
  4. hwpx_automation/agent_document.py +392 -0
  5. hwpx_automation/api.py +136 -0
  6. hwpx_automation/blind_eval.py +407 -0
  7. hwpx_automation/capabilities.py +110 -0
  8. hwpx_automation/compat.py +48 -0
  9. hwpx_automation/configuration.py +60 -0
  10. hwpx_automation/core/__init__.py +2 -0
  11. hwpx_automation/core/content.py +762 -0
  12. hwpx_automation/core/context.py +111 -0
  13. hwpx_automation/core/diff.py +53 -0
  14. hwpx_automation/core/document.py +37 -0
  15. hwpx_automation/core/formatting.py +513 -0
  16. hwpx_automation/core/handles.py +24 -0
  17. hwpx_automation/core/locations.py +205 -0
  18. hwpx_automation/core/locator.py +162 -0
  19. hwpx_automation/core/plan.py +680 -0
  20. hwpx_automation/core/resources.py +42 -0
  21. hwpx_automation/core/search.py +296 -0
  22. hwpx_automation/core/transactions.py +434 -0
  23. hwpx_automation/core/txn.py +48 -0
  24. hwpx_automation/document_state.py +95 -0
  25. hwpx_automation/errors.py +174 -0
  26. hwpx_automation/execution_lock.py +15 -0
  27. hwpx_automation/fastmcp_adapter.py +672 -0
  28. hwpx_automation/form_fill.py +1177 -0
  29. hwpx_automation/form_output_models.py +223 -0
  30. hwpx_automation/handlers/__init__.py +2 -0
  31. hwpx_automation/handlers/_shared.py +377 -0
  32. hwpx_automation/handlers/agent_document.py +257 -0
  33. hwpx_automation/handlers/authoring.py +750 -0
  34. hwpx_automation/handlers/content_edit.py +1078 -0
  35. hwpx_automation/handlers/form_fill.py +607 -0
  36. hwpx_automation/handlers/layout_style.py +660 -0
  37. hwpx_automation/handlers/quality_render.py +566 -0
  38. hwpx_automation/handlers/read_export.py +1295 -0
  39. hwpx_automation/handlers/specialized.py +624 -0
  40. hwpx_automation/handlers/tracked_changes.py +589 -0
  41. hwpx_automation/handlers/workflow.py +105 -0
  42. hwpx_automation/hwp_converter.py +227 -0
  43. hwpx_automation/hwp_support.py +94 -0
  44. hwpx_automation/hwpx_ops.py +1439 -0
  45. hwpx_automation/identity.json +263 -0
  46. hwpx_automation/identity.py +18 -0
  47. hwpx_automation/ingest_adapters.py +85 -0
  48. hwpx_automation/markdown_plan.py +216 -0
  49. hwpx_automation/mcp_cli.py +29 -0
  50. hwpx_automation/metadata/tools_meta.py +40 -0
  51. hwpx_automation/mixed_form.py +3007 -0
  52. hwpx_automation/mutation_models.py +401 -0
  53. hwpx_automation/network_policy.py +232 -0
  54. hwpx_automation/office/__init__.py +14 -0
  55. hwpx_automation/office/agent/__init__.py +125 -0
  56. hwpx_automation/office/agent/_batch_verification.py +383 -0
  57. hwpx_automation/office/agent/blueprint/__init__.py +58 -0
  58. hwpx_automation/office/agent/blueprint/bundle.py +282 -0
  59. hwpx_automation/office/agent/blueprint/catalog.py +136 -0
  60. hwpx_automation/office/agent/blueprint/dump.py +520 -0
  61. hwpx_automation/office/agent/blueprint/mapping.py +312 -0
  62. hwpx_automation/office/agent/blueprint/model.py +722 -0
  63. hwpx_automation/office/agent/blueprint/native.py +621 -0
  64. hwpx_automation/office/agent/blueprint/replay.py +622 -0
  65. hwpx_automation/office/agent/catalog.py +252 -0
  66. hwpx_automation/office/agent/cli.py +647 -0
  67. hwpx_automation/office/agent/commands.py +1383 -0
  68. hwpx_automation/office/agent/document.py +801 -0
  69. hwpx_automation/office/agent/form_plan.py +1760 -0
  70. hwpx_automation/office/agent/model.py +808 -0
  71. hwpx_automation/office/agent/path.py +155 -0
  72. hwpx_automation/office/agent/query.py +230 -0
  73. hwpx_automation/office/agent/story.py +207 -0
  74. hwpx_automation/office/authoring/__init__.py +3542 -0
  75. hwpx_automation/office/authoring/advanced_generators.py +154 -0
  76. hwpx_automation/office/authoring/builder/__init__.py +52 -0
  77. hwpx_automation/office/authoring/builder/core.py +996 -0
  78. hwpx_automation/office/authoring/builder/report.py +195 -0
  79. hwpx_automation/office/authoring/design/__init__.py +30 -0
  80. hwpx_automation/office/authoring/design/_support.py +144 -0
  81. hwpx_automation/office/authoring/design/composer.py +282 -0
  82. hwpx_automation/office/authoring/design/harvest.py +305 -0
  83. hwpx_automation/office/authoring/design/plan.py +69 -0
  84. hwpx_automation/office/authoring/design/profile.py +88 -0
  85. hwpx_automation/office/authoring/design/profiles/application_form/fragments/body.xml +1 -0
  86. hwpx_automation/office/authoring/design/profiles/application_form/fragments/heading.xml +1 -0
  87. hwpx_automation/office/authoring/design/profiles/application_form/fragments/info_table.xml +1 -0
  88. hwpx_automation/office/authoring/design/profiles/application_form/fragments/title.xml +1 -0
  89. hwpx_automation/office/authoring/design/profiles/application_form/profile.json +25 -0
  90. hwpx_automation/office/authoring/design/profiles/application_form/template.hwpx +0 -0
  91. hwpx_automation/office/authoring/design/profiles/home_notice/fragments/body.xml +1 -0
  92. hwpx_automation/office/authoring/design/profiles/home_notice/fragments/heading.xml +1 -0
  93. hwpx_automation/office/authoring/design/profiles/home_notice/fragments/title.xml +1 -0
  94. hwpx_automation/office/authoring/design/profiles/home_notice/profile.json +24 -0
  95. hwpx_automation/office/authoring/design/profiles/home_notice/template.hwpx +0 -0
  96. hwpx_automation/office/authoring/design/profiles/official_notice/fragments/body.xml +1 -0
  97. hwpx_automation/office/authoring/design/profiles/official_notice/fragments/heading.xml +1 -0
  98. hwpx_automation/office/authoring/design/profiles/official_notice/fragments/info_table.xml +1 -0
  99. hwpx_automation/office/authoring/design/profiles/official_notice/fragments/title.xml +1 -0
  100. hwpx_automation/office/authoring/design/profiles/official_notice/profile.json +25 -0
  101. hwpx_automation/office/authoring/design/profiles/official_notice/template.hwpx +0 -0
  102. hwpx_automation/office/authoring/design/profiles/report/fragments/body.xml +1 -0
  103. hwpx_automation/office/authoring/design/profiles/report/fragments/heading.xml +1 -0
  104. hwpx_automation/office/authoring/design/profiles/report/fragments/info_table.xml +1 -0
  105. hwpx_automation/office/authoring/design/profiles/report/fragments/title.xml +1 -0
  106. hwpx_automation/office/authoring/design/profiles/report/profile.json +25 -0
  107. hwpx_automation/office/authoring/design/profiles/report/template.hwpx +0 -0
  108. hwpx_automation/office/authoring/design/validator.py +107 -0
  109. hwpx_automation/office/authoring/presets/__init__.py +22 -0
  110. hwpx_automation/office/authoring/presets/proposal.py +538 -0
  111. hwpx_automation/office/authoring/report_parser.py +141 -0
  112. hwpx_automation/office/authoring/style_profile.py +437 -0
  113. hwpx_automation/office/authoring/template_analyzer.py +657 -0
  114. hwpx_automation/office/compliance/__init__.py +38 -0
  115. hwpx_automation/office/compliance/official_lint.py +478 -0
  116. hwpx_automation/office/compliance/pii.py +388 -0
  117. hwpx_automation/office/document_ops/__init__.py +13 -0
  118. hwpx_automation/office/document_ops/comparison.py +62 -0
  119. hwpx_automation/office/document_ops/mail_merge.py +73 -0
  120. hwpx_automation/office/document_ops/redline.py +35 -0
  121. hwpx_automation/office/evalplan/__init__.py +36 -0
  122. hwpx_automation/office/evalplan/runtime.py +2762 -0
  123. hwpx_automation/office/exam/__init__.py +44 -0
  124. hwpx_automation/office/exam/compose.py +282 -0
  125. hwpx_automation/office/exam/ir.py +44 -0
  126. hwpx_automation/office/exam/measure.py +163 -0
  127. hwpx_automation/office/exam/parser.py +150 -0
  128. hwpx_automation/office/exam/profile.py +123 -0
  129. hwpx_automation/office/form_fill/__init__.py +66 -0
  130. hwpx_automation/office/form_fill/classification.py +108 -0
  131. hwpx_automation/office/form_fill/fill_residue.py +242 -0
  132. hwpx_automation/office/form_fill/fit/__init__.py +36 -0
  133. hwpx_automation/office/form_fill/fit/apply.py +24 -0
  134. hwpx_automation/office/form_fill/fit/engine.py +24 -0
  135. hwpx_automation/office/form_fill/fit/measure.py +50 -0
  136. hwpx_automation/office/form_fill/fit/policy.py +28 -0
  137. hwpx_automation/office/form_fill/fit/report.py +28 -0
  138. hwpx_automation/office/form_fill/fit/seal.py +457 -0
  139. hwpx_automation/office/form_fill/fit/wordbox.py +1343 -0
  140. hwpx_automation/office/form_fill/guidance.py +704 -0
  141. hwpx_automation/office/form_fill/quality.py +961 -0
  142. hwpx_automation/office/form_fill/split_run.py +333 -0
  143. hwpx_automation/office/form_fill/template_formfit.py +656 -0
  144. hwpx_automation/office/house_style/__init__.py +196 -0
  145. hwpx_automation/office/house_style/composition.py +68 -0
  146. hwpx_automation/office/house_style/data/bank.json +625 -0
  147. hwpx_automation/office/house_style/data/genres.json +43 -0
  148. hwpx_automation/office/quality/__init__.py +14 -0
  149. hwpx_automation/office/quality/page_guard.py +277 -0
  150. hwpx_automation/office/rendering/__init__.py +145 -0
  151. hwpx_automation/office/rendering/_hancom_open_rate.ps1 +374 -0
  152. hwpx_automation/office/rendering/_refresh_hwpx_mac.applescript +162 -0
  153. hwpx_automation/office/rendering/_render_hwpx.ps1 +72 -0
  154. hwpx_automation/office/rendering/_render_hwpx_mac.applescript +249 -0
  155. hwpx_automation/office/rendering/block_splits.py +76 -0
  156. hwpx_automation/office/rendering/detectors.py +151 -0
  157. hwpx_automation/office/rendering/diff.py +153 -0
  158. hwpx_automation/office/rendering/fixture_corpus.py +215 -0
  159. hwpx_automation/office/rendering/oracle.py +909 -0
  160. hwpx_automation/office/rendering/page_qa.py +245 -0
  161. hwpx_automation/office/rendering/qa_contracts.py +293 -0
  162. hwpx_automation/office/rendering/qa_metrics.py +241 -0
  163. hwpx_automation/office/rendering/worker.py +290 -0
  164. hwpx_automation/office/utilities/__init__.py +12 -0
  165. hwpx_automation/office/utilities/table_compute.py +477 -0
  166. hwpx_automation/ops_services/__init__.py +1 -0
  167. hwpx_automation/ops_services/_border_fill.py +283 -0
  168. hwpx_automation/ops_services/composition.py +55 -0
  169. hwpx_automation/ops_services/content_layout.py +322 -0
  170. hwpx_automation/ops_services/context.py +213 -0
  171. hwpx_automation/ops_services/form_fields.py +557 -0
  172. hwpx_automation/ops_services/media.py +178 -0
  173. hwpx_automation/ops_services/memo_style.py +477 -0
  174. hwpx_automation/ops_services/package_validation.py +166 -0
  175. hwpx_automation/ops_services/planning.py +201 -0
  176. hwpx_automation/ops_services/preview_export.py +585 -0
  177. hwpx_automation/ops_services/read_query.py +601 -0
  178. hwpx_automation/ops_services/save_policy.py +604 -0
  179. hwpx_automation/ops_services/tables.py +539 -0
  180. hwpx_automation/ops_services/transactions.py +616 -0
  181. hwpx_automation/preview_output_models.py +69 -0
  182. hwpx_automation/public-modules.json +206 -0
  183. hwpx_automation/py.typed +1 -0
  184. hwpx_automation/quality.py +351 -0
  185. hwpx_automation/quality_generation.py +725 -0
  186. hwpx_automation/runtime.py +321 -0
  187. hwpx_automation/runtime_services.py +100 -0
  188. hwpx_automation/server.py +259 -0
  189. hwpx_automation/storage.py +747 -0
  190. hwpx_automation/tool_bindings.py +170 -0
  191. hwpx_automation/tool_contract.py +982 -0
  192. hwpx_automation/upstream.py +755 -0
  193. hwpx_automation/utils/__init__.py +2 -0
  194. hwpx_automation/utils/helpers.py +29 -0
  195. hwpx_automation/visual_qa.py +667 -0
  196. hwpx_automation/workflow/__init__.py +55 -0
  197. hwpx_automation/workflow/adapters.py +482 -0
  198. hwpx_automation/workflow/dispatcher.py +213 -0
  199. hwpx_automation/workflow/models.py +243 -0
  200. hwpx_automation/workflow/policy.py +198 -0
  201. hwpx_automation/workflow/render_contracts.py +173 -0
  202. hwpx_automation/workflow/render_metrics.py +196 -0
  203. hwpx_automation/workflow/render_queue.py +482 -0
  204. hwpx_automation/workflow/render_security.py +172 -0
  205. hwpx_automation/workflow/render_transport.py +369 -0
  206. hwpx_automation/workflow/rendering.py +206 -0
  207. hwpx_automation/workflow/service.py +758 -0
  208. hwpx_automation/workflow/state_machine.py +65 -0
  209. hwpx_automation/workflow/store.py +747 -0
  210. hwpx_automation/workspace.py +1694 -0
  211. python_hwpx_automation-6.0.3.dist-info/METADATA +279 -0
  212. python_hwpx_automation-6.0.3.dist-info/RECORD +217 -0
  213. python_hwpx_automation-6.0.3.dist-info/WHEEL +5 -0
  214. python_hwpx_automation-6.0.3.dist-info/entry_points.txt +3 -0
  215. python_hwpx_automation-6.0.3.dist-info/licenses/LICENSE +178 -0
  216. python_hwpx_automation-6.0.3.dist-info/licenses/NOTICE +14 -0
  217. python_hwpx_automation-6.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,154 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Clean-room generators for common Korean office document blocks."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from pathlib import Path
7
+ from typing import Any, Mapping, Sequence
8
+
9
+
10
+ def build_image_grid(
11
+ images: Sequence[str | Mapping[str, Any]],
12
+ *,
13
+ columns: int = 2,
14
+ image_width_mm: float | None = None,
15
+ ) -> dict[str, Any]:
16
+ """Return a plan-v2 image_grid block for a photo sheet."""
17
+
18
+ normalized = _normalize_images(images)
19
+ if not normalized:
20
+ raise ValueError("images must contain at least one item")
21
+ column_count = _positive_int(columns, field="columns")
22
+ block: dict[str, Any] = {
23
+ "type": "image_grid",
24
+ "columns": column_count,
25
+ "images": normalized,
26
+ }
27
+ if image_width_mm is not None:
28
+ block["imageWidthMm"] = float(image_width_mm)
29
+ return block
30
+
31
+
32
+ def build_meeting_nameplates(
33
+ names: Sequence[str],
34
+ *,
35
+ size: str = "150x70",
36
+ columns: int = 2,
37
+ ) -> dict[str, Any]:
38
+ """Return a plan-v2 table block for meeting nameplates."""
39
+
40
+ clean_names = [str(name).strip() for name in names if str(name).strip()]
41
+ if not clean_names:
42
+ raise ValueError("names must contain at least one non-empty value")
43
+ column_count = _positive_int(columns, field="columns")
44
+ rows = _chunk(clean_names, column_count, fill="")
45
+ return {
46
+ "type": "table",
47
+ "header": [f"명패 {index + 1}" for index in range(column_count)],
48
+ "rows": rows,
49
+ "columnWidths": [1 for _ in range(column_count)],
50
+ "metadata": {"generator": "meeting_nameplates", "size": size},
51
+ }
52
+
53
+
54
+ def build_organization_chart(
55
+ hierarchy: Mapping[str, Any] | Sequence[Mapping[str, Any]],
56
+ *,
57
+ max_depth: int = 3,
58
+ ) -> dict[str, Any]:
59
+ """Return a table-based organization chart block for 2-3 level hierarchies."""
60
+
61
+ depth = _positive_int(max_depth, field="max_depth")
62
+ if depth not in {2, 3}:
63
+ raise ValueError("max_depth must be 2 or 3")
64
+ roots = list(hierarchy) if isinstance(hierarchy, Sequence) and not isinstance(hierarchy, Mapping) else [hierarchy]
65
+ rows: list[list[str]] = []
66
+ for root in roots:
67
+ if not isinstance(root, Mapping):
68
+ raise TypeError("organization chart nodes must be mappings")
69
+ rows.extend(_flatten_org_node(root, depth=depth))
70
+ if not rows:
71
+ raise ValueError("hierarchy must contain at least one node")
72
+ return {
73
+ "type": "table",
74
+ "header": [f"{index + 1}단계" for index in range(depth)],
75
+ "rows": rows,
76
+ "columnWidths": [1 for _ in range(depth)],
77
+ "metadata": {"generator": "organization_chart", "maxDepth": depth},
78
+ }
79
+
80
+
81
+ def _normalize_images(images: Sequence[str | Mapping[str, Any]]) -> list[dict[str, str]]:
82
+ normalized: list[dict[str, str]] = []
83
+ for item in images:
84
+ if isinstance(item, Mapping):
85
+ path = str(item.get("path") or "").strip()
86
+ caption = str(item.get("caption") or "").strip()
87
+ else:
88
+ path = str(item).strip()
89
+ caption = ""
90
+ if not path:
91
+ raise ValueError("each image must define a non-empty path")
92
+ normalized.append(
93
+ {
94
+ "path": path,
95
+ "caption": caption or Path(path).stem,
96
+ }
97
+ )
98
+ return normalized
99
+
100
+
101
+ def _positive_int(value: int | str, *, field: str) -> int:
102
+ try:
103
+ parsed = int(value)
104
+ except (TypeError, ValueError) as exc:
105
+ raise ValueError(f"{field} must be a positive integer") from exc
106
+ if parsed < 1:
107
+ raise ValueError(f"{field} must be a positive integer")
108
+ return parsed
109
+
110
+
111
+ def _chunk(values: Sequence[str], columns: int, *, fill: str) -> list[list[str]]:
112
+ rows: list[list[str]] = []
113
+ for offset in range(0, len(values), columns):
114
+ row = list(values[offset : offset + columns])
115
+ row.extend(fill for _ in range(columns - len(row)))
116
+ rows.append(row)
117
+ return rows
118
+
119
+
120
+ def _node_name(node: Mapping[str, Any]) -> str:
121
+ value = node.get("name", node.get("title", node.get("label", "")))
122
+ name = str(value or "").strip()
123
+ if not name:
124
+ raise ValueError("organization chart node must define name, title, or label")
125
+ return name
126
+
127
+
128
+ def _flatten_org_node(
129
+ node: Mapping[str, Any],
130
+ *,
131
+ depth: int,
132
+ prefix: Sequence[str] = (),
133
+ ) -> list[list[str]]:
134
+ current = (*prefix, _node_name(node))
135
+ children = node.get("children") or ()
136
+ if len(current) >= depth or not children:
137
+ row = list(current[:depth])
138
+ row.extend("" for _ in range(depth - len(row)))
139
+ return [row]
140
+ if not isinstance(children, Sequence) or isinstance(children, (str, bytes, bytearray)):
141
+ raise TypeError("organization chart children must be a sequence")
142
+ rows: list[list[str]] = []
143
+ for child in children:
144
+ if not isinstance(child, Mapping):
145
+ raise TypeError("organization chart child nodes must be mappings")
146
+ rows.extend(_flatten_org_node(child, depth=depth, prefix=current))
147
+ return rows
148
+
149
+
150
+ __all__ = [
151
+ "build_image_grid",
152
+ "build_meeting_nameplates",
153
+ "build_organization_chart",
154
+ ]
@@ -0,0 +1,52 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Public builder nodes for declarative HWPX document generation."""
3
+
4
+ from .core import (
5
+ Bullet,
6
+ Document,
7
+ Footer,
8
+ Header,
9
+ Heading,
10
+ Image,
11
+ Margins,
12
+ Metadata,
13
+ NumberedList,
14
+ PageBreak,
15
+ PageNumber,
16
+ PageSize,
17
+ Paragraph,
18
+ Run,
19
+ Section,
20
+ Table,
21
+ approval_box,
22
+ )
23
+ from .report import (
24
+ FIDELITY_CONTRACT,
25
+ BuilderSaveReport,
26
+ BuilderVerifyReport,
27
+ ReopenReport,
28
+ )
29
+
30
+ __all__ = [
31
+ "FIDELITY_CONTRACT",
32
+ "BuilderSaveReport",
33
+ "BuilderVerifyReport",
34
+ "Bullet",
35
+ "Document",
36
+ "Footer",
37
+ "Header",
38
+ "Heading",
39
+ "Image",
40
+ "Margins",
41
+ "Metadata",
42
+ "NumberedList",
43
+ "PageBreak",
44
+ "PageNumber",
45
+ "PageSize",
46
+ "Paragraph",
47
+ "ReopenReport",
48
+ "Run",
49
+ "Section",
50
+ "Table",
51
+ "approval_box",
52
+ ]