@codyswann/lisa 2.147.4 → 2.147.6

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 (66) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/skills/repair-intake/SKILL.md +37 -14
  5. package/plugins/lisa-agy/plugin.json +1 -1
  6. package/plugins/lisa-agy/skills/repair-intake/SKILL.md +37 -14
  7. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  8. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  9. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  10. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  11. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  12. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +37 -14
  14. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +37 -14
  16. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  18. package/plugins/lisa-expo-agy/plugin.json +1 -1
  19. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  23. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  24. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  28. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  29. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  33. package/plugins/lisa-openclaw/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  34. package/plugins/lisa-openclaw/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  35. package/plugins/lisa-openclaw/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
  36. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  37. package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  38. package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  39. package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
  40. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  42. package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  43. package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
  44. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  46. package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  47. package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
  48. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-rails-agy/plugin.json +1 -1
  51. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  56. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  60. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  61. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/src/base/skills/repair-intake/SKILL.md +37 -14
  64. package/plugins/src/openclaw/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  65. package/plugins/src/openclaw/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  66. package/plugins/src/openclaw/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
@@ -14,6 +14,13 @@ all unrelated agents, channels, routes, and tokens.
14
14
 
15
15
  ## Telegram — facilitator topic route
16
16
 
17
+ Use `channels.telegram.groups` for a single-account Telegram setup. If the OpenClaw config has
18
+ `channels.telegram.accounts`, put the route under the owning bot account at
19
+ `channels.telegram.accounts.<account-id>.groups.<telegram-supergroup-id>`; account-scoped Telegram
20
+ configs do not inherit root group routes.
21
+
22
+ ### Single-account route
23
+
17
24
  ```json5
18
25
  {
19
26
  "channels": {
@@ -36,6 +43,34 @@ all unrelated agents, channels, routes, and tokens.
36
43
  }
37
44
  ```
38
45
 
46
+ ### Multi-account route
47
+
48
+ ```json5
49
+ {
50
+ "channels": {
51
+ "telegram": {
52
+ "accounts": {
53
+ "<account-id>": {
54
+ "groups": {
55
+ "<telegram-supergroup-id>": {
56
+ "groupPolicy": "allowlist",
57
+ "requireMention": true,
58
+ "allowFrom": ["<telegram-user-id>"],
59
+ "topics": {
60
+ "<facilitator-topic-id>": {
61
+ "agentId": "<facilitator-agent-id>",
62
+ "requireMention": true
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
39
74
  ## Slack — facilitator channel route
40
75
 
41
76
  ```json5
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.4",
3
+ "version": "2.147.6",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -49,11 +49,15 @@ close-out** roles and moves work *unstuck* or *fully closed*:
49
49
  lifecycle label. repair-intake classifies it as a PRD or build ticket and adds the configured
50
50
  `ready` label (`prd-ready` for a PRD, build `status:ready` for a ticket) so normal intake can see
51
51
  it; if the later intake/implement gate finds the item incomplete, it moves the item to `blocked`.
52
- - **Missing PRD child link drift** — a GitHub PRD in `ticketed` (or another open non-product-owned
53
- PRD role) has a generated-work section/comment that names top-level generated work, but the PRD's
54
- native sub-issue list is missing one or more of those top-level children. repair-intake replays the
55
- `prd-backlink` native-linking contract and attaches the missing same-repo top-level children
56
- idempotently, so PRD rollup can rely on the native graph again.
52
+ - **Missing native child link drift** — a GitHub parent (a `ticketed`/other open non-product-owned
53
+ PRD, **or a build Epic/Story container**) whose children are discoverable from the generated-work
54
+ section/comment for a PRD, or from body parentage (`Parent: #<n>` / `Parent Epic: #<n>`) for a build
55
+ container resolved via the documented hierarchy fallback but whose native sub-issue list is missing
56
+ one or more of those children. This is the common shape when children were created by an external
57
+ generator (e.g. Codex) or an older write path that recorded parentage only in prose and never called
58
+ `addSubIssue`. repair-intake replays the `prd-backlink` / `github-write-issue` native-linking contract
59
+ and attaches the missing same-repo children idempotently, so rollup and the GitHub UI can rely on the
60
+ native graph again.
57
61
 
58
62
  This skill is the symmetric counterpart to `lisa:intake`. It reuses the same queue-detection,
59
63
  the same agent-team orchestration, the same "don't ask, just run" confirmation policy, and the
@@ -467,7 +471,21 @@ left in a status it should not carry, including a stale build-ready `ready`).
467
471
 
468
472
  1. Read the child set using the vendor-native hierarchy first (GitHub sub-issues, JIRA
469
473
  Epic/parent/sub-task hierarchy, Linear project/parent/sub-issues), with the same fallbacks the
470
- vendor read/sync skills document.
474
+ vendor read/sync skills document. **Record which children were resolved natively vs. only via the
475
+ prose/body-parentage fallback** — the gap between the two sets is repairable native-link drift.
476
+ 1a. **Heal native child links before rolling up (GitHub).** Whenever the resolved child set
477
+ contains same-repo children that are *not* in the parent's native `subIssues` graph — the typical
478
+ case when the children carry `Parent: #<n>` / `Parent Epic: #<n>` in prose but were never attached
479
+ (external generators like Codex, or an older write path) — attach each missing same-repo child as a
480
+ native sub-issue using the identical idempotent `addSubIssue` contract the "GitHub PRD missing child
481
+ links" path documents below: dedupe by `owner/repo#number`, treat "already linked" as success, keep
482
+ cross-repo/cross-vendor children documented-only with a warning, and on `subIssues`/`addSubIssue`
483
+ unavailability record a capability warning and continue. A build parent attaches the children
484
+ resolved by its hierarchy (its Stories/Sub-tasks), not only empty-parent-token top-level work — the
485
+ PRD top-level-only restriction is a PRD rule, not a build one. Record repaired refs in the rollup
486
+ state fingerprint so repeated cycles do not re-post. Do this even when step 2 derives `unchanged`:
487
+ the native graph is what the GitHub UI rollup and progress bar depend on, independently of the
488
+ parent's status.
471
489
  2. **Compute the derived parent state** bottom-up per the `leaf-only-lifecycle` **Parent status
472
490
  rollup** state machine, evaluated over the env ladder `in-progress < dev < staging <
473
491
  production` (the ordered keys of the env-keyed `done` map): any required child blocked →
@@ -754,9 +772,11 @@ It MAY:
754
772
  applies only to containers, never to leaves.
755
773
  - Move a PRD with fully terminal generated work to `shipped` and close/archive the source artifact
756
774
  where the source vendor supports native close-out, per `prd-lifecycle-rollup`.
757
- - Repair missing native GitHub PRD child links from the generated-work fallback by replaying the
758
- `prd-backlink` top-level-only, same-repo, idempotent `addSubIssue` contract. This repairs
759
- structure only; it does not ship or verify the PRD.
775
+ - Repair missing native GitHub child links by replaying the same-repo, idempotent `addSubIssue`
776
+ contract — for a **PRD** from the generated-work fallback (top-level-only), and for a **build
777
+ Epic/Story container** from its hierarchy/body-parentage children so rollup and the GitHub UI can
778
+ rely on the native graph. This repairs structure only; it does not ship, transition, or verify the
779
+ parent.
760
780
  - Normalize a GitHub issue with no configured lifecycle label by adding the configured PRD or build
761
781
  `ready` label after classifying the issue. This is a visibility repair, not a claim; the item
762
782
  remains open and unclaimed for normal intake.
@@ -779,13 +799,16 @@ It MUST NOT:
779
799
  1. **Resolve the queue** — detect vendor/lifecycle (Source dispatch); resolve stuck role names
780
800
  from config. For JIRA, confirm the needed transitions are reachable; stop on misconfig.
781
801
  2. **Enumerate repair candidates** — query in-progress role(s), `blocked` role(s), terminal/open
782
- items, GitHub PRDs whose generated-work fallback names top-level children missing from native
783
- sub-issues, rollup parents/PRDs with child work, **containers carrying the `ready` role** (a
802
+ items, GitHub parents (PRDs **and build Epic/Story containers**) whose discoverable children
803
+ generated-work fallback for a PRD, hierarchy/body-parentage for a build container are missing from
804
+ their native sub-issue graph, rollup parents/PRDs with child work, **containers carrying the `ready`
805
+ role** (a
784
806
  leaf-only-invariant violation to reconcile), and GitHub issues with no configured lifecycle label,
785
807
  for the detected lifecycle(s), up to `max_candidates`, via the Access layer reads.
786
808
  3. **Order deterministically**, highest repair-confidence first:
787
809
  1. terminal-labeled items that only need native close / complete / resolve,
788
- 2. GitHub PRDs missing native links for generated top-level work (structure-only repair),
810
+ 2. GitHub parents (PRDs missing native links for generated top-level work, or build Epic/Story
811
+ containers missing native links for prose/hierarchy children) needing structure-only repair,
789
812
  3. rollup parents/PRDs whose child sets are all terminal (close-out),
790
813
  4. rollup parents whose children have advanced to an intermediate env, or stale-`ready`
791
814
  containers, that need their derived state applied (status-only reconciliation, no native
@@ -826,8 +849,8 @@ Report outcomes in these buckets:
826
849
  - `rolled_up` — parent/container/PRD rollups advanced to their derived state: an intermediate env
827
850
  (e.g. all children at `On Stg` → parent `On Stg`), a fully-terminal close-out, or a stale-`ready`
828
851
  container reconciled from its children.
829
- - `relinked` — GitHub PRDs whose missing native sub-issue links were repaired from the
830
- generated-work fallback.
852
+ - `relinked` — GitHub parents (PRDs from the generated-work fallback, or build Epic/Story containers
853
+ from hierarchy/body-parentage) whose missing native sub-issue links were attached.
831
854
  - `normalized_ready` — GitHub issues missing official lifecycle labels that were classified and
832
855
  given the configured PRD/build `ready` label so normal intake can claim them.
833
856
  - `still_blocked` — examined and intentionally left `blocked`, with the active reason.
@@ -101,18 +101,28 @@ The worker prepares the safe target and launches the CLI; it does not edit files
101
101
 
102
102
  ### 6. Bind the topic
103
103
 
104
- Route the topic to the dispatcher: set
105
- `channels.telegram.groups.<group-id>.topics.<topic-id>.agentId = <topic-slug>-dispatch`, keep
106
- allowlist policy, and add `allowFrom` only when membership must be narrower than the group. Leave the
107
- topic-level `requireMention = false` (the default) so the agent activates on any message — the topic
108
- is bound 1:1 to this dispatcher, so an @mention carries no routing information and is pure friction.
109
- Set it to `true` only for a shared-workspace topic where humans also coordinate with each other and
110
- you don't want every line to spawn a run; the group-level `requireMention` stays `true` regardless.
111
- See "Mention gating" in [references/repo-topic-config.md](references/repo-topic-config.md) for the
112
- tradeoff. The topic `systemPrompt` must state the scope mode, treat each native-reply
113
- root as an independent request context, confirm repo selection only in folder-scoped mode, spawn the
114
- worker with an explicit repo path, and return the worker result to the topic. Back up
115
- `~/.openclaw/openclaw.json` before editing and preserve unrelated routes.
104
+ Route the topic to the dispatcher. In single-account Telegram configs, set
105
+ `channels.telegram.groups.<group-id>.topics.<topic-id>.agentId = <topic-slug>-dispatch`. In
106
+ multi-account Telegram configs, set the same route under the owning bot account:
107
+ `channels.telegram.accounts.<account-id>.groups.<group-id>.topics.<topic-id>.agentId =
108
+ <topic-slug>-dispatch`. Account configs do not inherit root `channels.telegram.groups` routes, so a
109
+ root-only route can validate while the actual bot still ignores the topic-level `requireMention`,
110
+ `agentId`, and prompt. When in doubt, mirror the route under the owning account and keep any existing
111
+ root group route only as a fallback/documentation shape.
112
+
113
+ Keep allowlist policy, and add `allowFrom` only when membership must be narrower than the group.
114
+ Leave the topic-level `requireMention = false` (the default) so the agent activates on any message
115
+ the topic is bound 1:1 to this dispatcher, so an @mention carries no routing information and is pure
116
+ friction. Set it to `true` only for a shared-workspace topic where humans also coordinate with each
117
+ other and you don't want every line to spawn a run; the group-level `requireMention` stays `true`
118
+ regardless. See "Mention gating" in [references/repo-topic-config.md](references/repo-topic-config.md)
119
+ for the tradeoff. The topic `systemPrompt` must state the scope mode, treat each native-reply root as
120
+ an independent request context, confirm repo selection only in folder-scoped mode, spawn the worker
121
+ with an explicit repo path, and return the worker result to the topic. If the route may return
122
+ generated files, the prompt must also say to write or copy returnable artifacts under
123
+ `~/.openclaw/media` before calling `message(action="send")`, because outbound local media delivery
124
+ rejects arbitrary `/tmp` paths. Back up `~/.openclaw/openclaw.json` before editing and preserve
125
+ unrelated routes.
116
126
 
117
127
  ### 7. Validate + self-test
118
128
 
@@ -70,6 +70,13 @@ repos:
70
70
 
71
71
  ## Topic route
72
72
 
73
+ Use `channels.telegram.groups` for a single-account Telegram setup. If
74
+ `channels.telegram.accounts` is configured, bind the route under the owning bot account instead:
75
+ `channels.telegram.accounts.<account-id>.groups.<group-id>`. Account-scoped Telegram configs do not
76
+ inherit root `channels.telegram.groups` routes.
77
+
78
+ ### Single-account route
79
+
73
80
  ```json5
74
81
  {
75
82
  "channels": {
@@ -99,6 +106,41 @@ repos:
99
106
  }
100
107
  ```
101
108
 
109
+ ### Multi-account route
110
+
111
+ ```json5
112
+ {
113
+ "channels": {
114
+ "telegram": {
115
+ "accounts": {
116
+ "<account-id>": {
117
+ "groups": {
118
+ "<group-id>": {
119
+ "groupPolicy": "allowlist",
120
+ "requireMention": true,
121
+ "allowFrom": ["<telegram-user-id>"],
122
+ "topics": {
123
+ "<topic-id>": {
124
+ "agentId": "<topic-slug>-dispatch",
125
+ "requireMention": false,
126
+ "systemPrompt": "Use the topic's configured scope mode. For single-repo, pass the fixed repo path to <topic-slug>-codex. For folder-scoped, confirm the inferred repo or repo set unless the user already named it explicitly, then pass the explicit repo path(s) to <topic-slug>-codex. Treat each native reply root as an independent request context. If generated files need to be returned as Telegram attachments, write or copy them under ~/.openclaw/media before calling message(action=\"send\"), because outbound local media delivery rejects arbitrary /tmp paths."
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ ## File return path
139
+
140
+ When a repo-topic agent returns generated files to Telegram, use the OpenClaw `message` tool with
141
+ real local file paths. Write or copy returnable artifacts under `~/.openclaw/media` before sending;
142
+ outbound local media delivery rejects arbitrary `/tmp` paths even when the file exists.
143
+
102
144
  ## Mention gating
103
145
 
104
146
  `requireMention` controls whether a message must @-mention the bot before the agent activates. It is
@@ -14,6 +14,13 @@ all unrelated agents, channels, routes, and tokens.
14
14
 
15
15
  ## Telegram — facilitator topic route
16
16
 
17
+ Use `channels.telegram.groups` for a single-account Telegram setup. If the OpenClaw config has
18
+ `channels.telegram.accounts`, put the route under the owning bot account at
19
+ `channels.telegram.accounts.<account-id>.groups.<telegram-supergroup-id>`; account-scoped Telegram
20
+ configs do not inherit root group routes.
21
+
22
+ ### Single-account route
23
+
17
24
  ```json5
18
25
  {
19
26
  "channels": {
@@ -36,6 +43,34 @@ all unrelated agents, channels, routes, and tokens.
36
43
  }
37
44
  ```
38
45
 
46
+ ### Multi-account route
47
+
48
+ ```json5
49
+ {
50
+ "channels": {
51
+ "telegram": {
52
+ "accounts": {
53
+ "<account-id>": {
54
+ "groups": {
55
+ "<telegram-supergroup-id>": {
56
+ "groupPolicy": "allowlist",
57
+ "requireMention": true,
58
+ "allowFrom": ["<telegram-user-id>"],
59
+ "topics": {
60
+ "<facilitator-topic-id>": {
61
+ "agentId": "<facilitator-agent-id>",
62
+ "requireMention": true
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
39
74
  ## Slack — facilitator channel route
40
75
 
41
76
  ```json5