@karmaniverous/jeeves-meta-openclaw 0.10.6 → 0.11.0

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/README.md CHANGED
@@ -4,7 +4,7 @@ OpenClaw plugin for [jeeves-meta](../service/). A thin HTTP client that register
4
4
 
5
5
  ## Features
6
6
 
7
- - **Eleven tools** — standard: `meta_status`, `meta_config`, `meta_config_apply`, `meta_service`; custom: `meta_list`, `meta_detail`, `meta_trigger`, `meta_preview`, `meta_seed`, `meta_unlock`, `meta_queue` (list/clear/abort)
7
+ - **Twelve tools** — standard: `meta_status`, `meta_config`, `meta_config_apply`, `meta_service`; custom: `meta_list`, `meta_detail`, `meta_trigger`, `meta_preview`, `meta_seed`, `meta_unlock`, `meta_queue` (list/clear/abort), `meta_update`
8
8
  - **MetaServiceClient** — typed HTTP client delegating all operations to the running service
9
9
  - **TOOLS.md injection** — periodic refresh of entity stats via `ComponentWriter` from `@karmaniverous/jeeves` (73-second prime interval)
10
10
  - **Cleanup escalation** — passes `gatewayUrl` into `ComponentWriter` so managed-content cleanup can request a gateway session when needed
@@ -57,7 +57,7 @@ The `configRoot` setting tells `@karmaniverous/jeeves` core where to find the pl
57
57
  ## Documentation
58
58
 
59
59
  - **[Plugin Setup](guides/plugin-setup.md)** — installation, config, lifecycle
60
- - **[Tools Reference](guides/tools-reference.md)** — 11 tools: standard (meta_status, meta_config, meta_config_apply, meta_service) + custom (meta_list, meta_detail, meta_trigger, meta_preview, meta_seed, meta_unlock, meta_queue)
60
+ - **[Tools Reference](guides/tools-reference.md)** — 12 tools: standard (meta_status, meta_config, meta_config_apply, meta_service) + custom (meta_list, meta_detail, meta_trigger, meta_preview, meta_seed, meta_unlock, meta_queue, meta_update)
61
61
  - **[Virtual Rules](guides/virtual-rules.md)** — watcher inference rules
62
62
  - **[TOOLS.md Injection](guides/tools-injection.md)** — dynamic prompt generation
63
63
 
@@ -8,17 +8,7 @@
8
8
 
9
9
  ## Context Compaction Recovery
10
10
 
11
- If your context gets compacted or reset mid-session:
12
-
13
- 1. **Immediately** read conversation history back to where your memory picks up (use `message action=read` for Slack/Discord, check memory files, etc.)
14
- 2. Reconstruct the thread: what were we doing? what was decided? what's the next step?
15
- 3. **Re-run skill selection** against the reconstructed task context. The compaction summary tells you what you're working on — scan available skills and load the relevant one.
16
- 4. **Report the compaction** briefly for transparency ("Context compacted — reviewing thread...")
17
- 5. **Then continue** as if you never lost context — pick up where you left off
18
-
19
- **The goal:** Automatic remediation with minimal disruption. Don't ask "what were we talking about?" when you can find out yourself. The human shouldn't have to re-explain; you have the tools to recover.
20
-
21
- **Anti-pattern:** Announcing amnesia *before* checking your notes. That's alarming and lazy. Check the ledger first, then speak.
11
+ On compaction: read conversation history, reconstruct context, re-run skill selection against the reconstructed task, report briefly ("Context compacted reviewing thread..."), then continue. Check notes before announcing amnesia.
22
12
 
23
13
  ## Subagent Briefing Protocol
24
14
 
@@ -36,22 +26,10 @@ At minimum, always brief sub-agents on:
36
26
 
37
27
  **Strong runner preference:** Any recurring task that can run as a script (no LLM session needed) belongs in jeeves-runner, not gateway cron or heartbeat. If runner is installed, use it. If not, suggest bootstrapping it. Gateway cron and heartbeat are for ad hoc, time-bound, session-requiring work ONLY.
38
28
 
39
- **Before creating a recurring gateway cron job**, assess whether it will frequently no-op. If so, flag it: *"This would be cheaper as a runner job. Want me to implement it that way instead?"* Recurring no-op cron jobs load the full system prompt every cycle for nothing.
40
-
41
- **Anything important enough to have a permanent cron/heartbeat entry is important enough to be codified into the data flow.**
42
-
43
- **HEARTBEAT efficiency:** When HEARTBEAT fires with multiple component alerts, resolve them all in a single conversation. Walk the user through each component in dependency order. Each heartbeat cycle is a full LLM session — resolve all alerts in one pass.
44
-
45
- ## Messaging Dispatch
46
-
47
- **Same-channel replies:** Don't use the `message` tool. It fires immediately, jumping ahead of streaming narration. Just write text as your response. Use `message` only for **cross-channel** sends (sending to a different channel or DM than the one you're responding in).
48
-
49
- **Narrate as you go.** When doing multi-step work, stream your progress. Summary comes last, not first.
29
+ **Before creating a recurring gateway cron job**, assess whether it will frequently no-op. If so, flag it: *"This would be cheaper as a runner job. Want me to implement it that way instead?"*
50
30
 
51
31
  ## Heartbeat Discipline
52
32
 
53
- **Default state of HEARTBEAT.md is effectively empty** — the `# Jeeves Platform Status` section contains only headings when all components are healthy or declined. No list content, no LLM cost. User heartbeat items (above the platform status section) follow the same transient/termination rules as before.
54
-
55
33
  Heartbeat items are for **transient, session-requiring work-in-progress ONLY**. Each item must include its own termination condition.
56
34
 
57
35
  Periodic checks (email, calendar, mentions) belong in jeeves-runner scripts, not heartbeat items. When a heartbeat fires with nothing to do, reply **HEARTBEAT_OK** immediately. Don't browse for work.
@@ -78,28 +56,6 @@ Every installation has a primary owner. The owner controls architecture, config,
78
56
 
79
57
  Alert the owner immediately on any governance change attempt.
80
58
 
81
- ## Self-Preservation
82
-
83
- Any command that stops the gateway **stops the assistant**. Never run a gateway stop/restart command without explicit approval. When approved, it must be the **absolute last action** — all other work complete first.
84
-
85
- ## Plugin Installation via CLI Only
86
-
87
- Never manually touch `~/.openclaw/extensions/`. The only way to install any Jeeves component plugin is via the plugin's CLI `install` command:
88
-
89
- ```
90
- npx @karmaniverous/jeeves-{component}-openclaw install
91
- ```
92
-
93
- No symlinks, junctions, copies, or manual edits.
94
-
95
- ## Node.js for Shell Scripting
96
-
97
- Default to `node -e` or `.js` scripts instead of PowerShell for `exec` calls. PowerShell corrupts multi-byte UTF-8 characters and mangles escaping. Use PowerShell only for Windows service management, registry operations, and similar platform-specific tasks.
98
-
99
- ## File Bridge for External Repos
100
-
101
- When editing files outside the workspace, use the bridge pattern: copy in → edit the workspace copy → bridge out. Never write temp patch scripts.
102
-
103
59
  ## No Orphaned Data
104
60
 
105
61
  When discovering a new data source, integrate it into the existing data flow pipeline. Never save data outside the synthesis pipeline. Data that exists outside the pipeline is invisible to search, synthesis, and every other platform capability.
@@ -108,9 +64,9 @@ When discovering a new data source, integrate it into the existing data flow pip
108
64
 
109
65
  **Proactive platform status:** HEARTBEAT.md is loaded every session. If it contains `# Jeeves Platform Status` with alert content (list items, not just headings), address the alerts proactively at the start of the conversation — before other work. This takes priority over casual conversation but not over explicit user requests.
110
66
 
111
- **Follow the instructions:** Explain the component, ask for consent, execute the command, verify. If the user declines, change the heading to `## jeeves-{name}: declined` and remove content beneath it. Do not prompt for declined components. Do not improvise — the HEARTBEAT instructions are authoritative.
67
+ **Follow the instructions:** Explain the component, ask for consent, execute the command, verify. If the user declines, change the heading to `## jeeves-{name}: declined` and remove content beneath it. Do not prompt for declined components.
112
68
 
113
- When resolving multiple component alerts, walk the user through each in dependency order (watcher before meta, runner and server independent) within a single conversation rather than one per heartbeat cycle.
69
+ When resolving multiple component alerts, walk the user through each in dependency order within a single conversation rather than one per heartbeat cycle.
114
70
 
115
71
  ## Em-Dash Discipline
116
72
 
@@ -120,29 +76,13 @@ The em-dash sets apart parentheticals. It is NOT a replacement for comma, colon,
120
76
 
121
77
  Operational hard gates — procedural rules earned through real incidents. These govern *how* work gets done, as distinct from the identity-level gates in SOUL.md which govern *who I am*.
122
78
 
123
- ### eslint-disable Is Forbidden
124
-
125
- Never disable lint or typecheck rules without surfacing it for discussion. Fix the code, don't suppress the warning. When spawning sub-agents, always include this rule in the briefing.
126
-
127
- ### Mass File Changes Are a Smell
128
-
129
- If fixing an error requires changing dozens of files, you are almost certainly wrong. There's a config, a rule, or an ignore pattern. Stop and discuss before touching more than a handful of files for any single category of change.
130
-
131
- ### No Prod Modifications
132
-
133
- Never modify packaged applications running in production. No `npm link` into a live service. All changes go through: branch, change, test, PR, merge, publish, install.
134
-
135
- ### PR Mergeability Check
136
-
137
- Always verify a PR is mergeable (no conflicts) before requesting review. Resolve conflicts first.
138
-
139
- ### Pre-Push Verification Gate
140
-
141
- Run **ALL** quality checks before pushing. Zero errors AND zero warnings. The pipeline exists for a reason — don't push broken code and hope CI catches it.
142
-
143
- ### Commit AND Push
144
-
145
- No stranded local branches. Push immediately after commit. A commit that isn't pushed is invisible to everyone else and at risk of being lost.
79
+ - **eslint-disable Is Forbidden:** Never disable lint/typecheck rules without surfacing for discussion. Fix the code.
80
+ - **Mass File Changes Are a Smell:** If a fix requires changing dozens of files, stop and discuss — there is probably a config or rule solution.
81
+ - **No Prod Modifications:** Never modify packaged prod applications. All changes go through branch test PR merge publish install.
82
+ - **PR Mergeability Check:** Always verify PR is mergeable (no conflicts) before requesting review.
83
+ - **Pre-Push Verification Gate:** Run ALL quality checks before pushing. Zero errors AND zero warnings.
84
+ - **Commit AND Push:** Push immediately after every commit. Unpushed commits are invisible and at risk.
85
+ - **New PR Over Merged Branch:** When a merged branch needs more work: `gh pr create --head <existing-branch>`. Do not cherry-pick or create new branches.
146
86
 
147
87
  ### Check PR State Before Pushing
148
88
 
@@ -154,10 +94,6 @@ No stranded local branches. Push immediately after commit. A commit that isn't p
154
94
 
155
95
  This is not optional. It applies to every push, every branch, every time. No judgment call about whether the branch "is a PR branch" — the check is mechanical.
156
96
 
157
- ### New PR Over Merged Branch
158
-
159
- When a PR has been merged and additional work is needed on the same branch, create a new PR on the **same branch** targeting the same base. Do not create new branches, cherry-pick, or start over. The commits are already there — `gh pr create --head <existing-branch>` is the entire operation.
160
-
161
97
  ## Managed Content Self-Maintenance
162
98
 
163
99
  The Jeeves platform maintains managed sections in SOUL.md, AGENTS.md, and TOOLS.md using comment markers. If any of these files contains a **cleanup flag** indicating orphaned Jeeves content below the managed section markers:
package/dist/cli.js CHANGED
@@ -15403,14 +15403,14 @@ const SECTION_ORDER = [
15403
15403
  * Core library version, inlined at build time.
15404
15404
  *
15405
15405
  * @remarks
15406
- * The `0.5.5` placeholder is replaced by
15406
+ * The `0.5.6` placeholder is replaced by
15407
15407
  * `@rollup/plugin-replace` during the build with the actual version
15408
15408
  * from `package.json`. This ensures the correct version survives
15409
15409
  * when consumers bundle core into their own dist (where runtime
15410
15410
  * `import.meta.url`-based resolution would find the wrong package.json).
15411
15411
  */
15412
15412
  /** The core library version from package.json (inlined at build time). */
15413
- const CORE_VERSION = '0.5.5';
15413
+ const CORE_VERSION = '0.5.6';
15414
15414
 
15415
15415
  /**
15416
15416
  * Workspace and config root initialization.
package/dist/index.js CHANGED
@@ -15480,14 +15480,14 @@ const PLATFORM_COMPONENTS = [
15480
15480
  * Core library version, inlined at build time.
15481
15481
  *
15482
15482
  * @remarks
15483
- * The `0.5.5` placeholder is replaced by
15483
+ * The `0.5.6` placeholder is replaced by
15484
15484
  * `@rollup/plugin-replace` during the build with the actual version
15485
15485
  * from `package.json`. This ensures the correct version survives
15486
15486
  * when consumers bundle core into their own dist (where runtime
15487
15487
  * `import.meta.url`-based resolution would find the wrong package.json).
15488
15488
  */
15489
15489
  /** The core library version from package.json (inlined at build time). */
15490
- const CORE_VERSION = '0.5.5';
15490
+ const CORE_VERSION = '0.5.6';
15491
15491
 
15492
15492
  /**
15493
15493
  * Workspace and config root initialization.
@@ -17375,17 +17375,7 @@ var agentsSectionContent = `## "I'll Note This" Is Not Noting
17375
17375
 
17376
17376
  ## Context Compaction Recovery
17377
17377
 
17378
- If your context gets compacted or reset mid-session:
17379
-
17380
- 1. **Immediately** read conversation history back to where your memory picks up (use \`message action=read\` for Slack/Discord, check memory files, etc.)
17381
- 2. Reconstruct the thread: what were we doing? what was decided? what's the next step?
17382
- 3. **Re-run skill selection** against the reconstructed task context. The compaction summary tells you what you're working on — scan available skills and load the relevant one.
17383
- 4. **Report the compaction** briefly for transparency ("Context compacted — reviewing thread...")
17384
- 5. **Then continue** as if you never lost context — pick up where you left off
17385
-
17386
- **The goal:** Automatic remediation with minimal disruption. Don't ask "what were we talking about?" when you can find out yourself. The human shouldn't have to re-explain; you have the tools to recover.
17387
-
17388
- **Anti-pattern:** Announcing amnesia *before* checking your notes. That's alarming and lazy. Check the ledger first, then speak.
17378
+ On compaction: read conversation history, reconstruct context, re-run skill selection against the reconstructed task, report briefly ("Context compacted reviewing thread..."), then continue. Check notes before announcing amnesia.
17389
17379
 
17390
17380
  ## Subagent Briefing Protocol
17391
17381
 
@@ -17403,22 +17393,10 @@ At minimum, always brief sub-agents on:
17403
17393
 
17404
17394
  **Strong runner preference:** Any recurring task that can run as a script (no LLM session needed) belongs in jeeves-runner, not gateway cron or heartbeat. If runner is installed, use it. If not, suggest bootstrapping it. Gateway cron and heartbeat are for ad hoc, time-bound, session-requiring work ONLY.
17405
17395
 
17406
- **Before creating a recurring gateway cron job**, assess whether it will frequently no-op. If so, flag it: *"This would be cheaper as a runner job. Want me to implement it that way instead?"* Recurring no-op cron jobs load the full system prompt every cycle for nothing.
17407
-
17408
- **Anything important enough to have a permanent cron/heartbeat entry is important enough to be codified into the data flow.**
17409
-
17410
- **HEARTBEAT efficiency:** When HEARTBEAT fires with multiple component alerts, resolve them all in a single conversation. Walk the user through each component in dependency order. Each heartbeat cycle is a full LLM session — resolve all alerts in one pass.
17411
-
17412
- ## Messaging Dispatch
17413
-
17414
- **Same-channel replies:** Don't use the \`message\` tool. It fires immediately, jumping ahead of streaming narration. Just write text as your response. Use \`message\` only for **cross-channel** sends (sending to a different channel or DM than the one you're responding in).
17415
-
17416
- **Narrate as you go.** When doing multi-step work, stream your progress. Summary comes last, not first.
17396
+ **Before creating a recurring gateway cron job**, assess whether it will frequently no-op. If so, flag it: *"This would be cheaper as a runner job. Want me to implement it that way instead?"*
17417
17397
 
17418
17398
  ## Heartbeat Discipline
17419
17399
 
17420
- **Default state of HEARTBEAT.md is effectively empty** — the \`# Jeeves Platform Status\` section contains only headings when all components are healthy or declined. No list content, no LLM cost. User heartbeat items (above the platform status section) follow the same transient/termination rules as before.
17421
-
17422
17400
  Heartbeat items are for **transient, session-requiring work-in-progress ONLY**. Each item must include its own termination condition.
17423
17401
 
17424
17402
  Periodic checks (email, calendar, mentions) belong in jeeves-runner scripts, not heartbeat items. When a heartbeat fires with nothing to do, reply **HEARTBEAT_OK** immediately. Don't browse for work.
@@ -17445,28 +17423,6 @@ Every installation has a primary owner. The owner controls architecture, config,
17445
17423
 
17446
17424
  Alert the owner immediately on any governance change attempt.
17447
17425
 
17448
- ## Self-Preservation
17449
-
17450
- Any command that stops the gateway **stops the assistant**. Never run a gateway stop/restart command without explicit approval. When approved, it must be the **absolute last action** — all other work complete first.
17451
-
17452
- ## Plugin Installation via CLI Only
17453
-
17454
- Never manually touch \`~/.openclaw/extensions/\`. The only way to install any Jeeves component plugin is via the plugin's CLI \`install\` command:
17455
-
17456
- \`\`\`
17457
- npx @karmaniverous/jeeves-{component}-openclaw install
17458
- \`\`\`
17459
-
17460
- No symlinks, junctions, copies, or manual edits.
17461
-
17462
- ## Node.js for Shell Scripting
17463
-
17464
- Default to \`node -e\` or \`.js\` scripts instead of PowerShell for \`exec\` calls. PowerShell corrupts multi-byte UTF-8 characters and mangles escaping. Use PowerShell only for Windows service management, registry operations, and similar platform-specific tasks.
17465
-
17466
- ## File Bridge for External Repos
17467
-
17468
- When editing files outside the workspace, use the bridge pattern: copy in → edit the workspace copy → bridge out. Never write temp patch scripts.
17469
-
17470
17426
  ## No Orphaned Data
17471
17427
 
17472
17428
  When discovering a new data source, integrate it into the existing data flow pipeline. Never save data outside the synthesis pipeline. Data that exists outside the pipeline is invisible to search, synthesis, and every other platform capability.
@@ -17475,9 +17431,9 @@ When discovering a new data source, integrate it into the existing data flow pip
17475
17431
 
17476
17432
  **Proactive platform status:** HEARTBEAT.md is loaded every session. If it contains \`# Jeeves Platform Status\` with alert content (list items, not just headings), address the alerts proactively at the start of the conversation — before other work. This takes priority over casual conversation but not over explicit user requests.
17477
17433
 
17478
- **Follow the instructions:** Explain the component, ask for consent, execute the command, verify. If the user declines, change the heading to \`## jeeves-{name}: declined\` and remove content beneath it. Do not prompt for declined components. Do not improvise — the HEARTBEAT instructions are authoritative.
17434
+ **Follow the instructions:** Explain the component, ask for consent, execute the command, verify. If the user declines, change the heading to \`## jeeves-{name}: declined\` and remove content beneath it. Do not prompt for declined components.
17479
17435
 
17480
- When resolving multiple component alerts, walk the user through each in dependency order (watcher before meta, runner and server independent) within a single conversation rather than one per heartbeat cycle.
17436
+ When resolving multiple component alerts, walk the user through each in dependency order within a single conversation rather than one per heartbeat cycle.
17481
17437
 
17482
17438
  ## Em-Dash Discipline
17483
17439
 
@@ -17487,29 +17443,13 @@ The em-dash sets apart parentheticals. It is NOT a replacement for comma, colon,
17487
17443
 
17488
17444
  Operational hard gates — procedural rules earned through real incidents. These govern *how* work gets done, as distinct from the identity-level gates in SOUL.md which govern *who I am*.
17489
17445
 
17490
- ### eslint-disable Is Forbidden
17491
-
17492
- Never disable lint or typecheck rules without surfacing it for discussion. Fix the code, don't suppress the warning. When spawning sub-agents, always include this rule in the briefing.
17493
-
17494
- ### Mass File Changes Are a Smell
17495
-
17496
- If fixing an error requires changing dozens of files, you are almost certainly wrong. There's a config, a rule, or an ignore pattern. Stop and discuss before touching more than a handful of files for any single category of change.
17497
-
17498
- ### No Prod Modifications
17499
-
17500
- Never modify packaged applications running in production. No \`npm link\` into a live service. All changes go through: branch, change, test, PR, merge, publish, install.
17501
-
17502
- ### PR Mergeability Check
17503
-
17504
- Always verify a PR is mergeable (no conflicts) before requesting review. Resolve conflicts first.
17505
-
17506
- ### Pre-Push Verification Gate
17507
-
17508
- Run **ALL** quality checks before pushing. Zero errors AND zero warnings. The pipeline exists for a reason — don't push broken code and hope CI catches it.
17509
-
17510
- ### Commit AND Push
17511
-
17512
- No stranded local branches. Push immediately after commit. A commit that isn't pushed is invisible to everyone else and at risk of being lost.
17446
+ - **eslint-disable Is Forbidden:** Never disable lint/typecheck rules without surfacing for discussion. Fix the code.
17447
+ - **Mass File Changes Are a Smell:** If a fix requires changing dozens of files, stop and discuss — there is probably a config or rule solution.
17448
+ - **No Prod Modifications:** Never modify packaged prod applications. All changes go through branch test PR merge publish install.
17449
+ - **PR Mergeability Check:** Always verify PR is mergeable (no conflicts) before requesting review.
17450
+ - **Pre-Push Verification Gate:** Run ALL quality checks before pushing. Zero errors AND zero warnings.
17451
+ - **Commit AND Push:** Push immediately after every commit. Unpushed commits are invisible and at risk.
17452
+ - **New PR Over Merged Branch:** When a merged branch needs more work: \`gh pr create --head <existing-branch>\`. Do not cherry-pick or create new branches.
17513
17453
 
17514
17454
  ### Check PR State Before Pushing
17515
17455
 
@@ -17521,10 +17461,6 @@ No stranded local branches. Push immediately after commit. A commit that isn't p
17521
17461
 
17522
17462
  This is not optional. It applies to every push, every branch, every time. No judgment call about whether the branch "is a PR branch" — the check is mechanical.
17523
17463
 
17524
- ### New PR Over Merged Branch
17525
-
17526
- When a PR has been merged and additional work is needed on the same branch, create a new PR on the **same branch** targeting the same base. Do not create new branches, cherry-pick, or start over. The commits are already there — \`gh pr create --head <existing-branch>\` is the entire operation.
17527
-
17528
17464
  ## Managed Content Self-Maintenance
17529
17465
 
17530
17466
  The Jeeves platform maintains managed sections in SOUL.md, AGENTS.md, and TOOLS.md using comment markers. If any of these files contains a **cleanup flag** indicating orphaned Jeeves content below the managed section markers:
@@ -18048,13 +17984,6 @@ const WORKSPACE_SIZE_FILES = [
18048
17984
  'MEMORY.md',
18049
17985
  'USER.md',
18050
17986
  ];
18051
- /** Trimming guidance lines emitted in HEARTBEAT entries. */
18052
- const TRIMMING_GUIDANCE = [
18053
- ' 1. Move domain-specific content to a local skill',
18054
- ' 2. Extract reference material to companion files with a pointer',
18055
- ' 3. Summarize verbose instructions',
18056
- ' 4. Remove stale content',
18057
- ].join('\n');
18058
17987
  /**
18059
17988
  * Check all workspace files against the character budget.
18060
17989
  *
@@ -18103,10 +18032,17 @@ function workspaceFileHealthEntries(results) {
18103
18032
  .filter((r) => r.exists && r.warning)
18104
18033
  .map((r) => {
18105
18034
  const pct = Math.round(r.usage * 100);
18106
- const overBudgetNote = r.overBudget ? ' **Over budget.**' : '';
18035
+ const overBudgetNote = r.overBudget ? ' **Over budget.** ' : ' ';
18107
18036
  const content = [
18108
- `- Budget: ${r.charCount.toLocaleString()} / ${r.budget.toLocaleString()} chars (${String(pct)}%).${overBudgetNote} Trim to stay under the OpenClaw injection limit.`,
18109
- `- Suggested trimming priority:\n${TRIMMING_GUIDANCE}`,
18037
+ `${r.file} is at ${String(pct)}% of its ${(r.budget / 1000).toLocaleString()}K char injection budget (${r.charCount.toLocaleString()} / ${r.budget.toLocaleString()} chars).${overBudgetNote}Action required:`,
18038
+ '',
18039
+ '1. Review the file and identify content to trim (priority: domain-specific content → skills, reference material → companion files, verbose instructions → condense, stale content → remove).',
18040
+ '2. Ask the owner for permission, then trim.',
18041
+ "3. If the owner declines, change this heading to '## " +
18042
+ r.file +
18043
+ ": declined' to suppress this alert.",
18044
+ '',
18045
+ 'Do NOT reply HEARTBEAT_OK while this alert is unresolved.',
18110
18046
  ].join('\n');
18111
18047
  return {
18112
18048
  name: r.file,
@@ -18969,11 +18905,22 @@ class MetaServiceClient {
18969
18905
  qs.set('neverSynthesized', String(params.neverSynthesized));
18970
18906
  if (params?.locked !== undefined)
18971
18907
  qs.set('locked', String(params.locked));
18908
+ if (params?.disabled !== undefined)
18909
+ qs.set('disabled', String(params.disabled));
18972
18910
  if (params?.fields?.length)
18973
18911
  qs.set('fields', params.fields.join(','));
18974
18912
  const query = qs.toString();
18975
18913
  return this.get('/metas' + (query ? '?' + query : ''));
18976
18914
  }
18915
+ /** PATCH /metas/:path — update user-settable reserved properties. */
18916
+ async update(metaPath, updates) {
18917
+ const encoded = encodeURIComponent(metaPath);
18918
+ return fetchJson(`${this.baseUrl}/metas/${encoded}`, {
18919
+ method: 'PATCH',
18920
+ headers: { 'Content-Type': 'application/json' },
18921
+ body: JSON.stringify(updates),
18922
+ });
18923
+ }
18977
18924
  /** GET /metas/:path — detail for a single meta. */
18978
18925
  async detail(metaPath, options) {
18979
18926
  const encoded = encodeURIComponent(metaPath);
@@ -19044,6 +18991,7 @@ function buildCustomTools(client, baseUrl) {
19044
18991
  buildMetaSeedTool(client, baseUrl),
19045
18992
  buildMetaUnlockTool(client, baseUrl),
19046
18993
  buildMetaQueueTool(client, baseUrl),
18994
+ buildMetaUpdateTool(client, baseUrl),
19047
18995
  ];
19048
18996
  }
19049
18997
  /** Wrap tool execution with connection error handling. */
@@ -19065,12 +19013,13 @@ function buildMetaListTool(client, baseUrl) {
19065
19013
  },
19066
19014
  filter: {
19067
19015
  type: 'object',
19068
- description: 'Structured filter. Supported keys: hasError (boolean), staleHours (number), neverSynthesized (boolean), locked (boolean).',
19016
+ description: 'Structured filter. Supported keys: hasError (boolean), staleHours (number), neverSynthesized (boolean), locked (boolean), disabled (boolean).',
19069
19017
  properties: {
19070
19018
  hasError: { type: 'boolean' },
19071
19019
  staleHours: { type: 'number' },
19072
19020
  neverSynthesized: { type: 'boolean' },
19073
19021
  locked: { type: 'boolean' },
19022
+ disabled: { type: 'boolean' },
19074
19023
  },
19075
19024
  },
19076
19025
  fields: {
@@ -19088,6 +19037,7 @@ function buildMetaListTool(client, baseUrl) {
19088
19037
  staleHours: filter?.staleHours,
19089
19038
  neverSynthesized: filter?.neverSynthesized,
19090
19039
  locked: filter?.locked,
19040
+ disabled: filter?.disabled,
19091
19041
  fields: params.fields,
19092
19042
  }));
19093
19043
  },
@@ -19244,6 +19194,39 @@ function buildMetaQueueTool(client, baseUrl) {
19244
19194
  },
19245
19195
  };
19246
19196
  }
19197
+ function buildMetaUpdateTool(client, baseUrl) {
19198
+ return {
19199
+ name: 'meta_update',
19200
+ description: 'Update user-settable reserved properties on a meta entity.',
19201
+ parameters: {
19202
+ type: 'object',
19203
+ properties: {
19204
+ path: {
19205
+ type: 'string',
19206
+ description: 'Path to the .meta/ directory or owner directory.',
19207
+ },
19208
+ updates: {
19209
+ type: 'object',
19210
+ description: 'Properties to set. Supported: _steer, _emphasis, _depth, _crossRefs, _disabled. Set to null to remove.',
19211
+ properties: {
19212
+ _steer: { type: ['string', 'null'] },
19213
+ _emphasis: { type: ['number', 'null'] },
19214
+ _depth: { type: ['number', 'null'] },
19215
+ _crossRefs: {
19216
+ oneOf: [
19217
+ { type: 'array', items: { type: 'string' } },
19218
+ { type: 'null' },
19219
+ ],
19220
+ },
19221
+ _disabled: { type: ['boolean', 'null'] },
19222
+ },
19223
+ },
19224
+ },
19225
+ required: ['path', 'updates'],
19226
+ },
19227
+ execute: async (_id, params) => wrap(baseUrl, () => client.update(params.path, params.updates)),
19228
+ };
19229
+ }
19247
19230
 
19248
19231
  /**
19249
19232
  * Meta tool registrations for OpenClaw.
@@ -91,8 +91,17 @@ export declare class MetaServiceClient {
91
91
  staleHours?: number;
92
92
  neverSynthesized?: boolean;
93
93
  locked?: boolean;
94
+ disabled?: boolean;
94
95
  fields?: string[];
95
96
  }): Promise<MetasResponse>;
97
+ /** PATCH /metas/:path — update user-settable reserved properties. */
98
+ update(metaPath: string, updates: {
99
+ _steer?: string | null;
100
+ _emphasis?: number | null;
101
+ _depth?: number | null;
102
+ _crossRefs?: string[] | null;
103
+ _disabled?: boolean | null;
104
+ }): Promise<unknown>;
96
105
  /** GET /metas/:path — detail for a single meta. */
97
106
  detail(metaPath: string, options?: {
98
107
  includeArchive?: boolean | number;
@@ -19,12 +19,12 @@ registration health.
19
19
 
20
20
  ### meta_list
21
21
  List all `.meta/` directories with summary stats and per-meta projection.
22
- Supports filtering by path prefix, error status, staleness, and lock state.
23
- Use for engine health checks and finding stale knowledge.
22
+ Supports filtering by path prefix, error status, staleness, lock state, and
23
+ disabled status. Use for engine health checks and finding stale knowledge.
24
24
 
25
25
  **Parameters:**
26
26
  - `pathPrefix` (optional): Filter by path prefix (e.g. "github/")
27
- - `filter` (optional): Structured filter (`{ hasError: true }`, `{ staleHours: 24 }`)
27
+ - `filter` (optional): Structured filter (`{ hasError: true }`, `{ staleHours: 24 }`, `{ disabled: true }`)
28
28
  - `fields` (optional): Property projection array
29
29
 
30
30
  ### meta_detail
@@ -86,6 +86,17 @@ filtering to extract specific settings. Sensitive fields (e.g.
86
86
  - `path` (optional): JSONPath expression (e.g. `$.schedule`). If omitted,
87
87
  returns the full sanitized config.
88
88
 
89
+ ### meta_update
90
+ Update user-settable reserved properties on a meta entity. Use this to
91
+ toggle `_disabled`, change `_steer`, adjust `_emphasis` or `_depth`, or
92
+ modify `_crossRefs` — without editing `meta.json` directly on the filesystem.
93
+
94
+ **Parameters:**
95
+ - `path` (required): `.meta/` or owner directory path.
96
+ - `updates` (required): Object with properties to set. Supported:
97
+ `_steer`, `_emphasis`, `_depth`, `_crossRefs`, `_disabled`.
98
+ Set a value to `null` to remove the property.
99
+
89
100
  ### meta_queue
90
101
  Queue management: list pending items, clear the queue, or abort current
91
102
  synthesis. The synthesis queue is single-threaded; use this tool to inspect
@@ -113,6 +124,9 @@ what's running, clear queued work, or abort a stuck synthesis.
113
124
  - **Checking queue state:** `meta_queue` with action `list`
114
125
  - **Clearing queued work:** `meta_queue` with action `clear`
115
126
  - **Aborting stuck synthesis:** `meta_queue` with action `abort`
127
+ - **Disabling a meta:** `meta_update` with path and `updates: { _disabled: true }`
128
+ - **Re-enabling a meta:** `meta_update` with path and `updates: { _disabled: null }`
129
+ - **Changing steer via API:** `meta_update` with path and `updates: { _steer: "new focus" }`
116
130
  - **Reading synthesis output:** Use `watcher_search` filtered by the properties
117
131
  configured in `metaProperty` (e.g. `{ "domains": ["meta"] }` in production).
118
132
  The default properties are `{ _meta: "current" }` for live metas and
@@ -131,6 +145,10 @@ what's running, clear queued work, or abort a stuck synthesis.
131
145
  - **Staleness:** Time since last synthesis. Deeper metas (leaves) update more
132
146
  often than rollup metas (parents). Cross-ref freshness does NOT affect
133
147
  the referencing meta's staleness — each meta synthesizes independently.
148
+ - **Disabled (`_disabled`):** Set `_disabled: true` on a meta to exclude it
149
+ from automatic staleness scheduling. The scheduler and auto-select both
150
+ skip disabled metas. Manual triggers (`meta_trigger` with explicit path)
151
+ still work. Use `meta_update` to toggle the flag.
134
152
  - **Three steps:** Architect crafts the task brief, Builder produces content,
135
153
  Critic evaluates quality. The feedback loop self-improves over cycles.
136
154
  - **Archives:** Each cycle creates a timestamped snapshot in `.meta/archive/`.
@@ -501,6 +519,7 @@ The service exposes these endpoints (default port 1938):
501
519
  | GET | `/status` | Service health, queue state, dependency checks |
502
520
  | GET | `/metas` | List metas with filtering and field projection |
503
521
  | GET | `/metas/:path` | Single meta detail with optional archive |
522
+ | PATCH | `/metas/:path` | Update user-settable reserved properties |
504
523
  | GET | `/preview` | Dry-run next synthesis candidate |
505
524
  | POST | `/synthesize` | Enqueue synthesis (stalest or specific path) |
506
525
  | POST | `/synthesize/abort` | Abort the currently running synthesis |
@@ -2,7 +2,7 @@
2
2
  "id": "jeeves-meta-openclaw",
3
3
  "name": "Jeeves Meta",
4
4
  "description": "Knowledge synthesis tools — trigger synthesis, view status, manage entities.",
5
- "version": "0.10.6",
5
+ "version": "0.11.0",
6
6
  "skills": [
7
7
  "dist/skills/jeeves-meta"
8
8
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@karmaniverous/jeeves-meta-openclaw",
3
- "version": "0.10.6",
3
+ "version": "0.11.0",
4
4
  "author": "Jason Williscroft",
5
5
  "description": "OpenClaw plugin for jeeves-meta — synthesis tools and virtual rule registration",
6
6
  "license": "BSD-3-Clause",
@@ -120,6 +120,6 @@
120
120
  }
121
121
  },
122
122
  "dependencies": {
123
- "@karmaniverous/jeeves": "^0.5.5"
123
+ "@karmaniverous/jeeves": "^0.5.7"
124
124
  }
125
125
  }