create-workframe 0.1.6 → 0.1.8

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 (90) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/workframe-api/package.json +1 -1
  4. package/workframe-api/server.py +841 -143
  5. package/workframe-api/stack_config.py +18 -10
  6. package/workframe-api/test_ensure_native_profile.py +29 -0
  7. package/workframe-api/test_oauth_llm.py +58 -0
  8. package/workframe-api/test_provider_model_surface.py +31 -0
  9. package/workframe-api/test_stack_config_install_smtp.py +56 -0
  10. package/workframe-ui/public/assets/{arc-DoYr2T5c.js → arc-DjpS9a2b.js} +1 -1
  11. package/workframe-ui/public/assets/architecture-7EHR7CIX-CvhbXEvt.js +1 -0
  12. package/workframe-ui/public/assets/{architectureDiagram-3BPJPVTR-Clher08G.js → architectureDiagram-3BPJPVTR-puCKmKHV.js} +1 -1
  13. package/workframe-ui/public/assets/{blockDiagram-GPEHLZMM-Bdw9txrZ.js → blockDiagram-GPEHLZMM-C2P0g-eH.js} +1 -1
  14. package/workframe-ui/public/assets/{c4Diagram-AAUBKEIU-DlI_h_uo.js → c4Diagram-AAUBKEIU-DdvYEITH.js} +1 -1
  15. package/workframe-ui/public/assets/channel-D63s_yN9.js +1 -0
  16. package/workframe-ui/public/assets/{chunk-2J33WTMH-ol-uwoeq.js → chunk-2J33WTMH-Cxe8QsEF.js} +1 -1
  17. package/workframe-ui/public/assets/{chunk-3OPIFGDE-7eDhBen0.js → chunk-3OPIFGDE-DPNyTwR3.js} +1 -1
  18. package/workframe-ui/public/assets/{chunk-4BX2VUAB-xPORD7Js.js → chunk-4BX2VUAB-XKG9gfRN.js} +1 -1
  19. package/workframe-ui/public/assets/{chunk-55IACEB6-Cwd7dr1z.js → chunk-55IACEB6-oPMTulgb.js} +1 -1
  20. package/workframe-ui/public/assets/{chunk-5ZQYHXKU-Ckt4Sjy1.js → chunk-5ZQYHXKU-BWwXvpa_.js} +1 -1
  21. package/workframe-ui/public/assets/{chunk-727SXJPM-sMk1op_G.js → chunk-727SXJPM-Cml2twO_.js} +1 -1
  22. package/workframe-ui/public/assets/{chunk-AQP2D5EJ-CMgSvr6H.js → chunk-AQP2D5EJ-DzrRBhQu.js} +1 -1
  23. package/workframe-ui/public/assets/{chunk-BSJP7CBP-Dx7GN0T4.js → chunk-BSJP7CBP-EZ7STU6h.js} +1 -1
  24. package/workframe-ui/public/assets/{chunk-CSCIHK7Q--OCu86u0.js → chunk-CSCIHK7Q-BGTQzWYw.js} +1 -1
  25. package/workframe-ui/public/assets/{chunk-FMBD7UC4-CejmwJpz.js → chunk-FMBD7UC4-Cm4stfRa.js} +1 -1
  26. package/workframe-ui/public/assets/{chunk-KSCS5N6A-CvOj2Yvp.js → chunk-KSCS5N6A-exbMijjy.js} +1 -1
  27. package/workframe-ui/public/assets/{chunk-L5ZTLDWV-B0nGBjLU.js → chunk-L5ZTLDWV-C75kbQwN.js} +1 -1
  28. package/workframe-ui/public/assets/{chunk-LZXEDZCA-Bdzvu227.js → chunk-LZXEDZCA-CsRdBqUB.js} +2 -2
  29. package/workframe-ui/public/assets/{chunk-ND2GUHAM-CGR07jTY.js → chunk-ND2GUHAM-D84zyIu2.js} +1 -1
  30. package/workframe-ui/public/assets/{chunk-NZK2D7GU-CBojDPNC.js → chunk-NZK2D7GU-CUNNo1bj.js} +1 -1
  31. package/workframe-ui/public/assets/{chunk-O5CBEL6O-DBin5MPF.js → chunk-O5CBEL6O-DN6WEIh-.js} +1 -1
  32. package/workframe-ui/public/assets/chunk-QZHKN3VN-Dj_Yxhgo.js +1 -0
  33. package/workframe-ui/public/assets/chunk-WU5MYG2G-AFchshb6.js +1 -0
  34. package/workframe-ui/public/assets/{chunk-XPW4576I-TD7I7pcb.js → chunk-XPW4576I-Ct5VQv2D.js} +1 -1
  35. package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-Opj8t01I.js +1 -0
  36. package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-Opj8t01I.js +1 -0
  37. package/workframe-ui/public/assets/{cose-bilkent-S5V4N54A-Bmm5x5xm.js → cose-bilkent-S5V4N54A-Bj4W5oMk.js} +1 -1
  38. package/workframe-ui/public/assets/{dagre-BM42HDAG-zU2r0aq2.js → dagre-BM42HDAG-DAjHBkAy.js} +1 -1
  39. package/workframe-ui/public/assets/{diagram-2AECGRRQ-AL01qukm.js → diagram-2AECGRRQ-Ch2gGFPG.js} +1 -1
  40. package/workframe-ui/public/assets/{diagram-5GNKFQAL-DKi1xSMg.js → diagram-5GNKFQAL-BzIIvgYH.js} +1 -1
  41. package/workframe-ui/public/assets/{diagram-KO2AKTUF-DQJDQ-f-.js → diagram-KO2AKTUF-Df0Q8nv6.js} +1 -1
  42. package/workframe-ui/public/assets/{diagram-LMA3HP47-B1oisGUj.js → diagram-LMA3HP47-D-G3ekmF.js} +1 -1
  43. package/workframe-ui/public/assets/{diagram-OG6HWLK6-DjpJKffk.js → diagram-OG6HWLK6-TBHhT9f5.js} +1 -1
  44. package/workframe-ui/public/assets/{dist-Jk20AnQG.js → dist-CPbiDkEZ.js} +1 -1
  45. package/workframe-ui/public/assets/{erDiagram-TEJ5UH35-Vu8RtLUf.js → erDiagram-TEJ5UH35-YxkUmLLV.js} +1 -1
  46. package/workframe-ui/public/assets/eventmodeling-FCH6USID-LQOYL50n.js +1 -0
  47. package/workframe-ui/public/assets/{flowDiagram-I6XJVG4X-CHAXEhbR.js → flowDiagram-I6XJVG4X-kfZ7-RSd.js} +1 -1
  48. package/workframe-ui/public/assets/{ganttDiagram-6RSMTGT7-DhiEkfH8.js → ganttDiagram-6RSMTGT7-DmTx3hzR.js} +1 -1
  49. package/workframe-ui/public/assets/{gitGraph-WXDBUCRP-Cuq44XvU.js → gitGraph-WXDBUCRP-BXa0ewp3.js} +1 -1
  50. package/workframe-ui/public/assets/{gitGraphDiagram-PVQCEYII-B7kgReRt.js → gitGraphDiagram-PVQCEYII-CQr2qMxU.js} +1 -1
  51. package/workframe-ui/public/assets/{index-auJ0bLMU.css → index-B08aShJy.css} +1 -1
  52. package/workframe-ui/public/assets/index-DCF3W3G_.js +129 -0
  53. package/workframe-ui/public/assets/{info-J43DQDTF-oV4b3M4f.js → info-J43DQDTF-t-Qlx8zv.js} +1 -1
  54. package/workframe-ui/public/assets/{infoDiagram-5YYISTIA-CthN4b6o.js → infoDiagram-5YYISTIA-CzkYofPx.js} +1 -1
  55. package/workframe-ui/public/assets/{ishikawaDiagram-YF4QCWOH-oEGS3TKg.js → ishikawaDiagram-YF4QCWOH-djK3Oxgb.js} +1 -1
  56. package/workframe-ui/public/assets/{journeyDiagram-JHISSGLW-CXJsWmKF.js → journeyDiagram-JHISSGLW-CWxYXxdF.js} +1 -1
  57. package/workframe-ui/public/assets/{kanban-definition-UN3LZRKU-DTPo8yHW.js → kanban-definition-UN3LZRKU-D7leCAD9.js} +1 -1
  58. package/workframe-ui/public/assets/{line-Bm9Pmcnz.js → line-BSFj2OC5.js} +1 -1
  59. package/workframe-ui/public/assets/{linear-Cn-uD6eX.js → linear-pfPwnu-o.js} +1 -1
  60. package/workframe-ui/public/assets/{mermaid-parser.core-BBVSTQZ4.js → mermaid-parser.core-Dm2L9Ib_.js} +2 -2
  61. package/workframe-ui/public/assets/{mermaid.core-DE668nUy.js → mermaid.core-Bevx9bif.js} +3 -3
  62. package/workframe-ui/public/assets/{mindmap-definition-RKZ34NQL-4qVsiwCf.js → mindmap-definition-RKZ34NQL-UkjDssmP.js} +1 -1
  63. package/workframe-ui/public/assets/{packet-YPE3B663-CqJeoiFG.js → packet-YPE3B663-JO2ezH3_.js} +1 -1
  64. package/workframe-ui/public/assets/{pie-LRSECV5Y-DcOqVssg.js → pie-LRSECV5Y-DdMFsfR8.js} +1 -1
  65. package/workframe-ui/public/assets/{pieDiagram-4H26LBE5-CosMnpAM.js → pieDiagram-4H26LBE5-CEPHFBU1.js} +1 -1
  66. package/workframe-ui/public/assets/{quadrantDiagram-W4KKPZXB-DtsnIK98.js → quadrantDiagram-W4KKPZXB-_RF9_86k.js} +1 -1
  67. package/workframe-ui/public/assets/{radar-GUYGQ44K-BqLpJuWc.js → radar-GUYGQ44K-Cb-YfdaA.js} +1 -1
  68. package/workframe-ui/public/assets/{requirementDiagram-4Y6WPE33-Pb7cuX8_.js → requirementDiagram-4Y6WPE33-DBVOxmBn.js} +1 -1
  69. package/workframe-ui/public/assets/{sankeyDiagram-5OEKKPKP-BJBlMM1m.js → sankeyDiagram-5OEKKPKP-BTpxsGUA.js} +1 -1
  70. package/workframe-ui/public/assets/{sequenceDiagram-3UESZ5HK-i4HnjP39.js → sequenceDiagram-3UESZ5HK-DHP_Bq3l.js} +1 -1
  71. package/workframe-ui/public/assets/{src-DIhmc_XG.js → src-CY_By-r7.js} +1 -1
  72. package/workframe-ui/public/assets/{stateDiagram-AJRCARHV-Ba2iClPT.js → stateDiagram-AJRCARHV-BVtp_LPR.js} +1 -1
  73. package/workframe-ui/public/assets/stateDiagram-v2-BHNVJYJU-CvJhS_BJ.js +1 -0
  74. package/workframe-ui/public/assets/{timeline-definition-PNZ67QCA-CL4X9vSF.js → timeline-definition-PNZ67QCA-D38HJhop.js} +1 -1
  75. package/workframe-ui/public/assets/{treeView-BLDUP644-BJrjnbMj.js → treeView-BLDUP644-CFCG3Sc_.js} +1 -1
  76. package/workframe-ui/public/assets/{treemap-LRROVOQU-CN6H54RF.js → treemap-LRROVOQU-BeiMs_dF.js} +1 -1
  77. package/workframe-ui/public/assets/{vennDiagram-CIIHVFJN-Cee6sbUy.js → vennDiagram-CIIHVFJN-CKMeT6PW.js} +1 -1
  78. package/workframe-ui/public/assets/{wardley-L42UT6IY-D0cXq60c.js → wardley-L42UT6IY-BljDy8ph.js} +1 -1
  79. package/workframe-ui/public/assets/{wardleyDiagram-YWT4CUSO-CaH9XkCx.js → wardleyDiagram-YWT4CUSO-DEE8D94J.js} +1 -1
  80. package/workframe-ui/public/assets/{xychartDiagram-2RQKCTM6-BEisgFoI.js → xychartDiagram-2RQKCTM6-BRaAWV_g.js} +1 -1
  81. package/workframe-ui/public/index.html +2 -2
  82. package/workframe-ui/public/assets/architecture-7EHR7CIX-CmDi28hh.js +0 -1
  83. package/workframe-ui/public/assets/channel-DZYVoEdD.js +0 -1
  84. package/workframe-ui/public/assets/chunk-QZHKN3VN-DwiajAaK.js +0 -1
  85. package/workframe-ui/public/assets/chunk-WU5MYG2G-Bz8vA5s7.js +0 -1
  86. package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-DQiq8od0.js +0 -1
  87. package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-DQiq8od0.js +0 -1
  88. package/workframe-ui/public/assets/eventmodeling-FCH6USID-BXUnTe0c.js +0 -1
  89. package/workframe-ui/public/assets/index-72-j0sA5.js +0 -129
  90. package/workframe-ui/public/assets/stateDiagram-v2-BHNVJYJU-aUpqRAhy.js +0 -1
@@ -1,4 +1,8 @@
1
- """Stack operator config (SMTP, deployment mode, install state). Env wins over file for VPS."""
1
+ """Stack operator config (SMTP, deployment mode, install state).
2
+
3
+ During install window: stack file only (clean install — no compose env ghost creds).
4
+ After install_complete: env wins over file for VPS ops overrides.
5
+ """
2
6
 
3
7
  from __future__ import annotations
4
8
 
@@ -247,18 +251,18 @@ def patch_stack_config(body: dict[str, Any]) -> dict[str, Any]:
247
251
 
248
252
 
249
253
  def resolve_deployment_mode(env_default: str = "trusted_team") -> str:
250
- """Explicit WORKFRAME_DEPLOYMENT_MODE env wins; stack_config applies only when env is unset."""
251
- env_raw = (os.environ.get("WORKFRAME_DEPLOYMENT_MODE") or "").strip().lower()
252
- if env_raw in DEPLOYMENT_MODES:
253
- return env_raw
254
- if env_raw:
255
- return env_raw
254
+ """Persisted stack_config deployment_mode wins when set; else WORKFRAME_DEPLOYMENT_MODE env."""
256
255
  try:
257
- sc_mode = str(get_stack_config().get("deployment_mode") or "").strip().lower()
256
+ sc_mode = str(_read_raw().get("deployment_mode") or "").strip().lower()
258
257
  if sc_mode in DEPLOYMENT_MODES:
259
258
  return sc_mode
260
259
  except Exception:
261
260
  pass
261
+ env_raw = (os.environ.get("WORKFRAME_DEPLOYMENT_MODE") or "").strip().lower()
262
+ if env_raw in DEPLOYMENT_MODES:
263
+ return env_raw
264
+ if env_raw:
265
+ return env_raw
262
266
  raw = (env_default or "trusted_team").strip().lower()
263
267
  return raw if raw in DEPLOYMENT_MODES else "trusted_team"
264
268
 
@@ -267,15 +271,19 @@ def effective_deployment_mode(env_default: str) -> str:
267
271
  return resolve_deployment_mode(env_default)
268
272
 
269
273
 
274
+ def _install_window_open() -> bool:
275
+ return not bool(_read_raw().get("install_complete"))
276
+
277
+
270
278
  def resolved_smtp() -> dict[str, Any]:
271
- """Env wins for host; secrets/from fall back to stack file when env omits them."""
279
+ """Stack file during install; env overrides only after install_complete."""
272
280
  stack = _stack_smtp_raw()
273
281
  stack_host = str(stack.get("host") or "").strip()
274
282
  stack_user = str(stack.get("user") or "").strip()
275
283
  stack_pw = str(stack.get("password") or "").strip().replace(" ", "")
276
284
  stack_from = str(stack.get("from") or "").strip()
277
285
 
278
- env_host = os.environ.get("SMTP_HOST", "").strip()
286
+ env_host = "" if _install_window_open() else os.environ.get("SMTP_HOST", "").strip()
279
287
  if env_host:
280
288
  port = int(os.environ.get("SMTP_PORT", "587"))
281
289
  secure = normalize_smtp_secure(
@@ -0,0 +1,29 @@
1
+ """ponytail self-check: empty Hermes data must seed workframe-agent for gateway boot.
2
+
3
+ Run: python services/workframe-api/test_ensure_native_profile.py
4
+ """
5
+ import json
6
+ import os
7
+ import sys
8
+ import tempfile
9
+ from pathlib import Path
10
+
11
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
12
+
13
+ import server # noqa: E402
14
+
15
+ td = Path(tempfile.mkdtemp())
16
+ os.environ["HERMES_DATA"] = str(td)
17
+ server.HERMES_DATA = td
18
+ server.ROUTES_JSON = td / "workframe" / "routes.json"
19
+
20
+ slug = server._native_profile_slug()
21
+ assert slug == "workframe-agent"
22
+ assert not server._native_profile_present()
23
+ assert server._seed_native_profile_on_disk(slug)
24
+ assert server._native_profile_present()
25
+ assert (td / "profiles" / slug / "config.yaml").is_file()
26
+ routes = json.loads((td / "workframe" / "routes.json").read_text(encoding="utf-8"))
27
+ assert any(row.get("profile") == slug for row in routes.get("routes", []))
28
+
29
+ print("ensure native profile self-check ok")
@@ -0,0 +1,58 @@
1
+ """ponytail self-check: OAuth LLM providers (Codex/Nous) must pass chat gates without API keys.
2
+
3
+ Run: python services/workframe-api/test_oauth_llm.py
4
+ """
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
9
+
10
+ import server # noqa: E402
11
+
12
+ keys = server._hermes_oauth_auth_keys("openai-codex")
13
+ assert "openai-codex" in keys
14
+ assert "codex" in keys
15
+ assert "openai_codex" in keys
16
+
17
+ pool_only = {
18
+ "version": 1,
19
+ "providers": {},
20
+ "credential_pool": {"openai-codex": [{"id": "x", "auth_type": "oauth"}]},
21
+ }
22
+ assert server._auth_json_has_oauth_material(pool_only)
23
+
24
+ # credential_pool-only auth must merge into profile auth
25
+ merged: dict = {"version": 1, "providers": {}, "credential_pool": {}}
26
+ assert server._merge_oauth_auth_into_profile(merged, pool_only, "openai-codex")
27
+ assert merged["credential_pool"].get("openai-codex")
28
+
29
+ # Without live tokens require path must fail
30
+ try:
31
+ server._require_runtime_owner_provider("user-1", "ws-1", "codex")
32
+ raise AssertionError("expected ValueError without oauth tokens")
33
+ except ValueError:
34
+ pass
35
+
36
+ _orig = server._hermes_oauth_tokens_present
37
+
38
+
39
+ def _fake_present(_user: str, _auth_id: str) -> bool:
40
+ return True
41
+
42
+
43
+ server._hermes_oauth_tokens_present = _fake_present
44
+ try:
45
+ resolved = server._require_runtime_owner_provider(
46
+ "550e8400-e29b-41d4-a716-446655440000",
47
+ "ws-1",
48
+ "codex",
49
+ )
50
+ assert resolved.get("credential_type") == "oauth"
51
+ assert resolved.get("credential_ref") == "oauth:openai-codex"
52
+ finally:
53
+ server._hermes_oauth_tokens_present = _orig
54
+
55
+ mvp = server.PROVIDER_MVP_MODELS["codex"]["primary"]
56
+ assert mvp == "gpt-5.4-medium"
57
+
58
+ print("oauth llm self-check ok")
@@ -0,0 +1,31 @@
1
+ """ponytail: connected providers → model offers → billing alignment.
2
+
3
+ Run: python services/workframe-api/test_provider_model_surface.py
4
+ """
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
9
+
10
+ import server # noqa: E402
11
+
12
+ codex_rows = server._model_catalog_rows_for_provider("codex")
13
+ codex_models = {row["model"] for row in codex_rows}
14
+ assert "gpt-5.4-medium" in codex_models, codex_models
15
+ assert "gpt-5.4-mini" in codex_models, codex_models
16
+ assert all("gemini" not in m for m in codex_models)
17
+
18
+ assert server._resolve_billing_provider_for_model("gpt-5.4-mini", {"codex"}) == "codex"
19
+ assert server._resolve_billing_provider_for_model("google/gemini-2.5-flash", {"codex"}) == ""
20
+ assert server._resolve_billing_provider_for_model(
21
+ "google/gemini-2.5-flash", {"openrouter"}
22
+ ) == "openrouter"
23
+
24
+ stack = server._suggestions_for_connected_llm_providers({"codex", "openrouter"})
25
+ models = {row["model"] for row in stack}
26
+ assert "gpt-5.4-medium" in models
27
+ assert any(m.startswith("google/") for m in models)
28
+
29
+ assert server._billing_provider_id_from_hermes_config("openai-codex") == "codex"
30
+
31
+ print("provider model surface self-check ok")
@@ -0,0 +1,56 @@
1
+ """ponytail: install window must ignore compose SMTP env (clean install, not migration).
2
+
3
+ Run: python services/workframe-api/test_stack_config_install_smtp.py
4
+ """
5
+ import os
6
+ import sys
7
+ import tempfile
8
+ from pathlib import Path
9
+
10
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
11
+
12
+ import stack_config # noqa: E402
13
+
14
+ td = Path(tempfile.mkdtemp())
15
+ stack_config.DATA_DIR = td
16
+ stack_config.CONFIG_PATH = td / "stack_config.json"
17
+
18
+ os.environ["SMTP_HOST"] = "smtp.ghost.example"
19
+ os.environ["SMTP_USER"] = "ghost@example.com"
20
+ os.environ["SMTP_PASS"] = "secret"
21
+
22
+ # Fresh install: no stack file, install window open → env ignored
23
+ assert stack_config._install_window_open()
24
+ resolved = stack_config.resolved_smtp()
25
+ assert resolved.get("source") == "none", resolved
26
+ assert not stack_config.smtp_configured()
27
+
28
+ # Wizard saves SMTP to stack file
29
+ stack_config.patch_stack_config(
30
+ {
31
+ "smtp": {
32
+ "host": "smtp.wizard.example",
33
+ "port": 587,
34
+ "user": "admin@wizard.example",
35
+ "password": "wizard-pass",
36
+ "from": "admin@wizard.example",
37
+ }
38
+ }
39
+ )
40
+ resolved = stack_config.resolved_smtp()
41
+ assert resolved.get("host") == "smtp.wizard.example", resolved
42
+ assert resolved.get("source") == "stack_config", resolved
43
+
44
+ # After install complete, env wins for ops overrides
45
+ stack_config.patch_stack_config({"install_complete": True})
46
+ assert not stack_config._install_window_open()
47
+ resolved = stack_config.resolved_smtp()
48
+ assert resolved.get("host") == "smtp.ghost.example", resolved
49
+ assert resolved.get("source") == "env", resolved
50
+
51
+ # Wizard deployment_mode persists over compose .env default
52
+ os.environ["WORKFRAME_DEPLOYMENT_MODE"] = "trusted_team"
53
+ stack_config.patch_stack_config({"deployment_mode": "single_user_local"})
54
+ assert stack_config.resolve_deployment_mode() == "single_user_local"
55
+
56
+ print("stack_config install-window smtp self-check ok")
@@ -1 +1 @@
1
- import{n as e,t}from"./path-BWPyau1x.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-Jk20AnQG.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
1
+ import{n as e,t}from"./path-BWPyau1x.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-CPbiDkEZ.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
@@ -0,0 +1 @@
1
+ import"./chunk-NNHCCRGN-DlpIbxXb.js";import{x as e}from"./mermaid-parser.core-Dm2L9Ib_.js";export{e as createArchitectureServices};