loki-mode 11.90.0 → 11.92.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 (78) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/autonomy/completion-council.sh +16 -2
  4. package/autonomy/council-v2.sh +10 -2
  5. package/autonomy/grill.sh +4 -1
  6. package/autonomy/lib/done-recognition.sh +12 -4
  7. package/autonomy/lib/prd-enrich.sh +5 -2
  8. package/autonomy/lib/voter-agents.sh +1 -1
  9. package/autonomy/loki +128 -45
  10. package/autonomy/quickstart.sh +13 -2
  11. package/completions/_loki +7 -4
  12. package/completions/loki.bash +3 -3
  13. package/dashboard/__init__.py +1 -1
  14. package/docs/CLI-REFERENCE.md +1 -1
  15. package/docs/INSTALLATION.md +1 -1
  16. package/docs/v11/VERIFY-PR-SANDBOX.md +1 -1
  17. package/loki-ts/dist/loki.js +1421 -1414
  18. package/mcp/__init__.py +1 -1
  19. package/package.json +2 -2
  20. package/packages/control-plane/dist/server.js +20346 -20211
  21. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  22. package/web-app/dist/assets/{AdminPage-CZL0cONl.js → AdminPage-2eApQhkp.js} +1 -1
  23. package/web-app/dist/assets/{Avatar-tJZxSP21.js → Avatar-V-WXQ0hZ.js} +1 -1
  24. package/web-app/dist/assets/{Badge-B-uFJM_y.js → Badge-uw9uv8IY.js} +1 -1
  25. package/web-app/dist/assets/{Button-DfKU7ctr.js → Button-34AooGBc.js} +1 -1
  26. package/web-app/dist/assets/{CockpitPage-CRNp09jN.js → CockpitPage-DHVPvw4u.js} +1 -1
  27. package/web-app/dist/assets/{ComparePage-Cdvjcs57.js → ComparePage-CXuFkRpn.js} +1 -1
  28. package/web-app/dist/assets/{ErrorBoundary-C_benNK3.js → ErrorBoundary-DpPNWkHN.js} +1 -1
  29. package/web-app/dist/assets/{EvidenceReceiptPanel-Ch_6YkUO.js → EvidenceReceiptPanel-C3Mc9c1x.js} +1 -1
  30. package/web-app/dist/assets/{GitHubIssuesPanel-C_a7mAlw.js → GitHubIssuesPanel-Bsqa3l6c.js} +1 -1
  31. package/web-app/dist/assets/{GitHubPRsPanel-xMr7IKsr.js → GitHubPRsPanel-B0xZbM-K.js} +1 -1
  32. package/web-app/dist/assets/{HomePage-BVe6s1kz.js → HomePage-D0aizXzO.js} +2 -2
  33. package/web-app/dist/assets/{LoginPage-DKlLaNw0.js → LoginPage-DjQ5-faQ.js} +1 -1
  34. package/web-app/dist/assets/{MagicPage-StmxQunX.js → MagicPage-mzwFEhXD.js} +1 -1
  35. package/web-app/dist/assets/{MetricsPage-C7e2CioT.js → MetricsPage-Be61Umuv.js} +1 -1
  36. package/web-app/dist/assets/{NotFoundPage-B2IopV0V.js → NotFoundPage-CjmTN3Z6.js} +1 -1
  37. package/web-app/dist/assets/{ProjectPage-CXs8d6Cx.js → ProjectPage-Bj1dJlmV.js} +3 -3
  38. package/web-app/dist/assets/{ProjectsPage-BfgMJYYj.js → ProjectsPage-DPgt37Ev.js} +1 -1
  39. package/web-app/dist/assets/{SettingsPage-CZ8lwCF2.js → SettingsPage-CtaHS1ob.js} +1 -1
  40. package/web-app/dist/assets/{ShowcasePage-iNCfKZj0.js → ShowcasePage-DD7t6JHO.js} +1 -1
  41. package/web-app/dist/assets/{SystemSettingsPage-FMV2pNNz.js → SystemSettingsPage-CzgVPzMw.js} +1 -1
  42. package/web-app/dist/assets/{TeamsPage-D_SzTjuD.js → TeamsPage-CBouFUwW.js} +1 -1
  43. package/web-app/dist/assets/{TemplatesPage-BMF_6X7R.js → TemplatesPage-BArudpPa.js} +1 -1
  44. package/web-app/dist/assets/{TerminalOutput-ClZtwhW8.js → TerminalOutput-DxA5HoZ5.js} +1 -1
  45. package/web-app/dist/assets/{activity-DSOGDSlj.js → activity-BR76ZMBh.js} +1 -1
  46. package/web-app/dist/assets/{bell-BQaMS_Ge.js → bell-Br9K5dz8.js} +1 -1
  47. package/web-app/dist/assets/{bot-Iw0qLbSN.js → bot-DWOsO7gw.js} +1 -1
  48. package/web-app/dist/assets/{check-BNNpt5tE.js → check-CbHxZskh.js} +1 -1
  49. package/web-app/dist/assets/{chevron-left-DDFdacve.js → chevron-left-B7VJtFeE.js} +1 -1
  50. package/web-app/dist/assets/{circle-alert-CiRTbi7c.js → circle-alert-DFxljQkZ.js} +1 -1
  51. package/web-app/dist/assets/{clock-hudCD7-Z.js → clock-BDhyJZBv.js} +1 -1
  52. package/web-app/dist/assets/{cloud-Brn55LA3.js → cloud-BxVf6gss.js} +1 -1
  53. package/web-app/dist/assets/{code-xml-kiS4rISP.js → code-xml-BsBy-SZC.js} +1 -1
  54. package/web-app/dist/assets/{database-BD1l1Tuw.js → database-Bqz0cKPA.js} +1 -1
  55. package/web-app/dist/assets/{dollar-sign-DT5e3PIo.js → dollar-sign-Nma2_5tQ.js} +1 -1
  56. package/web-app/dist/assets/{file-code-corner-DmixJzQ5.js → file-code-corner-DDiKT74Y.js} +1 -1
  57. package/web-app/dist/assets/{file-plus-CeQieVbR.js → file-plus-Bsi1eh4g.js} +1 -1
  58. package/web-app/dist/assets/{globe-BayFHork.js → globe-BrDJU35Q.js} +1 -1
  59. package/web-app/dist/assets/{hammer-BzJ_7lDH.js → hammer-Cc0dGdYB.js} +1 -1
  60. package/web-app/dist/assets/{index-DgDlNUmy.js → index-CwRUHGRH.js} +3 -3
  61. package/web-app/dist/assets/{layers-CfWES4J2.js → layers-dBYYRarz.js} +1 -1
  62. package/web-app/dist/assets/{loader-circle-CH0UbcAO.js → loader-circle-Bgp8OiC8.js} +1 -1
  63. package/web-app/dist/assets/{lock-BuKglb_x.js → lock-mYd7M_sm.js} +1 -1
  64. package/web-app/dist/assets/{package-BkpU_Qb_.js → package-Bl6u282j.js} +1 -1
  65. package/web-app/dist/assets/{plus-BFMNyc0G.js → plus-H-VgX3FJ.js} +1 -1
  66. package/web-app/dist/assets/{refresh-cw-DQnQVKNC.js → refresh-cw-emJQn2ZS.js} +1 -1
  67. package/web-app/dist/assets/{rotate-ccw-B_M9AdjB.js → rotate-ccw-CTDYewXA.js} +1 -1
  68. package/web-app/dist/assets/{scroll-text-1P39rc_L.js → scroll-text-Bx_yfYId.js} +1 -1
  69. package/web-app/dist/assets/{server-BjGwVEsb.js → server-CfCbWR2b.js} +1 -1
  70. package/web-app/dist/assets/{shield-alert-CKcYjHu8.js → shield-alert-ODyUhCBO.js} +1 -1
  71. package/web-app/dist/assets/{thumbs-up-BC_5mpCw.js → thumbs-up-D4rG_0Db.js} +1 -1
  72. package/web-app/dist/assets/{trash-2-CjtQl9fg.js → trash-2-CLW0eSji.js} +1 -1
  73. package/web-app/dist/assets/{trending-down-D9MnFNOD.js → trending-down-B_9FnZty.js} +1 -1
  74. package/web-app/dist/assets/{trending-up-DrHz29bk.js → trending-up-fEvDswGA.js} +1 -1
  75. package/web-app/dist/assets/{upload-D7jmahPb.js → upload-DvgEs5QL.js} +1 -1
  76. package/web-app/dist/assets/{usePolling-C-zxuzqz.js → usePolling-KK1QY8nW.js} +1 -1
  77. package/web-app/dist/assets/{user-DE2Mkf9B.js → user-Cp4-qLBC.js} +1 -1
  78. package/web-app/dist/index.html +1 -1
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: Runs an autonomous software factory that knows what it is supposed to deliver and proves it did, with a signed receipt. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
4
4
  ---
5
5
 
6
- # Loki Mode v11.90.0
6
+ # Loki Mode v11.92.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
 
@@ -475,4 +475,4 @@ Implemented, planned and deprecated items, with the version each landed in: `ski
475
475
 
476
476
  ---
477
477
 
478
- **v11.90.0 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
478
+ **v11.92.0 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.90.0
1
+ 11.92.0
@@ -3268,6 +3268,13 @@ ISSUES: CRITICAL:description (optional, one per line per issue)"
3268
3268
  # out of scope when this file is sourced standalone, so each is
3269
3269
  # type-guarded (degrades to the prior bare invocation).
3270
3270
  local _cm_argv=("--model" "$council_model")
3271
+ local _cm_shell
3272
+ _cm_shell="$(
3273
+ type _loki_claude_shell_value >/dev/null 2>&1 \
3274
+ || . "${BASH_SOURCE[0]%/*}/lib/claude-flags.sh" >/dev/null 2>&1 || exit 1
3275
+ _loki_claude_shell_value
3276
+ )" || _cm_shell=""
3277
+ [ -n "$_cm_shell" ] || _cm_shell="${SHELL-}"
3271
3278
  if type loki_subcall_bare_enabled >/dev/null 2>&1 && loki_subcall_bare_enabled; then
3272
3279
  _cm_argv+=("--bare")
3273
3280
  fi
@@ -3299,7 +3306,7 @@ ISSUES: CRITICAL:description (optional, one per line per issue)"
3299
3306
  # required safe default. pipefail (run.sh:172) makes the assignment's
3300
3307
  # $? equal timeout's 124 when the CLI is killed. _provider_rc is read
3301
3308
  # after the case to force a conservative REJECT on timeout.
3302
- verdict=$(echo "$prompt" | timeout "${LOKI_COUNCIL_REVIEW_TIMEOUT:-600}" env CAVEMAN_DEFAULT_MODE=off claude "${_cm_argv[@]}" -p 2>/dev/null)
3309
+ verdict=$(echo "$prompt" | timeout "${LOKI_COUNCIL_REVIEW_TIMEOUT:-600}" env "SHELL=$_cm_shell" CAVEMAN_DEFAULT_MODE=off claude "${_cm_argv[@]}" -p 2>/dev/null)
3303
3310
  _provider_rc=$?
3304
3311
  fi
3305
3312
  ;;
@@ -3476,6 +3483,13 @@ REASON: one-line justification citing path:line evidence"
3476
3483
  # reviewer must never mutate the tree). Gated + opt-out
3477
3484
  # LOKI_BARE_SUBCALLS=0 / LOKI_REVIEW_TOOL_GUARD=0; type-guarded.
3478
3485
  local _co_argv=("--model" "$council_model")
3486
+ local _co_shell
3487
+ _co_shell="$(
3488
+ type _loki_claude_shell_value >/dev/null 2>&1 \
3489
+ || . "${BASH_SOURCE[0]%/*}/lib/claude-flags.sh" >/dev/null 2>&1 || exit 1
3490
+ _loki_claude_shell_value
3491
+ )" || _co_shell=""
3492
+ [ -n "$_co_shell" ] || _co_shell="${SHELL-}"
3479
3493
  if type loki_subcall_bare_enabled >/dev/null 2>&1 && loki_subcall_bare_enabled; then
3480
3494
  _co_argv+=("--bare")
3481
3495
  fi
@@ -3491,7 +3505,7 @@ REASON: one-line justification citing path:line evidence"
3491
3505
  # bash-F3: timeout-guard the devil's-advocate subcall (same 600s
3492
3506
  # default as the member subcalls / Bun council.ts). An empty
3493
3507
  # verdict on timeout hits the conservative REJECT fallback below.
3494
- verdict=$(echo "$prompt" | timeout "${LOKI_COUNCIL_REVIEW_TIMEOUT:-600}" env CAVEMAN_DEFAULT_MODE=off claude "${_co_argv[@]}" -p 2>/dev/null)
3508
+ verdict=$(echo "$prompt" | timeout "${LOKI_COUNCIL_REVIEW_TIMEOUT:-600}" env "SHELL=$_co_shell" CAVEMAN_DEFAULT_MODE=off claude "${_co_argv[@]}" -p 2>/dev/null)
3495
3509
  fi
3496
3510
  ;;
3497
3511
  codex)
@@ -426,6 +426,14 @@ Respond ONLY with a valid JSON object. No markdown fencing."
426
426
  # opt-out LOKI_BARE_SUBCALLS=0 / LOKI_REVIEW_TOOL_GUARD=0;
427
427
  # type-guarded for standalone sourcing.
428
428
  local _c2_argv=("--model" "${_c2_agent_model:-haiku}")
429
+ # Pin SHELL=/bin/bash for the claude child (LOKI_E10_KEEP_USER_SHELL=1 keeps the user shell).
430
+ local _c2_shell
431
+ _c2_shell="$(
432
+ type _loki_claude_shell_value >/dev/null 2>&1 \
433
+ || . "${BASH_SOURCE[0]%/*}/lib/claude-flags.sh" >/dev/null 2>&1 || exit 1
434
+ _loki_claude_shell_value
435
+ )" || _c2_shell=""
436
+ [ -n "$_c2_shell" ] || _c2_shell="${SHELL-}"
429
437
  if type loki_subcall_bare_enabled >/dev/null 2>&1 && loki_subcall_bare_enabled; then
430
438
  _c2_argv+=("--bare")
431
439
  fi
@@ -458,7 +466,7 @@ Respond ONLY with a valid JSON object. No markdown fencing."
458
466
  local _c2_schema_content _c2_json
459
467
  _c2_schema_content="$(cat "$_c2_schema" 2>/dev/null)" || _c2_schema_content=""
460
468
  if [ -n "$_c2_schema_content" ]; then
461
- _c2_json="$(echo "$full_prompt" | CAVEMAN_DEFAULT_MODE=off claude "${_c2_argv[@]}" -p \
469
+ _c2_json="$(echo "$full_prompt" | SHELL="$_c2_shell" CAVEMAN_DEFAULT_MODE=off claude "${_c2_argv[@]}" -p \
462
470
  --json-schema "$_c2_schema_content" --output-format json 2>/dev/null)" || _c2_json=""
463
471
  if [ -n "$_c2_json" ]; then
464
472
  # Pull the schema-validated object out of the envelope.
@@ -480,7 +488,7 @@ except Exception:
480
488
  fi
481
489
  # Fall through to the plain text call (+ sed-carve) on any miss.
482
490
  if [ -z "$result" ]; then
483
- result=$(echo "$full_prompt" | CAVEMAN_DEFAULT_MODE=off claude "${_c2_argv[@]}" -p 2>/dev/null || echo '{"verdict":"INCONCLUSIVE","justification":"review execution failed (no verdict obtained; NOT a rejection)","issues":[]}')
491
+ result=$(echo "$full_prompt" | SHELL="$_c2_shell" CAVEMAN_DEFAULT_MODE=off claude "${_c2_argv[@]}" -p 2>/dev/null || echo '{"verdict":"INCONCLUSIVE","justification":"review execution failed (no verdict obtained; NOT a rejection)","issues":[]}')
484
492
  fi
485
493
  else
486
494
  result='{"verdict":"INCONCLUSIVE","justification":"reviewer CLI unavailable (no verdict obtained; NOT a rejection)","issues":[]}'
package/autonomy/grill.sh CHANGED
@@ -251,6 +251,9 @@ grill_invoke_provider() {
251
251
  _LOKI_PERM_ARGV=(--dangerously-skip-permissions)
252
252
  ! type _loki_claude_permission_argv >/dev/null 2>&1 || _loki_claude_permission_argv
253
253
  local _gr_argv=("${_LOKI_PERM_ARGV[@]}" "--model" "${LOKI_GRILL_MODEL:-sonnet}")
254
+ # Pin SHELL=/bin/bash for the claude child (LOKI_E10_KEEP_USER_SHELL=1 keeps the user shell).
255
+ local _gr_shell
256
+ _gr_shell="$(_loki_claude_shell_value 2>/dev/null || printf '%s' "${SHELL-}")"
254
257
  # lean child flags (text-only role, no tools/MCP/slash commands) and
255
258
  # a ledger line per call via --output-format json (unwrapped below).
256
259
  local _gr_lf _gr_ledger=false
@@ -275,7 +278,7 @@ grill_invoke_provider() {
275
278
  # (not a bare VAR=val prefix) because the call goes through
276
279
  # _grill_with_timeout, where the first token is exec'd as the command.
277
280
  out="$(printf '%s' "$prompt" \
278
- | _grill_with_timeout "${LOKI_GRILL_TIMEOUT:-180}" env CAVEMAN_DEFAULT_MODE=off claude "${_gr_argv[@]}" -p - 2>/dev/null)"
281
+ | _grill_with_timeout "${LOKI_GRILL_TIMEOUT:-180}" env "SHELL=$_gr_shell" CAVEMAN_DEFAULT_MODE=off claude "${_gr_argv[@]}" -p - 2>/dev/null)"
279
282
  if [ "$_gr_ledger" = true ] && [ -n "$out" ]; then
280
283
  loki_child_ledger_append "$role" "$out" >/dev/null 2>&1 || true
281
284
  out="$(printf '%s' "$out" | python3 -I -c 'import json,sys
@@ -141,6 +141,14 @@ _loki_done_recog_invoke() {
141
141
  || . "$(dirname "${BASH_SOURCE[0]}")/../../providers/loader.sh" 2>/dev/null
142
142
  loki_claude_sidecall_allowed 2>/dev/null || return 1
143
143
  command -v claude >/dev/null 2>&1 || return 1
144
+ # Pin SHELL=/bin/bash for the claude child (LOKI_E10_KEEP_USER_SHELL=1 keeps the user shell).
145
+ local _dr_shell
146
+ _dr_shell="$(
147
+ type _loki_claude_shell_value >/dev/null 2>&1 \
148
+ || . "$(dirname "${BASH_SOURCE[0]}")/claude-flags.sh" >/dev/null 2>&1 || exit 1
149
+ _loki_claude_shell_value
150
+ )" || _dr_shell=""
151
+ [ -n "$_dr_shell" ] || _dr_shell="${SHELL-}"
144
152
 
145
153
  # STRUCTURED VERDICT (v8.x): when the CLI supports --json-schema, force valid
146
154
  # JSON so parse_object never has to brace-slice prose. --json-schema takes
@@ -160,11 +168,11 @@ _loki_done_recog_invoke() {
160
168
  _LOKI_PERM_ARGV=(--dangerously-skip-permissions)
161
169
  ! type _loki_claude_permission_argv >/dev/null 2>&1 || _loki_claude_permission_argv
162
170
  if command -v timeout >/dev/null 2>&1; then
163
- _dr_json=$(CAVEMAN_DEFAULT_MODE=off timeout "${LOKI_DONE_RECOG_TIMEOUT}" \
171
+ _dr_json=$(SHELL="$_dr_shell" CAVEMAN_DEFAULT_MODE=off timeout "${LOKI_DONE_RECOG_TIMEOUT}" \
164
172
  claude "${_LOKI_PERM_ARGV[@]}" -p "$prompt" \
165
173
  --json-schema "$_dr_schema_content" --output-format json 2>/dev/null) || _dr_json=""
166
174
  else
167
- _dr_json=$(CAVEMAN_DEFAULT_MODE=off \
175
+ _dr_json=$(SHELL="$_dr_shell" CAVEMAN_DEFAULT_MODE=off \
168
176
  claude "${_LOKI_PERM_ARGV[@]}" -p "$prompt" \
169
177
  --json-schema "$_dr_schema_content" --output-format json 2>/dev/null) || _dr_json=""
170
178
  fi
@@ -197,10 +205,10 @@ except Exception:
197
205
  _LOKI_PERM_ARGV=(--dangerously-skip-permissions)
198
206
  ! type _loki_claude_permission_argv >/dev/null 2>&1 || _loki_claude_permission_argv
199
207
  if command -v timeout >/dev/null 2>&1; then
200
- out=$(CAVEMAN_DEFAULT_MODE=off timeout "${LOKI_DONE_RECOG_TIMEOUT}" \
208
+ out=$(SHELL="$_dr_shell" CAVEMAN_DEFAULT_MODE=off timeout "${LOKI_DONE_RECOG_TIMEOUT}" \
201
209
  claude "${_LOKI_PERM_ARGV[@]}" -p "$prompt" 2>/dev/null) || rc=$?
202
210
  else
203
- out=$(CAVEMAN_DEFAULT_MODE=off \
211
+ out=$(SHELL="$_dr_shell" CAVEMAN_DEFAULT_MODE=off \
204
212
  claude "${_LOKI_PERM_ARGV[@]}" -p "$prompt" 2>/dev/null) || rc=$?
205
213
  fi
206
214
  [ "$rc" -ne 0 ] && return 1
@@ -101,13 +101,16 @@ _loki_prd_enrich_invoke() {
101
101
  _pe_ledger=true
102
102
  _pe_argv+=("--output-format" "json")
103
103
  fi
104
+ # Pin SHELL=/bin/bash for the claude child (LOKI_E10_KEEP_USER_SHELL=1 keeps the user shell).
105
+ local _pe_shell
106
+ _pe_shell="$(_loki_claude_shell_value 2>/dev/null || printf '%s' "${SHELL-}")"
104
107
  if command -v timeout >/dev/null 2>&1; then
105
- out=$(CAVEMAN_DEFAULT_MODE=off timeout "${LOKI_PRD_ENRICH_TIMEOUT}" \
108
+ out=$(SHELL="$_pe_shell" CAVEMAN_DEFAULT_MODE=off timeout "${LOKI_PRD_ENRICH_TIMEOUT}" \
106
109
  claude "${_pe_argv[@]}" -p "$prompt" 2>/dev/null) || rc=$?
107
110
  else
108
111
  # No coreutils timeout (e.g. bare macOS). Run without it; the model
109
112
  # call is a one-shot and the caller still tolerates failure.
110
- out=$(CAVEMAN_DEFAULT_MODE=off \
113
+ out=$(SHELL="$_pe_shell" CAVEMAN_DEFAULT_MODE=off \
111
114
  claude "${_pe_argv[@]}" -p "$prompt" 2>/dev/null) || rc=$?
112
115
  fi
113
116
  if [ "$rc" -eq 0 ] && [ "$_pe_ledger" = true ] && [ -n "$out" ]; then
@@ -401,7 +401,7 @@ loki_council_dispatch_agents() {
401
401
  _va_fmt=(--output-format json)
402
402
  fi
403
403
  response=$(timeout "${LOKI_COUNCIL_REVIEW_TIMEOUT:-600}" \
404
- env CAVEMAN_DEFAULT_MODE=off claude "${_LOKI_PERM_ARGV[@]}" \
404
+ env "SHELL=$(_loki_claude_shell_value 2>/dev/null || printf '%s' "${SHELL-}")" CAVEMAN_DEFAULT_MODE=off claude "${_LOKI_PERM_ARGV[@]}" \
405
405
  ${_va_lean[@]+"${_va_lean[@]}"} \
406
406
  ${_va_fmt[@]+"${_va_fmt[@]}"} \
407
407
  -p "$prompt" \