@event4u/agent-config 3.0.0 → 3.1.0

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 (207) hide show
  1. package/.agent-src/commands/install-via-agent.md +129 -0
  2. package/.agent-src/commands/video/from-script.md +1 -1
  3. package/.agent-src/commands/video.md +1 -1
  4. package/.agent-src/contexts/execution/cheap-question-mechanics.md +81 -0
  5. package/.agent-src/rules/caveman-speak.md +2 -2
  6. package/.agent-src/rules/context-hygiene.md +36 -0
  7. package/.agent-src/rules/engineering-safety-floor.md +102 -0
  8. package/.agent-src/rules/finance-safety-floor.md +114 -0
  9. package/.agent-src/rules/git-history-discipline.md +1 -1
  10. package/.agent-src/rules/no-cheap-questions.md +34 -32
  11. package/.agent-src/rules/provider-lifecycle-discipline.md +4 -4
  12. package/.agent-src/rules/strategy-safety-floor.md +114 -0
  13. package/.agent-src/skills/agents-md-thin-root/SKILL.md +15 -9
  14. package/.agent-src/skills/async-python-patterns/SKILL.md +1 -1
  15. package/.agent-src/skills/project-analysis-node-express/SKILL.md +1 -1
  16. package/.agent-src/skills/readme-reviewer/SKILL.md +52 -3
  17. package/.agent-src/skills/readme-writing/SKILL.md +52 -4
  18. package/.agent-src/skills/readme-writing-package/SKILL.md +48 -5
  19. package/.agent-src/skills/systematic-debugging/SKILL.md +41 -0
  20. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  21. package/.agent-src/templates/hooks/pre-commit-frontmatter +66 -0
  22. package/.agent-src/templates/hooks/pre-commit-roadmap-progress +78 -39
  23. package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +4 -1
  24. package/.agent-src/templates/scripts/work_engine/orchestration.py +25 -11
  25. package/.claude-plugin/marketplace.json +2 -1
  26. package/AGENTS.md +10 -8
  27. package/CHANGELOG.md +223 -125
  28. package/README.md +165 -553
  29. package/config/agent-settings.template.yml +0 -7
  30. package/config/discovery/packs.yml +20 -0
  31. package/config/discovery/unassigned-artefacts.yml +2 -0
  32. package/config/gitignore-block.txt +19 -3
  33. package/dist/cli/commands/uiServe.js +13 -4
  34. package/dist/cli/commands/uiServe.js.map +1 -1
  35. package/dist/cli/registry.js +2 -0
  36. package/dist/cli/registry.js.map +1 -1
  37. package/dist/discovery/deprecation-report.md +7 -0
  38. package/dist/discovery/discovery-manifest.json +2107 -1409
  39. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  40. package/dist/discovery/discovery-manifest.summary.md +9 -9
  41. package/dist/discovery/orphan-report.md +10 -0
  42. package/dist/discovery/packs.json +1002 -0
  43. package/dist/discovery/trust-report.md +26 -0
  44. package/dist/discovery/workspaces.json +705 -0
  45. package/dist/mcp/registry-manifest.json +4 -4
  46. package/dist/router.json +1623 -0
  47. package/dist/server/app.js +11 -3
  48. package/dist/server/app.js.map +1 -1
  49. package/dist/server/io/atomicMultiWrite.js +3 -1
  50. package/dist/server/io/atomicMultiWrite.js.map +1 -1
  51. package/dist/server/io/yamlIO.js +22 -0
  52. package/dist/server/io/yamlIO.js.map +1 -1
  53. package/dist/server/routes/ping.js +8 -0
  54. package/dist/server/routes/ping.js.map +1 -1
  55. package/dist/server/routes/schema.js +2 -2
  56. package/dist/server/routes/schema.js.map +1 -1
  57. package/dist/server/routes/settings.js +104 -23
  58. package/dist/server/routes/settings.js.map +1 -1
  59. package/dist/server/routes/userMd.js +37 -27
  60. package/dist/server/routes/userMd.js.map +1 -1
  61. package/dist/server/routes/wizard.js +256 -20
  62. package/dist/server/routes/wizard.js.map +1 -1
  63. package/dist/server/schemas/settings.js +0 -1
  64. package/dist/server/schemas/settings.js.map +1 -1
  65. package/dist/server/token.js +10 -3
  66. package/dist/server/token.js.map +1 -1
  67. package/dist/server/writeRoot.js +28 -11
  68. package/dist/server/writeRoot.js.map +1 -1
  69. package/dist/server/writeRoot.test.js +22 -4
  70. package/dist/server/writeRoot.test.js.map +1 -1
  71. package/dist/shared/userMd/formAdapter.js +29 -51
  72. package/dist/shared/userMd/formAdapter.js.map +1 -1
  73. package/dist/shared/userMd/schema.js +32 -104
  74. package/dist/shared/userMd/schema.js.map +1 -1
  75. package/dist/shared/userMd/utils.js +64 -50
  76. package/dist/shared/userMd/utils.js.map +1 -1
  77. package/dist/ui/assets/index-D-DY1ywI.js +35 -0
  78. package/dist/ui/assets/index-D-DY1ywI.js.map +1 -0
  79. package/dist/ui/index.html +1 -1
  80. package/docs/adrs/router/0001-three-tier-routing.md +5 -5
  81. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +1 -1
  82. package/docs/architecture.md +3 -3
  83. package/docs/archive/CHANGELOG-pre-3.1.0.md +167 -0
  84. package/docs/catalog.md +30 -26
  85. package/docs/contracts/CHANGELOG-conventions.md +1 -1
  86. package/docs/contracts/agent-user-schema.md +6 -9
  87. package/docs/contracts/consumer-bridge.md +79 -0
  88. package/docs/contracts/discovery-manifest.md +209 -0
  89. package/docs/contracts/discovery-manifest.schema.json +77 -4
  90. package/docs/contracts/explain-trace.schema.json +1 -1
  91. package/docs/contracts/file-ownership-matrix.json +197 -13
  92. package/docs/contracts/frontmatter-contract.md +140 -0
  93. package/docs/contracts/gui-wizard.md +223 -0
  94. package/docs/contracts/installer-agent-mode.md +137 -0
  95. package/docs/contracts/kernel-membership.md +1 -1
  96. package/docs/contracts/mcp-tool-inventory.md +9 -9
  97. package/docs/contracts/namespace.md +6 -6
  98. package/docs/contracts/provider-lifecycle.md +5 -5
  99. package/docs/contracts/rule-router.md +4 -4
  100. package/docs/contracts/settings-api.md +53 -6
  101. package/docs/contracts/smoke-contracts.md +3 -3
  102. package/docs/contracts/trust-and-safety.md +144 -0
  103. package/docs/customization.md +2 -2
  104. package/docs/decisions/ADR-007-agent-discovery-scopes.md +12 -0
  105. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +24 -0
  106. package/docs/decisions/ADR-015-discovery-manifest-contract.md +146 -0
  107. package/docs/decisions/ADR-016-installer-architecture.md +189 -0
  108. package/docs/decisions/ADR-017-monorepo-physical-layout.md +261 -0
  109. package/docs/decisions/ADR-018-trust-and-safety-layer.md +159 -0
  110. package/docs/decisions/ADR-019-router-json-dist-location.md +124 -0
  111. package/docs/decisions/ADR-020-global-only-consumer-scope.md +123 -0
  112. package/docs/decisions/ADR-021-deployment-shape.md +153 -0
  113. package/docs/decisions/INDEX.md +7 -0
  114. package/docs/deploy/connector-setup.md +129 -0
  115. package/docs/deploy/env-vars.md +70 -0
  116. package/docs/deploy/policy-cookbook.md +130 -0
  117. package/docs/deploy/quickstart.md +112 -0
  118. package/docs/distribution/public-install-smoke.md +68 -0
  119. package/docs/distribution/registries.md +55 -0
  120. package/docs/distribution/telemetry-privacy.md +128 -0
  121. package/docs/distribution/telemetry-schema.md +174 -0
  122. package/docs/featured-skills.md +95 -0
  123. package/docs/getting-started-by-role.md +19 -1
  124. package/docs/getting-started.md +2 -2
  125. package/docs/guidelines/agent-infra/installed-tools-manifest.md +11 -8
  126. package/docs/guidelines/docs/readme-size-and-splitting.md +53 -1
  127. package/docs/installation.md +27 -14
  128. package/docs/maintainers/dev-mode.md +105 -0
  129. package/docs/setup/per-ide/claude-desktop.md +3 -2
  130. package/docs/wizard.md +39 -4
  131. package/package.json +18 -1
  132. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  133. package/scripts/_cli/cmd_doctor.py +150 -2
  134. package/scripts/_cli/cmd_explain.py +2 -1
  135. package/scripts/_cli/cmd_migrate_to_global.py +415 -0
  136. package/scripts/_cli/cmd_settings_migrate.py +146 -0
  137. package/scripts/_cli/explain_last/route.py +2 -1
  138. package/scripts/_dispatch.bash +36 -3
  139. package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  140. package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  141. package/scripts/_lib/agent_settings.py +4 -1
  142. package/scripts/_lib/agent_src.py +157 -0
  143. package/scripts/agent-config +17 -6
  144. package/scripts/audit_skill_descriptions.py +18 -6
  145. package/scripts/build_discovery_manifest.py +373 -17
  146. package/scripts/check_artefact_checksums.py +104 -0
  147. package/scripts/check_cluster_patterns.py +20 -4
  148. package/scripts/check_command_count_messaging.py +33 -14
  149. package/scripts/check_council_references.py +43 -4
  150. package/scripts/check_overlay_cascade_subdirs.py +7 -3
  151. package/scripts/check_references.py +5 -2
  152. package/scripts/check_reply_consistency.py +32 -9
  153. package/scripts/check_template_pin_drift.py +24 -7
  154. package/scripts/check_token_optimizer_freshness.py +18 -3
  155. package/scripts/compile_router.py +34 -2
  156. package/scripts/compress.py +162 -44
  157. package/scripts/config/presets.py +19 -1
  158. package/scripts/config/profiles.py +16 -1
  159. package/scripts/discovery_stats.py +70 -0
  160. package/scripts/expected_perms.json +47 -0
  161. package/scripts/generate_index.py +78 -46
  162. package/scripts/generate_ownership_matrix.py +98 -43
  163. package/scripts/generate_pack_manifests.py +183 -0
  164. package/scripts/install +18 -1
  165. package/scripts/install.py +934 -59
  166. package/scripts/install.sh +27 -9
  167. package/scripts/lint_agents_layout.py +93 -13
  168. package/scripts/lint_agents_md.py +1 -1
  169. package/scripts/lint_archived_skills.py +32 -16
  170. package/scripts/lint_bench_corpus.py +14 -2
  171. package/scripts/lint_command_tiers.py +15 -2
  172. package/scripts/lint_featured_skills.py +139 -0
  173. package/scripts/lint_framework_leakage.py +33 -6
  174. package/scripts/lint_global_paths.py +147 -0
  175. package/scripts/lint_orchestration_dsl.py +6 -3
  176. package/scripts/lint_pack_boundaries.py +147 -0
  177. package/scripts/lint_pack_first_win.py +103 -0
  178. package/scripts/lint_readme_jargon.py +131 -0
  179. package/scripts/lint_readme_size.py +33 -0
  180. package/scripts/lint_rule_interactions.py +23 -5
  181. package/scripts/lint_rule_tiers.py +12 -3
  182. package/scripts/lint_trust_coherence.py +212 -0
  183. package/scripts/measure_rule_budget.py +22 -4
  184. package/scripts/move_artefact.py +143 -0
  185. package/scripts/new_skill.py +148 -0
  186. package/scripts/plan_physical_move.py +353 -0
  187. package/scripts/refine_ticket_detect.py +30 -7
  188. package/scripts/schemas/command.schema.json +4 -0
  189. package/scripts/skill_linter.py +248 -118
  190. package/scripts/skill_trigger_eval.py +28 -8
  191. package/scripts/smoke/kernel.sh +1 -1
  192. package/scripts/smoke/router.sh +24 -5
  193. package/scripts/smoke/skills.sh +15 -7
  194. package/scripts/smoke_quickstart.py +11 -2
  195. package/scripts/snapshot_agent_outputs.py +144 -0
  196. package/scripts/update_counts.py +45 -17
  197. package/scripts/validate_decision_engine.py +9 -1
  198. package/scripts/validate_discovery_manifest.py +94 -0
  199. package/scripts/validate_frontmatter.py +39 -20
  200. package/scripts/verify_physical_move.py +185 -0
  201. package/templates/agent-user.md +0 -1
  202. package/templates/agent-user.yml +21 -0
  203. package/templates/minimal/agents-overrides-readme.md +46 -0
  204. package/templates/minimal/overrides-gitkeep +2 -0
  205. package/dist/ui/assets/index-BTRcKDlB.js +0 -39
  206. package/dist/ui/assets/index-BTRcKDlB.js.map +0 -1
  207. package/templates/minimal/agents-gitkeep +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"writeRoot.test.js","sourceRoot":"","sources":["../../src/server/writeRoot.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"writeRoot.test.js","sourceRoot":"","sources":["../../src/server/writeRoot.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACZ,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;QAE7F,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjD,8DAA8D;QAC9D,0DAA0D;QAC1D,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,gEAAgE;QAChE,8DAA8D;QAC9D,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAEpF,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,gEAAgE;QAChE,+DAA+D;QAC/D,gCAAgC;QAChC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAChF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpC,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,gEAAgE;QAChE,8DAA8D;QAC9D,4DAA4D;QAC5D,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACtC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;QAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEhD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtC,6DAA6D;QAC7D,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,YAAY,CAAC,CAAC;QAEvD,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,28 +1,26 @@
1
1
  /**
2
- * Form adapter for `.agent-user.md`.
2
+ * Form adapter for `.agent-user.yml`.
3
3
  *
4
- * Bridges the raw markdown body (signal in WizardPage / UserMdPanel) and
5
- * the structured UserMdForm value. Lives under `src/shared/` so both the
6
- * server and the UI can round-trip identically; ESLint enforces no-Node
7
- * imports (`./schema.ts` and `./utils.ts` already comply).
4
+ * Bridges the parsed-YAML object (signal in WizardPage / UserMdPanel)
5
+ * and the structured UserMdForm value. Lives under `src/shared/` so
6
+ * server and UI round-trip identically; ESLint forbids Node imports in
7
+ * this tree.
8
8
  *
9
- * Default frontmatter mirrors `templates/agent-user.md` so a freshly
10
- * loaded body without frontmatter still produces a renderable form (every
11
- * field has *something*), while keeping `name`, `role[0]`, and
12
- * `voice_sample` empty the wizard surfaces those as 422 issues when
13
- * the user tries to finish with them blank.
9
+ * Defaults mirror `templates/agent-user.yml` so a fresh form is fully
10
+ * renderable (every field has *something*), while keeping `name`,
11
+ * `role[0]`, and `voice_sample` empty — the wizard surfaces those as
12
+ * 422 issues when the user tries to finish with them blank.
14
13
  *
15
- * Round-trip discipline: `formToBody` always emits block-style YAML via
16
- * `composeUserMd`; `bodyToForm` runs `parseUserMd` and merges field-by-
17
- * field over `defaultFrontmatter()` so a malformed or partial frontmatter
18
- * never crashes the form.
14
+ * Round-trip discipline: the form value **is** the identity object
15
+ * (post-migration to pure YAML). `mergeIdentity` is the soft merge used
16
+ * when reading a partial or legacy file; validation runs server-side on
17
+ * save via `userIdentitySchema`.
19
18
  */
20
- import { parseUserMd, composeUserMd } from './utils.js';
21
19
  /**
22
- * Defaults for a fresh form. Matches `templates/agent-user.md`:
20
+ * Defaults for a fresh form. Matches `templates/agent-user.yml`:
23
21
  * `last_updated` is 1970-01-01 so any user-driven edit visibly bumps it.
24
22
  */
25
- export function defaultFrontmatter() {
23
+ export function defaultIdentity() {
26
24
  return {
27
25
  version: 1,
28
26
  identity: { name: '' },
@@ -51,24 +49,24 @@ function pickRoles(value) {
51
49
  const filtered = value.filter((v) => typeof v === 'string');
52
50
  return filtered.length === 0 ? [''] : filtered;
53
51
  }
52
+ function pickNotes(value) {
53
+ if (typeof value !== 'string')
54
+ return undefined;
55
+ return value === '' ? undefined : value;
56
+ }
54
57
  /**
55
- * Merge parsed frontmatter over defaults field-by-field. Malformed or
58
+ * Merge a parsed YAML object over defaults field-by-field. Malformed or
56
59
  * missing entries fall through to the default so the form always has a
57
60
  * complete shape to render — validation runs server-side on save.
58
61
  */
59
- export function mergeFrontmatter(parsed) {
60
- const def = defaultFrontmatter();
62
+ export function mergeIdentity(parsed) {
63
+ const def = defaultIdentity();
61
64
  const identityRaw = isObject(parsed.identity) ? parsed.identity : {};
62
65
  const styleRaw = isObject(parsed.style) ? parsed.style : {};
63
- const identity = {
64
- name: pickString(identityRaw.name, def.identity.name),
65
- };
66
- const nickname = identityRaw.nickname;
67
- if (typeof nickname === 'string' && nickname !== '')
68
- identity.nickname = nickname;
69
- return {
66
+ const notes = pickNotes(parsed.notes);
67
+ const out = {
70
68
  version: 1,
71
- identity,
69
+ identity: { name: pickString(identityRaw.name, def.identity.name) },
72
70
  language: pickString(parsed.language, def.language),
73
71
  role: pickRoles(parsed.role),
74
72
  style: {
@@ -78,28 +76,8 @@ export function mergeFrontmatter(parsed) {
78
76
  voice_sample: pickString(parsed.voice_sample, def.voice_sample),
79
77
  last_updated: pickString(parsed.last_updated, def.last_updated),
80
78
  };
81
- }
82
- /**
83
- * Parse a raw `.agent-user.md` body into the structured form value. Empty
84
- * or frontmatter-less bodies produce defaults; the markdown content is
85
- * preserved verbatim so a manually edited file round-trips cleanly when
86
- * the user clicks Save without touching the form.
87
- */
88
- export function bodyToForm(body) {
89
- const parsed = parseUserMd(body);
90
- return {
91
- frontmatter: mergeFrontmatter(parsed.data),
92
- content: parsed.content,
93
- };
94
- }
95
- /**
96
- * Compose a structured form value back into a markdown body. The result
97
- * always carries block-style frontmatter per the contract.
98
- */
99
- export function formToBody(value) {
100
- return composeUserMd({
101
- data: value.frontmatter,
102
- content: value.content,
103
- });
79
+ if (notes !== undefined)
80
+ out.notes = notes;
81
+ return out;
104
82
  }
105
83
  //# sourceMappingURL=formAdapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formAdapter.js","sourceRoot":"","sources":["../../../src/shared/userMd/formAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formAdapter.js","sourceRoot":"","sources":["../../../src/shared/userMd/formAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,118 +1,46 @@
1
1
  /**
2
- * Zod schema for `.agent-user.md` body.
2
+ * Schema for `.agent-user.yml` (the user-identity file).
3
3
  *
4
- * Council CRITICAL (2026-05-18): a bare `z.string().max(8000)` is a length
5
- * gate, not validation. It accepts malformed frontmatter the agent's identity
6
- * parser then refuses to load. The wizard would happily write a file the
7
- * agent cannot consume.
4
+ * Pure YAML no fenced-frontmatter wrapper. The wizard, the server
5
+ * routes, and the on-disk file all carry the same shape: a single
6
+ * object that round-trips through `js-yaml`. See
7
+ * `docs/contracts/agent-user-schema.md` for the canonical reference.
8
8
  *
9
- * Resolution: validate via the shared `parseUserMd` helper — same
10
- * fenced-frontmatter + `js-yaml` parser the agent uses at load time
11
- * per ADR-010. The schema runs the parser inside `.superRefine()` and
12
- * then validates the parsed frontmatter against the v1 contract
13
- * (`docs/contracts/agent-user-schema.md`). Errors surface as Zod
14
- * issues with the underlying message; the route returns HTTP 422.
15
- *
16
- * Strictness (A4 · 2026-05-19): the schema enforces the locked v1
17
- * frontmatter — `version`, `identity.name`, `language`, `role[≥1]`,
18
- * `style.formality`, `style.pace`, `voice_sample`, `last_updated`. Plain
19
- * markdown without frontmatter is rejected; the wizard cannot finish on a
20
- * partial body.
21
- *
22
- * Hard length cap kept at 8 000 chars (form input cap, not security).
9
+ * Lives under `src/shared/` so the Fastify server (request validation,
10
+ * wizard finish) and the Vite-bundled UI (form validation) consume
11
+ * the same Zod schema. ESLint forbids Node-only imports in this tree.
23
12
  */
24
13
  import { z } from 'zod';
25
- import { parseUserMd } from './utils.js';
26
- const MAX_BODY_CHARS = 8_000;
27
- /**
28
- * Seeded role enum mirrors `SEED_PROFILE_IDS` in
29
- * `scripts/config/profiles.py`. Per contract, free-form additions are
30
- * accepted (forward-compat); closed validation lives in the wizard, not
31
- * the loader. The schema therefore validates `role` as `string().min(1)`
32
- * the constant is exported for the wizard UI to use as the seeded
33
- * combobox options.
34
- */
35
- export const SEED_ROLE_IDS = [
36
- 'founder',
37
- 'developer',
38
- 'content_creator',
39
- 'agency',
40
- 'finance',
41
- 'ops',
42
- ];
43
- /** `YYYY-MM-DD` — agent bumps `last_updated` on every accept. */
44
- const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/;
45
- /** BCP-47-ish: lowercase primary tag, optional region. "de", "en", "en-US". */
46
- const LANGUAGE_TAG = /^[a-z]{2,3}(-[A-Za-z0-9]{2,8})?$/;
47
- /**
48
- * Strict v1 frontmatter shape. Exported for the wizard UI form and for
49
- * direct unit tests; the route-level schema (`userMdSchema` below) parses
50
- * a body string and feeds the result through this.
51
- */
52
- export const frontmatterSchema = z.object({
53
- version: z.literal(1, { errorMap: () => ({ message: 'version must be 1' }) }),
14
+ /** Hard cap on the optional `notes` block. Keeps the file loadable into every reply. */
15
+ export const USER_IDENTITY_NOTES_MAX_CHARS = 8_000;
16
+ /** Hard cap on the `voice_sample` block — one to three sentences in practice. */
17
+ export const USER_IDENTITY_VOICE_SAMPLE_MAX_CHARS = 2_000;
18
+ /** ISO-8601 date (`YYYY-MM-DD`) `last_updated` is a date, not a timestamp. */
19
+ const isoDate = z
20
+ .string()
21
+ .regex(/^\d{4}-\d{2}-\d{2}$/, 'last_updated must be ISO-8601 date (YYYY-MM-DD)');
22
+ export const userIdentitySchema = z.object({
23
+ version: z.literal(1),
54
24
  identity: z.object({
55
- name: z.string().min(1, 'identity.name is required'),
56
- nickname: z.string().min(1).optional(),
25
+ name: z.string().trim().min(1, 'identity.name is required'),
57
26
  }),
58
- language: z
59
- .string()
60
- .regex(LANGUAGE_TAG, 'language must be a BCP-47 tag (e.g. "de", "en", "en-US")'),
27
+ language: z.string().trim().min(2, 'language must be a non-empty code'),
61
28
  role: z
62
- .array(z.string().min(1, 'role entries must be non-empty'))
29
+ .array(z.string().trim().min(1, 'role entries must be non-empty'))
63
30
  .min(1, 'role must list at least one entry'),
64
31
  style: z.object({
65
- formality: z.enum(['informal', 'formal'], {
66
- errorMap: () => ({ message: 'style.formality must be "informal" or "formal"' }),
67
- }),
68
- pace: z.enum(['pragmatic', 'thorough', 'rapid'], {
69
- errorMap: () => ({ message: 'style.pace must be "pragmatic", "thorough", or "rapid"' }),
70
- }),
32
+ formality: z.enum(['informal', 'formal']),
33
+ pace: z.enum(['rapid', 'pragmatic', 'thorough']),
71
34
  }),
72
- voice_sample: z.string().min(1, 'voice_sample is required'),
73
- last_updated: z.string().regex(ISO_DATE, 'last_updated must be YYYY-MM-DD'),
74
- });
75
- function tryParse(body) {
76
- try {
77
- const result = parseUserMd(body);
78
- // `parseUserMd` returns an empty object when no frontmatter
79
- // fence is present; the contract requires v1 frontmatter, so
80
- // empty objects fall through to `frontmatterSchema` and fail
81
- // there with the missing-required-field issues the wizard
82
- // wants to surface.
83
- return { ok: true, data: result.data };
84
- }
85
- catch (err) {
86
- const message = err instanceof Error ? err.message : 'frontmatter parse failed';
87
- return { ok: false, message };
88
- }
89
- }
90
- export const userMdSchema = z.object({
91
- body: z
35
+ voice_sample: z
36
+ .string()
37
+ .trim()
38
+ .min(1, 'voice_sample is required')
39
+ .max(USER_IDENTITY_VOICE_SAMPLE_MAX_CHARS, 'voice_sample exceeds hard cap'),
40
+ last_updated: isoDate,
41
+ notes: z
92
42
  .string()
93
- .max(MAX_BODY_CHARS, `body must be ≤ ${MAX_BODY_CHARS} chars`)
94
- .superRefine((value, ctx) => {
95
- const parsed = tryParse(value);
96
- if (!parsed.ok) {
97
- ctx.addIssue({
98
- code: z.ZodIssueCode.custom,
99
- message: `.agent-user.md frontmatter invalid: ${parsed.message}`,
100
- path: ['body'],
101
- });
102
- return;
103
- }
104
- const shape = frontmatterSchema.safeParse(parsed.data);
105
- if (shape.success)
106
- return;
107
- for (const issue of shape.error.issues) {
108
- ctx.addIssue({
109
- code: z.ZodIssueCode.custom,
110
- message: issue.message,
111
- path: ['body', ...issue.path],
112
- });
113
- }
114
- })
115
- .describe('Markdown body with v1 frontmatter per agent-user-schema contract.'),
43
+ .max(USER_IDENTITY_NOTES_MAX_CHARS, 'notes exceeds hard cap')
44
+ .optional(),
116
45
  });
117
- export const USER_MD_MAX_CHARS = MAX_BODY_CHARS;
118
46
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/shared/userMd/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/shared/userMd/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,wFAAwF;AACxF,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAEnD,iFAAiF;AACjF,MAAM,CAAC,MAAM,oCAAoC,GAAG,KAAK,CAAC;AAE1D,gFAAgF;AAChF,MAAM,OAAO,GAAG,CAAC;KACZ,MAAM,EAAE;KACR,KAAK,CAAC,qBAAqB,EAAE,iDAAiD,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;KAC9D,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,mCAAmC,CAAC;IACvE,IAAI,EAAE,CAAC;SACF,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAC;SACjE,GAAG,CAAC,CAAC,EAAE,mCAAmC,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACZ,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;KACnD,CAAC;IACF,YAAY,EAAE,CAAC;SACV,MAAM,EAAE;SACR,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;SAClC,GAAG,CAAC,oCAAoC,EAAE,+BAA+B,CAAC;IAC/E,YAAY,EAAE,OAAO;IACrB,KAAK,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,6BAA6B,EAAE,wBAAwB,CAAC;SAC5D,QAAQ,EAAE;CAClB,CAAC,CAAC"}
@@ -1,74 +1,88 @@
1
1
  /**
2
- * Pure parse / compose helpers for `.agent-user.md` bodies.
2
+ * Pure parse / compose helpers for `.agent-user.yml`.
3
3
  *
4
4
  * Shared between the Fastify server (route validation, wizard finish) and
5
- * the Vite-bundled UI (round-trip between structured form and markdown).
6
- * Per the council verdict (2026-05-19), this module lives under
7
- * `src/shared/` and MUST stay free of Node-only APIs (`fs`, `path`,
8
- * `crypto`, `process`, …) — ESLint enforces it.
5
+ * the Vite-bundled UI (round-trip between structured form and YAML text).
6
+ * Lives under `src/shared/` and MUST stay free of Node-only APIs
7
+ * (`fs`, `path`, `crypto`, `process`, …) ESLint enforces it.
9
8
  *
10
- * Parser choice: a small fenced-frontmatter splitter plus `js-yaml`.
11
- * `js-yaml` is pure JS, has no `Buffer` / `process` dependency, and
12
- * bundles cleanly into the Vite UI output. (The previous `gray-matter`
13
- * implementation crashed in the browser with `ReferenceError: Buffer
14
- * is not defined`, which silently broke the wizard's userMd step.)
9
+ * Parser choice: `js-yaml`. Pure JS, no `Buffer` / `process` dependency,
10
+ * bundles cleanly into the Vite UI output. (An earlier `gray-matter`
11
+ * attempt crashed in the browser with `ReferenceError: Buffer is not
12
+ * defined`, which silently broke the wizard's userMd step.)
15
13
  *
16
14
  * Compose choice: `yaml.dump` with `flowLevel: -1` emits **block style**
17
15
  * at every depth. Block-style is required by the schema contract
18
- * (`docs/contracts/agent-user-schema.md`): `identity.role` and other
19
- * list-valued fields produce clean, line-oriented git diffs that way;
20
- * flow style (`role: [a, b]`) is allowed by the parser but rejected
21
- * by the contract.
16
+ * (`docs/contracts/agent-user-schema.md`): `role` and other list-valued
17
+ * fields produce clean, line-oriented git diffs that way; flow style
18
+ * (`role: [a, b]`) is allowed by the parser but rejected by the contract.
19
+ *
20
+ * Legacy bridge: `parseLegacyUserMd` accepts the old fenced-frontmatter
21
+ * `.agent-user.md` body and returns the same shape as `parseUserIdentity`
22
+ * so the server can read pre-migration files during the wizard finish.
23
+ * Drop once no consumer ships the legacy file.
22
24
  */
23
25
  import yaml from 'js-yaml';
26
+ /** Frontmatter fence used by the legacy `.agent-user.md` format. */
27
+ const FRONTMATTER_FENCE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
24
28
  /**
25
- * Frontmatter fence: leading `---` on its own line, YAML body, trailing
26
- * `---` on its own line. Matches `gray-matter`'s default delimiter
27
- * behaviour so existing files round-trip identically.
29
+ * Parse a `.agent-user.yml` body into a plain object. Throws on
30
+ * malformed YAML callers that need a soft failure (HTTP 422 in
31
+ * routes, form-level error in the UI) should pre-validate via
32
+ * `userIdentitySchema` in `./schema.ts`. An empty / whitespace-only
33
+ * body parses to `{}` so callers can layer defaults on top.
28
34
  */
29
- const FRONTMATTER_FENCE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
35
+ export function parseUserIdentity(body) {
36
+ const trimmed = body.trim();
37
+ if (trimmed === '')
38
+ return {};
39
+ const loaded = yaml.load(body);
40
+ if (loaded === null || loaded === undefined)
41
+ return {};
42
+ if (typeof loaded !== 'object' || Array.isArray(loaded)) {
43
+ throw new Error('.agent-user.yml must parse to an object');
44
+ }
45
+ return loaded;
46
+ }
30
47
  /**
31
- * Parse an `.agent-user.md` body into its frontmatter object and the
32
- * markdown content that follows.
48
+ * Compose a plain object back into a `.agent-user.yml` body, emitting
49
+ * YAML in block style (no flow `[a, b]`, no inline maps) so list-valued
50
+ * fields like `role` produce one entry per line and diff cleanly in git.
33
51
  *
34
- * Throws on malformed YAML callers that need a soft failure
35
- * (HTTP 422 in routes, form-level error in the UI) should pre-validate
36
- * via the Zod schema in `./schema.ts`. A body without a frontmatter
37
- * fence parses to `{ data: {}, content: body }`.
52
+ * `yaml.dump` always terminates with `\n`; the result is returned as-is
53
+ * so atomicWrite preserves the trailing newline (POSIX-friendly).
38
54
  */
39
- export function parseUserMd(body) {
55
+ export function composeUserIdentity(data) {
56
+ return yaml.dump(data, {
57
+ flowLevel: -1,
58
+ lineWidth: -1,
59
+ noRefs: true,
60
+ });
61
+ }
62
+ /**
63
+ * Parse a legacy `.agent-user.md` body (fenced YAML frontmatter +
64
+ * optional markdown body). The frontmatter becomes the identity object;
65
+ * any non-empty markdown body is captured under `notes` so prose is
66
+ * preserved across the migration. Returns `{}` when neither fence nor
67
+ * usable body is present.
68
+ *
69
+ * Drop once `.agent-user.md` files are no longer in circulation.
70
+ */
71
+ export function parseLegacyUserMd(body) {
40
72
  const match = FRONTMATTER_FENCE.exec(body);
41
73
  if (match === null) {
42
- return { data: {}, content: body };
74
+ const trimmed = body.trim();
75
+ return trimmed === '' ? {} : { notes: trimmed };
43
76
  }
44
77
  const yamlText = match[1] ?? '';
45
- const content = body.slice(match[0].length);
78
+ const tail = body.slice(match[0].length).trim();
46
79
  const loaded = yaml.load(yamlText);
47
80
  const data = loaded !== null && typeof loaded === 'object' && !Array.isArray(loaded)
48
- ? loaded
81
+ ? { ...loaded }
49
82
  : {};
50
- return { data, content };
51
- }
52
- /**
53
- * Compose a structured `ParsedUserMd` back into an `.agent-user.md`
54
- * body, emitting YAML frontmatter in block style (no flow `[a, b]`,
55
- * no inline maps) so list-valued fields like `identity.role` produce
56
- * one entry per line and diff cleanly in git.
57
- *
58
- * When `data` is empty, the leading `---\n---\n` fence is omitted.
59
- */
60
- export function composeUserMd(parsed) {
61
- if (Object.keys(parsed.data).length === 0) {
62
- return parsed.content;
83
+ if (tail !== '' && data.notes === undefined) {
84
+ data.notes = tail;
63
85
  }
64
- const dumped = yaml.dump(parsed.data, {
65
- flowLevel: -1,
66
- lineWidth: -1,
67
- noRefs: true,
68
- });
69
- // `yaml.dump` always terminates with `\n`; strip and re-add inside
70
- // the fence so the body shape stays `---\n<yaml>\n---\n<content>`.
71
- const trimmed = dumped.endsWith('\n') ? dumped.slice(0, -1) : dumped;
72
- return `---\n${trimmed}\n---\n${parsed.content}`;
86
+ return data;
73
87
  }
74
88
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/shared/userMd/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAc3B;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,mCAAmC,CAAC;AAE9D;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,IAAI,GACN,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACnE,CAAC,CAAE,MAAkC;QACrC,CAAC,CAAC,EAAE,CAAC;IACb,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoB;IAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC,OAAO,CAAC;IAC1B,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAClC,SAAS,EAAE,CAAC,CAAC;QACb,SAAS,EAAE,CAAC,CAAC;QACb,MAAM,EAAE,IAAI;KACf,CAAC,CAAC;IACH,mEAAmE;IACnE,mEAAmE;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,OAAO,QAAQ,OAAO,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/shared/userMd/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,oEAAoE;AACpE,MAAM,iBAAiB,GAAG,mCAAmC,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAiC,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA6B;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACnB,SAAS,EAAE,CAAC,CAAC;QACb,SAAS,EAAE,CAAC,CAAC;QACb,MAAM,EAAE,IAAI;KACf,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,IAAI,GACN,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACnE,CAAC,CAAC,EAAE,GAAI,MAAkC,EAAE;QAC5C,CAAC,CAAC,EAAE,CAAC;IACb,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}