loki-mode 11.7.1 → 11.9.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.
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/lib/backlog.py +40 -4
- package/autonomy/lib/chat.sh +3 -2
- package/autonomy/lib/workspace.py +95 -4
- package/autonomy/loki +185 -106
- package/autonomy/trigger-server.py +550 -5
- package/autonomy/verify.sh +5 -0
- package/bin/loki +1 -1
- package/completions/_loki +34 -1
- package/completions/loki.bash +10 -3
- package/dashboard/__init__.py +1 -1
- package/docs/ARCHITECTURE.md +0 -1
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/COMPONENTS.md +1 -1
- package/docs/DEPLOY-PLAN.md +13 -3
- package/docs/INSTALLATION.md +1 -1
- package/docs/WORKSPACES.md +1 -1
- package/docs/dev/architecture-reference.md +1 -1
- package/docs/sentry-intake.md +36 -0
- package/docs/v10/D61-SPEED.md +14 -0
- package/docs/v10/PROGRESS.md +22 -0
- package/loki-ts/dist/loki.js +962 -879
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
- package/packages/control-plane/dist/ask-tools-server.js +13 -4
- package/packages/control-plane/dist/server.js +614 -456
- package/packages/control-plane/src/server/diffstat.ts +10 -2
- package/packages/control-plane/src/server/legacy/routes-control.ts +8 -4
- package/packages/control-plane/src/server/routes/checkpoints.ts +11 -2
- package/packages/control-plane/ui/dist/assets/index-u8cd6TRQ.js +190 -0
- package/packages/control-plane/ui/dist/index.html +1 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-S3BYeapm.js → AdminPage-BdH9iL2I.js} +1 -1
- package/web-app/dist/assets/{Avatar-C1rHwLgn.js → Avatar-C-WixxR6.js} +1 -1
- package/web-app/dist/assets/{Badge-CzlnN5aQ.js → Badge-BFWpRd_L.js} +1 -1
- package/web-app/dist/assets/{Button-B1w5AeGC.js → Button-CE5vG66Y.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-Dyeqjfkc.js → CockpitPage-BAVn10bY.js} +1 -1
- package/web-app/dist/assets/{ComparePage-C6y2GkGR.js → ComparePage-DOecIGfM.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-Dg2fcGkR.js → ErrorBoundary-1rNA5v7f.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-CxbyjvTj.js → EvidenceReceiptPanel-DjOaWfdH.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-Dpys1xDb.js → GitHubIssuesPanel-NNPBuRPD.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-CRVjWoFl.js → GitHubPRsPanel-CL1b--tV.js} +1 -1
- package/web-app/dist/assets/{HomePage-BKnv-oYw.js → HomePage-BsLDN6MW.js} +2 -2
- package/web-app/dist/assets/{LoginPage-BGksmFRd.js → LoginPage-CVIv5bCS.js} +1 -1
- package/web-app/dist/assets/{MagicPage-OCvhp16M.js → MagicPage-BgMBB9lK.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-CJOJpXWC.js → MetricsPage-BHeJlqPC.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-C04p3QvN.js → NotFoundPage-DDzwfyDK.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-BRB8txsY.js → ProjectPage-CuQWEYBF.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-CoUYeQEh.js → ProjectsPage-OoD0RFDZ.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-BkjmJGfM.js → SettingsPage-tMFMKkK5.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-B4vU9TjQ.js → ShowcasePage-DVfLoWdz.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-Z2jiVsni.js → SystemSettingsPage-CThV9N4l.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-Ulm8SISq.js → TeamsPage-CV0nvXI8.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-C_7MM6Ey.js → TemplatesPage-D81EI1L8.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-Cumd7Tgs.js → TerminalOutput-Bj7uKRIe.js} +1 -1
- package/web-app/dist/assets/{activity-CZAUkbiY.js → activity-DoNfNkOL.js} +1 -1
- package/web-app/dist/assets/{bell-BOvSXpEr.js → bell-BWO3OU50.js} +1 -1
- package/web-app/dist/assets/{bot-DOTZxBYj.js → bot-DcvWv_zD.js} +1 -1
- package/web-app/dist/assets/{check-BxpE0B5u.js → check-CfG09Z18.js} +1 -1
- package/web-app/dist/assets/{chevron-left-D6KPvBOA.js → chevron-left-z0fh4x2h.js} +1 -1
- package/web-app/dist/assets/{circle-alert-Bajq86oe.js → circle-alert-C_7GlYul.js} +1 -1
- package/web-app/dist/assets/{clock-CnlHAVJc.js → clock-BsYUp070.js} +1 -1
- package/web-app/dist/assets/{cloud-DjaymjwM.js → cloud-BVWAJ7Rv.js} +1 -1
- package/web-app/dist/assets/{code-xml-BADEw2Ld.js → code-xml-CdZT-6zu.js} +1 -1
- package/web-app/dist/assets/{database-B4aKb5Cq.js → database-Dbkm9t2D.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-DrldXpja.js → dollar-sign-CfIUM5Pd.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-DVebDVR-.js → file-code-corner-CrUKhnj-.js} +1 -1
- package/web-app/dist/assets/{file-plus-BD-N_-Tl.js → file-plus-Cf6u0xHY.js} +1 -1
- package/web-app/dist/assets/{globe-C7ieInC-.js → globe-DsIqaI7w.js} +1 -1
- package/web-app/dist/assets/{hammer-BSugKIji.js → hammer-CA14BeMp.js} +1 -1
- package/web-app/dist/assets/{index-nLQgfvOn.js → index-DpJ_GJuZ.js} +3 -3
- package/web-app/dist/assets/{layers-CHXxU2on.js → layers-Dh5Oqhrj.js} +1 -1
- package/web-app/dist/assets/{loader-circle-BEEz0LbD.js → loader-circle-B0WHIGqt.js} +1 -1
- package/web-app/dist/assets/{lock-CzQGfcnE.js → lock-DkgfEGYF.js} +1 -1
- package/web-app/dist/assets/{package-CcHYQLGd.js → package-LzjmwD1S.js} +1 -1
- package/web-app/dist/assets/{plus-DdzgFEXn.js → plus-BNjA0KSV.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-7x0HbH9Y.js → refresh-cw-k3IacuDX.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-DBahX1Sp.js → rotate-ccw-BFON_xv-.js} +1 -1
- package/web-app/dist/assets/{scroll-text-BB8y8a9Z.js → scroll-text-CaIlSPZB.js} +1 -1
- package/web-app/dist/assets/{server-CfkbW2MH.js → server-CKFUccCG.js} +1 -1
- package/web-app/dist/assets/{shield-alert-DUgD8rBF.js → shield-alert-Q4-rPo5r.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-DGoyY6QC.js → thumbs-up-BYMeh8oV.js} +1 -1
- package/web-app/dist/assets/{trash-2-B6xrSUMr.js → trash-2-BHSUEIHw.js} +1 -1
- package/web-app/dist/assets/{trending-down-B6RGKTOx.js → trending-down-BC_FR2VT.js} +1 -1
- package/web-app/dist/assets/{trending-up-B44DCrt1.js → trending-up-CmA-WmLW.js} +1 -1
- package/web-app/dist/assets/{upload-4kWm33ZY.js → upload-BxLgBa1B.js} +1 -1
- package/web-app/dist/assets/{usePolling-zkUtRQG6.js → usePolling-DKNgwt5n.js} +1 -1
- package/web-app/dist/assets/{user-04cEVIe2.js → user-CA2DlmLc.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/memory/rag_injector.py +0 -161
- package/packages/control-plane/ui/dist/assets/index-DbLzr87u.js +0 -190
package/autonomy/verify.sh
CHANGED
|
@@ -2588,6 +2588,11 @@ OPTIONS:
|
|
|
2588
2588
|
Seal a workspace run into one signed composite receipt
|
|
2589
2589
|
(composite.json). `loki verify <composite.json>` then
|
|
2590
2590
|
re-checks it offline. Routed to the engine10 verifier.
|
|
2591
|
+
--max-age <DUR> With a receipt path: refuse a receipt whose signed issue
|
|
2592
|
+
time is older than DUR (Ns, Nm, Nh, Nd or seconds), has
|
|
2593
|
+
no signed issue time, or is more than 300s in the
|
|
2594
|
+
future. Exits 2 (UNCHECKED). Routed to the engine10
|
|
2595
|
+
verifier.
|
|
2591
2596
|
-h, --help Show this help.
|
|
2592
2597
|
|
|
2593
2598
|
GATES (deterministic, reproducible by construction):
|
package/bin/loki
CHANGED
|
@@ -794,7 +794,7 @@ fi
|
|
|
794
794
|
# Two-token routes (provider show/list, memory list/index) match on the first
|
|
795
795
|
# token only; the Bun dispatcher handles subcommand routing internally.
|
|
796
796
|
case "${1:-}" in
|
|
797
|
-
version|--version|-v|status|stats|doctor|provider|memory|rollback|internal|kpis|trust|proof|receipt|wiki|crash|control|contract|slack|queue|issues|answer|undo|verify-pr|completion|__complete)
|
|
797
|
+
version|--version|-v|status|stats|doctor|provider|memory|rollback|internal|kpis|estimate|trust|proof|receipt|wiki|crash|control|contract|slack|queue|issues|answer|undo|verify-pr|completion|__complete)
|
|
798
798
|
# v7.5.2: rollback added (wires loki-ts/src/commands/rollback.ts).
|
|
799
799
|
# v7.5.3: internal added for autonomy/run.sh phase1-hooks calls.
|
|
800
800
|
# v7.5.28: kpis added (Phase K MVP: read-only KPI snapshot).
|
package/completions/_loki
CHANGED
|
@@ -56,6 +56,13 @@ function _loki {
|
|
|
56
56
|
agent)
|
|
57
57
|
_loki_agent
|
|
58
58
|
;;
|
|
59
|
+
estimate)
|
|
60
|
+
_arguments \
|
|
61
|
+
'--json[Output machine-readable JSON]' \
|
|
62
|
+
'--model[Model whose rough prior to use]:model:' \
|
|
63
|
+
'--provider[Provider whose default model is used]:provider:' \
|
|
64
|
+
'--help[Show help]'
|
|
65
|
+
;;
|
|
59
66
|
status)
|
|
60
67
|
_arguments \
|
|
61
68
|
'--json[Output machine-readable JSON]' \
|
|
@@ -162,6 +169,27 @@ function _loki {
|
|
|
162
169
|
code)
|
|
163
170
|
_loki_code
|
|
164
171
|
;;
|
|
172
|
+
deploy)
|
|
173
|
+
_arguments \
|
|
174
|
+
'--dir[Project directory to scan]:directory:_directories' \
|
|
175
|
+
'--no-clip[Do not copy the command to the clipboard]' \
|
|
176
|
+
'--execute[Run the deploy command if the receipt gate passes]' \
|
|
177
|
+
'--canary[With --execute: staged rollout (Vercel promote, Fly canary)]' \
|
|
178
|
+
'--allow-unanchored[Proceed when the receipt records no baseline]' \
|
|
179
|
+
'--health-url[Health probe URL]:url:' \
|
|
180
|
+
'--auto-rollback[Roll back on a failed health probe]' \
|
|
181
|
+
'--help[Show help]'
|
|
182
|
+
;;
|
|
183
|
+
verify)
|
|
184
|
+
_arguments \
|
|
185
|
+
'--pubkey[Check against this public key only]:key file:_files' \
|
|
186
|
+
'--sign-deploy[Sign a loki.deploy/1 deploy record in place]:record:_files' \
|
|
187
|
+
'--receipt[Cited receipt file for a deploy record]:receipt:_files' \
|
|
188
|
+
'--max-age[Reject a receipt older than DUR]:duration:' \
|
|
189
|
+
'--seal-composite[Sign a workspace composite]:run dir:_directories' \
|
|
190
|
+
'--help[Show help]' \
|
|
191
|
+
'*:receipt or deploy record:_files'
|
|
192
|
+
;;
|
|
165
193
|
esac
|
|
166
194
|
;;
|
|
167
195
|
esac
|
|
@@ -231,7 +259,7 @@ function _loki_commands {
|
|
|
231
259
|
'plan:Preview the build plan for a spec'
|
|
232
260
|
'report:Reporting commands (cost, kpis, share)'
|
|
233
261
|
'cost:Show cost of recent runs (--detail for cache + trend)'
|
|
234
|
-
'estimate:
|
|
262
|
+
'estimate:Estimate run cost from run history (--json, --model, --provider)'
|
|
235
263
|
'kpis:Key performance indicators'
|
|
236
264
|
'stats:Session statistics'
|
|
237
265
|
'preview:Open the running app preview'
|
|
@@ -313,6 +341,11 @@ function _loki_start {
|
|
|
313
341
|
_arguments \
|
|
314
342
|
'--provider[AI provider]:provider name:(claude cline codex aider opencode)' \
|
|
315
343
|
'--parallel[Parallel mode]' \
|
|
344
|
+
'--brief[Zero-config brief mode]:brief text:' \
|
|
345
|
+
'--worktree[Git worktree isolation]' \
|
|
346
|
+
'--pr[Worktree plus auto-create PR]' \
|
|
347
|
+
'--ship[Worktree plus PR plus auto-merge]' \
|
|
348
|
+
'--detach[Run in background (implies --worktree)]' \
|
|
316
349
|
'--workspace[Run a loki.yaml workspace for the brief]:workspace name:' \
|
|
317
350
|
'--deploy[Deploy after a VERIFIED run via loki deploy --execute]' \
|
|
318
351
|
'--health-url[With --deploy: health probe URL]:url:' \
|
package/completions/loki.bash
CHANGED
|
@@ -27,7 +27,7 @@ _loki_completion() {
|
|
|
27
27
|
|
|
28
28
|
# If the word starts with a dash, show flags
|
|
29
29
|
if [[ "$cur" == -* ]]; then
|
|
30
|
-
local flags="--provider --max-iterations --parallel --background --bg --simple --complex --github --no-dashboard --sandbox --skip-memory --spec --spec-first --yes --budget --attempts --model --isolation --max-cost --no-pr --explain-route --workspace --deploy --health-url --auto-rollback --help"
|
|
30
|
+
local flags="--provider --max-iterations --parallel --background --bg --simple --complex --github --no-dashboard --sandbox --skip-memory --spec --spec-first --yes --budget --attempts --model --isolation --max-cost --no-pr --explain-route --brief --worktree --pr --ship --detach --workspace --deploy --health-url --auto-rollback --help"
|
|
31
31
|
COMPREPLY=( $(compgen -W "${flags}" -- "$cur") )
|
|
32
32
|
return 0
|
|
33
33
|
fi
|
|
@@ -120,6 +120,13 @@ _loki_completion() {
|
|
|
120
120
|
COMPREPLY=( $(compgen -W "${syslog_cmds}" -- "$cur") )
|
|
121
121
|
;;
|
|
122
122
|
|
|
123
|
+
estimate)
|
|
124
|
+
if [[ "$cur" == -* ]]; then
|
|
125
|
+
COMPREPLY=( $(compgen -W "--json --model --provider --help" -- "$cur") )
|
|
126
|
+
return 0
|
|
127
|
+
fi
|
|
128
|
+
;;
|
|
129
|
+
|
|
123
130
|
status)
|
|
124
131
|
if [[ "$cur" == -* ]]; then
|
|
125
132
|
COMPREPLY=( $(compgen -W "--json --help" -- "$cur") )
|
|
@@ -142,14 +149,14 @@ _loki_completion() {
|
|
|
142
149
|
|
|
143
150
|
deploy)
|
|
144
151
|
if [[ "$cur" == -* ]]; then
|
|
145
|
-
COMPREPLY=( $(compgen -W "--execute --health-url --auto-rollback --help" -- "$cur") )
|
|
152
|
+
COMPREPLY=( $(compgen -W "--execute --canary --health-url --auto-rollback --dir --no-clip --allow-unanchored --help" -- "$cur") )
|
|
146
153
|
return 0
|
|
147
154
|
fi
|
|
148
155
|
;;
|
|
149
156
|
|
|
150
157
|
verify)
|
|
151
158
|
if [[ "$cur" == -* ]]; then
|
|
152
|
-
COMPREPLY=( $(compgen -W "--base --out --block-on --no-llm --json --explain --check-fresh --hosted --seal-composite --help" -- "$cur") )
|
|
159
|
+
COMPREPLY=( $(compgen -W "--base --out --block-on --no-llm --json --explain --check-fresh --max-age --hosted --seal-composite --sign-deploy --receipt --pubkey --help" -- "$cur") )
|
|
153
160
|
return 0
|
|
154
161
|
fi
|
|
155
162
|
;;
|
package/dashboard/__init__.py
CHANGED
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -209,7 +209,6 @@ memory/ Memory system (Python package, ~19 modules)
|
|
|
209
209
|
embeddings.py Vector embeddings (optional)
|
|
210
210
|
vector_index.py Vector search index
|
|
211
211
|
cross_project.py Cross-project knowledge transfer
|
|
212
|
-
rag_injector.py RAG context injection into prompts
|
|
213
212
|
knowledge_graph.py Knowledge graph over memories
|
|
214
213
|
layers/ Progressive-disclosure loading
|
|
215
214
|
|
package/docs/CLI-REFERENCE.md
CHANGED
|
@@ -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.
|
|
3
|
+
Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.9.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 |
|
package/docs/COMPONENTS.md
CHANGED
|
@@ -132,7 +132,7 @@ across projects.
|
|
|
132
132
|
- `consolidation.py` - Episodic-to-semantic consolidation pipeline.
|
|
133
133
|
- `token_economics.py` - Discovery vs read token accounting.
|
|
134
134
|
- `embeddings.py`, `vector_index.py` - Optional embedding-based similarity.
|
|
135
|
-
- `cross_project.py`, `knowledge_graph.py
|
|
135
|
+
- `cross_project.py`, `knowledge_graph.py` - Cross-project
|
|
136
136
|
recall, knowledge graph, and RAG prompt injection (v7.1.0+).
|
|
137
137
|
- `app_graph.py`, `error_log.py`, `ingest.py`, `namespace.py`, `replay.py`,
|
|
138
138
|
`unified_access.py` - Supporting modules.
|
package/docs/DEPLOY-PLAN.md
CHANGED
|
@@ -7,9 +7,19 @@ clean tree, a destructive-op refusal and a policy permission (`.loki/policies.js
|
|
|
7
7
|
deployed URL after the command. A non-2xx result is recorded as FAILED_HEALTH and exits non-zero;
|
|
8
8
|
with `--auto-rollback` it also runs the provider's documented rollback verb (`vercel rollback`,
|
|
9
9
|
`fly releases rollback <captured version>`; Netlify and Cloudflare print a manual note). With no
|
|
10
|
-
URL, health is recorded as "unchecked", never healthy. The deploy record
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
URL, health is recorded as "unchecked", never healthy. The deploy record in `.loki/deploys` is a
|
|
11
|
+
signed `loki.deploy/1` attestation bound to the receipt that authorized it (fields: receipt_sha256,
|
|
12
|
+
head_sha, target, command, health_status, health_url, rollback_attempted, rollback_exit,
|
|
13
|
+
started_at, finished_at). It is signed with the existing receipt signer (Ed25519, no new crypto)
|
|
14
|
+
and the receipt itself is unchanged. `loki verify <record.json>` re-checks it offline (also with
|
|
15
|
+
`--pubkey FILE`; `--receipt FILE` names the cited receipt when it is not beside the record). It
|
|
16
|
+
fails closed: a flipped byte is TAMPERED, an unsigned record or an unknown key is UNCHECKED, and a
|
|
17
|
+
cited receipt that is not VERIFIED is never reported as VERIFIED.
|
|
18
|
+
`loki deploy --execute --canary` is a staged rollout using only documented provider verbs: Vercel
|
|
19
|
+
deploys without `--prod`, health-checks the preview URL, then runs `vercel promote <url>` (a failed
|
|
20
|
+
probe never promotes); Fly runs `fly deploy --strategy canary`; Netlify and Cloudflare document no
|
|
21
|
+
staged path and refuse `--canary` with a sentence saying so.
|
|
22
|
+
`loki start --deploy [--health-url U] [--auto-rollback]` chains the same gated command after a start.
|
|
13
23
|
|
|
14
24
|
Everything below is the original print-only design plan and is kept for history.
|
|
15
25
|
|
package/docs/INSTALLATION.md
CHANGED
|
@@ -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.
|
|
5
|
+
**Version:** v11.9.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
|
|
package/docs/WORKSPACES.md
CHANGED
|
@@ -37,7 +37,7 @@ loki workspace status <run-id>
|
|
|
37
37
|
- The repo that owns the issue ref gets the ref; other repos get a task text naming the ref and the sibling worktree paths as read-only context.
|
|
38
38
|
- After all repos finish, the `integration` command runs once from the run directory with `LOKI_WS_DIR_<OWNER>_<REPO>` pointing at each worktree. A timeout counts as failed. With no integration configured the status is `not_configured`.
|
|
39
39
|
- Evidence is written to `.loki/workspaces/<name>/<run-id>/integration.json`: head SHA per repo, exit code, log sha256. When every repo succeeded, integration did not fail and every child sealed a receipt, the run also seals a signed `composite.json` that binds integration.json and every child receipt (see "Verify a workspace run").
|
|
40
|
-
- `loki workspace infer <name>` prints suggested `after:` edges read from package.json, go.mod and pyproject.toml dependencies on other listed repos. It is print-only and cycle-checked; it never edits loki.yaml.
|
|
40
|
+
- `loki workspace infer <name>` prints suggested `after:` edges read from package.json, go.mod and pyproject.toml dependencies on other listed repos. It also suggests an edge from (1) a source import (TS/JS import or require, Python import, Go import path) of a sibling's package or module name even when the manifest does not declare it, scanning at most 400 source files per repo, and (2) a client generator config (openapitools.json, openapi-generator*.yaml, orval.config.*) whose input spec path lies inside a sibling checkout. Each inferred edge prints its evidence as `file:line`. It is print-only and cycle-checked; it never edits loki.yaml.
|
|
41
41
|
- `plan: true` (or `LOKI_WORKSPACE_PLAN=1`) makes one provider call that decomposes the brief per repo into `<run-dir>/plan.json`. A valid plan gives each listed repo its own task; an invalid one falls back to the generic text and prints the reason.
|
|
42
42
|
- `integration: {per_stage: true}` also runs the integration command after each topological layer. A failing stage SKIPs every later layer, so a broken contract stops before downstream repos build on it.
|
|
43
43
|
- Without `path`, a repo is cloned to `~/.loki/repos/owner__name`.
|
|
@@ -39,7 +39,7 @@ model explicitly rather than inherit the session model.
|
|
|
39
39
|
- **Progressive Disclosure**: 3-layer loading (index, timeline, full details)
|
|
40
40
|
- **Token Economics**: Discovery vs read token tracking
|
|
41
41
|
- **Vector Search**: Optional embedding-based similarity (sentence-transformers)
|
|
42
|
-
- **Cross-project +
|
|
42
|
+
- **Cross-project index + knowledge graph**: `memory/cross_project.py`, `memory/knowledge_graph.py` (added v7.x)
|
|
43
43
|
- **Managed memory client**: `memory/managed_memory/` -- gated on `LOKI_MANAGED_MEMORY=true`. See `skills/memory.md`.
|
|
44
44
|
- **CLI**: `loki memory index|timeline|consolidate|economics|retrieve|episode|pattern|skill|vectors`
|
|
45
45
|
- **API**: REST endpoints at `/api/memory/*`
|
package/docs/sentry-intake.md
CHANGED
|
@@ -22,3 +22,39 @@ The token is sent only to the Sentry host through a curl config on stdin, never
|
|
|
22
22
|
|
|
23
23
|
The output is a receipt-gated PR only, never a deploy. Whether the PR opens is still decided by the policy file (`autonomy`).
|
|
24
24
|
|
|
25
|
+
|
|
26
|
+
## Slack, Linear, Jira and Teams delegation
|
|
27
|
+
|
|
28
|
+
`loki trigger` server setup for delegating a job from chat or a tracker. Both routes enqueue through the same job queue and runner as `POST /jobs`; a completion summary goes back to the origin. Nothing unauthenticated can start a job or choose a reply URL.
|
|
29
|
+
|
|
30
|
+
Secrets are env only and must differ from each other, the GitHub webhook secret, the API token and the Sentry secret (an equal secret disables its route at startup). A missing secret answers 503 naming the variable, and the server logs a startup warning. None of them reach the `loki start` child environment.
|
|
31
|
+
|
|
32
|
+
Slack (`POST /slack`):
|
|
33
|
+
|
|
34
|
+
1. Set `SLACK_SIGNING_SECRET`. Point a `/loki` slash command (and Events URL verification) at `/slack`.
|
|
35
|
+
2. The signature is `v0=` + hex HMAC-SHA256 over `v0:<X-Slack-Request-Timestamp>:<raw body>`, window 300s, the same contract as `loki-ts/src/contrib/slack_inbound.ts`. Bad, stale or missing signature: 401, nothing queued.
|
|
36
|
+
3. The command text is the spec (one line, not starting with `-`) and runs as `loki start <text> --detach`. Slack gets an ephemeral reply carrying the job id.
|
|
37
|
+
4. On completion the summary is posted to the request's `response_url`, only if it starts with `https://hooks.slack.com/`. Any other host is never contacted.
|
|
38
|
+
|
|
39
|
+
Linear (`POST /linear`):
|
|
40
|
+
|
|
41
|
+
1. Set `LINEAR_WEBHOOK_SECRET`. Point a Linear issue webhook at `/linear`.
|
|
42
|
+
2. `Linear-Signature` is the hex HMAC-SHA256 of the raw body, and the signed `webhookTimestamp` must be within 300s. Otherwise 401.
|
|
43
|
+
3. A created issue enqueues `loki start linear:<identifier> --detach` and answers 202 with the job id. Other events are skipped.
|
|
44
|
+
4. If `LINEAR_API_KEY` is set, a comment with the result is posted on the issue through `https://api.linear.app/graphql`. Without it nothing is posted.
|
|
45
|
+
|
|
46
|
+
Jira (`POST /jira`):
|
|
47
|
+
|
|
48
|
+
1. Set `JIRA_WEBHOOK_SECRET` (the secret on a Jira Cloud webhook) and point the webhook at `/jira`. Set `JIRA_ASSIGNEES` (comma-separated accountId, email or display name) and/or `JIRA_LABELS`. With neither set, every event is skipped.
|
|
49
|
+
2. `X-Hub-Signature` is `sha256=` + hex HMAC-SHA256 of the raw body. Bad or missing signature: 401. Jira signs no timestamp and the `X-Atlassian-Webhook-Identifier` header is not covered by the HMAC, so replay is bounded two ways: a repeated delivery id, or a repeated signed body (sha256 of the raw body, so changing or dropping the header does not help), answers `duplicate` and queues nothing. A replay of a body Jira never sent twice still needs the secret to forge.
|
|
50
|
+
3. `jira:issue_created`, or `jira:issue_updated` whose changelog touches assignee or labels, runs only when the issue is assigned to a configured user or has a configured label. The key, summary and description are folded into a one-line brief (1500 bytes max; an Atlassian Document Format description is flattened to its text) and run as `loki start --brief "<brief>" --pr --detach`. Answers 202 with the job id.
|
|
51
|
+
|
|
52
|
+
Teams (`POST /teams`):
|
|
53
|
+
|
|
54
|
+
1. Set `TEAMS_SECURITY_TOKEN` (the base64 token Teams shows when you create the outgoing webhook) and point the webhook at `/teams`.
|
|
55
|
+
2. `Authorization: HMAC <base64>` is the base64 HMAC-SHA256 of the raw body keyed by the base64-decoded token. Bad signature: 401. The activity `timestamp` must be within 300s; a stale or missing one is refused with 401.
|
|
56
|
+
3. The message text (with `<at>` mentions and tags removed) is the brief and runs as `loki start --brief "<brief>" --pr --detach`. Teams gets a synchronous reply whose text starts with "Queued" and ends with the job id. A repeated activity id is not queued twice.
|
|
57
|
+
|
|
58
|
+
Jira and Teams runs are receipt-gated PR runs only: the server always passes `--pr` and never a deploy argument, so shipping stays a separate gated step. `--brief` forces brief mode, so text that ends in `.md` or contains an issue URL is never reclassified, and `loki start --brief ... --pr/--worktree/--detach` runs in an isolated worktree, detached, and opens a PR carrying the Evidence Receipt (the same machinery as `loki start <issue>`). Sentry alerts use the same form. Neither secret reaches the `loki start` child environment, and both must differ from every other credential. A missing secret answers 503 naming the variable.
|
|
59
|
+
|
|
60
|
+
Reply targets are stored server side keyed by job id, captured only after verification. Notifier errors are logged and never fail the job. Poll status with `GET /jobs/<id>`.
|
package/docs/v10/D61-SPEED.md
CHANGED
|
@@ -89,3 +89,17 @@ With `LOKI_SPEED=1` (default off), intake no longer waits on the cheap-model alr
|
|
|
89
89
|
## D82-FLAGS status: default on
|
|
90
90
|
|
|
91
91
|
Per the D82 founder directive, `LOKI_SPEED` is on unless set to `0` (decomposer routing, warm engine on a unix socket, stage prefix, deferred already-done check, lean keyword fallback, unit mode when `LOKI_UNIT_SPEC` is set). `LOKI_SPEED=0` restores the previous behaviour byte for byte. The other D82 opt-outs are `LOKI_VISUAL_EVIDENCE=0`, `LOKI_CONTRACT=0`, `LOKI_SLACK_INBOUND=0` (Slack stays inert until its credential is configured), `LOKI_CONTROL=0` and `LOKI_WORKSPACES=0`. Test: `loki-ts/tests/features/d82_default_on.test.ts`.
|
|
92
|
+
|
|
93
|
+
## Missions and group Seal (v11.8.0)
|
|
94
|
+
|
|
95
|
+
Missions: a spec with two or more milestones runs milestone by milestone. Format: `## Milestone N[: title]` headings (the body is everything up to the next milestone heading), or a top-level `milestones:` list of `- title` lines. Fewer than 2 milestones is not a mission and takes the normal path unchanged. Parsing is `parseMilestones` in `loki-ts/src/features/decompose.ts`; the loop is in `maybeRunGroup` (`loki-ts/src/features/speed/route.ts`), reached from `loki start` and from chat `/run` through the same supervisor call.
|
|
96
|
+
|
|
97
|
+
Each milestone prints `loki: milestone k/N: <title>`, is decomposed on its own, and runs as its own group with its own frozen contract and group Seal. One-unit groups and sequential providers are allowed for milestones (the normal fewer-than-2-units and slot fallbacks do not apply). The mission stops at the first non-zero result, prints `loki: milestone k/N failed (exit X); rerun the same loki start to resume`, and returns that code; later milestones never start. All milestones exit 0 returns 0.
|
|
98
|
+
|
|
99
|
+
Group exit codes: 0 = every unit VERIFIED and the group receipt VERIFIED; 4 = NOT PROVEN (integrated, but no checked group receipt); 1 = failures.
|
|
100
|
+
|
|
101
|
+
Resume: rerun the same `loki start`. Each milestone group is found again by the hash of its body, so finished milestones re-verify and return 0 fast and the run continues at the failed one. No extra state is kept. `LOKI_GROUP_RESUME=0` disables auto-resume and starts every group fresh. Check any group receipt with `loki verify .loki/groups/<gid>/receipt.json`.
|
|
102
|
+
|
|
103
|
+
Test command precedence: `LOKI_GROUP_TEST_CMD` (whitespace split) wins over the repo's own test script. Test: `loki-ts/tests/engine10/route_group.test.ts`.
|
|
104
|
+
|
|
105
|
+
Fix units: when group integration stops on a merge conflict or a failing suite, one bounded fix unit runs through the same unit launcher (same scoped env, one slot) from the group branch, then integration restarts once. A conflict fix takes the conflicting unit's place; a suite fix goes last and receives the failing test names and output tail. Max one fix per conflict and 2 per group; `LOKI_GROUP_FIX_UNITS=0` restores stop-and-name. The suite, every unit receipt and the group Seal still decide the verdict, and a failed fix keeps the stop-and-name output (exit 1). A fix unit is stored in `dag.json` and resumes like any unit. Code: `loki-ts/src/features/speed/fix_units.ts`; tests: `loki-ts/tests/engine10/seal_group.test.ts`.
|
package/docs/v10/PROGRESS.md
CHANGED
|
@@ -2337,3 +2337,25 @@ The swarm is stopped: .loki/V10-STOP exists, the loop has no wake-ups, and the c
|
|
|
2337
2337
|
- 10.6.6 (456058bae): scope control, Control Plane v0, train-cycle fix, docs. All green. Published.
|
|
2338
2338
|
- 10.6.7 (bfce1db12): D60 sprint, all gates, Release, Post-Release Smoke and Promote success. latest and next at 10.6.7.
|
|
2339
2339
|
- Open at handoff: real-repo gate not wired into promote.yml and needs operator provider auth; no end-to-end exit 3 run of the cost cap; root action.yml still uses loki start --simple; about 43 worktrees under .claude/worktrees (cap 15); never push backup/train-67..70 or backup/main-pre-rebuild.
|
|
2340
|
+
|
|
2341
|
+
## 2026-10-15T20:05Z (CoS) 11.7.1 published, v11.8.0 train started
|
|
2342
|
+
- 11.7.0 (8b22e5fba): Tests red on tests/test-help-changelog-drift.sh (three flags missing from help/completion) and tests/test-sigpipe-guard.sh (count 1743 over ceiling 1742). Not published.
|
|
2343
|
+
- 11.7.1 (a01a22740): Release and Tests completed/success (gh run watch log, runs 38794589410 and 38794589637); npm dist-tags next=11.7.1, latest=11.6.0.
|
|
2344
|
+
- v11.8.0 train (workflow wf_e6306e08-008): group Seal, group resume, multi-milestone missions, Slack and Linear delegation on the trigger server, receipt --max-age, deploy completion and pulse ID_RE fixes.
|
|
2345
|
+
|
|
2346
|
+
## 2026-10-15T20:45Z (CoS) v11.8.0 failed CI, v11.8.1 fix-forward
|
|
2347
|
+
- v11.8.0 (b5191b999): Tests run 38800796458 and Release failed on line budgets (core engine10 5020, features 3190), the D66 fence (run_group.ts value-imported seal and verify_cmd), two unclassified checkouts in the L2 registry, macOS-first stat in tests/test-backlog-units.sh:162, and a `loki help verify` mismatch. Not published.
|
|
2348
|
+
- Fix 1d734e6ba (Opus HIGH review APPROVED, 162 pass 0 fail on five suites), merged as 1788db60b. Correction: E-121 (pulse ID_RE for S41-style ids) already shipped in v10.5.3 (BOARD row E-121, merge aecf6daa); nothing is open there.
|
|
2349
|
+
- Local guards on the merged tree, all rc=0: test-help-changelog-drift, test-sigpipe-guard, test-help-and-log-cap, test-backlog-units, structural-checks, test-ci-only-divergence, test-platform-infra; bun test budget, l2_destructive_registry, route_group, seal_group: 117 pass 0 fail.
|
|
2350
|
+
|
|
2351
|
+
## 2026-10-15T21:36Z (CoS) v11.9.0 train merged, release pending
|
|
2352
|
+
- 11.8.1 (22a6efc1f): Release and Tests completed/success; npm next=11.8.1.
|
|
2353
|
+
- Merged into main with --no-ff (workflow wf_b2e3c1df-452): DELEG-JIRA-TEAMS, DEPLOY-ATTEST-CANARY, ESTIMATE-ONE, RAG-DECIDE, GRAPH-IMPORTS, CPE24-HARDEN, CP-NITS-START, FC-01b (head e089b4224). FC-19b was already on main (5470167dd).
|
|
2354
|
+
- Rework round wf_4d4e81e3-3c3, Opus review APPROVE: GROUP-FIX-UNITS 196e3a6a4 (cap mutant MAX_FIX_UNITS=3 now red; 124 pass 0 fail), merged 0b3a2a46b; FC-09r c91b3642d (safeGit at runner_config.ts:45; raw execFileSync positive control red; 72 pass 0 fail), merged c39697cc1.
|
|
2355
|
+
- Guards on c39697cc1 plus dist rebuild (build rc=0): structural-checks rc=0; bun budget, l2_destructive_registry, fc25_raw_spawn_guard, spawn_env_guard, start_flag_parity_guard 43 pass 0 fail.
|
|
2356
|
+
- Advisories to card: detached --ship brief path calls gh issue close on b<epoch>; non-detached auto-merge arm rejects --brief; `loki run --brief-text` not marked internal; Teams dedup keys only on activity id; backlog.py base silently falls back to origin/HEAD on a non-SHA; runner_config subdir-base test missing.
|
|
2357
|
+
|
|
2358
|
+
## 2026-10-15T21:56Z (CoS) v11.9.0 failed CI, v11.9.1 fix-forward
|
|
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
|
+
- Fix c42d7fd22 (TL review APPROVE: 140 pass 0 fail plus 26 pass 0 fail on a git-archive copy), merged 9da6e2772.
|
|
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.
|