loki-mode 11.5.1 → 11.6.0

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 (98) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/autonomy/loki +12 -201
  4. package/autonomy/notification-checker.py +1 -1
  5. package/dashboard/__init__.py +3 -10
  6. package/dashboard/control.py +5 -435
  7. package/docs/ARCHITECTURE.md +1 -2
  8. package/docs/CLI-CORE-VERBS.md +2 -6
  9. package/docs/CLI-REFERENCE.md +1 -1
  10. package/docs/COMPONENTS.md +0 -2
  11. package/docs/INSTALLATION.md +1 -1
  12. package/docs/authentication.md +19 -1
  13. package/docs/dev/release-checklist.md +9 -8
  14. package/docs/enterprise/security.md +3 -234
  15. package/docs/v10/ARCHITECT-CUTS.md +304 -0
  16. package/docs/v10/DECISIONS.md +5 -5
  17. package/docs/v10/ENGINE.md +735 -299
  18. package/docs/v10/GUARDS.md +16 -14
  19. package/docs/v10/GUIDE.md +5 -7
  20. package/docs/v10/PROGRESS.md +12 -1
  21. package/docs/v11/MARKET-SLICES.md +1 -5
  22. package/integrations/openclaw/README.md +20 -0
  23. package/integrations/vibe-kanban.md +12 -50
  24. package/loki-ts/dist/loki.js +1183 -1182
  25. package/mcp/__init__.py +1 -1
  26. package/mcp/_sdk_loader.py +1 -1
  27. package/package.json +2 -2
  28. package/packages/control-plane/dist/server.js +630 -613
  29. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  30. package/references/quality-control.md +1 -116
  31. package/skills/00-index.md +2 -2
  32. package/skills/artifacts.md +0 -22
  33. package/skills/production.md +2 -38
  34. package/web-app/dist/assets/{AdminPage-Cbu3pXL8.js → AdminPage-DhXdJNQk.js} +1 -1
  35. package/web-app/dist/assets/{Avatar-DGqGGcGx.js → Avatar-ixVj76fM.js} +1 -1
  36. package/web-app/dist/assets/{Badge-Bhlipt6v.js → Badge-BGMSp22s.js} +1 -1
  37. package/web-app/dist/assets/{Button-CpN2sO61.js → Button-pYJc32tG.js} +1 -1
  38. package/web-app/dist/assets/{CockpitPage-BqeDJwdL.js → CockpitPage-C1JBBouA.js} +1 -1
  39. package/web-app/dist/assets/{ComparePage-DUieA2ba.js → ComparePage-qD0NV4RK.js} +1 -1
  40. package/web-app/dist/assets/{ErrorBoundary-DTWsYrOm.js → ErrorBoundary-C-yxO58j.js} +1 -1
  41. package/web-app/dist/assets/{EvidenceReceiptPanel-BU_B9X19.js → EvidenceReceiptPanel-ByPzuE1S.js} +1 -1
  42. package/web-app/dist/assets/{GitHubIssuesPanel-DEZoLOsP.js → GitHubIssuesPanel-BNv_2BEJ.js} +1 -1
  43. package/web-app/dist/assets/{GitHubPRsPanel-BEsnrq7Y.js → GitHubPRsPanel-CuLZQ9CS.js} +1 -1
  44. package/web-app/dist/assets/{HomePage-BoUVuq7h.js → HomePage-CS_FW8Je.js} +2 -2
  45. package/web-app/dist/assets/{LoginPage-CmOED7vb.js → LoginPage-DwiNf1Wm.js} +1 -1
  46. package/web-app/dist/assets/{MagicPage-DATZitrZ.js → MagicPage-CmQybLPZ.js} +1 -1
  47. package/web-app/dist/assets/{MetricsPage-DGL1v0I-.js → MetricsPage-D9ERdpv8.js} +1 -1
  48. package/web-app/dist/assets/{NotFoundPage-C2WgOjZd.js → NotFoundPage-D9ccgdbF.js} +1 -1
  49. package/web-app/dist/assets/{ProjectPage-BMi1tepj.js → ProjectPage-B9Jslmgv.js} +3 -3
  50. package/web-app/dist/assets/{ProjectsPage-vc3y5YPh.js → ProjectsPage-DnU99Go2.js} +1 -1
  51. package/web-app/dist/assets/{SettingsPage-kbq0Ftvi.js → SettingsPage-DcTyx6wo.js} +1 -1
  52. package/web-app/dist/assets/{ShowcasePage-Bn6Q8Kbg.js → ShowcasePage-jEY9ghSr.js} +1 -1
  53. package/web-app/dist/assets/{SystemSettingsPage-Basmhs_b.js → SystemSettingsPage-CSGltW-8.js} +1 -1
  54. package/web-app/dist/assets/{TeamsPage-BTqOc4TR.js → TeamsPage-gUuJXb9l.js} +1 -1
  55. package/web-app/dist/assets/{TemplatesPage-2P9002VL.js → TemplatesPage-37Zhe--v.js} +1 -1
  56. package/web-app/dist/assets/{TerminalOutput-CAoSPBrg.js → TerminalOutput-B09hRwaR.js} +1 -1
  57. package/web-app/dist/assets/{activity-BcWVWCqU.js → activity-q_4MY9J0.js} +1 -1
  58. package/web-app/dist/assets/{bell-CYRqqgZ6.js → bell-X8OC_PFP.js} +1 -1
  59. package/web-app/dist/assets/{bot-CU7gdn3g.js → bot-C-N1PUOD.js} +1 -1
  60. package/web-app/dist/assets/{check-DLlCpz9V.js → check-B2c76Jmp.js} +1 -1
  61. package/web-app/dist/assets/{chevron-left-CE9Cb30C.js → chevron-left-BF76YLNw.js} +1 -1
  62. package/web-app/dist/assets/{circle-alert-uou4bjua.js → circle-alert-AeFKBD8h.js} +1 -1
  63. package/web-app/dist/assets/{clock-C_dSJcDX.js → clock-CiXRf-FH.js} +1 -1
  64. package/web-app/dist/assets/{cloud-DZ22ITF6.js → cloud-DKQ8SRJ5.js} +1 -1
  65. package/web-app/dist/assets/{code-xml-BrJS0hhS.js → code-xml-DEb6jXWP.js} +1 -1
  66. package/web-app/dist/assets/{database-D2HOmxtl.js → database-6W7e-E9c.js} +1 -1
  67. package/web-app/dist/assets/{dollar-sign-CQ1vK_6q.js → dollar-sign-Ds2GOuyW.js} +1 -1
  68. package/web-app/dist/assets/{file-code-corner-w2vpGm5d.js → file-code-corner-CZU0jg52.js} +1 -1
  69. package/web-app/dist/assets/{file-plus-DlF6wjkD.js → file-plus-DTVYnXCN.js} +1 -1
  70. package/web-app/dist/assets/{globe-Dy3lBJg1.js → globe-0mUzKYDe.js} +1 -1
  71. package/web-app/dist/assets/{hammer-C3xIiRXN.js → hammer-BMHZg3YX.js} +1 -1
  72. package/web-app/dist/assets/{index-4t-_IW2y.js → index-BvOTvjax.js} +3 -3
  73. package/web-app/dist/assets/{layers-Y8Fs8qXI.js → layers-Df7TdcWB.js} +1 -1
  74. package/web-app/dist/assets/{loader-circle-CxgN1v4m.js → loader-circle-kPsVfrSY.js} +1 -1
  75. package/web-app/dist/assets/{lock-DFFNbXDs.js → lock-CXYcbEc5.js} +1 -1
  76. package/web-app/dist/assets/{package-5e6qCTUg.js → package-Cqhua1ID.js} +1 -1
  77. package/web-app/dist/assets/{plus-C0Go_ytj.js → plus-lseXhsn-.js} +1 -1
  78. package/web-app/dist/assets/{refresh-cw-D4i-NW3o.js → refresh-cw-OZriI6gD.js} +1 -1
  79. package/web-app/dist/assets/{rotate-ccw-YlKkiUW6.js → rotate-ccw-CKCfjPg8.js} +1 -1
  80. package/web-app/dist/assets/{scroll-text-4qXOHTap.js → scroll-text-DoVyyfKb.js} +1 -1
  81. package/web-app/dist/assets/{server-BB6zXNp9.js → server-DGy7TflW.js} +1 -1
  82. package/web-app/dist/assets/{shield-alert-D4tzjB1H.js → shield-alert-BCzRcMXi.js} +1 -1
  83. package/web-app/dist/assets/{thumbs-up-DZiRwdFj.js → thumbs-up-C_znJd5g.js} +1 -1
  84. package/web-app/dist/assets/{trash-2-Dv_LkRIK.js → trash-2-BosCbeeA.js} +1 -1
  85. package/web-app/dist/assets/{trending-down-BJYp9PQe.js → trending-down-CkR5zDkV.js} +1 -1
  86. package/web-app/dist/assets/{trending-up-BTcXLklK.js → trending-up-DpUIfOH4.js} +1 -1
  87. package/web-app/dist/assets/{upload-fcHqwOxr.js → upload-CH9aKc8L.js} +1 -1
  88. package/web-app/dist/assets/{usePolling-BeJYw_4L.js → usePolling-pzxrHJeg.js} +1 -1
  89. package/web-app/dist/assets/{user-BcDwUCsO.js → user-B7OHa-VQ.js} +1 -1
  90. package/web-app/dist/index.html +1 -1
  91. package/dashboard/run.py +0 -63
  92. package/docs/openclaw-integration.md +0 -52
  93. package/docs/v10/HANDOFF-NEXT-WEEK.md +0 -40
  94. package/docs/v10/MORNING-BRIEF-1003.md +0 -25
  95. package/docs/v10/MORNING-BRIEF.md +0 -52
  96. package/docs/v10/TODO.md +0 -35
  97. package/mcp/resources.py +0 -351
  98. package/mcp/tools.py +0 -200
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: An autonomous software factory that knows what it is supposed to deliver, and proves it did. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
4
4
  ---
5
5
 
6
- # Loki Mode v11.5.1
6
+ # Loki Mode v11.6.0
7
7
 
8
8
  **Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the previous bash loop. PRD-file starts (`loki start ./prd.md`) and the opencode provider still run on it until FC38-SWEEP ports them; the legacy-engine command and the LOKI_ENGINE switch remain removed. Prefer `loki owner/repo#N` for issues.
9
9
 
@@ -483,4 +483,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
483
483
 
484
484
  ---
485
485
 
486
- **v11.5.1 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v11.6.0 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.5.1
1
+ 11.6.0
package/autonomy/loki CHANGED
@@ -8293,7 +8293,7 @@ PURPLE_LAB_STATE_DIR="${HOME}/.loki/purple-lab"
8293
8293
  PURPLE_LAB_PID_FILE="${PURPLE_LAB_STATE_DIR}/purple-lab.pid"
8294
8294
 
8295
8295
  # Is this pid positively identified as THIS installation's Purple Lab server
8296
- # (cmd_web_start launches exactly `$DASHBOARD_PYTHON $SKILL_DIR/web-app/server.py`
8296
+ # (a server started before the web deprecation launched exactly `$DASHBOARD_PYTHON $SKILL_DIR/web-app/server.py`
8297
8297
  # at :8078), rather than a recycled pid, a decoy that merely mentions the path
8298
8298
  # in an argument, or another installation's server.py at a different SKILL_DIR?
8299
8299
  #
@@ -8506,205 +8506,6 @@ cmd_web_help() {
8506
8506
  echo " loki web stop Stop a standalone web server started the old way"
8507
8507
  }
8508
8508
 
8509
- cmd_web_start() {
8510
- local open_browser=true
8511
- local port="${PURPLE_LAB_DEFAULT_PORT}"
8512
- local prd_file=""
8513
-
8514
- # Parse arguments
8515
- while [[ $# -gt 0 ]]; do
8516
- case "$1" in
8517
- --no-open)
8518
- open_browser=false
8519
- shift
8520
- ;;
8521
- --port)
8522
- if [[ -z "${2:-}" ]]; then
8523
- echo -e "${RED}--port requires a port number${NC}"
8524
- exit 1
8525
- fi
8526
- port="$2"
8527
- shift 2
8528
- ;;
8529
- --prd)
8530
- if [[ -z "${2:-}" ]]; then
8531
- echo -e "${RED}--prd requires a file path${NC}"
8532
- exit 1
8533
- fi
8534
- prd_file="$2"
8535
- shift 2
8536
- ;;
8537
- --help|-h)
8538
- cmd_web_help
8539
- exit 0
8540
- ;;
8541
- *)
8542
- echo -e "${RED}Unknown option: $1${NC}"
8543
- echo "Run 'loki web --help' for usage."
8544
- exit 1
8545
- ;;
8546
- esac
8547
- done
8548
-
8549
- # Validate port: must be numeric and in valid range
8550
- if [[ ! "$port" =~ ^[0-9]+$ ]]; then
8551
- echo -e "${RED}Error: Port must be a number, got '$port'${NC}"
8552
- exit 1
8553
- fi
8554
- if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
8555
- echo -e "${RED}Error: Port must be between 1 and 65535, got $port${NC}"
8556
- exit 1
8557
- fi
8558
- # Port validation moved below (after PID file check) so we can offer to kill orphans
8559
-
8560
- # Validate --prd file if provided
8561
- if [ -n "$prd_file" ]; then
8562
- if [ ! -f "$prd_file" ]; then
8563
- echo -e "${RED}Error: PRD file not found: $prd_file${NC}"
8564
- exit 1
8565
- fi
8566
- export PURPLE_LAB_PRD
8567
- PURPLE_LAB_PRD=$(cat "$prd_file")
8568
- fi
8569
-
8570
- # Check that web-app dist exists
8571
- local web_dist="${SKILL_DIR}/web-app/dist"
8572
- if [ ! -d "$web_dist" ] || [ ! -f "$web_dist/index.html" ]; then
8573
- echo -e "${RED}Error: Web app not built${NC}"
8574
- echo "Expected files at: $web_dist"
8575
- echo ""
8576
- echo "Build the web app first:"
8577
- echo " cd web-app && npm install && npm run build"
8578
- exit 1
8579
- fi
8580
-
8581
- # Check that server.py exists
8582
- local server_py="${SKILL_DIR}/web-app/server.py"
8583
- if [ ! -f "$server_py" ]; then
8584
- echo -e "${RED}Error: Purple Lab server not found at $server_py${NC}"
8585
- exit 1
8586
- fi
8587
-
8588
- # Ensure Python venv with FastAPI is available
8589
- if ! ensure_dashboard_venv; then
8590
- echo -e "${RED}Error: Failed to set up Python environment${NC}"
8591
- exit 1
8592
- fi
8593
-
8594
- # Check if already running
8595
- mkdir -p "${LOKI_DIR}/purple-lab"
8596
- if [ -f "$PURPLE_LAB_PID_FILE" ]; then
8597
- local existing_pid
8598
- existing_pid=$(cat "$PURPLE_LAB_PID_FILE" 2>/dev/null)
8599
- if [ -n "$existing_pid" ] && kill -0 "$existing_pid" 2>/dev/null; then
8600
- echo -e "${GREEN}Purple Lab already running (PID: $existing_pid)${NC}"
8601
- local url="http://${PURPLE_LAB_DEFAULT_HOST}:${port}/lab/"
8602
- echo -e "Open: ${CYAN}$url${NC}"
8603
- if [ "$open_browser" = true ]; then
8604
- loki_open_url "$url" 2>/dev/null || true
8605
- fi
8606
- return 0
8607
- fi
8608
- fi
8609
-
8610
- # Check if port is already in use -- try to clean up orphaned processes.
8611
- # Only kill it if it is positively identified as THIS installation's own
8612
- # Purple Lab server (never a bare "it's listening on our port" guess): an
8613
- # unrelated process bound to the same port, or another installation's
8614
- # server, must never be signaled.
8615
- if lsof -i:"$port" -sTCP:LISTEN &> /dev/null; then
8616
- local blocking_pid
8617
- blocking_pid=$(lsof -ti:"$port" -sTCP:LISTEN 2>/dev/null | head -1)
8618
- if [ -n "$blocking_pid" ]; then
8619
- if _loki_pid_looks_like_purplelab "$blocking_pid"; then
8620
- echo -e "${YELLOW}Port $port in use by PID $blocking_pid -- stopping it...${NC}"
8621
- kill "$blocking_pid" 2>/dev/null
8622
- sleep 1
8623
- if kill -0 "$blocking_pid" 2>/dev/null; then
8624
- kill -9 "$blocking_pid" 2>/dev/null
8625
- sleep 1
8626
- fi
8627
- # Verify port is now free
8628
- if lsof -i:"$port" -sTCP:LISTEN &> /dev/null; then
8629
- echo -e "${RED}Error: Could not free port $port${NC}"
8630
- echo "Use --port to specify a different port, or manually kill the process."
8631
- exit 1
8632
- fi
8633
- echo -e "${GREEN}Port $port freed.${NC}"
8634
- else
8635
- echo -e "${RED}Error: Port $port is in use by PID $blocking_pid, which is not this installation's Purple Lab server.${NC}"
8636
- echo "Use --port to specify a different port, or manually stop that process."
8637
- exit 1
8638
- fi
8639
- fi
8640
- fi
8641
-
8642
- # Start the server
8643
- local log_dir="${LOKI_DIR}/purple-lab/logs"
8644
- mkdir -p "$log_dir"
8645
- local log_file="$log_dir/purple-lab.log"
8646
-
8647
- echo -e "${CYAN}Starting Purple Lab...${NC}"
8648
-
8649
- PURPLE_LAB_PORT="$port" PURPLE_LAB_HOST="${PURPLE_LAB_DEFAULT_HOST}" \
8650
- LOKI_DIR="$LOKI_DIR" LOKI_SKILL_DIR="$SKILL_DIR" PYTHONPATH="$SKILL_DIR" \
8651
- nohup "$DASHBOARD_PYTHON" "$server_py" > "$log_file" 2>&1 &
8652
- local pid=$!
8653
-
8654
- mkdir -p "$PURPLE_LAB_STATE_DIR"
8655
- echo "$pid" > "$PURPLE_LAB_PID_FILE"
8656
- echo "$port" > "${PURPLE_LAB_STATE_DIR}/port"
8657
- # Also write to local .loki for backward compat
8658
- mkdir -p "${LOKI_DIR}/purple-lab"
8659
- echo "$pid" > "${LOKI_DIR}/purple-lab/purple-lab.pid"
8660
- echo "$port" > "${LOKI_DIR}/purple-lab/port"
8661
-
8662
- # Wait for server to be ready
8663
- local retries=0
8664
- local server_ready=false
8665
- while [ $retries -lt 15 ]; do
8666
- if curl -s "http://${PURPLE_LAB_DEFAULT_HOST}:${port}/lab/api/session/status" > /dev/null 2>&1; then
8667
- server_ready=true
8668
- break
8669
- fi
8670
- sleep 0.5
8671
- retries=$((retries + 1))
8672
- done
8673
-
8674
- if ! kill -0 "$pid" 2>/dev/null; then
8675
- echo -e "${RED}Error: Purple Lab failed to start${NC}"
8676
- echo "Check logs at: $log_file"
8677
- rm -f "$PURPLE_LAB_PID_FILE"
8678
- exit 1
8679
- fi
8680
-
8681
- local url="http://${PURPLE_LAB_DEFAULT_HOST}:${port}/lab/"
8682
-
8683
- if [ "$server_ready" = true ]; then
8684
- echo -e "${GREEN}Purple Lab (project web UI) running at: $url${NC} (PID: $pid)"
8685
- else
8686
- echo -e "${YELLOW}Purple Lab (project web UI) starting at: $url${NC} (PID: $pid)"
8687
- echo "Server may still be loading. Refresh the browser if it does not load immediately."
8688
- fi
8689
- echo -e "Logs: $log_file"
8690
- # v7.28.x UX #5: distinguish the two browser UIs so the ops monitor and the
8691
- # spec-input web UI are never confused for each other.
8692
- echo -e "${DIM}Looking for the live run monitor? loki dashboard (:${DASHBOARD_DEFAULT_PORT:-57374})${NC}"
8693
- echo -e "Stop with: ${CYAN}loki web stop${NC}"
8694
-
8695
- # Open browser only after server is confirmed ready
8696
- if [ "$open_browser" = true ]; then
8697
- if [ "$server_ready" = true ]; then
8698
- echo ""
8699
- loki_open_url "$url" 2>/dev/null || echo "Please open in browser: $url"
8700
- else
8701
- echo ""
8702
- echo -e "${YELLOW}Browser not opened because server is not ready yet.${NC}"
8703
- echo "Open manually when ready: $url"
8704
- fi
8705
- fi
8706
- }
8707
-
8708
8509
  cmd_web_stop() {
8709
8510
  local stopped=false
8710
8511
  local port
@@ -12451,6 +12252,7 @@ cmd_export() {
12451
12252
  echo " markdown Human-readable session summary"
12452
12253
  echo " csv Task queue as CSV"
12453
12254
  echo " timeline Iteration timeline as JSON"
12255
+ echo " vibe-kanban Sync .loki/queue tasks into the Vibe Kanban SQLite DB"
12454
12256
  echo ""
12455
12257
  echo "Flags:"
12456
12258
  echo " --sarif [run-id] Write .loki/runs/<id>/findings.sarif (SARIF 2.1.0; needs bun)"
@@ -12461,6 +12263,7 @@ cmd_export() {
12461
12263
  echo " loki export markdown # Readable summary"
12462
12264
  echo " loki export csv tasks.csv # Task queue CSV"
12463
12265
  echo " loki export timeline # Iteration timeline"
12266
+ echo " loki export vibe-kanban # Sync tasks to Vibe Kanban"
12464
12267
  exit 0
12465
12268
  ;;
12466
12269
  json)
@@ -12477,13 +12280,21 @@ cmd_export() {
12477
12280
  require_jq || return 1
12478
12281
  _export_timeline "$output_path"
12479
12282
  ;;
12283
+ vibe-kanban)
12284
+ local vk_script="${SKILL_DIR:-}/scripts/sync-to-vibe-kanban.sh"
12285
+ if [ ! -f "$vk_script" ]; then
12286
+ echo -e "${RED}Error: sync-to-vibe-kanban.sh not found at $vk_script${NC}" >&2
12287
+ return 1
12288
+ fi
12289
+ bash "$vk_script"
12290
+ ;;
12480
12291
  --sarif)
12481
12292
  echo -e "${RED}loki export --sarif needs bun (https://bun.sh).${NC}" >&2
12482
12293
  return 1
12483
12294
  ;;
12484
12295
  *)
12485
12296
  echo -e "${RED}Unknown format: $format${NC}"
12486
- echo "Supported: json, markdown, csv, timeline"
12297
+ echo "Supported: json, markdown, csv, timeline, vibe-kanban"
12487
12298
  exit 1
12488
12299
  ;;
12489
12300
  esac
@@ -265,7 +265,7 @@ def check_quality_gate(trigger, loki_dir, iteration, notifications):
265
265
  defect as the budget key, in the same file.
266
266
 
267
267
  gate-failures.txt is the canonical failure source used by
268
- proof-generator.py:413 and loki-ts build_prompt_helpers.ts:250, so this
268
+ proof-generator.py:413 and loki-ts build_prompt.ts, so this
269
269
  reuses a proven contract rather than introducing a second one.
270
270
  """
271
271
  failures_file = Path(loki_dir) / "quality" / "gate-failures.txt"
@@ -4,16 +4,9 @@ Loki Mode Dashboard Backend
4
4
  FastAPI-based dashboard for managing Loki Mode projects, tasks, and agents.
5
5
 
6
6
  Modules:
7
- control: Session control API (start/stop/pause/resume)
7
+ control: Session control helpers (status, atomic writes, origin check)
8
8
  """
9
9
 
10
- __version__ = "11.5.1"
10
+ __version__ = "11.6.0"
11
11
 
12
- # Expose the control app for easy import
13
- try:
14
- from .control import app as control_app
15
- except ImportError:
16
- # FastAPI not installed, control module not available
17
- control_app = None
18
-
19
- __all__ = ["control_app", "__version__"]
12
+ __all__ = ["__version__"]