@karmaniverous/jeeves-meta-openclaw 0.11.0 → 0.12.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/README.md +2 -1
- package/dist/cli.js +3 -2
- package/dist/index.js +98 -8
- package/dist/skills/jeeves-meta/SKILL.md +69 -29
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -6,7 +6,8 @@ OpenClaw plugin for [jeeves-meta](../service/). A thin HTTP client that register
|
|
|
6
6
|
|
|
7
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
|
-
- **TOOLS.md injection** — periodic refresh of entity stats via `ComponentWriter` from `@karmaniverous/jeeves` (73-second prime interval)
|
|
9
|
+
- **TOOLS.md injection** — periodic refresh of entity stats, phase-state summary, failed-phase alerts, and next-phase indicator via `ComponentWriter` from `@karmaniverous/jeeves` (73-second prime interval)
|
|
10
|
+
- **Phase-state awareness** — tools expose per-meta `_phaseState`, `owedPhase`, and phase-state summary from the service's phase-state machine
|
|
10
11
|
- **Cleanup escalation** — passes `gatewayUrl` into `ComponentWriter` so managed-content cleanup can request a gateway session when needed
|
|
11
12
|
- **Dependency health** — shows warnings when watcher/gateway are degraded
|
|
12
13
|
- **Consumer skill** — `SKILL.md` for agent integration
|
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.
|
|
15406
|
+
* The `0.5.7` 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.
|
|
15413
|
+
const CORE_VERSION = '0.5.7';
|
|
15414
15414
|
|
|
15415
15415
|
/**
|
|
15416
15416
|
* Workspace and config root initialization.
|
|
@@ -15433,6 +15433,7 @@ function init(options) {
|
|
|
15433
15433
|
workspacePath: options.workspacePath,
|
|
15434
15434
|
configRoot: options.configRoot,
|
|
15435
15435
|
coreConfigDir: join(options.configRoot, CORE_CONFIG_DIR),
|
|
15436
|
+
componentConfigPaths: new Map(),
|
|
15436
15437
|
};
|
|
15437
15438
|
}
|
|
15438
15439
|
/**
|
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.
|
|
15483
|
+
* The `0.5.7` 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.
|
|
15490
|
+
const CORE_VERSION = '0.5.7';
|
|
15491
15491
|
|
|
15492
15492
|
/**
|
|
15493
15493
|
* Workspace and config root initialization.
|
|
@@ -15510,6 +15510,7 @@ function init(options) {
|
|
|
15510
15510
|
workspacePath: options.workspacePath,
|
|
15511
15511
|
configRoot: options.configRoot,
|
|
15512
15512
|
coreConfigDir: join(options.configRoot, CORE_CONFIG_DIR),
|
|
15513
|
+
componentConfigPaths: new Map(),
|
|
15513
15514
|
};
|
|
15514
15515
|
}
|
|
15515
15516
|
/**
|
|
@@ -15691,6 +15692,32 @@ async function withWorkspaceLock(workspacePath, fn) {
|
|
|
15691
15692
|
function getErrorMessage(err) {
|
|
15692
15693
|
return err instanceof Error ? err.message : String(err);
|
|
15693
15694
|
}
|
|
15695
|
+
/** Error codes / names that indicate transient network failures. */
|
|
15696
|
+
const TRANSIENT_CODES = new Set([
|
|
15697
|
+
'ECONNRESET',
|
|
15698
|
+
'ETIMEDOUT',
|
|
15699
|
+
'UND_ERR_CONNECT_TIMEOUT',
|
|
15700
|
+
'AbortError',
|
|
15701
|
+
]);
|
|
15702
|
+
/**
|
|
15703
|
+
* Classify whether an error is a transient network failure.
|
|
15704
|
+
*
|
|
15705
|
+
* @param err - The caught value.
|
|
15706
|
+
* @returns `true` for ECONNRESET, ETIMEDOUT, UND_ERR_CONNECT_TIMEOUT,
|
|
15707
|
+
* AbortError, and timeout-related fetch errors.
|
|
15708
|
+
*/
|
|
15709
|
+
function isTransientError(err) {
|
|
15710
|
+
let current = err;
|
|
15711
|
+
while (current instanceof Error) {
|
|
15712
|
+
if (TRANSIENT_CODES.has(current.name))
|
|
15713
|
+
return true;
|
|
15714
|
+
const code = current.code;
|
|
15715
|
+
if (typeof code === 'string' && TRANSIENT_CODES.has(code))
|
|
15716
|
+
return true;
|
|
15717
|
+
current = current.cause;
|
|
15718
|
+
}
|
|
15719
|
+
return false;
|
|
15720
|
+
}
|
|
15694
15721
|
|
|
15695
15722
|
/**
|
|
15696
15723
|
* Workspace-level shared configuration: `jeeves.config.json`.
|
|
@@ -18702,7 +18729,12 @@ class ComponentWriter {
|
|
|
18702
18729
|
*/
|
|
18703
18730
|
function createAsyncContentCache(options) {
|
|
18704
18731
|
const { fetch: fetchContent, placeholder = '> Initializing...', onError = (err) => {
|
|
18705
|
-
|
|
18732
|
+
if (isTransientError(err)) {
|
|
18733
|
+
console.warn(`[jeeves] cache refresh: transient error (${getErrorMessage(err)})`);
|
|
18734
|
+
}
|
|
18735
|
+
else {
|
|
18736
|
+
console.warn('[jeeves] cache refresh failed:', err);
|
|
18737
|
+
}
|
|
18706
18738
|
}, } = options;
|
|
18707
18739
|
let cached = placeholder;
|
|
18708
18740
|
let refreshing = false;
|
|
@@ -18842,6 +18874,63 @@ async function generateMetaMenu(client) {
|
|
|
18842
18874
|
if (dependencies.gateway.status !== 'ok') {
|
|
18843
18875
|
depLines.push('> ⚠️ **Gateway**: ' + dependencies.gateway.status);
|
|
18844
18876
|
}
|
|
18877
|
+
// Phase-state summary from /status health
|
|
18878
|
+
const phaseLines = [];
|
|
18879
|
+
const phaseSummary = status.health.phaseStateSummary;
|
|
18880
|
+
if (phaseSummary) {
|
|
18881
|
+
// Aggregate counts across all phases
|
|
18882
|
+
const totals = {};
|
|
18883
|
+
for (const phase of ['architect', 'builder', 'critic']) {
|
|
18884
|
+
const counts = phaseSummary[phase];
|
|
18885
|
+
for (const [state, count] of Object.entries(counts)) {
|
|
18886
|
+
if (count > 0) {
|
|
18887
|
+
totals[state] = (totals[state] ?? 0) + count;
|
|
18888
|
+
}
|
|
18889
|
+
}
|
|
18890
|
+
}
|
|
18891
|
+
const parts = [];
|
|
18892
|
+
for (const state of ['fresh', 'pending', 'running', 'failed']) {
|
|
18893
|
+
if (totals[state]) {
|
|
18894
|
+
parts.push(totals[state].toString() + ' ' + state);
|
|
18895
|
+
}
|
|
18896
|
+
}
|
|
18897
|
+
if (parts.length > 0) {
|
|
18898
|
+
phaseLines.push('Phases: ' + parts.join(', '));
|
|
18899
|
+
}
|
|
18900
|
+
// Failed-phase alert
|
|
18901
|
+
const failedParts = [];
|
|
18902
|
+
for (const item of metas.metas) {
|
|
18903
|
+
const ps = item.phaseState;
|
|
18904
|
+
if (!ps)
|
|
18905
|
+
continue;
|
|
18906
|
+
for (const phase of ['architect', 'builder', 'critic']) {
|
|
18907
|
+
if (ps[phase] === 'failed') {
|
|
18908
|
+
const p = item.path;
|
|
18909
|
+
failedParts.push(p + ' (' + phase + ')');
|
|
18910
|
+
}
|
|
18911
|
+
}
|
|
18912
|
+
}
|
|
18913
|
+
if (failedParts.length > 0) {
|
|
18914
|
+
phaseLines.push('> Failed: ' +
|
|
18915
|
+
failedParts.slice(0, 10).join(', ') +
|
|
18916
|
+
(failedParts.length > 10
|
|
18917
|
+
? ' (+' + (failedParts.length - 10).toString() + ' more)'
|
|
18918
|
+
: ''));
|
|
18919
|
+
}
|
|
18920
|
+
}
|
|
18921
|
+
// Next-phase indicator from /status health
|
|
18922
|
+
const nextPhase = status.health.nextPhase;
|
|
18923
|
+
if (nextPhase) {
|
|
18924
|
+
phaseLines.push('Next: ' +
|
|
18925
|
+
nextPhase.path +
|
|
18926
|
+
' → ' +
|
|
18927
|
+
nextPhase.phase +
|
|
18928
|
+
' (band ' +
|
|
18929
|
+
nextPhase.band.toString() +
|
|
18930
|
+
', staleness ' +
|
|
18931
|
+
formatAge(nextPhase.staleness) +
|
|
18932
|
+
')');
|
|
18933
|
+
}
|
|
18845
18934
|
return [
|
|
18846
18935
|
'The jeeves-meta synthesis engine manages ' +
|
|
18847
18936
|
summary.total.toString() +
|
|
@@ -18856,6 +18945,7 @@ async function generateMetaMenu(client) {
|
|
|
18856
18945
|
'| Never synthesized | ' + summary.neverSynthesized.toString() + ' |',
|
|
18857
18946
|
'| Stalest | ' + stalestDisplay + ' |',
|
|
18858
18947
|
'| Last synthesized | ' + lastSynthDisplay + ' |',
|
|
18948
|
+
...(phaseLines.length > 0 ? ['', '### Phase State', ...phaseLines] : []),
|
|
18859
18949
|
...(depLines.length > 0 ? ['', '### Dependencies', ...depLines] : []),
|
|
18860
18950
|
'',
|
|
18861
18951
|
'Read the `jeeves-meta` skill for usage guidance, configuration, and troubleshooting.',
|
|
@@ -19003,7 +19093,7 @@ function wrap(baseUrl, fn) {
|
|
|
19003
19093
|
function buildMetaListTool(client, baseUrl) {
|
|
19004
19094
|
return {
|
|
19005
19095
|
name: 'meta_list',
|
|
19006
|
-
description: 'List metas with summary stats and per-meta projection.
|
|
19096
|
+
description: 'List metas with summary stats and per-meta projection. Response includes _phaseState and owedPhase per meta.',
|
|
19007
19097
|
parameters: {
|
|
19008
19098
|
type: 'object',
|
|
19009
19099
|
properties: {
|
|
@@ -19046,7 +19136,7 @@ function buildMetaListTool(client, baseUrl) {
|
|
|
19046
19136
|
function buildMetaDetailTool(client, baseUrl) {
|
|
19047
19137
|
return {
|
|
19048
19138
|
name: 'meta_detail',
|
|
19049
|
-
description: 'Full detail for a single meta, with optional archive history.',
|
|
19139
|
+
description: 'Full detail for a single meta, with optional archive history. Response includes _phaseState and owedPhase.',
|
|
19050
19140
|
parameters: {
|
|
19051
19141
|
type: 'object',
|
|
19052
19142
|
properties: {
|
|
@@ -19075,7 +19165,7 @@ function buildMetaDetailTool(client, baseUrl) {
|
|
|
19075
19165
|
function buildMetaPreviewTool(client, baseUrl) {
|
|
19076
19166
|
return {
|
|
19077
19167
|
name: 'meta_preview',
|
|
19078
|
-
description: 'Dry-run
|
|
19168
|
+
description: 'Dry-run preview of next synthesis. Returns owedPhase, priorityBand, phaseState, stalenessInputs, and architectInvalidators.',
|
|
19079
19169
|
parameters: {
|
|
19080
19170
|
type: 'object',
|
|
19081
19171
|
properties: {
|
|
@@ -19091,7 +19181,7 @@ function buildMetaPreviewTool(client, baseUrl) {
|
|
|
19091
19181
|
function buildMetaTriggerTool(client, baseUrl) {
|
|
19092
19182
|
return {
|
|
19093
19183
|
name: 'meta_trigger',
|
|
19094
|
-
description: '
|
|
19184
|
+
description: 'Trigger synthesis. Path-targeted creates an override queue entry; returns owedPhase. Fully-fresh metas return status:skipped.',
|
|
19095
19185
|
parameters: {
|
|
19096
19186
|
type: 'object',
|
|
19097
19187
|
properties: {
|
|
@@ -19167,7 +19257,7 @@ function buildMetaUnlockTool(client, baseUrl) {
|
|
|
19167
19257
|
function buildMetaQueueTool(client, baseUrl) {
|
|
19168
19258
|
return {
|
|
19169
19259
|
name: 'meta_queue',
|
|
19170
|
-
description: 'Queue management
|
|
19260
|
+
description: 'Queue management. list: 3-layer model (current with phase, overrides, automatic, pending). clear: removes overrides only. abort: returns {status,path,phase} or {status:idle}.',
|
|
19171
19261
|
parameters: {
|
|
19172
19262
|
type: 'object',
|
|
19173
19263
|
properties: {
|
|
@@ -7,6 +7,12 @@ jeeves-meta is the Jeeves platform's knowledge synthesis engine. It discovers
|
|
|
7
7
|
gathers context from co-located source files, and uses a three-step LLM process
|
|
8
8
|
(architect, builder, critic) to produce structured synthesis artifacts.
|
|
9
9
|
|
|
10
|
+
Each meta entity carries a **phase-state machine** (`_phaseState`) tracking
|
|
11
|
+
the state of each phase independently: `fresh`, `stale`, `pending`, `running`,
|
|
12
|
+
or `failed`. The scheduler picks **one phase per tick** across the entire
|
|
13
|
+
corpus (critic > builder > architect priority), enabling surgical retries of
|
|
14
|
+
failed phases without re-running the full pipeline.
|
|
15
|
+
|
|
10
16
|
**Requires:** jeeves-watcher ≥ 0.10.0 (provides `POST /walk` and auto
|
|
11
17
|
rules-reindex on registration).
|
|
12
18
|
|
|
@@ -21,6 +27,8 @@ registration health.
|
|
|
21
27
|
List all `.meta/` directories with summary stats and per-meta projection.
|
|
22
28
|
Supports filtering by path prefix, error status, staleness, lock state, and
|
|
23
29
|
disabled status. Use for engine health checks and finding stale knowledge.
|
|
30
|
+
Each meta entry includes `phaseState` (`{ architect, builder, critic }`)
|
|
31
|
+
showing the per-phase state.
|
|
24
32
|
|
|
25
33
|
**Parameters:**
|
|
26
34
|
- `pathPrefix` (optional): Filter by path prefix (e.g. "github/")
|
|
@@ -28,7 +36,8 @@ disabled status. Use for engine health checks and finding stale knowledge.
|
|
|
28
36
|
- `fields` (optional): Property projection array
|
|
29
37
|
|
|
30
38
|
### meta_detail
|
|
31
|
-
Full detail for a single meta, with optional archive history.
|
|
39
|
+
Full detail for a single meta, with optional archive history. Includes
|
|
40
|
+
`_phaseState` showing the per-phase state machine status.
|
|
32
41
|
|
|
33
42
|
**Parameters:**
|
|
34
43
|
- `path` (required): `.meta/` or owner directory path
|
|
@@ -36,20 +45,22 @@ Full detail for a single meta, with optional archive history.
|
|
|
36
45
|
- `includeArchive` (optional): false, true, or number (N most recent)
|
|
37
46
|
|
|
38
47
|
### meta_preview
|
|
39
|
-
Dry-run for the next synthesis
|
|
40
|
-
architect trigger reasons, steer status,
|
|
41
|
-
running any LLM calls.
|
|
42
|
-
|
|
48
|
+
Dry-run for the next synthesis candidate. Shows scope files, delta files,
|
|
49
|
+
architect trigger reasons, steer status, structure changes, and the
|
|
50
|
+
phase that would execute next — without running any LLM calls. Includes
|
|
51
|
+
`phaseState` and `owedPhase` (the phase that would run). Use before
|
|
52
|
+
`meta_trigger` to understand what will happen.
|
|
43
53
|
|
|
44
54
|
**Parameters:**
|
|
45
55
|
- `path` (optional): Specific `.meta/` or owner directory path. If omitted,
|
|
46
56
|
previews the stalest candidate.
|
|
47
57
|
|
|
48
58
|
### meta_trigger
|
|
49
|
-
Enqueue a synthesis
|
|
59
|
+
Enqueue a synthesis for a specific meta or the next-stalest candidate.
|
|
50
60
|
The synthesis runs asynchronously in the service queue; the tool returns
|
|
51
|
-
immediately with the queue position.
|
|
52
|
-
|
|
61
|
+
immediately with the queue position. Only one phase runs per tick (the
|
|
62
|
+
owed phase). Includes `owedPhase` in the response showing which phase
|
|
63
|
+
will execute.
|
|
53
64
|
|
|
54
65
|
**Parameters:**
|
|
55
66
|
- `path` (optional): Specific `.meta/` or owner directory path. If omitted,
|
|
@@ -99,14 +110,17 @@ modify `_crossRefs` — without editing `meta.json` directly on the filesystem.
|
|
|
99
110
|
|
|
100
111
|
### meta_queue
|
|
101
112
|
Queue management: list pending items, clear the queue, or abort current
|
|
102
|
-
synthesis. The
|
|
103
|
-
|
|
113
|
+
synthesis. The queue has three layers: `current` (the running phase),
|
|
114
|
+
`overrides` (explicitly triggered entries), and `automatic` (scheduler-
|
|
115
|
+
computed candidates). The `pending` and `state` fields provide legacy
|
|
116
|
+
compatibility.
|
|
104
117
|
|
|
105
118
|
**Parameters:**
|
|
106
119
|
- `action` (required): One of `list`, `clear`, `abort`.
|
|
107
|
-
- `list`: Show current queue state (current
|
|
108
|
-
|
|
109
|
-
- `
|
|
120
|
+
- `list`: Show current queue state (current with phase, overrides,
|
|
121
|
+
automatic candidates, pending items).
|
|
122
|
+
- `clear`: Remove all override queue entries.
|
|
123
|
+
- `abort`: Stop the currently running phase and release its lock.
|
|
110
124
|
|
|
111
125
|
## When to Use
|
|
112
126
|
|
|
@@ -158,6 +172,17 @@ what's running, clear queued work, or abort a stuck synthesis.
|
|
|
158
172
|
(e.g. phased analysis, incremental refinement). On builder timeout, the
|
|
159
173
|
engine attempts to recover partial output — if `_state` advanced, it saves
|
|
160
174
|
the new state without overwriting existing content.
|
|
175
|
+
- **Phase-state machine (`_phaseState`):** Each meta tracks its three phases
|
|
176
|
+
independently: `{ architect: <state>, builder: <state>, critic: <state> }`.
|
|
177
|
+
States are `fresh`, `stale`, `pending`, `running`, or `failed`. The
|
|
178
|
+
scheduler picks the single highest-priority owed phase across all metas
|
|
179
|
+
each tick (critic > builder > architect, with staleness tiebreaking).
|
|
180
|
+
Failed phases are automatically retried on the next tick (promoted from
|
|
181
|
+
`failed` → `pending`). Only the failed phase reruns — upstream/downstream
|
|
182
|
+
phases are untouched (surgical retries). A full cycle completes only when
|
|
183
|
+
all three phases are `fresh`, at which point the archive snapshot is taken
|
|
184
|
+
and `_synthesisCount` increments. Legacy metas without `_phaseState` have
|
|
185
|
+
their state derived automatically from existing fields on first load.
|
|
161
186
|
|
|
162
187
|
## Configuration
|
|
163
188
|
|
|
@@ -516,7 +541,7 @@ The service exposes these endpoints (default port 1938):
|
|
|
516
541
|
|
|
517
542
|
| Method | Path | Description |
|
|
518
543
|
|--------|------|-------------|
|
|
519
|
-
| GET | `/status` | Service health, queue state, dependency checks |
|
|
544
|
+
| GET | `/status` | Service health, queue state, dependency checks, phase-state summary |
|
|
520
545
|
| GET | `/metas` | List metas with filtering and field projection |
|
|
521
546
|
| GET | `/metas/:path` | Single meta detail with optional archive |
|
|
522
547
|
| PATCH | `/metas/:path` | Update user-settable reserved properties |
|
|
@@ -527,8 +552,8 @@ The service exposes these endpoints (default port 1938):
|
|
|
527
552
|
| POST | `/unlock` | Remove `.lock` file from a meta entity |
|
|
528
553
|
| GET | `/config` | Query sanitized config with optional JSONPath (`?path=$.schedule`) |
|
|
529
554
|
| POST | `/config/apply` | Apply a config patch (merge or replace) |
|
|
530
|
-
| GET | `/queue` |
|
|
531
|
-
| POST | `/queue/clear` | Remove all
|
|
555
|
+
| GET | `/queue` | Queue state: current (with phase), overrides, automatic, pending |
|
|
556
|
+
| POST | `/queue/clear` | Remove all override queue entries |
|
|
532
557
|
|
|
533
558
|
All endpoints return JSON. The OpenClaw plugin tools are thin wrappers
|
|
534
559
|
around these endpoints.
|
|
@@ -553,15 +578,22 @@ The `start` command uses `--config`/`-c` instead (port is read from the config f
|
|
|
553
578
|
Recommended periodic checks:
|
|
554
579
|
- **Errors:** `meta_list` with `filter: { hasError: true }` — investigate
|
|
555
580
|
and retry with `meta_trigger`
|
|
581
|
+
- **Failed phases:** The TOOLS.md injection shows a "Failed:" alert listing
|
|
582
|
+
metas with failed phases. Failed phases auto-retry on the next scheduler
|
|
583
|
+
tick. Use `meta_detail` to inspect the `_phaseState` and `_error` fields.
|
|
556
584
|
- **Stuck locks:** `meta_list` with `filter: { locked: true }` — locks
|
|
557
585
|
older than 30 minutes indicate a crashed synthesis; use `jeeves-meta unlock`
|
|
558
586
|
- **Stale knowledge:** `meta_list` with `filter: { staleHours: 48 }` — check
|
|
559
587
|
if the scheduler is running and the watcher is up
|
|
588
|
+
- **Phase health:** `/status` includes `phaseStateSummary` with aggregate
|
|
589
|
+
counts per phase (`fresh`, `stale`, `pending`, `running`, `failed`) and
|
|
590
|
+
`nextPhase` showing the next candidate.
|
|
560
591
|
- **Service health:** `/status` endpoint (via `meta_list` summary or direct
|
|
561
592
|
HTTP) includes dependency status for watcher and gateway
|
|
562
593
|
|
|
563
594
|
The TOOLS.md injection surfaces the most critical stats (entity count, errors,
|
|
564
|
-
stalest entity
|
|
595
|
+
stalest entity, phase summary, failed-phase alerts, next-phase indicator) in
|
|
596
|
+
the agent's system prompt automatically.
|
|
565
597
|
|
|
566
598
|
## Troubleshooting
|
|
567
599
|
|
|
@@ -622,18 +654,22 @@ progressive work is not lost on timeout — only the content update is skipped.
|
|
|
622
654
|
3. Check if the LLM provider is slow or rate-limited
|
|
623
655
|
4. Check scope size: large scopes with many files take longer
|
|
624
656
|
|
|
625
|
-
### LLM errors in synthesis
|
|
657
|
+
### LLM errors in synthesis phases
|
|
626
658
|
|
|
627
|
-
**Symptom:** `meta_detail` shows `_error` field with step/code/message
|
|
659
|
+
**Symptom:** `meta_detail` shows `_error` field with step/code/message, and
|
|
660
|
+
`_phaseState` shows `failed` for one or more phases.
|
|
628
661
|
**Cause:** Subprocess failed (API error, malformed output, rate limit)
|
|
629
662
|
**Fix:**
|
|
630
663
|
1. Check error details: `meta_detail <path>` — `_error.step` tells you
|
|
631
|
-
which
|
|
632
|
-
2.
|
|
664
|
+
which phase failed; `_phaseState` shows the exact state of each phase
|
|
665
|
+
2. Failed phases are **automatically retried** on the next scheduler tick
|
|
666
|
+
(promoted from `failed` → `pending`). Only the failed phase reruns —
|
|
667
|
+
other phases are untouched (surgical retry).
|
|
668
|
+
3. Architect failure with existing `_builder`: engine reuses cached brief
|
|
633
669
|
(self-healing)
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
670
|
+
4. Architect failure without `_builder` (first run): retry with `meta_trigger`
|
|
671
|
+
5. Builder failure: meta stays stale, retried next tick automatically
|
|
672
|
+
6. Critic failure: content saved without feedback, not critical
|
|
637
673
|
|
|
638
674
|
### Discovery returns wrong/stale results
|
|
639
675
|
|
|
@@ -649,8 +685,9 @@ not yet indexed new files
|
|
|
649
685
|
|
|
650
686
|
## Gotchas
|
|
651
687
|
|
|
652
|
-
- `meta_trigger`
|
|
653
|
-
|
|
688
|
+
- `meta_trigger` enqueues a single phase (not all three). A full cycle
|
|
689
|
+
requires three separate ticks (one per phase). Use `meta_detail` to
|
|
690
|
+
check `_phaseState` for progress.
|
|
654
691
|
- A locked meta (another synthesis in progress) will be skipped silently.
|
|
655
692
|
- First-run quality is lower — the feedback loop needs 2-3 cycles to calibrate.
|
|
656
693
|
- Changing `metaProperty` requires both a meta service restart AND a watcher reindex.
|
|
@@ -661,9 +698,12 @@ not yet indexed new files
|
|
|
661
698
|
- All prompts are compiled as Handlebars templates. Avoid using `{{` in prompt
|
|
662
699
|
overrides unless you intend template variable resolution. Escape with `\{{`
|
|
663
700
|
for literal double-braces.
|
|
664
|
-
- The synthesis queue is single-threaded
|
|
665
|
-
|
|
701
|
+
- The synthesis queue is single-threaded with three layers: `current` (the
|
|
702
|
+
running phase), `overrides` (explicitly triggered entries, highest priority),
|
|
703
|
+
and `automatic` (scheduler-computed candidates). Override entries are
|
|
704
|
+
processed before automatic candidates.
|
|
666
705
|
- The scheduler uses adaptive backoff: if no stale candidates are found, it
|
|
667
|
-
doubles the skip interval (max 4×). Backoff resets after
|
|
706
|
+
doubles the skip interval (max 4×). Backoff resets after any successful
|
|
707
|
+
phase execution (not just full-cycle completion).
|
|
668
708
|
- All CLI commands except `start` require the service to be running (they call
|
|
669
709
|
the HTTP API).
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@karmaniverous/jeeves-meta-openclaw",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.1",
|
|
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.
|
|
123
|
+
"@karmaniverous/jeeves": "^0.5.8"
|
|
124
124
|
}
|
|
125
125
|
}
|