@mono-agent/agent-app 0.2.2 → 0.4.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 +9 -5
- package/dist/adapter-send-tools-main.d.ts +3 -0
- package/dist/adapter-send-tools-main.d.ts.map +1 -0
- package/dist/adapter-send-tools-main.js +20 -0
- package/dist/adapter-send-tools-main.js.map +1 -0
- package/dist/adapter-send-tools.d.ts +59 -0
- package/dist/adapter-send-tools.d.ts.map +1 -0
- package/dist/adapter-send-tools.js +254 -0
- package/dist/adapter-send-tools.js.map +1 -0
- package/dist/app-config.d.ts +40 -17
- package/dist/app-config.d.ts.map +1 -1
- package/dist/app-config.js +188 -68
- package/dist/app-config.js.map +1 -1
- package/dist/app.d.ts +41 -20
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +349 -87
- package/dist/app.js.map +1 -1
- package/dist/backfill.d.ts +79 -0
- package/dist/backfill.d.ts.map +1 -0
- package/dist/backfill.js +246 -0
- package/dist/backfill.js.map +1 -0
- package/dist/background.d.ts +0 -4
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +78 -50
- package/dist/background.js.map +1 -1
- package/dist/channels.d.ts +7 -0
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +26 -3
- package/dist/channels.js.map +1 -1
- package/dist/cli.d.ts +53 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +317 -113
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +8 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +236 -30
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +1 -1
- package/dist/init.js.map +1 -1
- package/dist/launchd.d.ts +0 -2
- package/dist/launchd.d.ts.map +1 -1
- package/dist/launchd.js +0 -2
- package/dist/launchd.js.map +1 -1
- package/dist/memory-recall-main.d.ts +3 -0
- package/dist/memory-recall-main.d.ts.map +1 -0
- package/dist/memory-recall-main.js +30 -0
- package/dist/memory-recall-main.js.map +1 -0
- package/dist/memory-recall.d.ts +111 -0
- package/dist/memory-recall.d.ts.map +1 -0
- package/dist/memory-recall.js +275 -0
- package/dist/memory-recall.js.map +1 -0
- package/dist/memory-rituals.d.ts +51 -0
- package/dist/memory-rituals.d.ts.map +1 -0
- package/dist/memory-rituals.js +228 -0
- package/dist/memory-rituals.js.map +1 -0
- package/dist/sessions.d.ts +21 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +45 -0
- package/dist/sessions.js.map +1 -0
- package/dist/ui.d.ts +54 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +153 -0
- package/dist/ui.js.map +1 -0
- package/package.json +22 -17
- package/skills/mono-agent-composer/SKILL.md +7 -6
- package/skills/mono-agent-composer/references/config-blueprint.md +53 -22
- package/skills/mono-agent-composer/references/discovery-questions.md +121 -10
- package/skills/mono-agent-composer/references/feature-coverage.md +15 -12
- package/skills/mono-agent-composer/references/package-map.md +9 -11
- package/skills/mono-agent-composer/references/validation.md +5 -4
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-app memory ritual scheduler for the `bujo` tier.
|
|
3
|
+
*
|
|
4
|
+
* Schedules `store.reflect()` and `store.migrate()` on their configured cron
|
|
5
|
+
* cadences (defaults: `0 3 * * *` / `0 4 1 * *`). Uses a hand-rolled minimal
|
|
6
|
+
* cron next-run calculator (5-field `m h dom mon dow`); avoids adding
|
|
7
|
+
* `cron-parser` as a direct dep of this package.
|
|
8
|
+
*
|
|
9
|
+
* Design guarantees:
|
|
10
|
+
* - Only schedules for `store.tier() === "bujo"` (needs the LLM tier).
|
|
11
|
+
* - Rituals default-enabled; set `enabled: false` to opt out.
|
|
12
|
+
* - Skip-overlap: never starts a run while the previous is in flight.
|
|
13
|
+
* - Never-throws: errors are caught and logged via `logger.warn`; the
|
|
14
|
+
* scheduler reschedules after every run (success or failure).
|
|
15
|
+
* - Injectable `now` / `setTimer` / `clearTimer` for deterministic testing.
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_REFLECTION_CRON = "0 3 * * *";
|
|
18
|
+
const DEFAULT_MIGRATION_CRON = "0 4 1 * *";
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Public entry point
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
export function startMemoryRituals(input) {
|
|
23
|
+
const { store, logger } = input;
|
|
24
|
+
// Only schedule for the bujo tier.
|
|
25
|
+
if (store.tier() !== "bujo") {
|
|
26
|
+
return noopRituals();
|
|
27
|
+
}
|
|
28
|
+
const now = input.now ?? (() => new Date());
|
|
29
|
+
const setTimer = input.setTimer ?? defaultSetTimer;
|
|
30
|
+
const clearTimer = input.clearTimer ?? ((h) => clearTimeout(h));
|
|
31
|
+
const handles = [];
|
|
32
|
+
let stopped = false;
|
|
33
|
+
function scheduleRitual(name, cronExpr, run) {
|
|
34
|
+
let inFlight = false;
|
|
35
|
+
let currentHandle;
|
|
36
|
+
function schedule() {
|
|
37
|
+
if (stopped) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const current = now();
|
|
41
|
+
let delayMs;
|
|
42
|
+
try {
|
|
43
|
+
delayMs = nextCronDelayMs(cronExpr, current);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
logger?.warn(`Memory ritual "${name}" has an invalid cron expression "${cronExpr}": ${err instanceof Error ? err.message : String(err)}. Ritual disabled.`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const handle = setTimer(() => {
|
|
50
|
+
// Remove from tracked handles (it has fired)
|
|
51
|
+
const idx = handles.indexOf(handle);
|
|
52
|
+
if (idx !== -1) {
|
|
53
|
+
handles.splice(idx, 1);
|
|
54
|
+
}
|
|
55
|
+
currentHandle = undefined;
|
|
56
|
+
if (stopped) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (inFlight) {
|
|
60
|
+
// Skip: the previous run is still in flight. Do NOT reschedule here — the in-flight run's
|
|
61
|
+
// .finally schedules the next tick, keeping exactly one pending timer per ritual (no double-schedule).
|
|
62
|
+
logger?.warn(`Memory ritual "${name}" skipped — previous run is still in flight.`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
inFlight = true;
|
|
66
|
+
run()
|
|
67
|
+
.catch((err) => {
|
|
68
|
+
logger?.warn(`Memory ritual "${name}" failed: ${err instanceof Error ? err.message : String(err)}.`);
|
|
69
|
+
})
|
|
70
|
+
.finally(() => {
|
|
71
|
+
inFlight = false;
|
|
72
|
+
schedule();
|
|
73
|
+
});
|
|
74
|
+
}, delayMs);
|
|
75
|
+
handle.unref?.();
|
|
76
|
+
currentHandle = handle;
|
|
77
|
+
handles.push(handle);
|
|
78
|
+
}
|
|
79
|
+
schedule();
|
|
80
|
+
void currentHandle; // suppress unused-variable lint; reference is in handles
|
|
81
|
+
}
|
|
82
|
+
// Schedule reflection ritual
|
|
83
|
+
if (input.reflection?.enabled !== false) {
|
|
84
|
+
const cronExpr = input.reflection?.cron ?? DEFAULT_REFLECTION_CRON;
|
|
85
|
+
scheduleRitual("reflect", cronExpr, () => store.reflect());
|
|
86
|
+
}
|
|
87
|
+
// Schedule migration ritual
|
|
88
|
+
if (input.migration?.enabled !== false) {
|
|
89
|
+
const cronExpr = input.migration?.cron ?? DEFAULT_MIGRATION_CRON;
|
|
90
|
+
scheduleRitual("migrate", cronExpr, () => store.migrate());
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
stop() {
|
|
94
|
+
stopped = true;
|
|
95
|
+
for (const h of handles.splice(0)) {
|
|
96
|
+
if (h !== undefined) {
|
|
97
|
+
clearTimer(h);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Minimal 5-field cron next-run calculator
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
//
|
|
107
|
+
// Supports `m h dom mon dow` where each field is:
|
|
108
|
+
// * matches every value
|
|
109
|
+
// <number> exact match
|
|
110
|
+
// */n step (e.g. */5 = every 5)
|
|
111
|
+
// a-b range
|
|
112
|
+
// a,b,c list
|
|
113
|
+
// a-b/n range with step
|
|
114
|
+
//
|
|
115
|
+
// Sufficient for the two defaults + most simple expressions.
|
|
116
|
+
// Time complexity: O(minutes-until-next-run), bounded by 366*24*60 ≈ 530k.
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
function nextCronDelayMs(expression, from) {
|
|
119
|
+
const fields = expression.trim().split(/\s+/u);
|
|
120
|
+
if (fields.length !== 5) {
|
|
121
|
+
throw new Error(`Expected 5 fields; got ${fields.length}`);
|
|
122
|
+
}
|
|
123
|
+
const [mField, hField, domField, monField, dowField] = fields;
|
|
124
|
+
// Search forward minute by minute for up to ~2 years
|
|
125
|
+
// Start from the NEXT minute after `from` (cron fires at the start of the minute)
|
|
126
|
+
const candidate = new Date(from.getTime());
|
|
127
|
+
// Advance to the next whole minute
|
|
128
|
+
candidate.setUTCSeconds(0, 0);
|
|
129
|
+
candidate.setUTCMinutes(candidate.getUTCMinutes() + 1);
|
|
130
|
+
const MAX_ITERATIONS = 365 * 24 * 60 * 2; // 2 years in minutes
|
|
131
|
+
for (let i = 0; i < MAX_ITERATIONS; i++) {
|
|
132
|
+
const min = candidate.getUTCMinutes();
|
|
133
|
+
const hour = candidate.getUTCHours();
|
|
134
|
+
const dom = candidate.getUTCDate();
|
|
135
|
+
const mon = candidate.getUTCMonth() + 1; // 1-12
|
|
136
|
+
const dow = candidate.getUTCDay(); // 0 (Sun) – 6 (Sat)
|
|
137
|
+
if (matchField(mField, min, 0, 59) &&
|
|
138
|
+
matchField(hField, hour, 0, 23) &&
|
|
139
|
+
matchField(monField, mon, 1, 12) &&
|
|
140
|
+
matchDayField(domField, dowField, dom, dow)) {
|
|
141
|
+
return candidate.getTime() - from.getTime();
|
|
142
|
+
}
|
|
143
|
+
candidate.setUTCMinutes(candidate.getUTCMinutes() + 1);
|
|
144
|
+
}
|
|
145
|
+
throw new Error(`No match found in 2 years for cron expression "${expression}"`);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Standard cron DOM/DOW logic:
|
|
149
|
+
* - If BOTH dom and dow are restricted (not `*`), either matching satisfies.
|
|
150
|
+
* - If only one is restricted, only that one must match.
|
|
151
|
+
* - If both are `*`, always matches.
|
|
152
|
+
*/
|
|
153
|
+
function matchDayField(domField, dowField, dom, dow) {
|
|
154
|
+
const domRestricted = domField !== "*";
|
|
155
|
+
const dowRestricted = dowField !== "*";
|
|
156
|
+
if (domRestricted && dowRestricted) {
|
|
157
|
+
return matchField(domField, dom, 1, 31) || matchField(dowField, dow, 0, 6);
|
|
158
|
+
}
|
|
159
|
+
if (domRestricted) {
|
|
160
|
+
return matchField(domField, dom, 1, 31);
|
|
161
|
+
}
|
|
162
|
+
if (dowRestricted) {
|
|
163
|
+
return matchField(dowField, dow, 0, 6);
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
function matchField(field, value, _min, _max) {
|
|
168
|
+
// Comma-separated list
|
|
169
|
+
const parts = field.split(",");
|
|
170
|
+
return parts.some((part) => matchPart(part.trim(), value, _min, _max));
|
|
171
|
+
}
|
|
172
|
+
function matchPart(part, value, min, max) {
|
|
173
|
+
// Wildcard
|
|
174
|
+
if (part === "*") {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
// Step: */n or a-b/n
|
|
178
|
+
const slashIdx = part.indexOf("/");
|
|
179
|
+
if (slashIdx !== -1) {
|
|
180
|
+
const stepStr = part.slice(slashIdx + 1);
|
|
181
|
+
const step = parseInt(stepStr, 10);
|
|
182
|
+
if (Number.isNaN(step) || step <= 0) {
|
|
183
|
+
throw new Error(`Invalid step in cron field part "${part}"`);
|
|
184
|
+
}
|
|
185
|
+
const rangePart = part.slice(0, slashIdx);
|
|
186
|
+
let rangeStart = min;
|
|
187
|
+
let rangeEnd = max;
|
|
188
|
+
if (rangePart !== "*") {
|
|
189
|
+
const dashIdx = rangePart.indexOf("-");
|
|
190
|
+
if (dashIdx !== -1) {
|
|
191
|
+
rangeStart = parseInt(rangePart.slice(0, dashIdx), 10);
|
|
192
|
+
rangeEnd = parseInt(rangePart.slice(dashIdx + 1), 10);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
rangeStart = parseInt(rangePart, 10);
|
|
196
|
+
rangeEnd = max;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (value < rangeStart || value > rangeEnd) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
return (value - rangeStart) % step === 0;
|
|
203
|
+
}
|
|
204
|
+
// Range: a-b
|
|
205
|
+
const dashIdx = part.indexOf("-");
|
|
206
|
+
if (dashIdx !== -1) {
|
|
207
|
+
const rangeStart = parseInt(part.slice(0, dashIdx), 10);
|
|
208
|
+
const rangeEnd = parseInt(part.slice(dashIdx + 1), 10);
|
|
209
|
+
return value >= rangeStart && value <= rangeEnd;
|
|
210
|
+
}
|
|
211
|
+
// Exact number
|
|
212
|
+
const num = parseInt(part, 10);
|
|
213
|
+
if (Number.isNaN(num)) {
|
|
214
|
+
throw new Error(`Invalid cron field part "${part}"`);
|
|
215
|
+
}
|
|
216
|
+
return value === num;
|
|
217
|
+
}
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// Helpers
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
function noopRituals() {
|
|
222
|
+
return { stop() { } };
|
|
223
|
+
}
|
|
224
|
+
function defaultSetTimer(cb, ms) {
|
|
225
|
+
const handle = setTimeout(cb, ms);
|
|
226
|
+
return { unref: () => handle.unref() };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=memory-rituals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-rituals.js","sourceRoot":"","sources":["../src/memory-rituals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MonoAgentAppConfigInput } from "./app-config.js";
|
|
2
|
+
export interface PurgeSessionsResult {
|
|
3
|
+
/** The resolved sessions root, or undefined when sessions are in-memory only. */
|
|
4
|
+
readonly root?: string;
|
|
5
|
+
/** True when an on-disk sessions store existed and was removed. */
|
|
6
|
+
readonly removed: boolean;
|
|
7
|
+
/** Count of removed `*.jsonl` session files (best-effort; 0 when none/unknown). */
|
|
8
|
+
readonly files: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Remove the durable pi-session store so the next start begins with fresh sessions
|
|
12
|
+
* instead of resuming persisted transcripts. A no-op (`removed: false`) when no
|
|
13
|
+
* on-disk store is configured (in-memory sessions) or the directory does not exist.
|
|
14
|
+
*
|
|
15
|
+
* The runtime recreates the directory on the next session, and the agent's durable
|
|
16
|
+
* memory lives elsewhere (`memory.path`), so this drops only resumable conversation
|
|
17
|
+
* transcripts — not the knowledge base. Stop the worker before calling this so it is
|
|
18
|
+
* not writing sessions while they are deleted.
|
|
19
|
+
*/
|
|
20
|
+
export declare function purgeSessions(input: MonoAgentAppConfigInput): Promise<PurgeSessionsResult>;
|
|
21
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgBhG"}
|
package/dist/sessions.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { readdir, rm } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { resolveAppSessionsRoot } from "./app-config.js";
|
|
4
|
+
/**
|
|
5
|
+
* Remove the durable pi-session store so the next start begins with fresh sessions
|
|
6
|
+
* instead of resuming persisted transcripts. A no-op (`removed: false`) when no
|
|
7
|
+
* on-disk store is configured (in-memory sessions) or the directory does not exist.
|
|
8
|
+
*
|
|
9
|
+
* The runtime recreates the directory on the next session, and the agent's durable
|
|
10
|
+
* memory lives elsewhere (`memory.path`), so this drops only resumable conversation
|
|
11
|
+
* transcripts — not the knowledge base. Stop the worker before calling this so it is
|
|
12
|
+
* not writing sessions while they are deleted.
|
|
13
|
+
*/
|
|
14
|
+
export async function purgeSessions(input) {
|
|
15
|
+
const root = await resolveAppSessionsRoot(input);
|
|
16
|
+
if (root === undefined) {
|
|
17
|
+
return { removed: false, files: 0 };
|
|
18
|
+
}
|
|
19
|
+
let files = 0;
|
|
20
|
+
try {
|
|
21
|
+
files = await countSessionFiles(root);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// The store may not exist yet; treat it as nothing to remove.
|
|
25
|
+
return { root, removed: false, files: 0 };
|
|
26
|
+
}
|
|
27
|
+
await rm(root, { recursive: true, force: true });
|
|
28
|
+
return { root, removed: true, files };
|
|
29
|
+
}
|
|
30
|
+
/** Recursively count `*.jsonl` session files under a sessions root. */
|
|
31
|
+
async function countSessionFiles(dir) {
|
|
32
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
33
|
+
let total = 0;
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
const full = join(dir, entry.name);
|
|
36
|
+
if (entry.isDirectory()) {
|
|
37
|
+
total += await countSessionFiles(full);
|
|
38
|
+
}
|
|
39
|
+
else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
|
|
40
|
+
total += 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return total;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAYzD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAA8B;IAChE,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;QAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxC,CAAC;AAED,uEAAuE;AACvE,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,IAAI,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ValidationStatus } from "./doctor.js";
|
|
2
|
+
/**
|
|
3
|
+
* Decide whether ANSI color should be emitted. `NO_COLOR` (any value) always
|
|
4
|
+
* wins per the no-color.org convention; `FORCE_COLOR` forces the decision when
|
|
5
|
+
* set to a recognized truthy/falsy value; otherwise color follows the TTY-ness
|
|
6
|
+
* of the stream. Pure and env-injected so it is trivially testable.
|
|
7
|
+
*/
|
|
8
|
+
export declare function computeColorEnabled(env: Record<string, string | undefined>, isTty: boolean | undefined): boolean;
|
|
9
|
+
export declare function isColorEnabled(): boolean;
|
|
10
|
+
/** Color/weight helpers. Each is the identity function when color is disabled. */
|
|
11
|
+
export declare const style: {
|
|
12
|
+
readonly bold: (text: string) => string;
|
|
13
|
+
readonly dim: (text: string) => string;
|
|
14
|
+
readonly red: (text: string) => string;
|
|
15
|
+
readonly green: (text: string) => string;
|
|
16
|
+
readonly yellow: (text: string) => string;
|
|
17
|
+
readonly cyan: (text: string) => string;
|
|
18
|
+
readonly gray: (text: string) => string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Render a status badge as a fixed-width prefix (badge + trailing space). With
|
|
22
|
+
* color on it is a green/yellow/dim/red glyph; with color off it falls back to
|
|
23
|
+
* an equal-width ASCII tag so columns still line up in plain output.
|
|
24
|
+
*/
|
|
25
|
+
export declare function badge(status: ValidationStatus): string;
|
|
26
|
+
/**
|
|
27
|
+
* Render aligned `label value` rows: labels are padded to the widest label so
|
|
28
|
+
* values line up, replacing the hand-tuned `padEnd` blocks. `indent` prefixes
|
|
29
|
+
* every row with that many spaces (used to nest rows under a section rule).
|
|
30
|
+
* Returns one string with a trailing newline per row (empty when there are no
|
|
31
|
+
* rows).
|
|
32
|
+
*/
|
|
33
|
+
export declare function keyValue(rows: ReadonlyArray<readonly [label: string, value: string]>, indent?: number): string;
|
|
34
|
+
/**
|
|
35
|
+
* A horizontal section divider, optionally labeled — `── instance ────────`.
|
|
36
|
+
* Width tracks the terminal (read at call time so resizes are honored), capped
|
|
37
|
+
* for readability and falling back to a fixed width when stdout is not a TTY.
|
|
38
|
+
* Rendered dim/gray (identity when color is off); the label appears verbatim so
|
|
39
|
+
* it stays greppable. Always ends with a newline.
|
|
40
|
+
*/
|
|
41
|
+
export declare function rule(label?: string): string;
|
|
42
|
+
/** Badge for a channel status *kind* string (running/waiting…/disabled/error). */
|
|
43
|
+
export declare function channelBadge(kind: string): string;
|
|
44
|
+
/** Badge for a trace-source health word (running/stale/stopped/…). */
|
|
45
|
+
export declare function healthBadge(health: string): string;
|
|
46
|
+
/** A bold/cyan section heading with a trailing newline. */
|
|
47
|
+
export declare function heading(text: string): string;
|
|
48
|
+
/** The CLI title block: bold title plus an optional dim subtitle. */
|
|
49
|
+
export declare function banner(title: string, subtitle?: string): string;
|
|
50
|
+
/** A red error line (✗ prefix) with a trailing newline — write to stderr. */
|
|
51
|
+
export declare function errorLine(message: string): string;
|
|
52
|
+
/** A dim hint line (→ prefix) with a trailing newline. */
|
|
53
|
+
export declare function hint(message: string): string;
|
|
54
|
+
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAuBpD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,KAAK,EAAE,OAAO,GAAG,SAAS,GACzB,OAAO,CAYT;AAID,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAMD,kFAAkF;AAClF,eAAO,MAAM,KAAK;0BACH,MAAM,KAAG,MAAM;yBAChB,MAAM,KAAG,MAAM;yBACf,MAAM,KAAG,MAAM;2BACb,MAAM,KAAG,MAAM;4BACd,MAAM,KAAG,MAAM;0BACjB,MAAM,KAAG,MAAM;0BACf,MAAM,KAAG,MAAM;CACpB,CAAC;AAgBX;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAGtD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAC5D,MAAM,SAAI,GACT,MAAM,CASR;AAKD;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3C;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAcjD;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,qEAAqE;AACrE,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,0DAA0D;AAC1D,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5C"}
|
package/dist/ui.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
/**
|
|
3
|
+
* Tiny zero-dependency terminal styling layer for the CLI. Every helper returns
|
|
4
|
+
* a plain string, so callers can keep writing through `process.stdout.write` or
|
|
5
|
+
* the injected `deps.stdout`/`deps.stderr` sinks in background.ts. Color is a
|
|
6
|
+
* single global decision keyed on the REAL process stdout (see
|
|
7
|
+
* {@link computeColorEnabled}); when it is off — piped output, `NO_COLOR`, or a
|
|
8
|
+
* non-TTY test harness — every styling helper degrades to plain ASCII so logs
|
|
9
|
+
* and test assertions stay greppable.
|
|
10
|
+
*/
|
|
11
|
+
const ANSI = {
|
|
12
|
+
reset: "[0m",
|
|
13
|
+
bold: "[1m",
|
|
14
|
+
dim: "[2m",
|
|
15
|
+
red: "[31m",
|
|
16
|
+
green: "[32m",
|
|
17
|
+
yellow: "[33m",
|
|
18
|
+
cyan: "[36m",
|
|
19
|
+
gray: "[90m",
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Decide whether ANSI color should be emitted. `NO_COLOR` (any value) always
|
|
23
|
+
* wins per the no-color.org convention; `FORCE_COLOR` forces the decision when
|
|
24
|
+
* set to a recognized truthy/falsy value; otherwise color follows the TTY-ness
|
|
25
|
+
* of the stream. Pure and env-injected so it is trivially testable.
|
|
26
|
+
*/
|
|
27
|
+
export function computeColorEnabled(env, isTty) {
|
|
28
|
+
if (env.NO_COLOR !== undefined) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const force = env.FORCE_COLOR;
|
|
32
|
+
if (force === "1" || force === "true") {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (force === "0" || force === "false") {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return Boolean(isTty);
|
|
39
|
+
}
|
|
40
|
+
const colorEnabled = computeColorEnabled(process.env, process.stdout.isTTY);
|
|
41
|
+
export function isColorEnabled() {
|
|
42
|
+
return colorEnabled;
|
|
43
|
+
}
|
|
44
|
+
function paint(code, text) {
|
|
45
|
+
return colorEnabled ? `${code}${text}${ANSI.reset}` : text;
|
|
46
|
+
}
|
|
47
|
+
/** Color/weight helpers. Each is the identity function when color is disabled. */
|
|
48
|
+
export const style = {
|
|
49
|
+
bold: (text) => paint(ANSI.bold, text),
|
|
50
|
+
dim: (text) => paint(ANSI.dim, text),
|
|
51
|
+
red: (text) => paint(ANSI.red, text),
|
|
52
|
+
green: (text) => paint(ANSI.green, text),
|
|
53
|
+
yellow: (text) => paint(ANSI.yellow, text),
|
|
54
|
+
cyan: (text) => paint(ANSI.cyan, text),
|
|
55
|
+
gray: (text) => paint(ANSI.gray, text),
|
|
56
|
+
};
|
|
57
|
+
const BADGES = {
|
|
58
|
+
ok: { glyph: "✓", paint: style.green, plain: "[ok] " },
|
|
59
|
+
waiting: { glyph: "⚠", paint: style.yellow, plain: "[wait] " },
|
|
60
|
+
disabled: { glyph: "○", paint: style.dim, plain: "[off] " },
|
|
61
|
+
error: { glyph: "✗", paint: style.red, plain: "[error]" },
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Render a status badge as a fixed-width prefix (badge + trailing space). With
|
|
65
|
+
* color on it is a green/yellow/dim/red glyph; with color off it falls back to
|
|
66
|
+
* an equal-width ASCII tag so columns still line up in plain output.
|
|
67
|
+
*/
|
|
68
|
+
export function badge(status) {
|
|
69
|
+
const spec = BADGES[status];
|
|
70
|
+
return colorEnabled ? `${spec.paint(spec.glyph)} ` : `${spec.plain} `;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Render aligned `label value` rows: labels are padded to the widest label so
|
|
74
|
+
* values line up, replacing the hand-tuned `padEnd` blocks. `indent` prefixes
|
|
75
|
+
* every row with that many spaces (used to nest rows under a section rule).
|
|
76
|
+
* Returns one string with a trailing newline per row (empty when there are no
|
|
77
|
+
* rows).
|
|
78
|
+
*/
|
|
79
|
+
export function keyValue(rows, indent = 0) {
|
|
80
|
+
if (rows.length === 0) {
|
|
81
|
+
return "";
|
|
82
|
+
}
|
|
83
|
+
const pad = " ".repeat(indent);
|
|
84
|
+
const width = rows.reduce((max, [label]) => Math.max(max, label.length), 0);
|
|
85
|
+
return rows
|
|
86
|
+
.map(([label, value]) => `${pad}${style.gray(label.padEnd(width))} ${value}\n`)
|
|
87
|
+
.join("");
|
|
88
|
+
}
|
|
89
|
+
const RULE_FALLBACK_WIDTH = 44;
|
|
90
|
+
const RULE_MAX_WIDTH = 72;
|
|
91
|
+
/**
|
|
92
|
+
* A horizontal section divider, optionally labeled — `── instance ────────`.
|
|
93
|
+
* Width tracks the terminal (read at call time so resizes are honored), capped
|
|
94
|
+
* for readability and falling back to a fixed width when stdout is not a TTY.
|
|
95
|
+
* Rendered dim/gray (identity when color is off); the label appears verbatim so
|
|
96
|
+
* it stays greppable. Always ends with a newline.
|
|
97
|
+
*/
|
|
98
|
+
export function rule(label) {
|
|
99
|
+
const width = Math.min(process.stdout.columns ?? RULE_FALLBACK_WIDTH, RULE_MAX_WIDTH);
|
|
100
|
+
if (label === undefined) {
|
|
101
|
+
return `${style.gray("─".repeat(width))}\n`;
|
|
102
|
+
}
|
|
103
|
+
const prefix = `── ${label} `;
|
|
104
|
+
const fill = Math.max(0, width - prefix.length);
|
|
105
|
+
return `${style.gray(`${prefix}${"─".repeat(fill)}`)}\n`;
|
|
106
|
+
}
|
|
107
|
+
/** Badge for a channel status *kind* string (running/waiting…/disabled/error). */
|
|
108
|
+
export function channelBadge(kind) {
|
|
109
|
+
if (kind === "running") {
|
|
110
|
+
return badge("ok");
|
|
111
|
+
}
|
|
112
|
+
if (kind.startsWith("waiting")) {
|
|
113
|
+
return badge("waiting");
|
|
114
|
+
}
|
|
115
|
+
if (kind === "disabled") {
|
|
116
|
+
return badge("disabled");
|
|
117
|
+
}
|
|
118
|
+
if (/error|fail|crash/u.test(kind)) {
|
|
119
|
+
return badge("error");
|
|
120
|
+
}
|
|
121
|
+
return badge("waiting");
|
|
122
|
+
}
|
|
123
|
+
/** Badge for a trace-source health word (running/stale/stopped/…). */
|
|
124
|
+
export function healthBadge(health) {
|
|
125
|
+
switch (health) {
|
|
126
|
+
case "running":
|
|
127
|
+
return badge("ok");
|
|
128
|
+
case "stale":
|
|
129
|
+
return badge("waiting");
|
|
130
|
+
case "stopped":
|
|
131
|
+
return badge("disabled");
|
|
132
|
+
default:
|
|
133
|
+
return badge("error");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** A bold/cyan section heading with a trailing newline. */
|
|
137
|
+
export function heading(text) {
|
|
138
|
+
return `${style.bold(style.cyan(text))}\n`;
|
|
139
|
+
}
|
|
140
|
+
/** The CLI title block: bold title plus an optional dim subtitle. */
|
|
141
|
+
export function banner(title, subtitle) {
|
|
142
|
+
const head = style.bold(style.cyan(title));
|
|
143
|
+
return subtitle === undefined ? `${head}\n` : `${head} ${style.dim(`— ${subtitle}`)}\n`;
|
|
144
|
+
}
|
|
145
|
+
/** A red error line (✗ prefix) with a trailing newline — write to stderr. */
|
|
146
|
+
export function errorLine(message) {
|
|
147
|
+
return `${style.red(`✗ ${message}`)}\n`;
|
|
148
|
+
}
|
|
149
|
+
/** A dim hint line (→ prefix) with a trailing newline. */
|
|
150
|
+
export function hint(message) {
|
|
151
|
+
return `${style.dim(`→ ${message}`)}\n`;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mono-agent/agent-app",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Config-first mono-agent host: builds a responder and starts every configured communication channel
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Config-first mono-agent host: builds a responder and starts every configured communication channel and traceability from one mono-agent.config.json.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
7
|
"private": false,
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"bin": {
|
|
17
|
-
"mono-agent": "./dist/cli.js"
|
|
17
|
+
"mono-agent": "./dist/cli.js",
|
|
18
|
+
"mono-agent-memory-recall": "./dist/memory-recall-main.js"
|
|
18
19
|
},
|
|
19
20
|
"files": [
|
|
20
21
|
"dist",
|
|
@@ -22,20 +23,24 @@
|
|
|
22
23
|
"README.md"
|
|
23
24
|
],
|
|
24
25
|
"dependencies": {
|
|
25
|
-
"@
|
|
26
|
-
"@mono-agent/
|
|
27
|
-
"@mono-agent/agent-
|
|
28
|
-
"@mono-agent/
|
|
29
|
-
"@mono-agent/
|
|
30
|
-
"@mono-agent/
|
|
31
|
-
"@mono-agent/
|
|
32
|
-
"@mono-agent/
|
|
33
|
-
"@mono-agent/
|
|
34
|
-
"@mono-agent/
|
|
35
|
-
"@mono-agent/
|
|
36
|
-
"@mono-agent/
|
|
37
|
-
"@mono-agent/
|
|
38
|
-
"@mono-agent/
|
|
26
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
27
|
+
"@mono-agent/a2a-adapter": "0.4.0",
|
|
28
|
+
"@mono-agent/agent-contracts": "0.4.0",
|
|
29
|
+
"@mono-agent/agent-host": "0.4.0",
|
|
30
|
+
"@mono-agent/config": "0.4.0",
|
|
31
|
+
"@mono-agent/cron-adapter": "0.4.0",
|
|
32
|
+
"@mono-agent/memory-bujo": "0.4.0",
|
|
33
|
+
"@mono-agent/memory-search": "0.4.0",
|
|
34
|
+
"@mono-agent/observability": "0.4.0",
|
|
35
|
+
"@mono-agent/observability-otel": "0.4.0",
|
|
36
|
+
"@mono-agent/openai-api-adapter": "0.4.0",
|
|
37
|
+
"@mono-agent/runtime-adapter": "0.4.0",
|
|
38
|
+
"@mono-agent/settings": "0.4.0",
|
|
39
|
+
"@mono-agent/slack-adapter": "0.4.0",
|
|
40
|
+
"@mono-agent/telegram-adapter": "0.4.0",
|
|
41
|
+
"@mono-agent/webhook-adapter": "0.4.0",
|
|
42
|
+
"@mono-agent/whatsapp-adapter": "0.4.0",
|
|
43
|
+
"zod": "^4.4.3"
|
|
39
44
|
},
|
|
40
45
|
"publishConfig": {
|
|
41
46
|
"access": "public"
|