loki-mode 11.3.1 → 11.3.4

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 (107) hide show
  1. package/SKILL.md +4 -4
  2. package/VERSION +1 -1
  3. package/autonomy/lib/efficiency_cost.py +8 -0
  4. package/autonomy/lib/engine10-push.sh +22 -8
  5. package/autonomy/loki +69 -30
  6. package/bin/loki +30 -1
  7. package/completions/_loki +22 -0
  8. package/completions/loki.bash +17 -3
  9. package/dashboard/__init__.py +1 -1
  10. package/dashboard/server.py +22 -14
  11. package/docs/AGENT-CHANGE-RECEIPT.md +2 -2
  12. package/docs/CLI-REFERENCE.md +5 -1
  13. package/docs/INSTALLATION.md +1 -1
  14. package/docs/OTEL-COLLECTOR.md +24 -0
  15. package/docs/ROUTING-EVIDENCE.md +32 -0
  16. package/docs/environment-variables.md +1 -0
  17. package/docs/spec-first-intent.md +28 -0
  18. package/docs/v10/CLI-MODERN.md +6 -3
  19. package/docs/v10/DECISIONS.md +20 -0
  20. package/docs/v10/FAILURE-CLASSES.md +263 -1
  21. package/docs/v10/GUARDS.md +18 -0
  22. package/docs/v10/GUIDE.md +7 -5
  23. package/docs/v10/METRICS.md +12 -0
  24. package/docs/v10/OPERATING-MODEL.md +3 -3
  25. package/docs/v10/PROGRESS.md +12 -0
  26. package/docs/v11/INTOTO-AGENT-CHANGE-PREDICATE.md +77 -0
  27. package/docs/v11/MCP-2026-07-28.md +55 -0
  28. package/docs/v11/VERIFY-PR-SANDBOX.md +41 -0
  29. package/loki-ts/dist/loki.js +1130 -969
  30. package/mcp/__init__.py +1 -1
  31. package/mcp/v10_tools.py +29 -0
  32. package/package.json +9 -11
  33. package/packages/control-plane/dist/ask-tools-server.js +8 -2
  34. package/packages/control-plane/dist/server.js +15752 -13978
  35. package/packages/control-plane/drizzle/0006_token_sessions.sql +1 -0
  36. package/packages/control-plane/drizzle/meta/0006_snapshot.json +807 -0
  37. package/packages/control-plane/drizzle/meta/_journal.json +7 -0
  38. package/packages/control-plane/src/db/schema.ts +1 -0
  39. package/packages/control-plane/src/server/routes/cost.ts +4 -3
  40. package/packages/control-plane/src/server/runs.ts +3 -3
  41. package/packages/control-plane/ui/dist/assets/index-DbLzr87u.js +190 -0
  42. package/packages/control-plane/ui/dist/index.html +1 -1
  43. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  44. package/providers/opencode.sh +2 -3
  45. package/src/observability/genai-spans.js +104 -0
  46. package/src/observability/otel-bridge.js +49 -1
  47. package/src/observability/otel.js +2 -2
  48. package/src/protocols/mcp-server.js +180 -5
  49. package/src/protocols/transport/sse.js +23 -2
  50. package/web-app/dist/assets/{AdminPage-CMkHNJbF.js → AdminPage-CKj0pDt0.js} +1 -1
  51. package/web-app/dist/assets/{Avatar-BJyjV7Zi.js → Avatar-BOV__pMM.js} +1 -1
  52. package/web-app/dist/assets/{Badge-D572l0uq.js → Badge-4a6mAYjU.js} +1 -1
  53. package/web-app/dist/assets/{Button-T4BnOZgl.js → Button-B3GM7oxm.js} +1 -1
  54. package/web-app/dist/assets/{CockpitPage-Cj_GFsNn.js → CockpitPage-Cwge3_kH.js} +1 -1
  55. package/web-app/dist/assets/{ComparePage-A8m4ZXak.js → ComparePage-CBQUGKsm.js} +1 -1
  56. package/web-app/dist/assets/{ErrorBoundary-hugCg5yg.js → ErrorBoundary-TM7lDjUJ.js} +1 -1
  57. package/web-app/dist/assets/{EvidenceReceiptPanel-CuJKDC2G.js → EvidenceReceiptPanel-DUOseTYA.js} +1 -1
  58. package/web-app/dist/assets/{GitHubIssuesPanel-BYGKjarC.js → GitHubIssuesPanel-hK_uML6T.js} +1 -1
  59. package/web-app/dist/assets/{GitHubPRsPanel-c7sFIJlf.js → GitHubPRsPanel-Bt0mug-u.js} +1 -1
  60. package/web-app/dist/assets/{HomePage-A1MIkG2P.js → HomePage-DcOogAai.js} +2 -2
  61. package/web-app/dist/assets/{LoginPage-8KQMRhtR.js → LoginPage-D41pjjhF.js} +1 -1
  62. package/web-app/dist/assets/{MagicPage-C05QW2Lx.js → MagicPage-iDcdAcL2.js} +1 -1
  63. package/web-app/dist/assets/{MetricsPage-Oukv5hme.js → MetricsPage-Tt4sfFD1.js} +1 -1
  64. package/web-app/dist/assets/{NotFoundPage-DKIwsawz.js → NotFoundPage-DPQMausn.js} +1 -1
  65. package/web-app/dist/assets/{ProjectPage-DwFRPLCG.js → ProjectPage-DdMz4frY.js} +3 -3
  66. package/web-app/dist/assets/{ProjectsPage-CgY4YYDX.js → ProjectsPage-Be0v4ace.js} +1 -1
  67. package/web-app/dist/assets/{SettingsPage-BpfcSjUA.js → SettingsPage-90yIh-mE.js} +1 -1
  68. package/web-app/dist/assets/{ShowcasePage-BqBakC4K.js → ShowcasePage-D5x5eczl.js} +1 -1
  69. package/web-app/dist/assets/{SystemSettingsPage-CZLu5VB0.js → SystemSettingsPage-UWeWT8KX.js} +1 -1
  70. package/web-app/dist/assets/{TeamsPage-D55S1jKz.js → TeamsPage-BtofFlme.js} +1 -1
  71. package/web-app/dist/assets/{TemplatesPage-D3SydvxN.js → TemplatesPage-DwB8Va2Z.js} +1 -1
  72. package/web-app/dist/assets/{TerminalOutput-hNg8G1-e.js → TerminalOutput-CGIgTmby.js} +1 -1
  73. package/web-app/dist/assets/{activity-D2C0VagO.js → activity-BZ77CO72.js} +1 -1
  74. package/web-app/dist/assets/{bell-CMvYi36w.js → bell-Bzpqv6un.js} +1 -1
  75. package/web-app/dist/assets/{bot-BvtQ6lmo.js → bot-yXo1B_-f.js} +1 -1
  76. package/web-app/dist/assets/{check-B13xkXed.js → check-BSxGjsta.js} +1 -1
  77. package/web-app/dist/assets/{chevron-left-emu6r49E.js → chevron-left-CqTRVUB5.js} +1 -1
  78. package/web-app/dist/assets/{circle-alert-CExlwjuy.js → circle-alert-88gdjY71.js} +1 -1
  79. package/web-app/dist/assets/{clock-D7Uas3oL.js → clock-XdFXoaJi.js} +1 -1
  80. package/web-app/dist/assets/{cloud-CkB4S86C.js → cloud-Tx1sJrXz.js} +1 -1
  81. package/web-app/dist/assets/{code-xml-SL9IIWIn.js → code-xml-DaH9CKWy.js} +1 -1
  82. package/web-app/dist/assets/{database-BQFkd7t1.js → database-BpvOmzij.js} +1 -1
  83. package/web-app/dist/assets/{dollar-sign-qHmnNYsU.js → dollar-sign-VC2UX2UE.js} +1 -1
  84. package/web-app/dist/assets/{file-code-corner-C2YUDP0K.js → file-code-corner--TF3VpoT.js} +1 -1
  85. package/web-app/dist/assets/{file-plus-C_ooIkDe.js → file-plus-DZpwU9pY.js} +1 -1
  86. package/web-app/dist/assets/{globe-CQ-GL485.js → globe-tbpeHRPV.js} +1 -1
  87. package/web-app/dist/assets/{hammer-U05L_D7V.js → hammer-CKLXn4vL.js} +1 -1
  88. package/web-app/dist/assets/{index-CooHd7I-.js → index-DnCsWpCh.js} +3 -3
  89. package/web-app/dist/assets/{layers-Buo17rjW.js → layers-B0fkGsk8.js} +1 -1
  90. package/web-app/dist/assets/{loader-circle-15vK3oV1.js → loader-circle-czscMzmQ.js} +1 -1
  91. package/web-app/dist/assets/{lock-BeXLebuJ.js → lock-CTtO6vc8.js} +1 -1
  92. package/web-app/dist/assets/{package-MVh_6-6R.js → package-DZeSY0-g.js} +1 -1
  93. package/web-app/dist/assets/{plus-Dh_nd9vS.js → plus-mE12CJVN.js} +1 -1
  94. package/web-app/dist/assets/{refresh-cw-C9cBJEAT.js → refresh-cw-9DSznasU.js} +1 -1
  95. package/web-app/dist/assets/{rotate-ccw-D3PAtzST.js → rotate-ccw-DcHI0M43.js} +1 -1
  96. package/web-app/dist/assets/{scroll-text-DZCoXQjo.js → scroll-text-BWLthSw-.js} +1 -1
  97. package/web-app/dist/assets/{server-OCOLI5J_.js → server-_I247LrS.js} +1 -1
  98. package/web-app/dist/assets/{shield-alert-oVhmf1_h.js → shield-alert-XRJYD_6c.js} +1 -1
  99. package/web-app/dist/assets/{thumbs-up-B-kbX4vN.js → thumbs-up-CxuTD3eO.js} +1 -1
  100. package/web-app/dist/assets/{trash-2-EL6moveW.js → trash-2-DuGxuVt8.js} +1 -1
  101. package/web-app/dist/assets/{trending-down-Cl3kjpsx.js → trending-down-Cg_zGt__.js} +1 -1
  102. package/web-app/dist/assets/{trending-up-DST7I6M2.js → trending-up-DpUJzIrV.js} +1 -1
  103. package/web-app/dist/assets/{upload-CUOT780G.js → upload-Db7YZ4zR.js} +1 -1
  104. package/web-app/dist/assets/{usePolling-Djmt90eb.js → usePolling-BGRYm-vq.js} +1 -1
  105. package/web-app/dist/assets/{user-BRBohA6J.js → user-CxHrowEP.js} +1 -1
  106. package/web-app/dist/index.html +1 -1
  107. package/packages/control-plane/ui/dist/assets/index-DcBJXjCJ.js +0 -190
package/mcp/__init__.py CHANGED
@@ -75,4 +75,4 @@ try:
75
75
  except ImportError:
76
76
  __all__ = ['mcp']
77
77
 
78
- __version__ = '11.3.1'
78
+ __version__ = '11.3.4'
package/mcp/v10_tools.py CHANGED
@@ -193,3 +193,32 @@ def v10_verify(receipt_path: str, repo_path: str, validate: Callable[[str], str]
193
193
  return {"error": f"could not run loki verify: {e}"}
194
194
  out = ((p.stdout or "") + (p.stderr or "")).strip()
195
195
  return {"exit_code": p.returncode, "verified": p.returncode == 0, "output": out[-2000:]}
196
+
197
+
198
+ def _cwd_validator(p: str) -> str:
199
+ """Resolve p and require it to sit inside the current working directory (the MCP server's, as for the SDK path)."""
200
+ root = os.path.realpath(os.getcwd())
201
+ real = os.path.realpath(p)
202
+ if real != root and not real.startswith(root + os.sep):
203
+ raise ValueError(f"path outside the working directory: {p}")
204
+ return real
205
+
206
+
207
+ def cli(argv: List[str]) -> int:
208
+ """MCP-D adapter for the JS server's Tasks. Calls only v10_verify or v10_run and prints their dict as one
209
+ sorted-key JSON line. Nothing else is reachable from here, and no verdict is computed or changed."""
210
+ import sys
211
+ if len(argv) != 3 or argv[0] not in ("verify", "run"):
212
+ sys.stderr.write("usage: v10_tools.py verify <receipt_path|''> <repo_path|''> | run <ref> <repo_path>\n")
213
+ return 2
214
+ if argv[0] == "verify":
215
+ result = v10_verify(argv[1], argv[2], _cwd_validator)
216
+ else:
217
+ result = v10_run(argv[1], argv[2], _cwd_validator)
218
+ sys.stdout.write(json.dumps(result, sort_keys=True) + "\n")
219
+ return 0
220
+
221
+
222
+ if __name__ == "__main__":
223
+ import sys
224
+ sys.exit(cli(sys.argv[1:]))
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "loki-mode",
3
3
  "mcpName": "io.github.asklokesh/loki-mode",
4
- "version": "11.3.1",
4
+ "version": "11.3.4",
5
5
  "description": "An autonomous software factory that knows what it is supposed to deliver, and proves it did.",
6
6
  "keywords": [
7
7
  "agent",
@@ -106,10 +106,7 @@
106
106
  "completions/",
107
107
  "src/",
108
108
  "web-app/dist/",
109
- "web-app/server.py",
110
- "web-app/auth.py",
111
- "web-app/models.py",
112
- "web-app/crypto.py",
109
+ "web-app/*.py",
113
110
  "web-app/requirements.txt",
114
111
  "web-app/alembic.ini",
115
112
  "web-app/migrations/",
@@ -138,17 +135,17 @@
138
135
  ],
139
136
  "optionalDependencies": {
140
137
  "@anthropic-ai/claude-agent-sdk": "0.3.293",
138
+ "@opentelemetry/api": "^1.9.1",
139
+ "@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
140
+ "@opentelemetry/sdk-trace-base": "^2.10.0",
141
+ "@opentelemetry/sdk-trace-node": "^2.10.0",
141
142
  "@oven/bun-darwin-aarch64": "1.4.2",
142
143
  "@oven/bun-darwin-x64": "1.4.2",
143
144
  "@oven/bun-linux-aarch64": "1.4.2",
144
145
  "@oven/bun-linux-aarch64-musl": "1.4.2",
145
146
  "@oven/bun-linux-x64": "1.4.2",
146
147
  "@oven/bun-linux-x64-musl": "1.4.2",
147
- "@oven/bun-windows-x64": "1.4.2",
148
- "@opentelemetry/api": "^1.9.1",
149
- "@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
150
- "@opentelemetry/sdk-trace-base": "^2.10.0",
151
- "@opentelemetry/sdk-trace-node": "^2.10.0"
148
+ "@oven/bun-windows-x64": "1.4.2"
152
149
  },
153
150
  "overrides": {
154
151
  "protobufjs": ">=8.4.2",
@@ -162,5 +159,6 @@
162
159
  },
163
160
  "dependencies": {
164
161
  "@resvg/resvg-wasm": "^2.6.2"
165
- }
162
+ },
163
+ "gitHead": "5377b0721e892e6245630986b77c2ad2ae6fb01f"
166
164
  }
@@ -38827,6 +38827,7 @@ var runs = sqliteTable("runs", {
38827
38827
  partialUsd: real("partial_usd").notNull(),
38828
38828
  measuredSessions: integer2("measured_sessions").notNull(),
38829
38829
  totalSessions: integer2("total_sessions").notNull(),
38830
+ tokenSessions: integer2("token_sessions"),
38830
38831
  inputTokens: integer2("input_tokens").notNull(),
38831
38832
  outputTokens: integer2("output_tokens").notNull(),
38832
38833
  wallS: real("wall_s"),
@@ -40527,7 +40528,7 @@ function effectiveVerdict(r) {
40527
40528
  var COST_DIMS = ["day", "model", "repo", "provider"];
40528
40529
  var DEFAULT_API_KEY_CAP_USD = 100;
40529
40530
  var NONE2 = "unknown";
40530
- var mk = (key) => ({ key, runs: 0, measured_runs: 0, partial_runs: 0, unmeasured_runs: 0, measured_usd: 0, partial_usd: 0, input_tokens: 0, output_tokens: 0 });
40531
+ var mk = (key) => ({ key, runs: 0, measured_runs: 0, partial_runs: 0, unmeasured_runs: 0, measured_usd: 0, partial_usd: 0, input_tokens: 0, output_tokens: 0, tk: 0, tn: 0 });
40531
40532
  var add = (a, r) => {
40532
40533
  a.runs++;
40533
40534
  if (r.costUsd !== null) {
@@ -40540,10 +40541,14 @@ var add = (a, r) => {
40540
40541
  a.unmeasured_runs++;
40541
40542
  a.input_tokens += r.inputTokens;
40542
40543
  a.output_tokens += r.outputTokens;
40544
+ if (r.tokenSessions !== null) {
40545
+ a.tk += r.tokenSessions;
40546
+ a.tn += r.totalSessions;
40547
+ }
40543
40548
  };
40544
40549
  var dimVal = (d, r) => d === "day" ? r.startedAt ? r.startedAt.slice(0, 10) : NONE2 : d === "model" ? r.model ?? NONE2 : d === "provider" ? r.provider ?? NONE2 : r.originRepo ?? NONE2;
40545
40550
  var round = (n) => Math.round(n * 1e6) / 1e6;
40546
- var out = (a) => ({ ...a.key, runs: a.runs, measured_runs: a.measured_runs, partial_runs: a.partial_runs, unmeasured_runs: a.unmeasured_runs, measured_usd: round(a.measured_usd), partial_usd: round(a.partial_usd), input_tokens: a.input_tokens, output_tokens: a.output_tokens });
40551
+ var out = (a) => ({ ...a.key, runs: a.runs, measured_runs: a.measured_runs, partial_runs: a.partial_runs, unmeasured_runs: a.unmeasured_runs, measured_usd: round(a.measured_usd), partial_usd: round(a.partial_usd), input_tokens: a.input_tokens, output_tokens: a.output_tokens, ...a.tk < a.tn ? { token_sessions: a.tk, token_sessions_total: a.tn } : {} });
40547
40552
  function mount2(ctx) {
40548
40553
  ctx.app.get("/v1/cost/repos", (c) => {
40549
40554
  const g = new Map;
@@ -40858,6 +40863,7 @@ var parseRun = (r) => ({
40858
40863
  partial_usd: r.partialUsd,
40859
40864
  measured_sessions: r.measuredSessions,
40860
40865
  total_sessions: r.totalSessions,
40866
+ token_sessions: r.tokenSessions,
40861
40867
  input_tokens: r.inputTokens,
40862
40868
  output_tokens: r.outputTokens,
40863
40869
  wall_s: r.wallS,