loki-mode 7.17.1 → 7.18.1

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/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: Autonomous spec-to-product system. Triggers on "Loki Mode". Takes a spec (PRD, GitHub issue, OpenAPI doc, etc.) to deployed product via the RARV-C closure loop, with minimal human intervention. Provider-agnostic. Requires --dangerously-skip-permissions flag.
4
4
  ---
5
5
 
6
- # Loki Mode v7.17.1
6
+ # Loki Mode v7.18.1
7
7
 
8
8
  **You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
9
9
 
@@ -383,4 +383,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
383
383
 
384
384
  ---
385
385
 
386
- **v7.17.1 | [Autonomi](https://www.autonomi.dev/) flagship product | ~260 lines core**
386
+ **v7.18.1 | [Autonomi](https://www.autonomi.dev/) flagship product | ~260 lines core**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 7.17.1
1
+ 7.18.1
package/autonomy/loki CHANGED
@@ -7627,6 +7627,22 @@ cmd_doctor() {
7627
7627
  elif command -v codex &>/dev/null; then
7628
7628
  echo -e " ${DIM} -- ${NC} OPENAI_API_KEY not set (Codex CLI uses its own login)"
7629
7629
  fi
7630
+ # Phase I (v7.5.25): detect ANTHROPIC_BASE_URL alt-provider routing
7631
+ # (OpenRouter, Ollama, LiteLLM, self-hosted). Claude Code reads this env
7632
+ # var natively; Loki passes it through unchanged. Warn when the user sets
7633
+ # an alt endpoint without LOKI_MODEL_OVERRIDE -- the default opus/sonnet/
7634
+ # haiku aliases may not resolve on the alt-provider.
7635
+ if [ -n "${ANTHROPIC_BASE_URL:-}" ]; then
7636
+ echo -e " ${GREEN}PASS${NC} ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}"
7637
+ pass_count=$((pass_count + 1))
7638
+ if [ -z "${LOKI_MODEL_OVERRIDE:-}" ]; then
7639
+ echo -e " ${YELLOW}WARN${NC} LOKI_MODEL_OVERRIDE not set -- opus/sonnet/haiku aliases may not resolve on alt-provider"
7640
+ warn_count=$((warn_count + 1))
7641
+ else
7642
+ echo -e " ${GREEN}PASS${NC} LOKI_MODEL_OVERRIDE: ${LOKI_MODEL_OVERRIDE}"
7643
+ pass_count=$((pass_count + 1))
7644
+ fi
7645
+ fi
7630
7646
  echo ""
7631
7647
 
7632
7648
  echo -e "${CYAN}Skills:${NC}"
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "7.17.1"
10
+ __version__ = "7.18.1"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -7772,7 +7772,14 @@ async def get_wiki_section(section: str):
7772
7772
  raise HTTPException(status_code=400, detail=f"unknown section: {section}")
7773
7773
  wiki_json = _wiki_dir() / "wiki.json"
7774
7774
  if not wiki_json.is_file():
7775
- raise HTTPException(status_code=404, detail="wiki not generated")
7775
+ # Soft empty state for dashboard consumers on a fresh repo. A hard 404
7776
+ # here floods the browser console (the panel and the SPA both poll this)
7777
+ # even though "no wiki yet" is an expected, benign state. Mirrors the
7778
+ # generated:false contract of GET /api/wiki.
7779
+ return JSONResponse(content={
7780
+ "generated": False, "id": section, "title": "",
7781
+ "body": "", "citations": [],
7782
+ })
7776
7783
  data = _safe_json_read(wiki_json, default=None)
7777
7784
  if not isinstance(data, dict):
7778
7785
  raise HTTPException(status_code=500, detail="wiki.json unreadable")
@@ -14,14 +14,50 @@
14
14
  <head>
15
15
  <meta charset="utf-8">
16
16
  <meta name="viewport" content="width=device-width, initial-scale=1">
17
+ <script>
18
+ // Match the embedding SPA's theme via the ?theme=dark|light param it passes
19
+ // when loading this page in its iframe. Set before paint to avoid a flash;
20
+ // with no/invalid param, OS prefers-color-scheme applies.
21
+ (function () {
22
+ try {
23
+ var t = new URLSearchParams(location.search).get('theme');
24
+ if (t === 'dark' || t === 'light') {
25
+ document.documentElement.setAttribute('data-loki-theme', t);
26
+ }
27
+ } catch (e) { /* no-op: fall back to OS preference */ }
28
+ })();
29
+ </script>
17
30
  <title>Loki Mode - Cost and Observability</title>
31
+ <link rel="preconnect" href="https://fonts.googleapis.com">
32
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
33
+ <link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display&family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
18
34
  <style>
35
+ /* Match the dashboard SPA design language (cream/light + serif headings),
36
+ so this page reads as one product when embedded in the SPA iframe. The
37
+ local --bg/--panel/--text/--mono/--sans names are kept (the rest of the
38
+ CSS references them) and remapped to the SPA --loki-* palette, with a
39
+ prefers-color-scheme dark variant mirroring the SPA. */
19
40
  :root {
20
- --bg: #0f1115; --panel: #171a21; --panel-2: #1d2129; --border: #2a2f3a;
21
- --text: #e7e9ee; --muted: #9aa1ad; --faint: #6b7280; --accent: #6f7bf7;
22
- --green: #34d399; --red: #f87171; --amber: #fbbf24;
23
- --mono: ui-monospace, "SF Mono", "Menlo", "Consolas", monospace;
41
+ --bg: #FAFAF7; --panel: rgba(255,255,255,0.72); --panel-2: #E8E5DE; --border: rgba(0,0,0,0.08);
42
+ --text: #1A1614; --muted: #4A4640; --faint: #8A857C; --accent: #553DE9;
43
+ --green: #1AAF95; --red: #C04848; --amber: #C4922E;
44
+ --mono: 'JetBrains Mono', ui-monospace, "SF Mono", "Menlo", monospace;
24
45
  --sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
46
+ --serif: 'DM Serif Display', Georgia, serif;
47
+ }
48
+ /* Dark palette. data-loki-theme (set from the SPA's ?theme= param) wins over
49
+ the OS preference so the iframe follows the SPA's manual Dark toggle. */
50
+ html[data-loki-theme="dark"] {
51
+ --bg: #0F0B1A; --panel: rgba(30,21,51,0.72); --panel-2: #1E1533; --border: rgba(255,255,255,0.08);
52
+ --text: #F0ECF8; --muted: #B8B0C8; --faint: #7B6FA0; --accent: #7B6BF0;
53
+ --green: #2ED8B6; --red: #E07070; --amber: #E8B84A;
54
+ }
55
+ @media (prefers-color-scheme: dark) {
56
+ html:not([data-loki-theme]) {
57
+ --bg: #0F0B1A; --panel: rgba(30,21,51,0.72); --panel-2: #1E1533; --border: rgba(255,255,255,0.08);
58
+ --text: #F0ECF8; --muted: #B8B0C8; --faint: #7B6FA0; --accent: #7B6BF0;
59
+ --green: #2ED8B6; --red: #E07070; --amber: #E8B84A;
60
+ }
25
61
  }
26
62
  * { box-sizing: border-box; }
27
63
  body { margin: 0; background: var(--bg); color: var(--text); font-family: var(--sans); line-height: 1.5; }
@@ -29,7 +65,7 @@
29
65
  a:hover { text-decoration: underline; }
30
66
  .wrap { max-width: 960px; margin: 0 auto; padding: 40px 20px 80px; }
31
67
  .head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 8px; }
32
- h1 { font-size: 24px; font-weight: 650; letter-spacing: -0.3px; margin: 0; }
68
+ h1 { font-family: var(--serif); font-size: 28px; font-weight: 400; letter-spacing: -0.3px; margin: 0; }
33
69
  h2 { font-size: 15px; font-weight: 600; color: var(--muted); margin: 30px 0 12px; text-transform: uppercase; letter-spacing: 0.5px; }
34
70
  .head a { font-size: 13px; }
35
71
  .sub { color: var(--muted); font-size: 14px; margin: 0 0 26px; }