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.
Files changed (42) hide show
  1. package/.claude/settings.json +120 -0
  2. package/.claude/skills/setup-wizard/skill.md +2 -2
  3. package/dashboard/index.html +221 -336
  4. package/dist/cli.js +0 -0
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +22 -4
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/server.d.ts.map +1 -1
  9. package/dist/commands/server.js +18 -1
  10. package/dist/commands/server.js.map +1 -1
  11. package/dist/commands/setup.d.ts.map +1 -1
  12. package/dist/commands/setup.js +23 -2
  13. package/dist/commands/setup.js.map +1 -1
  14. package/dist/core/GitSync.d.ts +3 -2
  15. package/dist/core/GitSync.d.ts.map +1 -1
  16. package/dist/core/GitSync.js +19 -4
  17. package/dist/core/GitSync.js.map +1 -1
  18. package/dist/core/SessionManager.d.ts +1 -1
  19. package/dist/core/SessionManager.d.ts.map +1 -1
  20. package/dist/core/SessionManager.js.map +1 -1
  21. package/dist/lifeline/ServerSupervisor.d.ts.map +1 -1
  22. package/dist/lifeline/ServerSupervisor.js +31 -0
  23. package/dist/lifeline/ServerSupervisor.js.map +1 -1
  24. package/dist/messaging/slack/SlackAdapter.d.ts +25 -4
  25. package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
  26. package/dist/messaging/slack/SlackAdapter.js +156 -12
  27. package/dist/messaging/slack/SlackAdapter.js.map +1 -1
  28. package/dist/messaging/slack/SocketModeClient.d.ts.map +1 -1
  29. package/dist/messaging/slack/SocketModeClient.js +11 -4
  30. package/dist/messaging/slack/SocketModeClient.js.map +1 -1
  31. package/dist/messaging/slack/types.d.ts +30 -0
  32. package/dist/messaging/slack/types.d.ts.map +1 -1
  33. package/dist/messaging/slack/types.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/data/builtin-manifest.json +4 -4
  36. package/upgrades/0.24.14.md +26 -0
  37. package/upgrades/0.24.18-beta.0.md +35 -0
  38. package/upgrades/0.24.18.md +26 -26
  39. package/upgrades/0.24.19.md +21 -0
  40. package/upgrades/0.24.21.md +25 -0
  41. package/upgrades/NEXT.md +45 -0
  42. /package/.claude/skills/secret-setup/{skill.md → SKILL.md} +0 -0
@@ -1921,345 +1921,101 @@
1921
1921
  .spark.s-skipped { background: #333; }
1922
1922
 
1923
1923
  /* ── Discovery Tab ──────────────────────────────────────── */
1924
- /* Systems Tab */
1925
- .systems-container {
1926
- grid-column: 1 / -1;
1927
- overflow-y: auto;
1928
- background: var(--bg);
1929
- padding: 20px;
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
- display: flex;
1968
- align-items: center;
1969
- gap: 16px;
1970
- padding: 20px 24px;
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
- flex: 1;
2003
- }
2004
-
2005
- .health-title {
2006
- font-size: 16px;
2007
- font-weight: 600;
2008
- color: var(--text-bright);
2009
- margin-bottom: 4px;
2010
- }
2011
-
2012
- .health-meta {
2013
- font-size: 12px;
2014
- color: var(--text-dim);
2015
- }
2016
-
2017
- /* Issues Panel */
2018
- .issues-panel {
2019
- margin-bottom: 24px;
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-info {
2112
- flex: 1;
2113
- min-width: 0;
2114
- }
2115
-
2116
- .cap-label {
2117
- font-size: 13px;
2118
- color: var(--text-bright);
2119
- font-weight: 500;
2120
- margin-bottom: 2px;
2121
- }
2122
-
2123
- .cap-metric {
2124
- font-size: 11px;
2125
- color: var(--text-dim);
2126
- white-space: nowrap;
2127
- overflow: hidden;
2128
- text-overflow: ellipsis;
2129
- }
2130
-
2131
- .cap-arrow {
2132
- font-size: 10px;
2133
- color: var(--text-dim);
2134
- transition: transform 0.2s;
2135
- flex-shrink: 0;
2136
- }
2137
-
2138
- .capability-card.expanded .cap-arrow {
2139
- transform: rotate(90deg);
2140
- }
2141
-
2142
- /* Capability Detail (expandable) */
2143
- .cap-detail {
2144
- display: none;
2145
- padding: 0 16px 14px;
2146
- border-top: 1px solid var(--border);
2147
- }
2148
-
2149
- .capability-card.expanded .cap-detail {
2150
- display: block;
2151
- }
2152
-
2153
- .cap-detail-desc {
2154
- font-size: 12px;
2155
- color: var(--text-dim);
2156
- margin: 12px 0 10px;
2157
- line-height: 1.5;
2158
- }
2159
-
2160
- .cap-detail-label {
2161
- font-size: 10px;
2162
- font-weight: 600;
2163
- color: var(--text-dim);
2164
- text-transform: uppercase;
2165
- letter-spacing: 0.5px;
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
- function buildStatCards(stats) {
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
- cards.push(`<div class="cap-stat-card"><div class="cap-stat-card-value">${stats[key]}</div><div class="cap-stat-card-label">${esc(label)}</div></div>`);
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">&times;</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 ? '&check;' : '&cross;'} ${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;AA6BH,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"}
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"}