loki-mode 11.3.1 → 11.3.2
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 +4 -4
- package/VERSION +1 -1
- package/autonomy/lib/efficiency_cost.py +8 -0
- package/autonomy/lib/engine10-push.sh +22 -8
- package/autonomy/loki +62 -30
- package/bin/loki +30 -1
- package/completions/_loki +6 -0
- package/completions/loki.bash +2 -2
- package/dashboard/__init__.py +1 -1
- package/dashboard/server.py +22 -14
- package/docs/AGENT-CHANGE-RECEIPT.md +2 -2
- package/docs/CLI-REFERENCE.md +5 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/OTEL-COLLECTOR.md +24 -0
- package/docs/ROUTING-EVIDENCE.md +32 -0
- package/docs/environment-variables.md +1 -0
- package/docs/spec-first-intent.md +28 -0
- package/docs/v10/CLI-MODERN.md +6 -3
- package/docs/v10/DECISIONS.md +15 -0
- package/docs/v10/FAILURE-CLASSES.md +95 -1
- package/docs/v10/GUARDS.md +18 -0
- package/docs/v10/GUIDE.md +7 -5
- package/docs/v10/METRICS.md +12 -0
- package/docs/v10/OPERATING-MODEL.md +3 -3
- package/docs/v10/PROGRESS.md +6 -0
- package/docs/v11/INTOTO-AGENT-CHANGE-PREDICATE.md +77 -0
- package/docs/v11/MCP-2026-07-28.md +55 -0
- package/docs/v11/VERIFY-PR-SANDBOX.md +41 -0
- package/loki-ts/dist/loki.js +1130 -969
- package/mcp/__init__.py +1 -1
- package/mcp/v10_tools.py +29 -0
- package/package.json +9 -11
- package/packages/control-plane/dist/ask-tools-server.js +8 -2
- package/packages/control-plane/dist/server.js +15728 -13988
- package/packages/control-plane/drizzle/0006_token_sessions.sql +1 -0
- package/packages/control-plane/drizzle/meta/0006_snapshot.json +807 -0
- package/packages/control-plane/drizzle/meta/_journal.json +7 -0
- package/packages/control-plane/src/db/schema.ts +1 -0
- package/packages/control-plane/src/server/routes/cost.ts +4 -3
- package/packages/control-plane/src/server/runs.ts +3 -3
- package/packages/control-plane/ui/dist/assets/index-DbLzr87u.js +190 -0
- package/packages/control-plane/ui/dist/index.html +1 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/providers/opencode.sh +2 -3
- package/src/observability/genai-spans.js +104 -0
- package/src/observability/otel-bridge.js +49 -1
- package/src/observability/otel.js +2 -2
- package/src/protocols/mcp-server.js +180 -5
- package/src/protocols/transport/sse.js +23 -2
- package/web-app/dist/assets/{AdminPage-CMkHNJbF.js → AdminPage-DuRQZsF9.js} +1 -1
- package/web-app/dist/assets/{Avatar-BJyjV7Zi.js → Avatar-7GtOQvsO.js} +1 -1
- package/web-app/dist/assets/{Badge-D572l0uq.js → Badge-CYgTnIxj.js} +1 -1
- package/web-app/dist/assets/{Button-T4BnOZgl.js → Button-rYSyIu7X.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-Cj_GFsNn.js → CockpitPage-9adANY4o.js} +1 -1
- package/web-app/dist/assets/{ComparePage-A8m4ZXak.js → ComparePage-DEG2oA-R.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-hugCg5yg.js → ErrorBoundary-CwtvY4xs.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-CuJKDC2G.js → EvidenceReceiptPanel-DTT73pPB.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-BYGKjarC.js → GitHubIssuesPanel-CpWZLz2x.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-c7sFIJlf.js → GitHubPRsPanel-H293R7E2.js} +1 -1
- package/web-app/dist/assets/{HomePage-A1MIkG2P.js → HomePage-B11Imp9k.js} +2 -2
- package/web-app/dist/assets/{LoginPage-8KQMRhtR.js → LoginPage-BZBgx5Jr.js} +1 -1
- package/web-app/dist/assets/{MagicPage-C05QW2Lx.js → MagicPage-B27S4_X8.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-Oukv5hme.js → MetricsPage-CfbJWNDG.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-DKIwsawz.js → NotFoundPage-Tp_4zMSm.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-DwFRPLCG.js → ProjectPage-CM4fgMsV.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-CgY4YYDX.js → ProjectsPage-DP2Fvsrd.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-BpfcSjUA.js → SettingsPage-C4G9-EAy.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-BqBakC4K.js → ShowcasePage-Dj-n4dwu.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-CZLu5VB0.js → SystemSettingsPage-BqMLpuGt.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-D55S1jKz.js → TeamsPage-mIH8H96m.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-D3SydvxN.js → TemplatesPage-BagW-v4n.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-hNg8G1-e.js → TerminalOutput-CTQRHhnK.js} +1 -1
- package/web-app/dist/assets/{activity-D2C0VagO.js → activity-DNQiBDDL.js} +1 -1
- package/web-app/dist/assets/{bell-CMvYi36w.js → bell-Coiwdad1.js} +1 -1
- package/web-app/dist/assets/{bot-BvtQ6lmo.js → bot-Cou-rTgR.js} +1 -1
- package/web-app/dist/assets/{check-B13xkXed.js → check-CsF-XtQp.js} +1 -1
- package/web-app/dist/assets/{chevron-left-emu6r49E.js → chevron-left-BJiy55Ht.js} +1 -1
- package/web-app/dist/assets/{circle-alert-CExlwjuy.js → circle-alert-D6-pQQWq.js} +1 -1
- package/web-app/dist/assets/{clock-D7Uas3oL.js → clock-BOGqwgt9.js} +1 -1
- package/web-app/dist/assets/{cloud-CkB4S86C.js → cloud-DsxhTtf5.js} +1 -1
- package/web-app/dist/assets/{code-xml-SL9IIWIn.js → code-xml-CxJDHUlE.js} +1 -1
- package/web-app/dist/assets/{database-BQFkd7t1.js → database-BJePscl_.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-qHmnNYsU.js → dollar-sign-6qWGAkZo.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-C2YUDP0K.js → file-code-corner-DcOtYeDb.js} +1 -1
- package/web-app/dist/assets/{file-plus-C_ooIkDe.js → file-plus-WuRyLFo0.js} +1 -1
- package/web-app/dist/assets/{globe-CQ-GL485.js → globe-r-xCP4DE.js} +1 -1
- package/web-app/dist/assets/{hammer-U05L_D7V.js → hammer-DTt0SsCB.js} +1 -1
- package/web-app/dist/assets/{index-CooHd7I-.js → index-BkbXyH8y.js} +3 -3
- package/web-app/dist/assets/{layers-Buo17rjW.js → layers-BvZhvSMY.js} +1 -1
- package/web-app/dist/assets/{loader-circle-15vK3oV1.js → loader-circle-3gosTei9.js} +1 -1
- package/web-app/dist/assets/{lock-BeXLebuJ.js → lock-CZZMxP0U.js} +1 -1
- package/web-app/dist/assets/{package-MVh_6-6R.js → package-C5A8CkJr.js} +1 -1
- package/web-app/dist/assets/{plus-Dh_nd9vS.js → plus-Btv7tTIF.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-C9cBJEAT.js → refresh-cw-DsWLXgs_.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-D3PAtzST.js → rotate-ccw-DOVDjway.js} +1 -1
- package/web-app/dist/assets/{scroll-text-DZCoXQjo.js → scroll-text-smySzlrX.js} +1 -1
- package/web-app/dist/assets/{server-OCOLI5J_.js → server-b5PHsqAU.js} +1 -1
- package/web-app/dist/assets/{shield-alert-oVhmf1_h.js → shield-alert-BD7FDlh-.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-B-kbX4vN.js → thumbs-up-CAsFzbyE.js} +1 -1
- package/web-app/dist/assets/{trash-2-EL6moveW.js → trash-2-BJ35qHgl.js} +1 -1
- package/web-app/dist/assets/{trending-down-Cl3kjpsx.js → trending-down-Ozrd26cZ.js} +1 -1
- package/web-app/dist/assets/{trending-up-DST7I6M2.js → trending-up-BhnMcM32.js} +1 -1
- package/web-app/dist/assets/{upload-CUOT780G.js → upload-JVHfdwoA.js} +1 -1
- package/web-app/dist/assets/{usePolling-Djmt90eb.js → usePolling-CTzbDV-e.js} +1 -1
- package/web-app/dist/assets/{user-BRBohA6J.js → user-Bks3-GYv.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/packages/control-plane/ui/dist/assets/index-DcBJXjCJ.js +0 -190
package/mcp/__init__.py
CHANGED
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.
|
|
4
|
+
"version": "11.3.2",
|
|
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
|
|
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": "75bbbb9465e6b2b80dc8b05a012a6d0eec576005"
|
|
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,
|