126 lines
26 KiB
XML
126 lines
26 KiB
XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="782px" preserveAspectRatio="none" style="width:1497px;height:782px;" version="1.1" viewBox="0 0 1497 782" width="1497px" zoomAndPan="magnify"><defs><filter height="300%" id="f14o8l4xcccnkh" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="274" x="615" y="19.2419">SmartTools System Architecture</text><!--MD5=[d1229199517cdd42d5433fd97e4c984e]
|
|
cluster User Interfaces--><polygon fill="#FFFFFF" filter="url(#f14o8l4xcccnkh)" points="446.78,48.5158,557.78,48.5158,564.78,73.5838,729.78,73.5838,729.78,141.5158,446.78,141.5158,446.78,48.5158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="446.78" x2="564.78" y1="73.5838" y2="73.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="105" x="450.78" y="65.4818">User Interfaces</text><!--MD5=[605f52eee8edfae24bd4998ae0416011]
|
|
cluster SmartTools CLI--><polygon fill="#FFFFFF" filter="url(#f14o8l4xcccnkh)" points="689.78,192.5158,800.78,192.5158,807.78,217.5838,976.78,217.5838,976.78,427.5158,689.78,427.5158,689.78,192.5158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="689.78" x2="807.78" y1="217.5838" y2="217.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="105" x="693.78" y="209.4818">SmartTools CLI</text><!--MD5=[9581351d4a2028020f5e3315621c6150]
|
|
cluster Web Application--><polygon fill="#FFFFFF" filter="url(#f14o8l4xcccnkh)" points="112.78,334.5158,232.78,334.5158,239.78,359.5838,407.78,359.5838,407.78,571.5158,112.78,571.5158,112.78,334.5158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="112.78" x2="239.78" y1="359.5838" y2="359.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="114" x="116.78" y="351.4818">Web Application</text><!--MD5=[ba741963d419160dafadc9ff4e43de37]
|
|
cluster Registry API--><polygon fill="#FFFFFF" filter="url(#f14o8l4xcccnkh)" points="561.78,478.5158,652.78,478.5158,659.78,503.5838,855.78,503.5838,855.78,739.0158,561.78,739.0158,561.78,478.5158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="561.78" x2="659.78" y1="503.5838" y2="503.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="85" x="565.78" y="495.4818">Registry API</text><!--MD5=[023fe2768d341cd525e8503fdfbee177]
|
|
cluster Data Layer--><polygon fill="#FFFFFF" filter="url(#f14o8l4xcccnkh)" points="879.78,635.0158,959.78,635.0158,966.78,660.0838,1168.78,660.0838,1168.78,750.0158,879.78,750.0158,879.78,635.0158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="879.78" x2="966.78" y1="660.0838" y2="660.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="74" x="883.78" y="651.9818">Data Layer</text><!--MD5=[056db7644fd855972490fe1694f3faa1]
|
|
cluster External--><polygon fill="#FFFFFF" filter="url(#f14o8l4xcccnkh)" points="264.78,646.0158,327.78,646.0158,334.78,671.0838,496.78,671.0838,496.78,739.0158,264.78,739.0158,264.78,646.0158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="264.78" x2="334.78" y1="671.0838" y2="671.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="57" x="268.78" y="662.9818">External</text><!--MD5=[df6a39b053164d23cc3ecae9c3484a54]
|
|
entity CLI--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="106" x="607.78" y="86.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="602.78" y="91.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="602.78" y="115.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="86" x="617.78" y="111.4818">Terminal/CLI</text><!--MD5=[e9dede37b31fdda9664526f66258b036]
|
|
entity Browser--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="109" x="463.28" y="86.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="458.28" y="91.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="458.28" y="115.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="89" x="473.28" y="111.4818">Web Browser</text><!--MD5=[5001853de30706f6ebd257c1547af469]
|
|
entity SMT--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="162" x="705.78" y="230.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="700.78" y="235.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="700.78" y="259.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="142" x="715.78" y="255.4818">smarttools command</text><!--MD5=[b44dd552d190738f366cb0d4cbe6023c]
|
|
entity Runner--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="102" x="705.78" y="372.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="700.78" y="377.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="700.78" y="401.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="82" x="715.78" y="397.4818">Tool Runner</text><!--MD5=[a535607fc6e1e098ee79a6f04a363106]
|
|
entity RegClient--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="842.78" y="372.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="837.78" y="377.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="837.78" y="401.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="98" x="852.78" y="397.4818">Registry Client</text><!--MD5=[ed05b4b62fc63017e649bfedb1046e43]
|
|
entity WebApp--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="205.78" y="372.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="200.78" y="377.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="200.78" y="401.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="98" x="215.78" y="397.4818">Flask Web App</text><!--MD5=[ca4719ec8dae7adc7b82816388a52075]
|
|
entity Templates--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="123" x="129.28" y="516.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="124.28" y="521.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="124.28" y="545.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="103" x="139.28" y="541.4818">Jinja Templates</text><!--MD5=[169e6db3b10d0b8bb941037d67bc5092]
|
|
entity Static--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="104" x="287.78" y="516.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="282.78" y="521.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="282.78" y="545.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="84" x="297.78" y="541.4818">Static Assets</text><!--MD5=[645d8587175d8f7ad110cd370775931d]
|
|
entity API--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="79" x="639.28" y="516.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="634.28" y="521.5158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="634.28" y="545.5838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="59" x="649.28" y="541.4818">Flask API</text><!--MD5=[d13fa8fc13b0f8aa3fa6202b21bee041]
|
|
entity RateLimit--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="101" x="578.28" y="684.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="573.28" y="689.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="573.28" y="713.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="81" x="588.28" y="708.9818">Rate Limiter</text><!--MD5=[39222abbbfd087a4fdab60e627dc976f]
|
|
entity Auth--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="110" x="714.78" y="684.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="709.78" y="689.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="709.78" y="713.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="90" x="724.78" y="708.9818">Auth Handler</text><!--MD5=[f9ba5bf973e7832d2ce5ed59077b93f7]
|
|
entity DB--><path d="M895.78,689.5158 C895.78,679.5158 948.78,679.5158 948.78,679.5158 C948.78,679.5158 1001.78,679.5158 1001.78,689.5158 L1001.78,717.5838 C1001.78,727.5838 948.78,727.5838 948.78,727.5838 C948.78,727.5838 895.78,727.5838 895.78,717.5838 L895.78,689.5158 " fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M895.78,689.5158 C895.78,699.5158 948.78,699.5158 948.78,699.5158 C948.78,699.5158 1001.78,699.5158 1001.78,689.5158 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="86" x="905.78" y="718.4818">SQLite (FTS5)</text><!--MD5=[254dae887335c3822701f7dbc12ae4f5]
|
|
entity ToolDir--><polygon fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" points="1037.28,673.0158,1083.28,673.0158,1090.28,694.0158,1152.28,694.0158,1152.28,734.1517,1037.28,734.1517,1037.28,673.0158" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1037.28" x2="1090.28" y1="694.0158" y2="694.0158"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="1047.28" y="715.9818">/.smarttools/</text><!--MD5=[fa5f2ca45d7d71a02e00e9182531f689]
|
|
entity Providers--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="101" x="379.28" y="684.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="374.28" y="689.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="374.28" y="713.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="81" x="389.28" y="708.9818">AI Providers</text><!--MD5=[8c1934be4febfaef4a9f4ab6ed25d16c]
|
|
entity Sentry--><rect fill="#FEFECE" filter="url(#f14o8l4xcccnkh)" height="39.0679" style="stroke: #A80036; stroke-width: 1.5;" width="63" x="281.28" y="684.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="276.28" y="689.0158"/><rect fill="#FEFECE" height="5" style="stroke: #A80036; stroke-width: 1.5;" width="10" x="276.28" y="713.0838"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="43" x="291.28" y="708.9818">Sentry</text><path d="M1187.28,636.5158 L1187.28,770.458 L1310.28,770.458 L1310.28,646.5158 L1300.28,636.5158 L1187.28,636.5158 " fill="#FBFB77" filter="url(#f14o8l4xcccnkh)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1300.28,636.5158 L1300.28,646.5158 L1310.28,646.5158 L1300.28,636.5158 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="41" x="1193.28" y="655.4129">Tables:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="69" x="1193.28" y="673.1189">- publishers</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="37" x="1193.28" y="690.8249">- tools</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="72" x="1193.28" y="708.5309">- api_tokens</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="102" x="1193.28" y="726.2369">- download_stats</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="70" x="1193.28" y="743.9429">- pageviews</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="58" x="1193.28" y="761.649">- tools_fts</text><path d="M1345.78,663.0158 L1345.78,743.8399 L1485.78,743.8399 L1485.78,673.0158 L1475.78,663.0158 L1345.78,663.0158 " fill="#FBFB77" filter="url(#f14o8l4xcccnkh)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1475.78,663.0158 L1475.78,673.0158 L1485.78,673.0158 L1475.78,663.0158 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="78" x="1351.78" y="681.9129">/.smarttools/</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="119" x="1351.78" y="699.6189">- <tool>/config.yaml</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="96" x="1351.78" y="717.3249">- providers.yaml</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="76" x="1351.78" y="735.0309">- config.yaml</text><!--MD5=[a914275849a484c1781b941144137745]
|
|
link CLI to SMT--><path d="M677.25,125.5758 C700.27,151.5158 742,198.5558 766.77,226.4758 " fill="none" id="CLI->SMT" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="770.3,230.4458,767.3282,221.056,766.9853,226.7025,761.3388,226.3596,770.3,230.4458" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="27" x="720.78" y="172.4129">runs</text><!--MD5=[085d57b09593e7e9cf7687a504fdb484]
|
|
link SMT to Runner--><path d="M764.15,269.9658 C756.11,278.1358 748.01,288.3658 743.78,299.5158 C735.45,321.4558 740.88,348.1858 747.07,367.0758 " fill="none" id="SMT->Runner" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="748.82,372.1858,749.6978,362.3762,747.2046,367.454,742.1268,364.9608,748.82,372.1858" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="86" x="744.78" y="314.4129">executes tools</text><!--MD5=[4a6a838f5ff88306718e7b1811ffe0fb]
|
|
link Runner to ToolDir--><path d="M782.14,411.7858 C802.47,427.0858 831.51,449.5258 855.78,470.5158 C931.98,536.4258 947.82,556.4958 1019.78,627.0158 C1033.77,640.7258 1049.04,656.0358 1062.12,669.2558 " fill="none" id="Runner->ToolDir" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1065.75,672.9358,1062.2702,663.7222,1062.236,669.379,1056.5792,669.3447,1065.75,672.9358" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="79" x="970.78" y="541.4129">reads configs</text><!--MD5=[31706ce452168553514d7b7f71f929ef]
|
|
link Runner to Providers--><path d="M705.48,399.0058 C653.73,407.3258 573.96,426.6858 519.78,470.5158 C454.12,523.6258 436.26,630.8858 431.48,678.6458 " fill="none" id="Runner->Providers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="430.99,683.8958,435.7951,675.2987,431.4465,678.9167,427.8285,674.5682,430.99,683.8958" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="40" x="520.78" y="541.4129">calls AI</text><!--MD5=[c94d411a20dc9d18f64ad7b39e7d3d31]
|
|
link SMT to RegClient--><path d="M807.09,269.6558 C816.22,278.3958 826.91,289.1458 835.78,299.5158 C854.84,321.7958 874.17,349.2958 886.94,368.3058 " fill="none" id="SMT->RegClient" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="889.73,372.4658,888.0428,362.7626,886.9466,368.3122,881.397,367.216,889.73,372.4658" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="84" x="849.78" y="314.4129">install/publish</text><!--MD5=[03b7a3b7bcc40b0c5fa5584932e46fbc]
|
|
link Browser to WebApp--><path d="M501.18,125.6458 C456.41,175.9058 333.31,314.0858 284.8,368.5358 " fill="none" id="Browser->WebApp" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="281.44,372.3158,290.4176,368.2658,284.7698,368.5859,284.4497,362.9381,281.44,372.3158" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="87" x="449.78" y="255.4129">HTTP requests</text><!--MD5=[a35c05fcd6e2843340593eaa15d9f1c6]
|
|
link WebApp to Templates--><path d="M209.54,411.7558 C195.42,419.3358 181.94,429.6558 173.78,443.5158 C161.54,464.3058 169.36,491.9858 178.01,511.4358 " fill="none" id="WebApp->Templates" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="180.21,516.1858,180.0644,506.3381,178.112,511.6473,172.8028,509.6949,180.21,516.1858" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="46" x="174.78" y="458.4129">renders</text><!--MD5=[21fd5f8483cead33a28cc749629eb61e]
|
|
link WebApp to Static--><path d="M259.69,411.5258 C256.7,426.0158 254.73,446.3558 261.78,462.5158 C262.15,463.3658 292.79,491.7158 315.55,512.7058 " fill="none" id="WebApp->Static" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="319.42,516.2758,315.5155,507.234,315.7443,512.8862,310.0921,513.1151,319.42,516.2758" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="79" x="262.78" y="458.4129">serves CSS/JS</text><!--MD5=[430e7c55d2c04d254fb667505dce0de7]
|
|
link WebApp to API--><path d="M324.03,409.7758 C375.37,424.6458 451.48,447.5158 516.78,470.5158 C557.06,484.7058 602.13,502.8358 634.49,516.2658 " fill="none" id="WebApp->API" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="639.17,518.2058,632.4086,511.0446,634.5567,516.2777,629.3236,518.4258,639.17,518.2058" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="74" x="490.78" y="458.4129">internal calls</text><!--MD5=[ac56397c80aa206a439b95a4bc6e68f5]
|
|
link RegClient to API--><path d="M872.62,411.5758 C831.31,437.8858 755.9,485.9058 712.31,513.6658 " fill="none" id="RegClient->API" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="707.94,516.4458,717.6795,514.9822,712.1565,513.7587,713.3801,508.2357,707.94,516.4458" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="52" x="817.78" y="458.4129">REST API</text><!--MD5=[cb843315cbb96b5d12052ada081a7869]
|
|
link API to RateLimit--><path d="M640.62,555.6758 C628.49,563.6758 616.49,574.2758 609.78,587.5158 C594.93,616.7858 606.52,655.1258 617.01,679.2958 " fill="none" id="API->RateLimit" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="619.09,683.9358,619.0585,674.087,617.0447,679.3733,611.7585,677.3595,619.09,683.9358" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="86" x="610.78" y="602.4129">enforces limits</text><!--MD5=[35b34b4d27a4d3597af9f2ffda93764a]
|
|
link API to Auth--><path d="M689.04,555.6758 C705.74,586.0558 738.77,646.1158 756.98,679.2358 " fill="none" id="API->Auth" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="759.55,683.9158,758.7139,674.1025,757.1388,679.5357,751.7056,677.9605,759.55,683.9158" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="97" x="716.78" y="602.4129">validates tokens</text><!--MD5=[b874c2a0ce20abc088b74c0c7c933d7a]
|
|
link API to DB--><path d="M718.54,546.3158 C748.56,554.4158 790.03,567.9458 822.78,587.5158 C863,611.5458 901.64,649.8058 925.28,675.5158 " fill="none" id="API->DB" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="928.66,679.2158,925.5549,669.8693,925.2924,675.52,919.6416,675.2575,928.66,679.2158" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="44" x="849.78" y="602.4129">queries</text><!--MD5=[5e0692d7836b022fdee864f5eba8d7eb]
|
|
link WebApp to Sentry--><path d="M205.65,393.8858 C149.35,398.2458 67.37,414.6058 26.78,470.5158 C-1.68,509.7158 0.14,539.0558 26.78,579.5158 C83.01,664.9158 212.32,691.2658 275.99,699.2058 " fill="none" id="WebApp->Sentry" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><polygon fill="#A80036" points="281.2,699.8358,272.7441,694.7863,276.236,699.2367,271.7856,702.7286,281.2,699.8358" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="83" x="27.78" y="541.4129">reports errors</text><!--MD5=[3c65e303467f427a981473c1f270161b]
|
|
link API to Sentry--><path d="M639.09,547.4858 C556.57,569.3658 373.17,618.6058 361.78,627.0158 C343.74,640.3358 330.52,662.4458 322.4,679.3058 " fill="none" id="API->Sentry" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><polygon fill="#A80036" points="320.24,683.9158,327.6796,677.462,322.3607,679.3879,320.4349,674.0689,320.24,683.9158" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="83" x="490.78" y="602.4129">reports errors</text><!--MD5=[ab5d13770903a4b42001319b58679495]
|
|
link DB to GMN39--><path d="M961.95,679.1458 C976.66,654.7658 1003,618.7358 1037.28,603.2658 C1083.46,582.4358 1104.6,583.5558 1151.28,603.2658 C1168.83,610.6858 1184.79,622.9758 1198.48,636.4558 " fill="none" id="DB-GMN39" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><!--MD5=[f1d4897222436a13cb915f45ce489a7c]
|
|
link ToolDir to GMN42--><path d="M1113.13,672.5458 C1129.27,648.6358 1155.17,617.3258 1187.28,603.2658 C1237.35,581.3358 1259.51,582.9958 1310.28,603.2658 C1340.55,615.3558 1367.1,640.7158 1385.99,662.9058 " fill="none" id="ToolDir-GMN42" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><!--MD5=[27421e287e173a193baeb787c08332a4]
|
|
@startuml system-architecture
|
|
skinparam backgroundColor white
|
|
skinparam componentStyle rectangle
|
|
|
|
title SmartTools System Architecture
|
|
|
|
package "User Interfaces" {
|
|
[Terminal/CLI] as CLI
|
|
[Web Browser] as Browser
|
|
}
|
|
|
|
package "SmartTools CLI" {
|
|
[smarttools command] as SMT
|
|
[Tool Runner] as Runner
|
|
[Registry Client] as RegClient
|
|
}
|
|
|
|
package "Web Application" {
|
|
[Flask Web App] as WebApp
|
|
[Jinja Templates] as Templates
|
|
[Static Assets] as Static
|
|
}
|
|
|
|
package "Registry API" {
|
|
[Flask API] as API
|
|
[Rate Limiter] as RateLimit
|
|
[Auth Handler] as Auth
|
|
}
|
|
|
|
package "Data Layer" {
|
|
database "SQLite (FTS5)" as DB
|
|
folder "~/.smarttools/" as ToolDir
|
|
}
|
|
|
|
package "External" {
|
|
[AI Providers] as Providers
|
|
[Sentry] as Sentry
|
|
}
|
|
|
|
CLI - -> SMT : runs
|
|
SMT - -> Runner : executes tools
|
|
Runner - -> ToolDir : reads configs
|
|
Runner - -> Providers : calls AI
|
|
SMT - -> RegClient : install/publish
|
|
|
|
Browser - -> WebApp : HTTP requests
|
|
WebApp - -> Templates : renders
|
|
WebApp - -> Static : serves CSS/JS
|
|
WebApp - -> API : internal calls
|
|
|
|
RegClient - -> API : REST API
|
|
API - -> RateLimit : enforces limits
|
|
API - -> Auth : validates tokens
|
|
API - -> DB : queries
|
|
|
|
WebApp ..> Sentry : reports errors
|
|
API ..> Sentry : reports errors
|
|
|
|
note right of DB
|
|
Tables:
|
|
- publishers
|
|
- tools
|
|
- api_tokens
|
|
- download_stats
|
|
- pageviews
|
|
- tools_fts
|
|
end note
|
|
|
|
note right of ToolDir
|
|
~/.smarttools/
|
|
- <tool>/config.yaml
|
|
- providers.yaml
|
|
- config.yaml
|
|
end note
|
|
|
|
@enduml
|
|
|
|
PlantUML version 1.2020.02(Sun Mar 01 06:22:07 AST 2020)
|
|
(GPL source distribution)
|
|
Java Runtime: OpenJDK Runtime Environment
|
|
JVM: OpenJDK 64-Bit Server VM
|
|
Java Version: 21.0.8+9-Ubuntu-0ubuntu124.04.1
|
|
Operating System: Linux
|
|
Default Encoding: UTF-8
|
|
Language: en
|
|
Country: CA
|
|
--></g></svg> |