loki-mode 11.9.1 → 11.10.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.
Files changed (71) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/autonomy/lib/backlog.py +12 -1
  4. package/autonomy/loki +4 -2
  5. package/autonomy/trigger-server.py +22 -2
  6. package/dashboard/__init__.py +1 -1
  7. package/docs/CLI-REFERENCE.md +1 -1
  8. package/docs/INSTALLATION.md +1 -1
  9. package/docs/v10/PROGRESS.md +12 -0
  10. package/loki-ts/dist/loki.js +890 -886
  11. package/mcp/__init__.py +1 -1
  12. package/package.json +2 -2
  13. package/packages/control-plane/dist/server.js +29 -3
  14. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  15. package/web-app/dist/assets/{AdminPage-BdH9iL2I.js → AdminPage-D3PgG7SH.js} +1 -1
  16. package/web-app/dist/assets/{Avatar-C-WixxR6.js → Avatar-Ct77hvlG.js} +1 -1
  17. package/web-app/dist/assets/{Badge-BFWpRd_L.js → Badge-Cg_gZaJF.js} +1 -1
  18. package/web-app/dist/assets/{Button-CE5vG66Y.js → Button-i9r2G84n.js} +1 -1
  19. package/web-app/dist/assets/{CockpitPage-BAVn10bY.js → CockpitPage-C3UyLXyp.js} +1 -1
  20. package/web-app/dist/assets/{ComparePage-DOecIGfM.js → ComparePage-B1dXHga_.js} +1 -1
  21. package/web-app/dist/assets/{ErrorBoundary-1rNA5v7f.js → ErrorBoundary-CQ_xREw0.js} +1 -1
  22. package/web-app/dist/assets/{EvidenceReceiptPanel-DjOaWfdH.js → EvidenceReceiptPanel-DwUxd_Xi.js} +1 -1
  23. package/web-app/dist/assets/{GitHubIssuesPanel-NNPBuRPD.js → GitHubIssuesPanel-C0jAnuAd.js} +1 -1
  24. package/web-app/dist/assets/{GitHubPRsPanel-CL1b--tV.js → GitHubPRsPanel-B4pNXJMz.js} +1 -1
  25. package/web-app/dist/assets/{HomePage-BsLDN6MW.js → HomePage-BC9UTS1l.js} +2 -2
  26. package/web-app/dist/assets/{LoginPage-CVIv5bCS.js → LoginPage-CnpdwK8F.js} +1 -1
  27. package/web-app/dist/assets/{MagicPage-BgMBB9lK.js → MagicPage-Bj0lZuNp.js} +1 -1
  28. package/web-app/dist/assets/{MetricsPage-BHeJlqPC.js → MetricsPage-yyw3VnfX.js} +1 -1
  29. package/web-app/dist/assets/{NotFoundPage-DDzwfyDK.js → NotFoundPage-LMxkJP15.js} +1 -1
  30. package/web-app/dist/assets/{ProjectPage-CuQWEYBF.js → ProjectPage-2x0MRkNu.js} +3 -3
  31. package/web-app/dist/assets/{ProjectsPage-OoD0RFDZ.js → ProjectsPage-A8J8o1gj.js} +1 -1
  32. package/web-app/dist/assets/{SettingsPage-tMFMKkK5.js → SettingsPage-fwvOVcRb.js} +1 -1
  33. package/web-app/dist/assets/{ShowcasePage-DVfLoWdz.js → ShowcasePage-DqI4sUwk.js} +1 -1
  34. package/web-app/dist/assets/{SystemSettingsPage-CThV9N4l.js → SystemSettingsPage-CyytfNo_.js} +1 -1
  35. package/web-app/dist/assets/{TeamsPage-CV0nvXI8.js → TeamsPage-BTTe76W1.js} +1 -1
  36. package/web-app/dist/assets/{TemplatesPage-D81EI1L8.js → TemplatesPage-CIp3OTlL.js} +1 -1
  37. package/web-app/dist/assets/{TerminalOutput-Bj7uKRIe.js → TerminalOutput-dX5L4ky-.js} +1 -1
  38. package/web-app/dist/assets/{activity-DoNfNkOL.js → activity-uHXr2AaF.js} +1 -1
  39. package/web-app/dist/assets/{bell-BWO3OU50.js → bell-D6RbxRMo.js} +1 -1
  40. package/web-app/dist/assets/{bot-DcvWv_zD.js → bot-D31w2Mu6.js} +1 -1
  41. package/web-app/dist/assets/{check-CfG09Z18.js → check-CoKJksbr.js} +1 -1
  42. package/web-app/dist/assets/{chevron-left-z0fh4x2h.js → chevron-left-Bjx7oX7s.js} +1 -1
  43. package/web-app/dist/assets/{circle-alert-C_7GlYul.js → circle-alert-DOAh8Jmi.js} +1 -1
  44. package/web-app/dist/assets/{clock-BsYUp070.js → clock-DgEXPNWH.js} +1 -1
  45. package/web-app/dist/assets/{cloud-BVWAJ7Rv.js → cloud-0dXJFzBv.js} +1 -1
  46. package/web-app/dist/assets/{code-xml-CdZT-6zu.js → code-xml-DytQ_bq7.js} +1 -1
  47. package/web-app/dist/assets/{database-Dbkm9t2D.js → database-Qyjryb72.js} +1 -1
  48. package/web-app/dist/assets/{dollar-sign-CfIUM5Pd.js → dollar-sign-BzhTVy1e.js} +1 -1
  49. package/web-app/dist/assets/{file-code-corner-CrUKhnj-.js → file-code-corner-DTdSOALw.js} +1 -1
  50. package/web-app/dist/assets/{file-plus-Cf6u0xHY.js → file-plus-VdjOG1RK.js} +1 -1
  51. package/web-app/dist/assets/{globe-DsIqaI7w.js → globe-BhxNOfyM.js} +1 -1
  52. package/web-app/dist/assets/{hammer-CA14BeMp.js → hammer-MQzrw8ee.js} +1 -1
  53. package/web-app/dist/assets/{index-DpJ_GJuZ.js → index-DaxrMbHf.js} +3 -3
  54. package/web-app/dist/assets/{layers-Dh5Oqhrj.js → layers-C7nusTP-.js} +1 -1
  55. package/web-app/dist/assets/{loader-circle-B0WHIGqt.js → loader-circle-B1qBkgOY.js} +1 -1
  56. package/web-app/dist/assets/{lock-DkgfEGYF.js → lock-BdkOxK2O.js} +1 -1
  57. package/web-app/dist/assets/{package-LzjmwD1S.js → package-RVyK96Zn.js} +1 -1
  58. package/web-app/dist/assets/{plus-BNjA0KSV.js → plus-ntmwFRrp.js} +1 -1
  59. package/web-app/dist/assets/{refresh-cw-k3IacuDX.js → refresh-cw-BJ39b_PP.js} +1 -1
  60. package/web-app/dist/assets/{rotate-ccw-BFON_xv-.js → rotate-ccw-uPx_-3vz.js} +1 -1
  61. package/web-app/dist/assets/{scroll-text-CaIlSPZB.js → scroll-text-D9qvXkj-.js} +1 -1
  62. package/web-app/dist/assets/{server-CKFUccCG.js → server-gs4xmD8Y.js} +1 -1
  63. package/web-app/dist/assets/{shield-alert-Q4-rPo5r.js → shield-alert-O2_YffGI.js} +1 -1
  64. package/web-app/dist/assets/{thumbs-up-BYMeh8oV.js → thumbs-up-B3RVBhQx.js} +1 -1
  65. package/web-app/dist/assets/{trash-2-BHSUEIHw.js → trash-2-DEUt7qhq.js} +1 -1
  66. package/web-app/dist/assets/{trending-down-BC_FR2VT.js → trending-down-oyTns4UZ.js} +1 -1
  67. package/web-app/dist/assets/{trending-up-CmA-WmLW.js → trending-up-CdpZK0Oc.js} +1 -1
  68. package/web-app/dist/assets/{upload-BxLgBa1B.js → upload-D9sbjjC8.js} +1 -1
  69. package/web-app/dist/assets/{usePolling-DKNgwt5n.js → usePolling-6ognrnyV.js} +1 -1
  70. package/web-app/dist/assets/{user-CA2DlmLc.js → user-CBKc8QoI.js} +1 -1
  71. package/web-app/dist/index.html +1 -1
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.9.1
6
+ # Loki Mode v11.10.1
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.9.1 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v11.10.1 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.9.1
1
+ 11.10.1
@@ -196,7 +196,7 @@ def load_dag(path, group):
196
196
  raise ValueError("unit %s task text starts with '-' and would be read as an option" % uid)
197
197
  units.append({"n": n, "id": uid, "deps": deps[uid], "write_set": list(u.get("writeSet") or []),
198
198
  "task": task, "done": u.get("done") is True,
199
- "base": str(u["base"]) if re.match(r"^[0-9a-f]{7,64}$", str(u.get("base") or "")) else "",
199
+ "base": str(u.get("base") or ""),
200
200
  "spec": u["spec"] if isinstance(u.get("spec"), str) and os.path.isabs(u["spec"]) else ""})
201
201
  return group, units
202
202
 
@@ -266,6 +266,17 @@ def main(argv):
266
266
  return die("this checkout's origin is %r, not %s; cd into a checkout of %s"
267
267
  % (origin_slug(top) or "unknown", a.repo, a.repo))
268
268
 
269
+ for u in dag_units:
270
+ b = u["base"]
271
+ if not b or re.match(r"^[0-9a-f]{7,64}$", b):
272
+ continue
273
+ # A ref-name base is resolved to a SHA; an unresolvable one fails loudly, never falls back to origin/HEAD.
274
+ r = git("rev-parse", "--verify", "-q", "--end-of-options", b + "^{commit}", cwd=top) if not b.startswith("-") else None
275
+ sha = r.stdout.strip() if r is not None and r.returncode == 0 else ""
276
+ if not re.match(r"^[0-9a-f]{40,64}$", sha):
277
+ return die("unit %s base %r is not a commit SHA or a resolvable ref" % (u["id"], b))
278
+ u["base"] = sha
279
+
269
280
  try:
270
281
  issues = ([{"number": n, "title": ""} for n in numbers] if numbers
271
282
  else list_issues(a.repo, a.label, env) if (a.all or a.label) else [])
package/autonomy/loki CHANGED
@@ -11075,6 +11075,7 @@ cmd_run() {
11075
11075
  echo " --sandbox Run in Docker sandbox (default: off; requires Docker)"
11076
11076
  echo " --no-plan Skip auto-shown PRD analysis at startup"
11077
11077
  echo " --budget USD Per-run cost cap (default $(loki_budget_default_usd))"
11078
+ echo " --brief-text TEXT (internal) set by 'loki start --brief'; not for direct use"
11078
11079
  echo ""
11079
11080
  echo "Progressive Isolation:"
11080
11081
  echo " --worktree, -w Git worktree isolation (separate branch)"
@@ -11491,7 +11492,8 @@ fi
11491
11492
  if [[ "$LOKI_AUTO_MERGE" == "true" ]]; then
11492
11493
  branch_current=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
11493
11494
  if gh pr merge "$branch_current" --squash --delete-branch 2>/dev/null; then
11494
- if [[ -n "${LOKI_ISSUE_NUMBER:-}" ]]; then
11495
+ # A brief run carries a synthetic ref (b<epoch>), not a real issue: close only numeric refs.
11496
+ if [[ "${LOKI_ISSUE_NUMBER:-}" =~ ^[0-9]+$ ]]; then
11495
11497
  gh issue close "$LOKI_ISSUE_NUMBER" --comment "Resolved by Loki Mode" 2>/dev/null || true
11496
11498
  fi
11497
11499
  fi
@@ -11738,7 +11740,7 @@ ${_gh_receipt}"
11738
11740
  if $auto_merge; then
11739
11741
  echo -e "${GREEN}Auto-merging...${NC}"
11740
11742
  case "${issue_provider:-github}" in
11741
- github)
11743
+ github|brief)
11742
11744
  local branch_current
11743
11745
  branch_current=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
11744
11746
  if gh pr merge "$branch_current" --squash --delete-branch 2>/dev/null; then
@@ -748,6 +748,27 @@ def verify_teams_signature(token, body, authorization):
748
748
  return constant_time_equals(expected, value.strip())
749
749
 
750
750
 
751
+ def teams_dedup_key(activity):
752
+ """Dedup key for a Teams activity: activity ids are unique only within a
753
+ conversation, so scope by conversation id plus serviceUrl and tenant when
754
+ present. Empty string (never deduplicated) when the activity id is absent."""
755
+ act_id = activity.get("id")
756
+ if not isinstance(act_id, str) or not act_id:
757
+ return ""
758
+
759
+ def _s(v):
760
+ return v if isinstance(v, str) else ""
761
+
762
+ conv = activity.get("conversation")
763
+ conv = conv if isinstance(conv, dict) else {}
764
+ cdata = activity.get("channelData")
765
+ tenant = cdata.get("tenant") if isinstance(cdata, dict) else None
766
+ tenant_id = _s(tenant.get("id")) if isinstance(tenant, dict) else ""
767
+ tenant_id = tenant_id or _s(conv.get("tenantId"))
768
+ return "teams:" + json.dumps(
769
+ [_s(conv.get("id")), _s(activity.get("serviceUrl")), tenant_id, act_id])
770
+
771
+
751
772
  def teams_fresh(activity, now=None):
752
773
  """The activity's ISO-8601 `timestamp` must be within the skew window."""
753
774
  raw = activity.get("timestamp")
@@ -1794,8 +1815,7 @@ class WebhookHandler(http.server.BaseHTTPRequestHandler):
1794
1815
  "text": "Usage: @loki <brief>. One-line brief, "
1795
1816
  "not starting with '-'."})
1796
1817
  return
1797
- act_id = activity.get("id")
1798
- if self.dispatcher.seen_delivery(act_id if isinstance(act_id, str) else ""):
1818
+ if self.dispatcher.seen_delivery(teams_dedup_key(activity)):
1799
1819
  self._send_json(200, {"type": "message", "text": "Duplicate, already queued."})
1800
1820
  return
1801
1821
  job_id = self._enqueue_job(brief, pr=True)
@@ -7,6 +7,6 @@ Modules:
7
7
  control: Session control helpers (status, atomic writes, origin check)
8
8
  """
9
9
 
10
- __version__ = "11.9.1"
10
+ __version__ = "11.10.1"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -1,6 +1,6 @@
1
1
  # CLI reference
2
2
 
3
- Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.9.1. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.10.1. Do not edit by hand.
4
4
  Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
5
5
 
6
6
  | Command | Description |
@@ -2,7 +2,7 @@
2
2
 
3
3
  Loki Mode, by [Autonomi](https://www.autonomi.dev/), turns a spec or an issue into a verified pull request with a receipt you can check. This page covers installing it, a first run, and the options around it.
4
4
 
5
- **Version:** v11.9.1
5
+ **Version:** v11.10.1
6
6
 
7
7
  **Engine note:** `loki start` is the primary command. `loki start`, `loki "<task>"`, `loki owner/repo#N` and `loki quick` all run the Loki 10 engine, whatever the flag order or input form (PRD file, issue ref, task or one-word brief). The previous loop runs only on `--engine legacy`, `LOKI_ENGINE=legacy`, or for one call when a flag Loki 10 cannot honor is present. See the [user guide](v10/GUIDE.md) and the [5-minute quickstart](QUICKSTART.md).
8
8
 
@@ -2359,3 +2359,15 @@ The swarm is stopped: .loki/V10-STOP exists, the loop has no wake-ups, and the c
2359
2359
  - v11.9.0 (b46960893): Tests run 38811268755 and Release 38811268450 failed: python test_trigger_server_hardening BriefPr test assumed a host provider CLI; bun static shape (engine10 outside the cli.ts arm, from ESTIMATE-ONE) and its E-12 shell twin; bun L0 guard (runner_config probes unlisted, two stale verify.ts rows); DOC-02 (docs/sentry-intake.md:56 named `loki job`). Not published; npm next stays 11.8.1.
2360
2360
  - Fix c42d7fd22 (TL review APPROVE: 140 pass 0 fail plus 26 pass 0 fail on a git-archive copy), merged 9da6e2772.
2361
2361
  - Guards on 9da6e2772 after dist rebuild (build rc=0): help-changelog-drift, sigpipe-guard, help-and-log-cap, ci-only-divergence, platform-infra, engine10-dispatch, docs-cli-drift, structural-checks all rc=0; pytest test_trigger_server_hardening 70 passed; bun budget, l2_destructive_registry, fc25, spawn_env, start_flag_parity, l0_guard, cli static shape 57 pass 0 fail.
2362
+
2363
+ ## 2026-10-15T22:17Z (CoS) v11.10.0 train merged, release pending
2364
+ - 11.9.1 (9d64d1461): Release and Tests completed/success; npm next=11.9.1, latest=11.8.1; GitHub release body set.
2365
+ - Merged into main with --no-ff (workflow wf_2c49533d-407, all reviews APPROVE): BRIEF-SHIP-FIX fb08048ef (a5f19f4c9), TEAMS-DEDUP ae7c8a7e5 (81d06e674), BASE-AND-SUBDIR 21f7d2581 (f02699857), A-112b bfd6b98d8 (b4e63c1ff), S41-13 e3607718c after rework (eb6c8d762; dist conflict resolved by rebuild, build rc=0).
2366
+ - Not shipped: M-15 (Opus BLOCK at unit.ts:164, symlinked conftest.py reaches PROVEN); round 3 rework in workflow wf_1d55d32c-a65. M-17..M-29 and G-05 stay blocked on it.
2367
+ - Advisory to card: TEAMS-DEDUP collision test is toothless; use conv='a|b',svc='c' against conv='a',svc='b|c'.
2368
+ - Guards on eb6c8d762: structural-checks and bun budget failed (core engine10 5000 >= 5000; A-112b split the verify.ts git helper over three lines). Folded it back to one line, no behaviour change. After dist rebuild (build rc=0): help-changelog-drift, sigpipe-guard, help-and-log-cap, ci-only-divergence, platform-infra, engine10-dispatch, docs-cli-drift, structural-checks all rc=0; pytest test_trigger_server_hardening 74 passed; bun budget, l2_destructive_registry, l0_guard, fc25, spawn_env, start_flag_parity, cli static shape, attempts, implement, verify 131 pass 0 fail.
2369
+
2370
+ ## 2026-10-15T22:37Z (CoS) v11.10.0 failed CI, v11.10.1 fix-forward
2371
+ - v11.10.0 (58344ed27): Tests run 38816323342 and Release failed: bun route_matrix_mutation B3 and B6 (anchor "let session = await ctx.sessions.run(first);" no longer exists after S41-13, so the mutations were not applied). Not published; npm next stays 11.9.1.
2372
+ - Fix: anchor updated to the S41-13 line in loki-ts/tests/engine10/route_matrix_mutation.test.ts (33 pass 0 fail); bun test tests/engine10 2037 pass 0 fail 1 skip.
2373
+ - M-15 round 4 (1c9a5e56a) Opus BLOCK: case-insensitive Conftest.py and symlinks under SKIP_DIRS; round 5 (class fixes) in flight.