instar 0.24.18 → 0.24.21
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/.claude/settings.json +120 -0
- package/.claude/skills/setup-wizard/skill.md +2 -2
- package/dashboard/index.html +221 -336
- package/dist/cli.js +0 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +22 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +18 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +23 -2
- package/dist/commands/setup.js.map +1 -1
- package/dist/core/GitSync.d.ts +3 -2
- package/dist/core/GitSync.d.ts.map +1 -1
- package/dist/core/GitSync.js +19 -4
- package/dist/core/GitSync.js.map +1 -1
- package/dist/core/SessionManager.d.ts +1 -1
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/lifeline/ServerSupervisor.d.ts.map +1 -1
- package/dist/lifeline/ServerSupervisor.js +31 -0
- package/dist/lifeline/ServerSupervisor.js.map +1 -1
- package/dist/messaging/slack/SlackAdapter.d.ts +25 -4
- package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
- package/dist/messaging/slack/SlackAdapter.js +156 -12
- package/dist/messaging/slack/SlackAdapter.js.map +1 -1
- package/dist/messaging/slack/SocketModeClient.d.ts.map +1 -1
- package/dist/messaging/slack/SocketModeClient.js +11 -4
- package/dist/messaging/slack/SocketModeClient.js.map +1 -1
- package/dist/messaging/slack/types.d.ts +30 -0
- package/dist/messaging/slack/types.d.ts.map +1 -1
- package/dist/messaging/slack/types.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +4 -4
- package/upgrades/0.24.14.md +26 -0
- package/upgrades/0.24.18-beta.0.md +35 -0
- package/upgrades/0.24.18.md +26 -26
- package/upgrades/0.24.19.md +21 -0
- package/upgrades/0.24.21.md +25 -0
- package/upgrades/NEXT.md +45 -0
- /package/.claude/skills/secret-setup/{skill.md → SKILL.md} +0 -0
package/dashboard/index.html
CHANGED
|
@@ -1921,345 +1921,101 @@
|
|
|
1921
1921
|
.spark.s-skipped { background: #333; }
|
|
1922
1922
|
|
|
1923
1923
|
/* ── Discovery Tab ──────────────────────────────────────── */
|
|
1924
|
-
/* Systems Tab */
|
|
1925
|
-
.systems-container {
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
}
|
|
1931
|
-
|
|
1932
|
-
.systems-main {
|
|
1933
|
-
max-width: 900px;
|
|
1934
|
-
margin: 0 auto;
|
|
1935
|
-
}
|
|
1936
|
-
|
|
1937
|
-
.systems-header {
|
|
1938
|
-
display: flex;
|
|
1939
|
-
align-items: center;
|
|
1940
|
-
justify-content: space-between;
|
|
1941
|
-
margin-bottom: 20px;
|
|
1942
|
-
}
|
|
1943
|
-
|
|
1944
|
-
.systems-header h2 {
|
|
1945
|
-
font-size: 16px;
|
|
1946
|
-
font-weight: 600;
|
|
1947
|
-
color: var(--text-bright);
|
|
1948
|
-
}
|
|
1949
|
-
|
|
1950
|
-
.systems-refresh {
|
|
1951
|
-
font-size: 11px;
|
|
1952
|
-
padding: 4px 12px;
|
|
1953
|
-
border-radius: 4px;
|
|
1954
|
-
border: 1px solid var(--border);
|
|
1955
|
-
background: transparent;
|
|
1956
|
-
color: var(--text-dim);
|
|
1957
|
-
cursor: pointer;
|
|
1958
|
-
}
|
|
1959
|
-
|
|
1960
|
-
.systems-refresh:hover {
|
|
1961
|
-
border-color: var(--text-dim);
|
|
1962
|
-
color: var(--text);
|
|
1963
|
-
}
|
|
1924
|
+
/* ── Systems Tab ──────────────────────────────────────────── */
|
|
1925
|
+
.systems-container { grid-column: 1 / -1; overflow-y: auto; background: var(--bg); padding: 20px; }
|
|
1926
|
+
.systems-main { max-width: 960px; margin: 0 auto; }
|
|
1927
|
+
.systems-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; }
|
|
1928
|
+
.systems-header h2 { font-size: 16px; font-weight: 600; color: var(--text-bright); }
|
|
1929
|
+
.systems-refresh { font-size: 11px; padding: 4px 12px; border-radius: 4px; border: 1px solid var(--border); background: transparent; color: var(--text-dim); cursor: pointer; }
|
|
1930
|
+
.systems-refresh:hover { border-color: var(--text-dim); color: var(--text); }
|
|
1964
1931
|
|
|
1965
1932
|
/* Health Banner */
|
|
1966
|
-
.health-banner {
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
border-radius: 10px;
|
|
1972
|
-
margin-bottom: 24px;
|
|
1973
|
-
border: 1px solid var(--border);
|
|
1974
|
-
}
|
|
1975
|
-
|
|
1976
|
-
.health-banner.healthy {
|
|
1977
|
-
background: rgba(76, 175, 80, 0.08);
|
|
1978
|
-
border-color: rgba(76, 175, 80, 0.25);
|
|
1979
|
-
}
|
|
1980
|
-
|
|
1981
|
-
.health-banner.error {
|
|
1982
|
-
background: rgba(244, 67, 54, 0.08);
|
|
1983
|
-
border-color: rgba(244, 67, 54, 0.25);
|
|
1984
|
-
}
|
|
1985
|
-
|
|
1986
|
-
.health-banner.degraded {
|
|
1987
|
-
background: rgba(255, 152, 0, 0.08);
|
|
1988
|
-
border-color: rgba(255, 152, 0, 0.25);
|
|
1989
|
-
}
|
|
1990
|
-
|
|
1991
|
-
.health-icon {
|
|
1992
|
-
font-size: 28px;
|
|
1993
|
-
line-height: 1;
|
|
1994
|
-
flex-shrink: 0;
|
|
1995
|
-
}
|
|
1996
|
-
|
|
1933
|
+
.health-banner { display: flex; align-items: center; gap: 16px; padding: 18px 22px; border-radius: 10px; margin-bottom: 24px; border: 1px solid var(--border); }
|
|
1934
|
+
.health-banner.healthy { background: rgba(76,175,80,0.08); border-color: rgba(76,175,80,0.25); }
|
|
1935
|
+
.health-banner.error { background: rgba(244,67,54,0.08); border-color: rgba(244,67,54,0.25); }
|
|
1936
|
+
.health-banner.degraded { background: rgba(255,152,0,0.08); border-color: rgba(255,152,0,0.25); }
|
|
1937
|
+
.health-icon { font-size: 26px; line-height: 1; flex-shrink: 0; }
|
|
1997
1938
|
.health-banner.healthy .health-icon { color: var(--accent); }
|
|
1998
1939
|
.health-banner.error .health-icon { color: var(--red); }
|
|
1999
1940
|
.health-banner.degraded .health-icon { color: var(--orange); }
|
|
2000
|
-
|
|
2001
|
-
.health-text
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
.
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
}
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
}
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
.
|
|
2019
|
-
|
|
2020
|
-
}
|
|
2021
|
-
|
|
2022
|
-
.issue-card {
|
|
2023
|
-
display: flex;
|
|
2024
|
-
align-items: flex-start;
|
|
2025
|
-
gap: 12px;
|
|
2026
|
-
padding: 12px 16px;
|
|
2027
|
-
background: var(--bg-panel);
|
|
2028
|
-
border: 1px solid var(--border);
|
|
2029
|
-
border-left: 3px solid var(--red);
|
|
2030
|
-
border-radius: 6px;
|
|
2031
|
-
margin-bottom: 8px;
|
|
2032
|
-
}
|
|
2033
|
-
|
|
2034
|
-
.issue-card.warning {
|
|
2035
|
-
border-left-color: var(--orange);
|
|
2036
|
-
}
|
|
2037
|
-
|
|
2038
|
-
.issue-card-icon {
|
|
2039
|
-
font-size: 14px;
|
|
2040
|
-
margin-top: 1px;
|
|
2041
|
-
flex-shrink: 0;
|
|
2042
|
-
}
|
|
2043
|
-
|
|
2044
|
-
.issue-card-content {
|
|
2045
|
-
flex: 1;
|
|
2046
|
-
}
|
|
2047
|
-
|
|
2048
|
-
.issue-card-label {
|
|
2049
|
-
font-size: 13px;
|
|
2050
|
-
font-weight: 500;
|
|
2051
|
-
color: var(--text-bright);
|
|
2052
|
-
margin-bottom: 2px;
|
|
2053
|
-
}
|
|
2054
|
-
|
|
2055
|
-
.issue-card-desc {
|
|
2056
|
-
font-size: 12px;
|
|
2057
|
-
color: var(--text-dim);
|
|
2058
|
-
}
|
|
2059
|
-
|
|
2060
|
-
/* Capabilities Grid */
|
|
2061
|
-
.capabilities-section {
|
|
2062
|
-
margin-bottom: 24px;
|
|
2063
|
-
}
|
|
2064
|
-
|
|
2065
|
-
.capabilities-section-title {
|
|
2066
|
-
font-size: 12px;
|
|
2067
|
-
font-weight: 600;
|
|
2068
|
-
color: var(--text-dim);
|
|
2069
|
-
text-transform: uppercase;
|
|
2070
|
-
letter-spacing: 0.5px;
|
|
2071
|
-
margin-bottom: 12px;
|
|
2072
|
-
}
|
|
2073
|
-
|
|
2074
|
-
/* Capability Cards */
|
|
2075
|
-
.capability-card {
|
|
2076
|
-
background: var(--bg-panel);
|
|
2077
|
-
border: 1px solid var(--border);
|
|
2078
|
-
border-radius: 8px;
|
|
2079
|
-
margin-bottom: 6px;
|
|
2080
|
-
overflow: hidden;
|
|
2081
|
-
transition: border-color 0.15s;
|
|
2082
|
-
}
|
|
2083
|
-
|
|
2084
|
-
.capability-card:hover {
|
|
2085
|
-
border-color: rgba(255,255,255,0.12);
|
|
2086
|
-
}
|
|
2087
|
-
|
|
2088
|
-
.capability-card.expanded {
|
|
2089
|
-
border-color: var(--accent);
|
|
2090
|
-
}
|
|
2091
|
-
|
|
2092
|
-
.capability-card-header {
|
|
2093
|
-
display: flex;
|
|
2094
|
-
align-items: center;
|
|
2095
|
-
gap: 12px;
|
|
2096
|
-
padding: 14px 16px;
|
|
2097
|
-
cursor: pointer;
|
|
2098
|
-
user-select: none;
|
|
2099
|
-
}
|
|
2100
|
-
|
|
2101
|
-
.cap-dot {
|
|
2102
|
-
width: 8px;
|
|
2103
|
-
height: 8px;
|
|
2104
|
-
border-radius: 50%;
|
|
2105
|
-
flex-shrink: 0;
|
|
2106
|
-
}
|
|
2107
|
-
|
|
1941
|
+
.health-text { flex: 1; }
|
|
1942
|
+
.health-title { font-size: 15px; font-weight: 600; color: var(--text-bright); margin-bottom: 3px; }
|
|
1943
|
+
.health-meta { font-size: 12px; color: var(--text-dim); }
|
|
1944
|
+
|
|
1945
|
+
/* Issues */
|
|
1946
|
+
.issues-panel { margin-bottom: 24px; }
|
|
1947
|
+
.issue-card { display: flex; align-items: flex-start; gap: 12px; padding: 12px 16px; background: var(--bg-panel); border: 1px solid var(--border); border-left: 3px solid var(--red); border-radius: 6px; margin-bottom: 8px; }
|
|
1948
|
+
.issue-card.warning { border-left-color: var(--orange); }
|
|
1949
|
+
.issue-card-icon { font-size: 14px; margin-top: 1px; flex-shrink: 0; }
|
|
1950
|
+
.issue-card-content { flex: 1; }
|
|
1951
|
+
.issue-card-label { font-size: 13px; font-weight: 500; color: var(--text-bright); margin-bottom: 2px; }
|
|
1952
|
+
.issue-card-desc { font-size: 12px; color: var(--text-dim); }
|
|
1953
|
+
|
|
1954
|
+
/* Card Grid */
|
|
1955
|
+
.cap-section-title { font-size: 11px; font-weight: 600; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }
|
|
1956
|
+
.cap-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 10px; margin-bottom: 24px; }
|
|
1957
|
+
.cap-card { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 10px; padding: 16px 18px; cursor: pointer; transition: border-color 0.15s, transform 0.1s; display: flex; flex-direction: column; gap: 8px; }
|
|
1958
|
+
.cap-card:hover { border-color: rgba(255,255,255,0.15); transform: translateY(-1px); }
|
|
1959
|
+
.cap-card-top { display: flex; align-items: center; gap: 10px; }
|
|
1960
|
+
.cap-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
|
|
2108
1961
|
.cap-dot.active { background: var(--accent); }
|
|
2109
1962
|
.cap-dot.error { background: var(--red); }
|
|
2110
|
-
|
|
2111
|
-
.cap-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
}
|
|
2115
|
-
|
|
2116
|
-
.cap-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
}
|
|
2122
|
-
|
|
2123
|
-
.cap-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
}
|
|
2130
|
-
|
|
2131
|
-
.cap-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
}
|
|
2137
|
-
|
|
2138
|
-
.
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
.
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
}
|
|
2148
|
-
|
|
2149
|
-
.
|
|
2150
|
-
|
|
2151
|
-
}
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
}
|
|
2159
|
-
|
|
2160
|
-
.cap-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
margin-bottom: 6px;
|
|
2167
|
-
}
|
|
2168
|
-
|
|
2169
|
-
.cap-detail-processes {
|
|
2170
|
-
display: flex;
|
|
2171
|
-
flex-wrap: wrap;
|
|
2172
|
-
gap: 6px;
|
|
2173
|
-
}
|
|
2174
|
-
|
|
2175
|
-
.cap-detail-proc {
|
|
2176
|
-
display: flex;
|
|
2177
|
-
align-items: center;
|
|
2178
|
-
gap: 6px;
|
|
2179
|
-
padding: 4px 10px;
|
|
2180
|
-
background: var(--bg);
|
|
2181
|
-
border: 1px solid var(--border);
|
|
2182
|
-
border-radius: 4px;
|
|
2183
|
-
font-size: 11px;
|
|
2184
|
-
color: var(--text);
|
|
2185
|
-
}
|
|
2186
|
-
|
|
2187
|
-
.cap-detail-proc-dot {
|
|
2188
|
-
width: 5px;
|
|
2189
|
-
height: 5px;
|
|
2190
|
-
border-radius: 50%;
|
|
2191
|
-
}
|
|
2192
|
-
|
|
2193
|
-
/* Events Disclosure */
|
|
2194
|
-
.events-disclosure {
|
|
2195
|
-
margin-top: 8px;
|
|
2196
|
-
}
|
|
2197
|
-
|
|
2198
|
-
.events-disclosure-toggle {
|
|
2199
|
-
display: flex;
|
|
2200
|
-
align-items: center;
|
|
2201
|
-
gap: 8px;
|
|
2202
|
-
padding: 10px 0;
|
|
2203
|
-
cursor: pointer;
|
|
2204
|
-
user-select: none;
|
|
2205
|
-
font-size: 12px;
|
|
2206
|
-
color: var(--text-dim);
|
|
2207
|
-
border: none;
|
|
2208
|
-
background: none;
|
|
2209
|
-
width: 100%;
|
|
2210
|
-
text-align: left;
|
|
2211
|
-
}
|
|
2212
|
-
|
|
2213
|
-
.events-disclosure-toggle:hover {
|
|
2214
|
-
color: var(--text);
|
|
2215
|
-
}
|
|
2216
|
-
|
|
2217
|
-
.events-disclosure-arrow {
|
|
2218
|
-
font-size: 10px;
|
|
2219
|
-
transition: transform 0.2s;
|
|
2220
|
-
}
|
|
2221
|
-
|
|
2222
|
-
.events-disclosure.expanded .events-disclosure-arrow {
|
|
2223
|
-
transform: rotate(90deg);
|
|
2224
|
-
}
|
|
2225
|
-
|
|
2226
|
-
.events-disclosure-body {
|
|
2227
|
-
display: none;
|
|
2228
|
-
background: var(--bg-panel);
|
|
2229
|
-
border: 1px solid var(--border);
|
|
2230
|
-
border-radius: 8px;
|
|
2231
|
-
max-height: 300px;
|
|
2232
|
-
overflow-y: auto;
|
|
2233
|
-
}
|
|
2234
|
-
|
|
2235
|
-
.events-disclosure.expanded .events-disclosure-body {
|
|
2236
|
-
display: block;
|
|
2237
|
-
}
|
|
2238
|
-
|
|
2239
|
-
.systems-event-row {
|
|
2240
|
-
display: flex;
|
|
2241
|
-
align-items: center;
|
|
2242
|
-
gap: 10px;
|
|
2243
|
-
padding: 8px 14px;
|
|
2244
|
-
border-bottom: 1px solid var(--border);
|
|
2245
|
-
font-size: 12px;
|
|
2246
|
-
}
|
|
2247
|
-
|
|
2248
|
-
.systems-event-row:last-child {
|
|
2249
|
-
border-bottom: none;
|
|
2250
|
-
}
|
|
2251
|
-
|
|
2252
|
-
.systems-event-time {
|
|
2253
|
-
color: var(--text-dim);
|
|
2254
|
-
white-space: nowrap;
|
|
2255
|
-
font-size: 11px;
|
|
2256
|
-
min-width: 60px;
|
|
2257
|
-
}
|
|
2258
|
-
|
|
2259
|
-
.systems-event-text {
|
|
2260
|
-
color: var(--text);
|
|
2261
|
-
flex: 1;
|
|
2262
|
-
}
|
|
1963
|
+
.cap-card-name { font-size: 14px; font-weight: 600; color: var(--text-bright); flex: 1; }
|
|
1964
|
+
.cap-card-arrow { font-size: 11px; color: var(--text-dim); }
|
|
1965
|
+
.cap-card-desc { font-size: 12px; color: var(--text-dim); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
|
1966
|
+
.cap-card-metric { font-size: 12px; color: var(--accent); font-weight: 500; padding-top: 4px; border-top: 1px solid var(--border); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
1967
|
+
.cap-card.error .cap-card-metric { color: var(--red); }
|
|
1968
|
+
.cap-card-stats { display: flex; gap: 12px; flex-wrap: wrap; }
|
|
1969
|
+
.cap-stat { font-size: 11px; color: var(--text-dim); }
|
|
1970
|
+
.cap-stat-value { font-weight: 600; color: var(--text); margin-right: 3px; }
|
|
1971
|
+
|
|
1972
|
+
/* Detail View */
|
|
1973
|
+
.cap-detail-view { display: none; }
|
|
1974
|
+
.cap-detail-view.active { display: block; }
|
|
1975
|
+
.cap-detail-back { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text-dim); cursor: pointer; border: none; background: none; padding: 0; margin-bottom: 16px; }
|
|
1976
|
+
.cap-detail-back:hover { color: var(--text); }
|
|
1977
|
+
.cap-detail-header { margin-bottom: 20px; }
|
|
1978
|
+
.cap-detail-title { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
|
|
1979
|
+
.cap-detail-title h3 { font-size: 18px; font-weight: 600; color: var(--text-bright); margin: 0; }
|
|
1980
|
+
.cap-detail-description { font-size: 13px; color: var(--text-dim); line-height: 1.6; max-width: 700px; }
|
|
1981
|
+
.cap-stats-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; margin-bottom: 24px; }
|
|
1982
|
+
.cap-stat-card { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 8px; padding: 12px 14px; text-align: center; }
|
|
1983
|
+
.cap-stat-card-value { font-size: 20px; font-weight: 700; color: var(--text-bright); }
|
|
1984
|
+
.cap-stat-card-label { font-size: 10px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.3px; margin-top: 4px; }
|
|
1985
|
+
.cap-detail-section { margin-bottom: 20px; }
|
|
1986
|
+
.cap-detail-section-title { font-size: 11px; font-weight: 600; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border); }
|
|
1987
|
+
.cap-process-list { display: flex; flex-direction: column; gap: 6px; }
|
|
1988
|
+
.cap-process-row { display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: var(--bg-panel); border: 1px solid var(--border); border-radius: 6px; }
|
|
1989
|
+
.cap-process-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
|
|
1990
|
+
.cap-process-name { font-size: 13px; color: var(--text-bright); font-weight: 500; flex: 1; }
|
|
1991
|
+
.cap-process-status { font-size: 11px; color: var(--text-dim); }
|
|
1992
|
+
.cap-last-activity { font-size: 11px; color: var(--text-dim); margin-top: 4px; }
|
|
1993
|
+
|
|
1994
|
+
/* Events */
|
|
1995
|
+
.events-disclosure { margin-top: 8px; }
|
|
1996
|
+
.events-disclosure-toggle { display: flex; align-items: center; gap: 8px; padding: 10px 0; cursor: pointer; user-select: none; font-size: 12px; color: var(--text-dim); border: none; background: none; width: 100%; text-align: left; }
|
|
1997
|
+
.events-disclosure-toggle:hover { color: var(--text); }
|
|
1998
|
+
.events-disclosure-arrow { font-size: 10px; transition: transform 0.2s; }
|
|
1999
|
+
.events-disclosure.expanded .events-disclosure-arrow { transform: rotate(90deg); }
|
|
2000
|
+
.events-disclosure-body { display: none; background: var(--bg-panel); border: 1px solid var(--border); border-radius: 8px; max-height: 300px; overflow-y: auto; }
|
|
2001
|
+
.events-disclosure.expanded .events-disclosure-body { display: block; }
|
|
2002
|
+
.systems-event-row { display: flex; align-items: center; gap: 10px; padding: 8px 14px; border-bottom: 1px solid var(--border); font-size: 12px; }
|
|
2003
|
+
.systems-event-row:last-child { border-bottom: none; }
|
|
2004
|
+
.systems-event-time { color: var(--text-dim); white-space: nowrap; font-size: 11px; min-width: 60px; }
|
|
2005
|
+
.systems-event-text { color: var(--text); flex: 1; }
|
|
2006
|
+
|
|
2007
|
+
/* Content Browser (browsable stats) */
|
|
2008
|
+
.cap-content-panel { background: var(--bg); border: 1px solid var(--border); border-radius: 8px; margin-top: 12px; overflow: hidden; }
|
|
2009
|
+
.cap-content-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; border-bottom: 1px solid var(--border); font-size: 12px; font-weight: 600; color: var(--text-bright); }
|
|
2010
|
+
.cap-content-body { max-height: 400px; overflow-y: auto; padding: 8px; }
|
|
2011
|
+
.cap-content-item { padding: 10px 12px; border: 1px solid var(--border); border-radius: 6px; margin-bottom: 6px; background: var(--bg-panel); }
|
|
2012
|
+
.cap-content-item-title { font-size: 13px; font-weight: 500; color: var(--text-bright); margin-bottom: 4px; }
|
|
2013
|
+
.cap-content-item-body { font-size: 12px; color: var(--text-dim); line-height: 1.5; word-break: break-word; }
|
|
2014
|
+
.cap-content-item-time { font-size: 11px; color: var(--text-dim); margin-top: 4px; }
|
|
2015
|
+
.cap-content-tag { display: inline-block; font-size: 10px; padding: 2px 8px; border-radius: 3px; background: rgba(255,255,255,0.06); color: var(--text-dim); margin-right: 4px; margin-top: 4px; }
|
|
2016
|
+
.cap-content-tag.applied { background: rgba(76,175,80,0.15); color: var(--accent); }
|
|
2017
|
+
.cap-content-empty { padding: 16px; text-align: center; color: var(--text-dim); font-size: 12px; }
|
|
2018
|
+
.cap-stat-card:hover { border-color: var(--accent); transition: border-color 0.15s; }
|
|
2263
2019
|
|
|
2264
2020
|
.discovery-container {
|
|
2265
2021
|
grid-column: 1 / -1;
|
|
@@ -5741,7 +5497,7 @@
|
|
|
5741
5497
|
document.getElementById('systemsDetailView').classList.add('active');
|
|
5742
5498
|
const content = document.getElementById('systemsDetailContent');
|
|
5743
5499
|
|
|
5744
|
-
const statCards = buildStatCards(cap.stats || {});
|
|
5500
|
+
const statCards = buildStatCards(cap.stats || {}, capId);
|
|
5745
5501
|
const processRows = (cap.processes || []).map(p => {
|
|
5746
5502
|
const dotColor = p.status === 'running' ? 'var(--accent)' : 'var(--red)';
|
|
5747
5503
|
return `<div class="cap-process-row">
|
|
@@ -5763,7 +5519,7 @@
|
|
|
5763
5519
|
<div class="cap-detail-description">${esc(cap.description)}</div>
|
|
5764
5520
|
${lastAct}
|
|
5765
5521
|
</div>
|
|
5766
|
-
${statCards ? '<div class="cap-detail-section"><div class="cap-detail-section-title">Metrics</div><div class="cap-stats-grid">' + statCards + '</div></div>' : ''}
|
|
5522
|
+
${statCards ? '<div class="cap-detail-section"><div class="cap-detail-section-title">Metrics</div><div class="cap-stats-grid">' + statCards + '</div><div id="capContentBrowser"></div></div>' : ''}
|
|
5767
5523
|
<div class="cap-detail-section">
|
|
5768
5524
|
<div class="cap-detail-section-title">Components (${(cap.processes || []).length})</div>
|
|
5769
5525
|
<div class="cap-process-list">${processRows}</div>
|
|
@@ -5774,7 +5530,31 @@
|
|
|
5774
5530
|
</div>`;
|
|
5775
5531
|
}
|
|
5776
5532
|
|
|
5777
|
-
|
|
5533
|
+
// Map stat keys to browsable content endpoints
|
|
5534
|
+
const BROWSABLE_STATS = {
|
|
5535
|
+
// Evolution
|
|
5536
|
+
learnings: { endpoint: '/evolution/learnings', label: 'Learnings', renderer: 'renderLearnings' },
|
|
5537
|
+
proposals: { endpoint: '/evolution/proposals', label: 'Proposals', renderer: 'renderProposals' },
|
|
5538
|
+
gaps: { endpoint: '/evolution/gaps', label: 'Capability Gaps', renderer: 'renderGaps' },
|
|
5539
|
+
actions: { endpoint: '/evolution/actions', label: 'Actions', renderer: 'renderActions' },
|
|
5540
|
+
overdueActions: { endpoint: '/evolution/actions/overdue', label: 'Overdue Actions', renderer: 'renderActions' },
|
|
5541
|
+
// Health
|
|
5542
|
+
coherenceChecks: { endpoint: '/health/coherence', label: 'Coherence Report', renderer: 'renderCoherence' },
|
|
5543
|
+
coherencePassed: { endpoint: '/health/coherence', label: 'Coherence Report', renderer: 'renderCoherence' },
|
|
5544
|
+
coherenceFailed: { endpoint: '/health/coherence', label: 'Coherence Report', renderer: 'renderCoherence' },
|
|
5545
|
+
// Recovery
|
|
5546
|
+
totalTriages: { endpoint: '/triage/history?limit=20', label: 'Triage History', renderer: 'renderTriageHistory' },
|
|
5547
|
+
interventions: { endpoint: '/watchdog/status', label: 'Watchdog Status', renderer: 'renderWatchdog' },
|
|
5548
|
+
recoveries: { endpoint: '/watchdog/status', label: 'Watchdog Status', renderer: 'renderWatchdog' },
|
|
5549
|
+
// Jobs
|
|
5550
|
+
totalJobs: { endpoint: '/jobs', label: 'Jobs', renderer: 'renderJobs' },
|
|
5551
|
+
enabledJobs: { endpoint: '/jobs', label: 'Jobs', renderer: 'renderJobs' },
|
|
5552
|
+
// Telegram
|
|
5553
|
+
totalMessages: { endpoint: '/telegram/log-stats', label: 'Message Stats', renderer: 'renderTelegramStats' },
|
|
5554
|
+
topicMappings: { endpoint: '/telegram/log-stats', label: 'Message Stats', renderer: 'renderTelegramStats' },
|
|
5555
|
+
};
|
|
5556
|
+
|
|
5557
|
+
function buildStatCards(stats, capId) {
|
|
5778
5558
|
if (!stats || typeof stats !== 'object') return '';
|
|
5779
5559
|
const map = {
|
|
5780
5560
|
interventions: 'Interventions', recoveries: 'Recoveries', sessionDeaths: 'Deaths',
|
|
@@ -5792,12 +5572,117 @@
|
|
|
5792
5572
|
const cards = [];
|
|
5793
5573
|
for (const [key, label] of Object.entries(map)) {
|
|
5794
5574
|
if (stats[key] != null && typeof stats[key] === 'number') {
|
|
5795
|
-
|
|
5575
|
+
const browsable = BROWSABLE_STATS[key];
|
|
5576
|
+
const clickAttr = browsable ? ` onclick="browseStatContent('${key}')" style="cursor:pointer"` : '';
|
|
5577
|
+
const browseHint = browsable ? '<div style="font-size:9px;color:var(--accent);margin-top:2px">click to view</div>' : '';
|
|
5578
|
+
cards.push(`<div class="cap-stat-card"${clickAttr}><div class="cap-stat-card-value">${stats[key]}</div><div class="cap-stat-card-label">${esc(label)}</div>${browseHint}</div>`);
|
|
5796
5579
|
}
|
|
5797
5580
|
}
|
|
5798
5581
|
return cards.join('');
|
|
5799
5582
|
}
|
|
5800
5583
|
|
|
5584
|
+
async function browseStatContent(statKey) {
|
|
5585
|
+
const info = BROWSABLE_STATS[statKey];
|
|
5586
|
+
if (!info) return;
|
|
5587
|
+
const panel = document.getElementById('capContentBrowser');
|
|
5588
|
+
if (!panel) return;
|
|
5589
|
+
panel.innerHTML = '<div style="padding:12px;color:var(--text-dim);font-size:12px">Loading ' + esc(info.label) + '...</div>';
|
|
5590
|
+
try {
|
|
5591
|
+
const data = await apiFetch(info.endpoint);
|
|
5592
|
+
panel.innerHTML = '<div class="cap-content-panel">' +
|
|
5593
|
+
'<div class="cap-content-header"><span>' + esc(info.label) + '</span><button onclick="document.getElementById(\'capContentBrowser\').innerHTML=\'\'" style="border:none;background:none;color:var(--text-dim);cursor:pointer;font-size:14px">×</button></div>' +
|
|
5594
|
+
'<div class="cap-content-body">' + renderBrowsableContent(info.renderer, data) + '</div></div>';
|
|
5595
|
+
} catch (e) {
|
|
5596
|
+
panel.innerHTML = '<div style="padding:12px;color:var(--red);font-size:12px">Failed to load: ' + esc(e.message) + '</div>';
|
|
5597
|
+
}
|
|
5598
|
+
}
|
|
5599
|
+
|
|
5600
|
+
function renderBrowsableContent(renderer, data) {
|
|
5601
|
+
switch (renderer) {
|
|
5602
|
+
case 'renderLearnings': {
|
|
5603
|
+
const items = data.learnings || data || [];
|
|
5604
|
+
if (!Array.isArray(items) || items.length === 0) return '<div class="cap-content-empty">No learnings recorded</div>';
|
|
5605
|
+
return items.map(l => `<div class="cap-content-item">
|
|
5606
|
+
<div class="cap-content-item-title">${esc(l.title || l.insight || l.id || 'Untitled')}</div>
|
|
5607
|
+
${l.description || l.context ? '<div class="cap-content-item-body">' + esc(l.description || l.context || '') + '</div>' : ''}
|
|
5608
|
+
${l.category ? '<span class="cap-content-tag">' + esc(l.category) + '</span>' : ''}
|
|
5609
|
+
${l.applied ? '<span class="cap-content-tag applied">Applied</span>' : ''}
|
|
5610
|
+
${l.createdAt ? '<div class="cap-content-item-time">' + esc(timeAgo(l.createdAt)) + '</div>' : ''}
|
|
5611
|
+
</div>`).join('');
|
|
5612
|
+
}
|
|
5613
|
+
case 'renderProposals': {
|
|
5614
|
+
const items = data.proposals || data || [];
|
|
5615
|
+
if (!Array.isArray(items) || items.length === 0) return '<div class="cap-content-empty">No proposals</div>';
|
|
5616
|
+
return items.map(p => `<div class="cap-content-item">
|
|
5617
|
+
<div class="cap-content-item-title">${esc(p.title || p.id || 'Untitled')}</div>
|
|
5618
|
+
${p.description ? '<div class="cap-content-item-body">' + esc(p.description) + '</div>' : ''}
|
|
5619
|
+
${p.status ? '<span class="cap-content-tag">' + esc(p.status) + '</span>' : ''}
|
|
5620
|
+
${p.type ? '<span class="cap-content-tag">' + esc(p.type) + '</span>' : ''}
|
|
5621
|
+
</div>`).join('');
|
|
5622
|
+
}
|
|
5623
|
+
case 'renderGaps': {
|
|
5624
|
+
const items = data.gaps || data || [];
|
|
5625
|
+
if (!Array.isArray(items) || items.length === 0) return '<div class="cap-content-empty">No gaps detected</div>';
|
|
5626
|
+
return items.map(g => `<div class="cap-content-item">
|
|
5627
|
+
<div class="cap-content-item-title">${esc(g.title || g.capability || g.id || 'Untitled')}</div>
|
|
5628
|
+
${g.description ? '<div class="cap-content-item-body">' + esc(g.description) + '</div>' : ''}
|
|
5629
|
+
${g.severity ? '<span class="cap-content-tag">' + esc(g.severity) + '</span>' : ''}
|
|
5630
|
+
</div>`).join('');
|
|
5631
|
+
}
|
|
5632
|
+
case 'renderActions': {
|
|
5633
|
+
const items = data.actions || data || [];
|
|
5634
|
+
if (!Array.isArray(items) || items.length === 0) return '<div class="cap-content-empty">No actions</div>';
|
|
5635
|
+
return items.map(a => `<div class="cap-content-item">
|
|
5636
|
+
<div class="cap-content-item-title">${esc(a.title || a.action || a.id || 'Untitled')}</div>
|
|
5637
|
+
${a.status ? '<span class="cap-content-tag">' + esc(a.status) + '</span>' : ''}
|
|
5638
|
+
${a.dueAt ? '<div class="cap-content-item-time">Due: ' + esc(timeAgo(a.dueAt)) + '</div>' : ''}
|
|
5639
|
+
</div>`).join('');
|
|
5640
|
+
}
|
|
5641
|
+
case 'renderCoherence': {
|
|
5642
|
+
const report = data.lastReport || data;
|
|
5643
|
+
if (!report || !report.checks) return '<div class="cap-content-empty">No coherence data</div>';
|
|
5644
|
+
return report.checks.map(c => `<div class="cap-content-item" style="border-left:3px solid ${c.passed ? 'var(--accent)' : 'var(--red)'}">
|
|
5645
|
+
<div class="cap-content-item-title">${c.passed ? '✓' : '✗'} ${esc(c.name)}</div>
|
|
5646
|
+
<div class="cap-content-item-body">${esc(c.message)}</div>
|
|
5647
|
+
</div>`).join('');
|
|
5648
|
+
}
|
|
5649
|
+
case 'renderTriageHistory': {
|
|
5650
|
+
const items = data.history || data || [];
|
|
5651
|
+
if (!Array.isArray(items) || items.length === 0) return '<div class="cap-content-empty">No triage history</div>';
|
|
5652
|
+
return items.map(t => `<div class="cap-content-item">
|
|
5653
|
+
<div class="cap-content-item-title">Topic ${t.topicId} — ${esc(t.sessionName || 'unknown')}</div>
|
|
5654
|
+
<div class="cap-content-item-body">${t.result ? esc(JSON.stringify(t.result.actionsTaken || t.result, null, 0).substring(0, 200)) : ''}</div>
|
|
5655
|
+
${t.timestamp ? '<div class="cap-content-item-time">' + esc(timeAgo(t.timestamp)) + '</div>' : ''}
|
|
5656
|
+
</div>`).join('');
|
|
5657
|
+
}
|
|
5658
|
+
case 'renderWatchdog': {
|
|
5659
|
+
const hist = data.interventionHistory || [];
|
|
5660
|
+
if (hist.length === 0) return '<div class="cap-content-empty">No interventions recorded</div>';
|
|
5661
|
+
return hist.map(h => `<div class="cap-content-item">
|
|
5662
|
+
<div class="cap-content-item-title">PID ${h.stuckPid || '?'} — ${esc(h.level || h.outcome || 'intervention')}</div>
|
|
5663
|
+
${h.outcome ? '<span class="cap-content-tag">' + esc(h.outcome) + '</span>' : ''}
|
|
5664
|
+
${h.timestamp ? '<div class="cap-content-item-time">' + esc(timeAgo(h.timestamp)) + '</div>' : ''}
|
|
5665
|
+
</div>`).join('');
|
|
5666
|
+
}
|
|
5667
|
+
case 'renderJobs': {
|
|
5668
|
+
const jobs = data.jobs || data || [];
|
|
5669
|
+
if (!Array.isArray(jobs) || jobs.length === 0) return '<div class="cap-content-empty">No jobs</div>';
|
|
5670
|
+
return jobs.slice(0, 20).map(j => `<div class="cap-content-item">
|
|
5671
|
+
<div class="cap-content-item-title">${esc(j.slug || j.name || 'unnamed')}</div>
|
|
5672
|
+
<div class="cap-content-item-body">${esc(j.cron || '')} ${j.enabled === false ? '(disabled)' : ''}</div>
|
|
5673
|
+
</div>`).join('');
|
|
5674
|
+
}
|
|
5675
|
+
case 'renderTelegramStats': {
|
|
5676
|
+
return `<div class="cap-content-item">
|
|
5677
|
+
<div class="cap-content-item-title">Message Log</div>
|
|
5678
|
+
<div class="cap-content-item-body">Total messages: ${data.totalMessages || '?'}<br>Log size: ${data.logSizeBytes ? Math.round(data.logSizeBytes / 1024) + ' KB' : '?'}</div>
|
|
5679
|
+
</div>`;
|
|
5680
|
+
}
|
|
5681
|
+
default:
|
|
5682
|
+
return '<div class="cap-content-empty">No viewer for this content</div>';
|
|
5683
|
+
}
|
|
5684
|
+
}
|
|
5685
|
+
|
|
5801
5686
|
function showSystemsOverview() {
|
|
5802
5687
|
document.getElementById('systemsOverview').style.display = '';
|
|
5803
5688
|
document.getElementById('systemsDetailView').classList.remove('active');
|
package/dist/cli.js
CHANGED
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AA+CH,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yFAAyF;IACzF,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBrE;AAgzFD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAiBlF"}
|