openclawdreams 3.0.6 → 3.0.8

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 (128) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +1 -1
  3. package/dist/bin/openclawdreams.d.ts +3 -0
  4. package/dist/bin/openclawdreams.d.ts.map +1 -0
  5. package/dist/bin/openclawdreams.js +4 -0
  6. package/dist/bin/openclawdreams.js.map +1 -0
  7. package/dist/src/backfill.d.ts +2 -0
  8. package/dist/src/backfill.d.ts.map +1 -0
  9. package/dist/src/backfill.js +63 -0
  10. package/dist/src/backfill.js.map +1 -0
  11. package/dist/src/budget.d.ts +28 -0
  12. package/dist/src/budget.d.ts.map +1 -0
  13. package/dist/src/budget.js +117 -0
  14. package/dist/src/budget.js.map +1 -0
  15. package/dist/src/cli.d.ts +19 -0
  16. package/dist/src/cli.d.ts.map +1 -0
  17. package/dist/src/cli.js +586 -0
  18. package/dist/src/cli.js.map +1 -0
  19. package/dist/src/config.d.ts +76 -0
  20. package/dist/src/config.d.ts.map +1 -0
  21. package/dist/src/config.js +178 -0
  22. package/dist/src/config.js.map +1 -0
  23. package/dist/src/crypto.d.ts +19 -0
  24. package/dist/src/crypto.d.ts.map +1 -0
  25. package/dist/src/crypto.js +70 -0
  26. package/dist/src/crypto.js.map +1 -0
  27. package/dist/src/dreamer.d.ts +78 -0
  28. package/dist/src/dreamer.d.ts.map +1 -0
  29. package/dist/src/dreamer.js +626 -0
  30. package/dist/src/dreamer.js.map +1 -0
  31. package/dist/src/entropy.d.ts +23 -0
  32. package/dist/src/entropy.d.ts.map +1 -0
  33. package/dist/src/entropy.js +188 -0
  34. package/dist/src/entropy.js.map +1 -0
  35. package/dist/src/filter.d.ts +30 -0
  36. package/dist/src/filter.d.ts.map +1 -0
  37. package/dist/src/filter.js +124 -0
  38. package/dist/src/filter.js.map +1 -0
  39. package/dist/src/identity.d.ts +29 -0
  40. package/dist/src/identity.d.ts.map +1 -0
  41. package/dist/src/identity.js +83 -0
  42. package/dist/src/identity.js.map +1 -0
  43. package/dist/src/index.d.ts +14 -0
  44. package/dist/src/index.d.ts.map +1 -0
  45. package/dist/src/index.js +460 -0
  46. package/dist/src/index.js.map +1 -0
  47. package/dist/src/ingestion.d.ts +22 -0
  48. package/dist/src/ingestion.d.ts.map +1 -0
  49. package/dist/src/ingestion.js +101 -0
  50. package/dist/src/ingestion.js.map +1 -0
  51. package/dist/src/instrumentation.d.ts +66 -0
  52. package/dist/src/instrumentation.d.ts.map +1 -0
  53. package/dist/src/instrumentation.js +112 -0
  54. package/dist/src/instrumentation.js.map +1 -0
  55. package/dist/src/llm.d.ts +26 -0
  56. package/dist/src/llm.d.ts.map +1 -0
  57. package/dist/src/llm.js +40 -0
  58. package/dist/src/llm.js.map +1 -0
  59. package/dist/src/logger.d.ts +6 -0
  60. package/dist/src/logger.d.ts.map +1 -0
  61. package/dist/src/logger.js +32 -0
  62. package/dist/src/logger.js.map +1 -0
  63. package/dist/src/memory.d.ts +96 -0
  64. package/dist/src/memory.d.ts.map +1 -0
  65. package/dist/src/memory.js +467 -0
  66. package/dist/src/memory.js.map +1 -0
  67. package/dist/src/meta-loop.d.ts +23 -0
  68. package/dist/src/meta-loop.d.ts.map +1 -0
  69. package/dist/src/meta-loop.js +72 -0
  70. package/dist/src/meta-loop.js.map +1 -0
  71. package/dist/src/moltbook-search.d.ts +23 -0
  72. package/dist/src/moltbook-search.d.ts.map +1 -0
  73. package/dist/src/moltbook-search.js +85 -0
  74. package/dist/src/moltbook-search.js.map +1 -0
  75. package/dist/src/moltbook.d.ts +34 -0
  76. package/dist/src/moltbook.d.ts.map +1 -0
  77. package/dist/src/moltbook.js +192 -0
  78. package/dist/src/moltbook.js.map +1 -0
  79. package/dist/src/nightmare.d.ts +11 -0
  80. package/dist/src/nightmare.d.ts.map +1 -0
  81. package/dist/src/nightmare.js +128 -0
  82. package/dist/src/nightmare.js.map +1 -0
  83. package/dist/src/notify.d.ts +20 -0
  84. package/dist/src/notify.d.ts.map +1 -0
  85. package/dist/src/notify.js +95 -0
  86. package/dist/src/notify.js.map +1 -0
  87. package/dist/src/persona.d.ts +30 -0
  88. package/dist/src/persona.d.ts.map +1 -0
  89. package/dist/src/persona.js +292 -0
  90. package/dist/src/persona.js.map +1 -0
  91. package/dist/src/reflection.d.ts +26 -0
  92. package/dist/src/reflection.d.ts.map +1 -0
  93. package/dist/src/reflection.js +127 -0
  94. package/dist/src/reflection.js.map +1 -0
  95. package/dist/src/rhythm.d.ts +19 -0
  96. package/dist/src/rhythm.d.ts.map +1 -0
  97. package/dist/src/rhythm.js +130 -0
  98. package/dist/src/rhythm.js.map +1 -0
  99. package/dist/src/state.d.ts +7 -0
  100. package/dist/src/state.d.ts.map +1 -0
  101. package/dist/src/state.js +40 -0
  102. package/dist/src/state.js.map +1 -0
  103. package/dist/src/synthesis.d.ts +29 -0
  104. package/dist/src/synthesis.d.ts.map +1 -0
  105. package/dist/src/synthesis.js +144 -0
  106. package/dist/src/synthesis.js.map +1 -0
  107. package/dist/src/topics.d.ts +19 -0
  108. package/dist/src/topics.d.ts.map +1 -0
  109. package/dist/src/topics.js +84 -0
  110. package/dist/src/topics.js.map +1 -0
  111. package/dist/src/types.d.ts +256 -0
  112. package/dist/src/types.d.ts.map +1 -0
  113. package/dist/src/types.js +5 -0
  114. package/dist/src/types.js.map +1 -0
  115. package/dist/src/vocabulary.d.ts +18 -0
  116. package/dist/src/vocabulary.d.ts.map +1 -0
  117. package/dist/src/vocabulary.js +121 -0
  118. package/dist/src/vocabulary.js.map +1 -0
  119. package/dist/src/waking.d.ts +27 -0
  120. package/dist/src/waking.d.ts.map +1 -0
  121. package/dist/src/waking.js +189 -0
  122. package/dist/src/waking.js.map +1 -0
  123. package/dist/src/web-search.d.ts +23 -0
  124. package/dist/src/web-search.d.ts.map +1 -0
  125. package/dist/src/web-search.js +64 -0
  126. package/dist/src/web-search.js.map +1 -0
  127. package/openclaw.plugin.json +1 -1
  128. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,38 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [3.0.8](https://github.com/RogueCtrl/OpenClawDreams/compare/v3.0.7...v3.0.8) (2026-03-22)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * Replace `api.registerHook` with `api.on` for event handling ([edfb133](https://github.com/RogueCtrl/OpenClawDreams/commit/edfb1331bad20f962ab2607fb9c4056aed95e9dd))
11
+ * Replace `api.registerHook` with `api.on` for event handling and update internal logging to use `console.error`. ([356108d](https://github.com/RogueCtrl/OpenClawDreams/commit/356108d3b7842817472eb581b77fed51a356fd0f))
12
+ * tighten agent hook event typing ([81dfa97](https://github.com/RogueCtrl/OpenClawDreams/commit/81dfa972e7c630093b071446751802bc4ea4e53b))
13
+
14
+
15
+ ### Documentation
16
+
17
+ * Update OpenClaw version requirement in README. ([7c7c0af](https://github.com/RogueCtrl/OpenClawDreams/commit/7c7c0af0a22d399a375dd393beb5652da52cc1f2))
18
+
19
+
20
+ ### Refactoring
21
+
22
+ * Update Claude code review workflow to use `allowed_bots` and `prompt` parameters. ([ee9da7e](https://github.com/RogueCtrl/OpenClawDreams/commit/ee9da7e25d9ae5585de83ddb290a37e96e1aadc9))
23
+
24
+ ### [3.0.7](https://github.com/RogueCtrl/OpenClawDreams/compare/v3.0.5...v3.0.7) (2026-03-22)
25
+
26
+
27
+ ### Features
28
+
29
+ * add structured instrumentation for the dream cycle ([fa992c5](https://github.com/RogueCtrl/OpenClawDreams/commit/fa992c56fd9516ed1731fd4f240986acef3d0434))
30
+
31
+
32
+ ### Bug Fixes
33
+
34
+ * add test to prevent token budget double-counting regression (ROG-68) ([7384d58](https://github.com/RogueCtrl/OpenClawDreams/commit/7384d589e137c60fd1550756873e645eede6d028))
35
+ * instrument dream cycle and lock down budget accounting ([2837875](https://github.com/RogueCtrl/OpenClawDreams/commit/28378759cb1b491f26bd7998210f9f1a613efef9))
36
+
5
37
  ### [3.0.6](https://github.com/RogueCtrl/OpenClawDreams/compare/v3.0.5...v3.0.6) (2026-03-22)
6
38
 
7
39
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
4
4
  [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D24-339933?logo=node.js&logoColor=white)](https://nodejs.org/)
5
- [![OpenClaw](https://img.shields.io/badge/OpenClaw-%E2%89%A52026.3.7-000000?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0id2hpdGUiPjx0ZXh0IHg9IjAiIHk9IjEzIiBmb250LXNpemU9IjE0Ij7wn6aAPC90ZXh0Pjwvc3ZnPg==)](https://github.com/openclaw)
5
+ [![OpenClaw](https://img.shields.io/badge/OpenClaw-%E2%89%A52026.3.13-000000?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0id2hpdGUiPjx0ZXh0IHg9IjAiIHk9IjEzIiBmb250LXNpemU9IjE0Ij7wn6aAPC90ZXh0Pjwvc3ZnPg==)](https://github.com/openclaw)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
7
  [![Build](https://github.com/RogueCtrl/ElectricSheep/actions/workflows/build.yml/badge.svg)](https://github.com/RogueCtrl/ElectricSheep/actions/workflows/build.yml)
8
8
 
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=openclawdreams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclawdreams.d.ts","sourceRoot":"","sources":["../../bin/openclawdreams.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { program } from "../src/cli.js";
3
+ void program.parseAsync(process.argv);
4
+ //# sourceMappingURL=openclawdreams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclawdreams.js","sourceRoot":"","sources":["../../bin/openclawdreams.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function ensureBackfilled(): Promise<void>;
2
+ //# sourceMappingURL=backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../../src/backfill.ts"],"names":[],"mappings":"AAaA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyDtD"}
@@ -0,0 +1,63 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { getDreamsDir, getNightmaresDir } from "./config.js";
4
+ import { storeDeepMemory, registerDream, getDreamRemembrances } from "./memory.js";
5
+ import { loadState, saveState } from "./state.js";
6
+ import logger from "./logger.js";
7
+ function parseFilename(filename) {
8
+ const match = filename.match(/^(\d{4}-\d{2}-\d{2})_(.+)\.md$/);
9
+ if (!match)
10
+ return null;
11
+ return { date: match[1], title: match[2].replace(/_/g, " ") };
12
+ }
13
+ export async function ensureBackfilled() {
14
+ const state = loadState();
15
+ if (state.dreams_backfilled) {
16
+ return;
17
+ }
18
+ logger.info("Starting initial dream remembrance backfill...");
19
+ let backfillCount = 0;
20
+ const existing = new Set(getDreamRemembrances().map((r) => r.filename));
21
+ // 1. Backfill from local disk (Dreams)
22
+ if (existsSync(getDreamsDir())) {
23
+ const files = readdirSync(getDreamsDir()).filter((f) => f.endsWith(".md"));
24
+ for (const f of files) {
25
+ if (existing.has(f))
26
+ continue;
27
+ const parsed = parseFilename(f);
28
+ if (!parsed)
29
+ continue;
30
+ const content = readFileSync(resolve(getDreamsDir(), f), "utf-8");
31
+ const deepMemoryId = storeDeepMemory({ text_summary: parsed.title, markdown: content, isNightmare: false }, "dream");
32
+ registerDream(f, parsed.title, parsed.date, {
33
+ isNightmare: false,
34
+ deepMemoryId,
35
+ });
36
+ existing.add(f);
37
+ backfillCount++;
38
+ }
39
+ }
40
+ // 2. Backfill from local disk (Nightmares)
41
+ if (existsSync(getNightmaresDir())) {
42
+ const files = readdirSync(getNightmaresDir()).filter((f) => f.endsWith(".md"));
43
+ for (const f of files) {
44
+ if (existing.has(f))
45
+ continue;
46
+ const parsed = parseFilename(f);
47
+ if (!parsed)
48
+ continue;
49
+ const content = readFileSync(resolve(getNightmaresDir(), f), "utf-8");
50
+ const deepMemoryId = storeDeepMemory({ text_summary: parsed.title, markdown: content, isNightmare: true }, "nightmare");
51
+ registerDream(f, parsed.title, parsed.date, {
52
+ isNightmare: true,
53
+ deepMemoryId,
54
+ });
55
+ existing.add(f);
56
+ backfillCount++;
57
+ }
58
+ }
59
+ logger.info(`Dream backfill complete. Recovered ${backfillCount} dreams.`);
60
+ state.dreams_backfilled = true;
61
+ saveState(state);
62
+ }
63
+ //# sourceMappingURL=backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../src/backfill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Daily token budget tracker and kill switch.
3
+ *
4
+ * Tracks cumulative token usage per day in state.json.
5
+ * When the daily limit is reached, all LLM calls are refused
6
+ * until the next calendar day (UTC).
7
+ */
8
+ import type { LLMClient, TokenUsage } from "./types.js";
9
+ export declare class BudgetExceededError extends Error {
10
+ constructor(used: number, limit: number);
11
+ }
12
+ export declare function getTokensUsedToday(): number;
13
+ export declare function getTokensRemaining(): number;
14
+ export declare function getBudgetStatus(): {
15
+ enabled: boolean;
16
+ limit: number;
17
+ used: number;
18
+ remaining: number;
19
+ date: string;
20
+ };
21
+ export declare function recordUsage(usage: TokenUsage): void;
22
+ /**
23
+ * Wraps an LLMClient with daily token budget enforcement.
24
+ * Checks budget before each call, records usage after.
25
+ * Returns the client unchanged if MAX_DAILY_TOKENS is 0 (disabled).
26
+ */
27
+ export declare function withBudget(client: LLMClient): LLMClient;
28
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/budget.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExD,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAOxC;AAMD,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAI3C;AAED,wBAAgB,eAAe,IAAI;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,CAWA;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAYnD;AAWD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAqDvD"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Daily token budget tracker and kill switch.
3
+ *
4
+ * Tracks cumulative token usage per day in state.json.
5
+ * When the daily limit is reached, all LLM calls are refused
6
+ * until the next calendar day (UTC).
7
+ */
8
+ import { loadState, saveState } from "./state.js";
9
+ import { getMaxDailyTokens } from "./config.js";
10
+ import logger from "./logger.js";
11
+ export class BudgetExceededError extends Error {
12
+ constructor(used, limit) {
13
+ super(`Daily token budget exceeded: ${used.toLocaleString()} / ${limit.toLocaleString()} tokens used. ` +
14
+ `Resets at midnight UTC. Override with MAX_DAILY_TOKENS env var (0 to disable).`);
15
+ this.name = "BudgetExceededError";
16
+ }
17
+ }
18
+ function getTodayUTC() {
19
+ return new Date().toISOString().slice(0, 10);
20
+ }
21
+ export function getTokensUsedToday() {
22
+ const state = loadState();
23
+ const today = getTodayUTC();
24
+ if (state.budget_date !== today)
25
+ return 0;
26
+ return state.budget_tokens_used ?? 0;
27
+ }
28
+ export function getTokensRemaining() {
29
+ const limit = getMaxDailyTokens();
30
+ if (limit <= 0)
31
+ return Infinity;
32
+ return Math.max(0, limit - getTokensUsedToday());
33
+ }
34
+ export function getBudgetStatus() {
35
+ const used = getTokensUsedToday();
36
+ const limit = getMaxDailyTokens();
37
+ const remaining = getTokensRemaining();
38
+ return {
39
+ enabled: limit > 0,
40
+ limit,
41
+ used,
42
+ remaining: limit <= 0 ? -1 : remaining,
43
+ date: getTodayUTC(),
44
+ };
45
+ }
46
+ export function recordUsage(usage) {
47
+ const state = loadState();
48
+ const today = getTodayUTC();
49
+ if (state.budget_date !== today) {
50
+ state.budget_date = today;
51
+ state.budget_tokens_used = 0;
52
+ }
53
+ const total = usage.input_tokens + usage.output_tokens;
54
+ state.budget_tokens_used = (state.budget_tokens_used ?? 0) + total;
55
+ saveState(state);
56
+ }
57
+ function checkBudget() {
58
+ const limit = getMaxDailyTokens();
59
+ if (limit <= 0)
60
+ return;
61
+ const used = getTokensUsedToday();
62
+ if (used >= limit) {
63
+ throw new BudgetExceededError(used, limit);
64
+ }
65
+ }
66
+ /**
67
+ * Wraps an LLMClient with daily token budget enforcement.
68
+ * Checks budget before each call, records usage after.
69
+ * Returns the client unchanged if MAX_DAILY_TOKENS is 0 (disabled).
70
+ */
71
+ export function withBudget(client) {
72
+ // Note: we check getMaxDailyTokens() at call time, not at wrap time,
73
+ // so runtime config changes via applyPluginConfig() take effect immediately.
74
+ return {
75
+ async createMessage(params) {
76
+ const limit = getMaxDailyTokens();
77
+ if (limit <= 0) {
78
+ // Budget disabled — still log usage for observability
79
+ const result = await client.createMessage(params);
80
+ if (result.usage) {
81
+ const total = result.usage.input_tokens + result.usage.output_tokens;
82
+ recordUsage(result.usage);
83
+ logger.debug(`Token usage (budget disabled): ${total.toLocaleString()} tokens ` +
84
+ `(in: ${result.usage.input_tokens.toLocaleString()}, out: ${result.usage.output_tokens.toLocaleString()}) — ` +
85
+ `cumulative today: ${getTokensUsedToday().toLocaleString()}`);
86
+ if (total > 50_000) {
87
+ logger.warn(`High token usage detected: ${total.toLocaleString()} tokens in a single call ` +
88
+ `(in: ${result.usage.input_tokens.toLocaleString()}, out: ${result.usage.output_tokens.toLocaleString()}). ` +
89
+ `This may indicate reasoning model token inflation.`);
90
+ }
91
+ }
92
+ return result;
93
+ }
94
+ // Budget enabled — enforce limits
95
+ checkBudget();
96
+ const result = await client.createMessage(params);
97
+ if (result.usage) {
98
+ recordUsage(result.usage);
99
+ const remaining = getTokensRemaining();
100
+ const total = result.usage.input_tokens + result.usage.output_tokens;
101
+ logger.debug(`Token budget: ${total.toLocaleString()} tokens this call ` +
102
+ `(in: ${result.usage.input_tokens.toLocaleString()}, out: ${result.usage.output_tokens.toLocaleString()}) — ` +
103
+ `${remaining.toLocaleString()} remaining today`);
104
+ if (total > 50_000) {
105
+ logger.warn(`High token usage detected: ${total.toLocaleString()} tokens in a single call ` +
106
+ `(in: ${result.usage.input_tokens.toLocaleString()}, out: ${result.usage.output_tokens.toLocaleString()}). ` +
107
+ `This may indicate reasoning model token inflation.`);
108
+ }
109
+ }
110
+ else {
111
+ logger.debug("Token budget: no usage data returned from LLM call");
112
+ }
113
+ return result;
114
+ },
115
+ };
116
+ }
117
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ElectricSheep CLI.
3
+ *
4
+ * Provides utility commands for inspecting agent state.
5
+ * Core agent behavior (check, dream, journal) runs via OpenClaw.
6
+ *
7
+ * Usage:
8
+ * openclawdreams register --name "Name" --description "Bio"
9
+ * openclawdreams status # show agent status and memory stats
10
+ * openclawdreams dreams # list saved dream journals
11
+ */
12
+ import { Command } from "commander";
13
+ /**
14
+ * Register all ElectricSheep subcommands onto a parent Command.
15
+ * Used both by the standalone bin and by api.registerCli().
16
+ */
17
+ export declare function registerCommands(parent: Command): void;
18
+ export declare const program: Command;
19
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2qBtD;AAGD,eAAO,MAAM,OAAO,SAAgB,CAAC"}