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.
- package/README.md +1 -1
- package/package.json +1 -1
- package/workframe-api/package.json +1 -1
- package/workframe-api/server.py +841 -143
- package/workframe-api/stack_config.py +18 -10
- package/workframe-api/test_ensure_native_profile.py +29 -0
- package/workframe-api/test_oauth_llm.py +58 -0
- package/workframe-api/test_provider_model_surface.py +31 -0
- package/workframe-api/test_stack_config_install_smtp.py +56 -0
- package/workframe-ui/public/assets/{arc-DoYr2T5c.js → arc-DjpS9a2b.js} +1 -1
- package/workframe-ui/public/assets/architecture-7EHR7CIX-CvhbXEvt.js +1 -0
- package/workframe-ui/public/assets/{architectureDiagram-3BPJPVTR-Clher08G.js → architectureDiagram-3BPJPVTR-puCKmKHV.js} +1 -1
- package/workframe-ui/public/assets/{blockDiagram-GPEHLZMM-Bdw9txrZ.js → blockDiagram-GPEHLZMM-C2P0g-eH.js} +1 -1
- package/workframe-ui/public/assets/{c4Diagram-AAUBKEIU-DlI_h_uo.js → c4Diagram-AAUBKEIU-DdvYEITH.js} +1 -1
- package/workframe-ui/public/assets/channel-D63s_yN9.js +1 -0
- package/workframe-ui/public/assets/{chunk-2J33WTMH-ol-uwoeq.js → chunk-2J33WTMH-Cxe8QsEF.js} +1 -1
- package/workframe-ui/public/assets/{chunk-3OPIFGDE-7eDhBen0.js → chunk-3OPIFGDE-DPNyTwR3.js} +1 -1
- package/workframe-ui/public/assets/{chunk-4BX2VUAB-xPORD7Js.js → chunk-4BX2VUAB-XKG9gfRN.js} +1 -1
- package/workframe-ui/public/assets/{chunk-55IACEB6-Cwd7dr1z.js → chunk-55IACEB6-oPMTulgb.js} +1 -1
- package/workframe-ui/public/assets/{chunk-5ZQYHXKU-Ckt4Sjy1.js → chunk-5ZQYHXKU-BWwXvpa_.js} +1 -1
- package/workframe-ui/public/assets/{chunk-727SXJPM-sMk1op_G.js → chunk-727SXJPM-Cml2twO_.js} +1 -1
- package/workframe-ui/public/assets/{chunk-AQP2D5EJ-CMgSvr6H.js → chunk-AQP2D5EJ-DzrRBhQu.js} +1 -1
- package/workframe-ui/public/assets/{chunk-BSJP7CBP-Dx7GN0T4.js → chunk-BSJP7CBP-EZ7STU6h.js} +1 -1
- package/workframe-ui/public/assets/{chunk-CSCIHK7Q--OCu86u0.js → chunk-CSCIHK7Q-BGTQzWYw.js} +1 -1
- package/workframe-ui/public/assets/{chunk-FMBD7UC4-CejmwJpz.js → chunk-FMBD7UC4-Cm4stfRa.js} +1 -1
- package/workframe-ui/public/assets/{chunk-KSCS5N6A-CvOj2Yvp.js → chunk-KSCS5N6A-exbMijjy.js} +1 -1
- package/workframe-ui/public/assets/{chunk-L5ZTLDWV-B0nGBjLU.js → chunk-L5ZTLDWV-C75kbQwN.js} +1 -1
- package/workframe-ui/public/assets/{chunk-LZXEDZCA-Bdzvu227.js → chunk-LZXEDZCA-CsRdBqUB.js} +2 -2
- package/workframe-ui/public/assets/{chunk-ND2GUHAM-CGR07jTY.js → chunk-ND2GUHAM-D84zyIu2.js} +1 -1
- package/workframe-ui/public/assets/{chunk-NZK2D7GU-CBojDPNC.js → chunk-NZK2D7GU-CUNNo1bj.js} +1 -1
- package/workframe-ui/public/assets/{chunk-O5CBEL6O-DBin5MPF.js → chunk-O5CBEL6O-DN6WEIh-.js} +1 -1
- package/workframe-ui/public/assets/chunk-QZHKN3VN-Dj_Yxhgo.js +1 -0
- package/workframe-ui/public/assets/chunk-WU5MYG2G-AFchshb6.js +1 -0
- package/workframe-ui/public/assets/{chunk-XPW4576I-TD7I7pcb.js → chunk-XPW4576I-Ct5VQv2D.js} +1 -1
- package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-Opj8t01I.js +1 -0
- package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-Opj8t01I.js +1 -0
- package/workframe-ui/public/assets/{cose-bilkent-S5V4N54A-Bmm5x5xm.js → cose-bilkent-S5V4N54A-Bj4W5oMk.js} +1 -1
- package/workframe-ui/public/assets/{dagre-BM42HDAG-zU2r0aq2.js → dagre-BM42HDAG-DAjHBkAy.js} +1 -1
- package/workframe-ui/public/assets/{diagram-2AECGRRQ-AL01qukm.js → diagram-2AECGRRQ-Ch2gGFPG.js} +1 -1
- package/workframe-ui/public/assets/{diagram-5GNKFQAL-DKi1xSMg.js → diagram-5GNKFQAL-BzIIvgYH.js} +1 -1
- package/workframe-ui/public/assets/{diagram-KO2AKTUF-DQJDQ-f-.js → diagram-KO2AKTUF-Df0Q8nv6.js} +1 -1
- package/workframe-ui/public/assets/{diagram-LMA3HP47-B1oisGUj.js → diagram-LMA3HP47-D-G3ekmF.js} +1 -1
- package/workframe-ui/public/assets/{diagram-OG6HWLK6-DjpJKffk.js → diagram-OG6HWLK6-TBHhT9f5.js} +1 -1
- package/workframe-ui/public/assets/{dist-Jk20AnQG.js → dist-CPbiDkEZ.js} +1 -1
- package/workframe-ui/public/assets/{erDiagram-TEJ5UH35-Vu8RtLUf.js → erDiagram-TEJ5UH35-YxkUmLLV.js} +1 -1
- package/workframe-ui/public/assets/eventmodeling-FCH6USID-LQOYL50n.js +1 -0
- package/workframe-ui/public/assets/{flowDiagram-I6XJVG4X-CHAXEhbR.js → flowDiagram-I6XJVG4X-kfZ7-RSd.js} +1 -1
- package/workframe-ui/public/assets/{ganttDiagram-6RSMTGT7-DhiEkfH8.js → ganttDiagram-6RSMTGT7-DmTx3hzR.js} +1 -1
- package/workframe-ui/public/assets/{gitGraph-WXDBUCRP-Cuq44XvU.js → gitGraph-WXDBUCRP-BXa0ewp3.js} +1 -1
- package/workframe-ui/public/assets/{gitGraphDiagram-PVQCEYII-B7kgReRt.js → gitGraphDiagram-PVQCEYII-CQr2qMxU.js} +1 -1
- package/workframe-ui/public/assets/{index-auJ0bLMU.css → index-B08aShJy.css} +1 -1
- package/workframe-ui/public/assets/index-DCF3W3G_.js +129 -0
- package/workframe-ui/public/assets/{info-J43DQDTF-oV4b3M4f.js → info-J43DQDTF-t-Qlx8zv.js} +1 -1
- package/workframe-ui/public/assets/{infoDiagram-5YYISTIA-CthN4b6o.js → infoDiagram-5YYISTIA-CzkYofPx.js} +1 -1
- package/workframe-ui/public/assets/{ishikawaDiagram-YF4QCWOH-oEGS3TKg.js → ishikawaDiagram-YF4QCWOH-djK3Oxgb.js} +1 -1
- package/workframe-ui/public/assets/{journeyDiagram-JHISSGLW-CXJsWmKF.js → journeyDiagram-JHISSGLW-CWxYXxdF.js} +1 -1
- package/workframe-ui/public/assets/{kanban-definition-UN3LZRKU-DTPo8yHW.js → kanban-definition-UN3LZRKU-D7leCAD9.js} +1 -1
- package/workframe-ui/public/assets/{line-Bm9Pmcnz.js → line-BSFj2OC5.js} +1 -1
- package/workframe-ui/public/assets/{linear-Cn-uD6eX.js → linear-pfPwnu-o.js} +1 -1
- package/workframe-ui/public/assets/{mermaid-parser.core-BBVSTQZ4.js → mermaid-parser.core-Dm2L9Ib_.js} +2 -2
- package/workframe-ui/public/assets/{mermaid.core-DE668nUy.js → mermaid.core-Bevx9bif.js} +3 -3
- package/workframe-ui/public/assets/{mindmap-definition-RKZ34NQL-4qVsiwCf.js → mindmap-definition-RKZ34NQL-UkjDssmP.js} +1 -1
- package/workframe-ui/public/assets/{packet-YPE3B663-CqJeoiFG.js → packet-YPE3B663-JO2ezH3_.js} +1 -1
- package/workframe-ui/public/assets/{pie-LRSECV5Y-DcOqVssg.js → pie-LRSECV5Y-DdMFsfR8.js} +1 -1
- package/workframe-ui/public/assets/{pieDiagram-4H26LBE5-CosMnpAM.js → pieDiagram-4H26LBE5-CEPHFBU1.js} +1 -1
- package/workframe-ui/public/assets/{quadrantDiagram-W4KKPZXB-DtsnIK98.js → quadrantDiagram-W4KKPZXB-_RF9_86k.js} +1 -1
- package/workframe-ui/public/assets/{radar-GUYGQ44K-BqLpJuWc.js → radar-GUYGQ44K-Cb-YfdaA.js} +1 -1
- package/workframe-ui/public/assets/{requirementDiagram-4Y6WPE33-Pb7cuX8_.js → requirementDiagram-4Y6WPE33-DBVOxmBn.js} +1 -1
- package/workframe-ui/public/assets/{sankeyDiagram-5OEKKPKP-BJBlMM1m.js → sankeyDiagram-5OEKKPKP-BTpxsGUA.js} +1 -1
- package/workframe-ui/public/assets/{sequenceDiagram-3UESZ5HK-i4HnjP39.js → sequenceDiagram-3UESZ5HK-DHP_Bq3l.js} +1 -1
- package/workframe-ui/public/assets/{src-DIhmc_XG.js → src-CY_By-r7.js} +1 -1
- package/workframe-ui/public/assets/{stateDiagram-AJRCARHV-Ba2iClPT.js → stateDiagram-AJRCARHV-BVtp_LPR.js} +1 -1
- package/workframe-ui/public/assets/stateDiagram-v2-BHNVJYJU-CvJhS_BJ.js +1 -0
- package/workframe-ui/public/assets/{timeline-definition-PNZ67QCA-CL4X9vSF.js → timeline-definition-PNZ67QCA-D38HJhop.js} +1 -1
- package/workframe-ui/public/assets/{treeView-BLDUP644-BJrjnbMj.js → treeView-BLDUP644-CFCG3Sc_.js} +1 -1
- package/workframe-ui/public/assets/{treemap-LRROVOQU-CN6H54RF.js → treemap-LRROVOQU-BeiMs_dF.js} +1 -1
- package/workframe-ui/public/assets/{vennDiagram-CIIHVFJN-Cee6sbUy.js → vennDiagram-CIIHVFJN-CKMeT6PW.js} +1 -1
- package/workframe-ui/public/assets/{wardley-L42UT6IY-D0cXq60c.js → wardley-L42UT6IY-BljDy8ph.js} +1 -1
- package/workframe-ui/public/assets/{wardleyDiagram-YWT4CUSO-CaH9XkCx.js → wardleyDiagram-YWT4CUSO-DEE8D94J.js} +1 -1
- package/workframe-ui/public/assets/{xychartDiagram-2RQKCTM6-BEisgFoI.js → xychartDiagram-2RQKCTM6-BRaAWV_g.js} +1 -1
- package/workframe-ui/public/index.html +2 -2
- package/workframe-ui/public/assets/architecture-7EHR7CIX-CmDi28hh.js +0 -1
- package/workframe-ui/public/assets/channel-DZYVoEdD.js +0 -1
- package/workframe-ui/public/assets/chunk-QZHKN3VN-DwiajAaK.js +0 -1
- package/workframe-ui/public/assets/chunk-WU5MYG2G-Bz8vA5s7.js +0 -1
- package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-DQiq8od0.js +0 -1
- package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-DQiq8od0.js +0 -1
- package/workframe-ui/public/assets/eventmodeling-FCH6USID-BXUnTe0c.js +0 -1
- package/workframe-ui/public/assets/index-72-j0sA5.js +0 -129
- 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).
|
|
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
|
-
"""
|
|
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(
|
|
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
|
-
"""
|
|
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-
|
|
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};
|