@mono-agent/agent-app 0.3.0 → 0.4.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 +24 -10
- 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 +125 -0
- package/dist/adapter-send-tools.d.ts.map +1 -0
- package/dist/adapter-send-tools.js +629 -0
- package/dist/adapter-send-tools.js.map +1 -0
- package/dist/app-config.d.ts +86 -26
- package/dist/app-config.d.ts.map +1 -1
- package/dist/app-config.js +284 -90
- package/dist/app-config.js.map +1 -1
- package/dist/app.d.ts +51 -20
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +889 -119
- package/dist/app.js.map +1 -1
- package/dist/artifact-retention.d.ts +32 -0
- package/dist/artifact-retention.d.ts.map +1 -0
- package/dist/artifact-retention.js +111 -0
- package/dist/artifact-retention.js.map +1 -0
- package/dist/audit-runs.d.ts +12 -0
- package/dist/audit-runs.d.ts.map +1 -0
- package/dist/audit-runs.js +68 -0
- package/dist/audit-runs.js.map +1 -0
- package/dist/backfill.d.ts +75 -0
- package/dist/backfill.d.ts.map +1 -0
- package/dist/backfill.js +350 -0
- package/dist/backfill.js.map +1 -0
- package/dist/background.d.ts +8 -5
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +279 -53
- package/dist/background.js.map +1 -1
- package/dist/broadcast-recorder.d.ts +27 -0
- package/dist/broadcast-recorder.d.ts.map +1 -0
- package/dist/broadcast-recorder.js +82 -0
- package/dist/broadcast-recorder.js.map +1 -0
- package/dist/channel-config-view.d.ts +28 -0
- package/dist/channel-config-view.d.ts.map +1 -0
- package/dist/channel-config-view.js +79 -0
- package/dist/channel-config-view.js.map +1 -0
- package/dist/channel-gate.d.ts +22 -0
- package/dist/channel-gate.d.ts.map +1 -0
- package/dist/channel-gate.js +35 -0
- package/dist/channel-gate.js.map +1 -0
- package/dist/channel-plugins.d.ts +39 -0
- package/dist/channel-plugins.d.ts.map +1 -0
- package/dist/channel-plugins.js +346 -0
- package/dist/channel-plugins.js.map +1 -0
- package/dist/channels.d.ts +62 -66
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +850 -120
- package/dist/channels.js.map +1 -1
- package/dist/cli.d.ts +103 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +984 -112
- package/dist/cli.js.map +1 -1
- package/dist/config-reference.d.ts +24 -0
- package/dist/config-reference.d.ts.map +1 -0
- package/dist/config-reference.js +580 -0
- package/dist/config-reference.js.map +1 -0
- package/dist/configured-agent.d.ts +104 -0
- package/dist/configured-agent.d.ts.map +1 -0
- package/dist/configured-agent.js +578 -0
- package/dist/configured-agent.js.map +1 -0
- package/dist/consumer-contract.d.ts +36 -0
- package/dist/consumer-contract.d.ts.map +1 -0
- package/dist/consumer-contract.js +290 -0
- package/dist/consumer-contract.js.map +1 -0
- package/dist/doctor.d.ts +17 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +392 -95
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +14 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +23 -7
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +91 -26
- package/dist/init.js.map +1 -1
- package/dist/install-skill.d.ts +1 -1
- package/dist/install-skill.js +2 -2
- package/dist/install-skill.js.map +1 -1
- package/dist/interaction-bridge.d.ts +72 -0
- package/dist/interaction-bridge.d.ts.map +1 -0
- package/dist/interaction-bridge.js +354 -0
- package/dist/interaction-bridge.js.map +1 -0
- 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-command.d.ts +10 -0
- package/dist/memory-command.d.ts.map +1 -0
- package/dist/memory-command.js +649 -0
- package/dist/memory-command.js.map +1 -0
- 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 +147 -0
- package/dist/memory-recall.d.ts.map +1 -0
- package/dist/memory-recall.js +345 -0
- package/dist/memory-recall.js.map +1 -0
- package/dist/memory-rituals.d.ts +8 -11
- package/dist/memory-rituals.d.ts.map +1 -1
- package/dist/memory-rituals.js +26 -25
- package/dist/memory-rituals.js.map +1 -1
- package/dist/metrics.d.ts +13 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +105 -0
- package/dist/metrics.js.map +1 -0
- package/dist/notify-destinations.d.ts +23 -0
- package/dist/notify-destinations.d.ts.map +1 -0
- package/dist/notify-destinations.js +79 -0
- package/dist/notify-destinations.js.map +1 -0
- package/dist/posted-message-index.d.ts +61 -0
- package/dist/posted-message-index.d.ts.map +1 -0
- package/dist/posted-message-index.js +178 -0
- package/dist/posted-message-index.js.map +1 -0
- package/dist/proactive-notify.d.ts +32 -0
- package/dist/proactive-notify.d.ts.map +1 -0
- package/dist/proactive-notify.js +62 -0
- package/dist/proactive-notify.js.map +1 -0
- package/dist/recipes/base.d.ts +15 -0
- package/dist/recipes/base.d.ts.map +1 -0
- package/dist/recipes/base.js +51 -0
- package/dist/recipes/base.js.map +1 -0
- package/dist/recipes/catalog.d.ts +4 -0
- package/dist/recipes/catalog.d.ts.map +1 -0
- package/dist/recipes/catalog.js +509 -0
- package/dist/recipes/catalog.js.map +1 -0
- package/dist/recipes/index.d.ts +11 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +14 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/recipes/types.d.ts +70 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +15 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/request-model-override.d.ts +67 -0
- package/dist/request-model-override.d.ts.map +1 -0
- package/dist/request-model-override.js +96 -0
- package/dist/request-model-override.js.map +1 -0
- package/dist/runs-health.d.ts +22 -0
- package/dist/runs-health.d.ts.map +1 -0
- package/dist/runs-health.js +144 -0
- package/dist/runs-health.js.map +1 -0
- package/dist/seen-conversations.d.ts +22 -0
- package/dist/seen-conversations.d.ts.map +1 -0
- package/dist/seen-conversations.js +120 -0
- package/dist/seen-conversations.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/setup.d.ts +29 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +97 -0
- package/dist/setup.js.map +1 -0
- package/dist/trigger-overrides.d.ts +17 -0
- package/dist/trigger-overrides.d.ts.map +1 -0
- package/dist/trigger-overrides.js +30 -0
- package/dist/trigger-overrides.js.map +1 -0
- package/dist/tui-command.d.ts +56 -0
- package/dist/tui-command.d.ts.map +1 -0
- package/dist/tui-command.js +160 -0
- package/dist/tui-command.js.map +1 -0
- package/dist/ui.d.ts +54 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +157 -0
- package/dist/ui.js.map +1 -0
- package/dist/web-command.d.ts +39 -0
- package/dist/web-command.d.ts.map +1 -0
- package/dist/web-command.js +151 -0
- package/dist/web-command.js.map +1 -0
- package/package.json +22 -17
- package/schema/mono-agent.config.schema.json +1686 -0
- package/skills/mono-agent-composer/SKILL.md +38 -12
- package/skills/mono-agent-composer/agents/openai.yaml +4 -0
- package/skills/mono-agent-composer/references/config-blueprint.md +84 -31
- package/skills/mono-agent-composer/references/discovery-questions.md +49 -36
- package/skills/mono-agent-composer/references/feature-coverage.md +26 -19
- package/skills/mono-agent-composer/references/package-map.md +20 -22
- package/skills/mono-agent-composer/references/playbooks.md +209 -0
- package/skills/mono-agent-composer/references/validation.md +14 -5
package/dist/memory-rituals.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-app memory ritual scheduler for the `bujo` tier.
|
|
3
3
|
*
|
|
4
|
-
* Schedules
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Schedules lightweight `store.consolidate()` on its configured cron cadence
|
|
5
|
+
* (default: every two hours). Uses a hand-rolled minimal cron next-run calculator
|
|
6
|
+
* (5-field `m h dom mon dow`); avoids adding `cron-parser` as a direct dep of
|
|
7
|
+
* this package.
|
|
8
8
|
*
|
|
9
9
|
* Design guarantees:
|
|
10
10
|
* - Only schedules for `store.tier() === "bujo"` (needs the LLM tier).
|
|
11
|
-
* -
|
|
11
|
+
* - Consolidation defaults enabled; set `enabled: false` to opt out.
|
|
12
12
|
* - Skip-overlap: never starts a run while the previous is in flight.
|
|
13
13
|
* - Never-throws: errors are caught and logged via `logger.warn`; the
|
|
14
14
|
* scheduler reschedules after every run (success or failure).
|
|
@@ -21,13 +21,10 @@ export interface MemoryRitualSchedule {
|
|
|
21
21
|
export interface StartMemoryRitualsInput {
|
|
22
22
|
readonly store: {
|
|
23
23
|
tier(): string;
|
|
24
|
-
|
|
25
|
-
migrate(): Promise<unknown>;
|
|
24
|
+
consolidate(): Promise<unknown>;
|
|
26
25
|
};
|
|
27
|
-
/** From config.memory.
|
|
28
|
-
readonly
|
|
29
|
-
/** From config.memory.migration */
|
|
30
|
-
readonly migration?: MemoryRitualSchedule;
|
|
26
|
+
/** From config.memory.consolidation */
|
|
27
|
+
readonly consolidation?: MemoryRitualSchedule;
|
|
31
28
|
readonly logger?: {
|
|
32
29
|
info(m: string): void;
|
|
33
30
|
warn(m: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-rituals.d.ts","sourceRoot":"","sources":["../src/memory-rituals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"memory-rituals.d.ts","sourceRoot":"","sources":["../src/memory-rituals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE;QACd,IAAI,IAAI,MAAM,CAAC;QACf,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;KACjC,CAAC;IACF,uCAAuC;IACvC,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;IACF,kEAAkE;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK;QAAE,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAC3E,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,IAAI,CAAC;CACd;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,cAAc,CA+FjF"}
|
package/dist/memory-rituals.js
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-app memory ritual scheduler for the `bujo` tier.
|
|
3
3
|
*
|
|
4
|
-
* Schedules
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Schedules lightweight `store.consolidate()` on its configured cron cadence
|
|
5
|
+
* (default: every two hours). Uses a hand-rolled minimal cron next-run calculator
|
|
6
|
+
* (5-field `m h dom mon dow`); avoids adding `cron-parser` as a direct dep of
|
|
7
|
+
* this package.
|
|
8
8
|
*
|
|
9
9
|
* Design guarantees:
|
|
10
10
|
* - Only schedules for `store.tier() === "bujo"` (needs the LLM tier).
|
|
11
|
-
* -
|
|
11
|
+
* - Consolidation defaults enabled; set `enabled: false` to opt out.
|
|
12
12
|
* - Skip-overlap: never starts a run while the previous is in flight.
|
|
13
13
|
* - Never-throws: errors are caught and logged via `logger.warn`; the
|
|
14
14
|
* scheduler reschedules after every run (success or failure).
|
|
15
15
|
* - Injectable `now` / `setTimer` / `clearTimer` for deterministic testing.
|
|
16
16
|
*/
|
|
17
|
-
const
|
|
18
|
-
|
|
17
|
+
const DEFAULT_CONSOLIDATION_CRON = "0 */2 * * *";
|
|
18
|
+
// Node's setTimeout stores the delay in a 32-bit signed int; anything larger
|
|
19
|
+
// silently fires after 1ms (with a TimeoutOverflowWarning). A very sparse custom
|
|
20
|
+
// consolidation cron can be >24.8 days out, so the raw cron delay must be capped
|
|
21
|
+
// and re-armed instead of busy-looping every ~1ms until its target date arrives.
|
|
22
|
+
const MAX_TIMEOUT_MS = 2_147_483_647;
|
|
19
23
|
// ---------------------------------------------------------------------------
|
|
20
24
|
// Public entry point
|
|
21
25
|
// ---------------------------------------------------------------------------
|
|
@@ -30,7 +34,7 @@ export function startMemoryRituals(input) {
|
|
|
30
34
|
const clearTimer = input.clearTimer ?? ((h) => clearTimeout(h));
|
|
31
35
|
const handles = [];
|
|
32
36
|
let stopped = false;
|
|
33
|
-
function
|
|
37
|
+
function scheduleConsolidation(cronExpr) {
|
|
34
38
|
let inFlight = false;
|
|
35
39
|
let currentHandle;
|
|
36
40
|
function schedule() {
|
|
@@ -43,7 +47,7 @@ export function startMemoryRituals(input) {
|
|
|
43
47
|
delayMs = nextCronDelayMs(cronExpr, current);
|
|
44
48
|
}
|
|
45
49
|
catch (err) {
|
|
46
|
-
logger?.warn(`Memory
|
|
50
|
+
logger?.warn(`Memory consolidation has an invalid cron expression "${cronExpr}": ${err instanceof Error ? err.message : String(err)}. Consolidation disabled.`);
|
|
47
51
|
return;
|
|
48
52
|
}
|
|
49
53
|
const handle = setTimer(() => {
|
|
@@ -56,22 +60,26 @@ export function startMemoryRituals(input) {
|
|
|
56
60
|
if (stopped) {
|
|
57
61
|
return;
|
|
58
62
|
}
|
|
63
|
+
if (delayMs > MAX_TIMEOUT_MS) {
|
|
64
|
+
// The timer was capped below the real target — consolidation isn't due
|
|
65
|
+
// yet. Re-arm for the remaining time instead of running it.
|
|
66
|
+
schedule();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
schedule();
|
|
59
70
|
if (inFlight) {
|
|
60
|
-
|
|
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.`);
|
|
71
|
+
logger?.warn("Memory consolidation skipped — previous run is still in flight.");
|
|
63
72
|
return;
|
|
64
73
|
}
|
|
65
74
|
inFlight = true;
|
|
66
|
-
|
|
75
|
+
store.consolidate()
|
|
67
76
|
.catch((err) => {
|
|
68
|
-
logger?.warn(`Memory
|
|
77
|
+
logger?.warn(`Memory consolidation failed: ${err instanceof Error ? err.message : String(err)}.`);
|
|
69
78
|
})
|
|
70
79
|
.finally(() => {
|
|
71
80
|
inFlight = false;
|
|
72
|
-
schedule();
|
|
73
81
|
});
|
|
74
|
-
}, delayMs);
|
|
82
|
+
}, Math.min(delayMs, MAX_TIMEOUT_MS));
|
|
75
83
|
handle.unref?.();
|
|
76
84
|
currentHandle = handle;
|
|
77
85
|
handles.push(handle);
|
|
@@ -79,15 +87,8 @@ export function startMemoryRituals(input) {
|
|
|
79
87
|
schedule();
|
|
80
88
|
void currentHandle; // suppress unused-variable lint; reference is in handles
|
|
81
89
|
}
|
|
82
|
-
|
|
83
|
-
|
|
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());
|
|
90
|
+
if (input.consolidation?.enabled !== false) {
|
|
91
|
+
scheduleConsolidation(input.consolidation?.cron ?? DEFAULT_CONSOLIDATION_CRON);
|
|
91
92
|
}
|
|
92
93
|
return {
|
|
93
94
|
stop() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-rituals.js","sourceRoot":"","sources":["../src/memory-rituals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,
|
|
1
|
+
{"version":3,"file":"memory-rituals.js","sourceRoot":"","sources":["../src/memory-rituals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RecordedRunMetricGroupBy, RecordedRunMetricsReport } from "@mono-agent/observability";
|
|
2
|
+
export interface RunMetricsArgs {
|
|
3
|
+
readonly configPath?: string;
|
|
4
|
+
readonly artifactDir?: string;
|
|
5
|
+
readonly since?: string;
|
|
6
|
+
readonly until?: string;
|
|
7
|
+
readonly groupBy?: RecordedRunMetricGroupBy;
|
|
8
|
+
readonly json?: boolean;
|
|
9
|
+
readonly includeMemory?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function runMetrics(args: RunMetricsArgs): Promise<number>;
|
|
12
|
+
export declare function renderMetricsReport(report: RecordedRunMetricsReport): string;
|
|
13
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAA4B,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAK9H,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BtE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CA8B5E"}
|
package/dist/metrics.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import process from "node:process";
|
|
3
|
+
import { summarizeRecordedRunMetrics } from "@mono-agent/observability";
|
|
4
|
+
import { resolveAppArtifactDir } from "./app-config.js";
|
|
5
|
+
export async function runMetrics(args) {
|
|
6
|
+
const cwd = process.cwd();
|
|
7
|
+
const input = {
|
|
8
|
+
env: process.env,
|
|
9
|
+
cwd,
|
|
10
|
+
configPath: resolve(cwd, args.configPath ?? "mono-agent.config.json"),
|
|
11
|
+
};
|
|
12
|
+
let report;
|
|
13
|
+
try {
|
|
14
|
+
const artifactDir = args.artifactDir === undefined
|
|
15
|
+
? await resolveAppArtifactDir(input)
|
|
16
|
+
: resolve(cwd, args.artifactDir);
|
|
17
|
+
report = await summarizeRecordedRunMetrics({
|
|
18
|
+
artifactDir,
|
|
19
|
+
...(args.since === undefined ? {} : { since: args.since }),
|
|
20
|
+
...(args.until === undefined ? {} : { until: args.until }),
|
|
21
|
+
...(args.groupBy === undefined ? {} : { groupBy: args.groupBy }),
|
|
22
|
+
scope: args.includeMemory === true ? "all" : "agent",
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
27
|
+
return 1;
|
|
28
|
+
}
|
|
29
|
+
process.stdout.write(args.json === true ? `${JSON.stringify(report, null, 2)}\n` : renderMetricsReport(report));
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
export function renderMetricsReport(report) {
|
|
33
|
+
let out = `Artifact metrics: ${report.artifactDir}\n`;
|
|
34
|
+
out += `Summary files: ${report.totalSummaryFiles} (${report.parsedSummaryFiles} parsed, ${report.parseFailureCount} parse failed)\n`;
|
|
35
|
+
if (report.since !== undefined || report.until !== undefined) {
|
|
36
|
+
out += `Window: ${report.since ?? "-inf"} to ${report.until ?? "+inf"}\n`;
|
|
37
|
+
}
|
|
38
|
+
out += renderBucket(report.overall);
|
|
39
|
+
if (report.groups.length > 0 && report.groupBy !== undefined) {
|
|
40
|
+
out += `\nGroups by ${report.groupBy}\n`;
|
|
41
|
+
for (const group of report.groups) {
|
|
42
|
+
out += ` ${group.key}: ${group.totalRuns} run${group.totalRuns === 1 ? "" : "s"}`;
|
|
43
|
+
out += `, failed ${group.statusCounts.failed} (${formatPercent(group.statusRates.failed)})`;
|
|
44
|
+
out += `, p90 ${formatDuration(group.durationMs.p90)}`;
|
|
45
|
+
out += `, cost ${formatUsd(group.cost.totalUsd)}\n`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (report.parseFailures.length > 0) {
|
|
49
|
+
out += "\nParse failures\n";
|
|
50
|
+
for (const issue of report.parseFailures) {
|
|
51
|
+
const value = issue.value === undefined ? "" : ` (${issue.value})`;
|
|
52
|
+
out += ` ${issue.fileName}: ${issue.reason}${value}\n`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (report.warnings.length > 0) {
|
|
56
|
+
out += "\nWarnings\n";
|
|
57
|
+
for (const warning of report.warnings) {
|
|
58
|
+
out += ` ${warning}\n`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
function renderBucket(bucket) {
|
|
64
|
+
let out = `Total runs: ${bucket.totalRuns}\n`;
|
|
65
|
+
out += "\nStatuses\n";
|
|
66
|
+
for (const [status, count] of Object.entries(bucket.statusCounts)) {
|
|
67
|
+
out += ` ${status}: ${count} (${formatPercent(bucket.statusRates[status])})\n`;
|
|
68
|
+
}
|
|
69
|
+
out += "\nDuration\n";
|
|
70
|
+
out += ` samples: ${bucket.durationMs.count}\n`;
|
|
71
|
+
out += ` p50: ${formatDuration(bucket.durationMs.p50)}\n`;
|
|
72
|
+
out += ` p90: ${formatDuration(bucket.durationMs.p90)}\n`;
|
|
73
|
+
out += ` p99: ${formatDuration(bucket.durationMs.p99)}\n`;
|
|
74
|
+
out += ` max: ${formatDuration(bucket.durationMs.max)}\n`;
|
|
75
|
+
out += "\nCost\n";
|
|
76
|
+
out += ` total: ${formatUsd(bucket.cost.totalUsd)}\n`;
|
|
77
|
+
out += ` average/run: ${formatUsd(bucket.cost.averageUsdPerRun)}\n`;
|
|
78
|
+
out += ` runs with cost: ${bucket.cost.runsWithCost}\n`;
|
|
79
|
+
out += "\nFailure kinds\n";
|
|
80
|
+
if (bucket.failureKindRates.length === 0) {
|
|
81
|
+
out += " none\n";
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
for (const failureKind of bucket.failureKindRates) {
|
|
85
|
+
out += ` ${failureKind.failureKind}: ${failureKind.count} (${formatPercent(failureKind.rate)})\n`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
function formatPercent(rate) {
|
|
91
|
+
const fixed = (rate * 100).toFixed(1);
|
|
92
|
+
return `${fixed.replace(/\.0$/u, "")}%`;
|
|
93
|
+
}
|
|
94
|
+
function formatDuration(value) {
|
|
95
|
+
return value === null ? "n/a" : `${formatNumber(value)} ms`;
|
|
96
|
+
}
|
|
97
|
+
function formatUsd(value) {
|
|
98
|
+
return `$${formatNumber(value, 6)}`;
|
|
99
|
+
}
|
|
100
|
+
function formatNumber(value, maxFractionDigits = 3) {
|
|
101
|
+
return new Intl.NumberFormat("en-US", {
|
|
102
|
+
maximumFractionDigits: maxFractionDigits,
|
|
103
|
+
}).format(value);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAGxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAaxD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAoB;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,KAAK,GAA4B;QACrC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG;QACH,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,IAAI,wBAAwB,CAAC;KACtE,CAAC;IAEF,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,SAAS;YAChD,CAAC,CAAC,MAAM,qBAAqB,CAAC,KAAK,CAAC;YACpC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,GAAG,MAAM,2BAA2B,CAAC;YACzC,WAAW;YACX,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAChE,KAAK,EAAE,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;SACrD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IAChH,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAgC;IAClE,IAAI,GAAG,GAAG,qBAAqB,MAAM,CAAC,WAAW,IAAI,CAAC;IACtD,GAAG,IAAI,kBAAkB,MAAM,CAAC,iBAAiB,KAAK,MAAM,CAAC,kBAAkB,YAAY,MAAM,CAAC,iBAAiB,kBAAkB,CAAC;IACtI,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7D,GAAG,IAAI,WAAW,MAAM,CAAC,KAAK,IAAI,MAAM,OAAO,MAAM,CAAC,KAAK,IAAI,MAAM,IAAI,CAAC;IAC5E,CAAC;IACD,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7D,GAAG,IAAI,eAAe,MAAM,CAAC,OAAO,IAAI,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,GAAG,IAAI,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACnF,GAAG,IAAI,YAAY,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;YAC5F,GAAG,IAAI,SAAS,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,GAAG,IAAI,UAAU,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtD,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,GAAG,IAAI,oBAAoB,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC;YACnE,GAAG,IAAI,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,GAAG,KAAK,IAAI,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,GAAG,IAAI,cAAc,CAAC;QACtB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,GAAG,IAAI,KAAK,OAAO,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,MAAgC;IACpD,IAAI,GAAG,GAAG,eAAe,MAAM,CAAC,SAAS,IAAI,CAAC;IAC9C,GAAG,IAAI,cAAc,CAAC;IACtB,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAClE,GAAG,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,MAAyC,CAAC,CAAC,KAAK,CAAC;IACrH,CAAC;IACD,GAAG,IAAI,cAAc,CAAC;IACtB,GAAG,IAAI,cAAc,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IACjD,GAAG,IAAI,UAAU,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3D,GAAG,IAAI,UAAU,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3D,GAAG,IAAI,UAAU,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3D,GAAG,IAAI,UAAU,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3D,GAAG,IAAI,UAAU,CAAC;IAClB,GAAG,IAAI,YAAY,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACvD,GAAG,IAAI,kBAAkB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;IACrE,GAAG,IAAI,qBAAqB,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC;IACzD,GAAG,IAAI,mBAAmB,CAAC;IAC3B,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,GAAG,IAAI,UAAU,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAClD,GAAG,IAAI,KAAK,WAAW,CAAC,WAAW,KAAK,WAAW,CAAC,KAAK,KAAK,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QACrG,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,KAAoB;IAC1C,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;AAC9D,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,iBAAiB,GAAG,CAAC;IACxD,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;QACpC,qBAAqB,EAAE,iBAAiB;KACzC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { NotifyDestination } from "@mono-agent/agent-contracts";
|
|
2
|
+
import type { MonoAgentAppConfigInput } from "./app-config.js";
|
|
3
|
+
import type { ChannelId, MonoAgentAppLogger } from "./channels.js";
|
|
4
|
+
export type { NotifyDestination } from "@mono-agent/agent-contracts";
|
|
5
|
+
export interface ResolveNotifyDestinationsInput {
|
|
6
|
+
readonly input: MonoAgentAppConfigInput;
|
|
7
|
+
readonly artifactDir: string;
|
|
8
|
+
/** Whether a given channel is currently running (only running channels can deliver). */
|
|
9
|
+
readonly isRunning: (id: ChannelId) => boolean;
|
|
10
|
+
readonly logger?: MonoAgentAppLogger | undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The conversations a native cron/webhook notification may be delivered to, used by
|
|
14
|
+
* the app to infer a destination when a job/endpoint sets no explicit
|
|
15
|
+
* `notifyConversationId`. Combines two id-free sources so the operator never types a conversationId:
|
|
16
|
+
* - conversations the agent has actually handled (run-artifact summaries), filtered to
|
|
17
|
+
* notify-capable + running channels, newest-first;
|
|
18
|
+
* - the adapter allowlist entries (when not allow-all), surfaced as candidates the agent
|
|
19
|
+
* can reach even before it has conversed there (covers a fresh single-user agent).
|
|
20
|
+
* WhatsApp is excluded (no notify hook yet) so the agent never picks an undeliverable id.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveNotifyDestinations(opts: ResolveNotifyDestinationsInput): Promise<readonly NotifyDestination[]>;
|
|
23
|
+
//# sourceMappingURL=notify-destinations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-destinations.d.ts","sourceRoot":"","sources":["../src/notify-destinations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAKnE,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAiBrE,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAClD;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CA6BvC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { listSeenNotifyDestinations } from "./seen-conversations.js";
|
|
2
|
+
let slackModule;
|
|
3
|
+
let telegramModule;
|
|
4
|
+
const loadSlackModule = async () => (slackModule ??= await import("@mono-agent/slack-adapter"));
|
|
5
|
+
const loadTelegramModule = async () => (telegramModule ??= await import("@mono-agent/telegram-adapter"));
|
|
6
|
+
/** Channels whose conversations can receive a proactive notification turn. */
|
|
7
|
+
const NOTIFY_CAPABLE = new Set(["telegram", "slack"]);
|
|
8
|
+
/**
|
|
9
|
+
* The conversations a native cron/webhook notification may be delivered to, used by
|
|
10
|
+
* the app to infer a destination when a job/endpoint sets no explicit
|
|
11
|
+
* `notifyConversationId`. Combines two id-free sources so the operator never types a conversationId:
|
|
12
|
+
* - conversations the agent has actually handled (run-artifact summaries), filtered to
|
|
13
|
+
* notify-capable + running channels, newest-first;
|
|
14
|
+
* - the adapter allowlist entries (when not allow-all), surfaced as candidates the agent
|
|
15
|
+
* can reach even before it has conversed there (covers a fresh single-user agent).
|
|
16
|
+
* WhatsApp is excluded (no notify hook yet) so the agent never picks an undeliverable id.
|
|
17
|
+
*/
|
|
18
|
+
export async function resolveNotifyDestinations(opts) {
|
|
19
|
+
const out = [];
|
|
20
|
+
const present = new Set();
|
|
21
|
+
const seen = await listSeenNotifyDestinations(opts.artifactDir);
|
|
22
|
+
for (const sighting of seen) {
|
|
23
|
+
if (!NOTIFY_CAPABLE.has(sighting.channelId) || !opts.isRunning(sighting.channelId)) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
out.push({
|
|
27
|
+
conversationId: sighting.conversationId,
|
|
28
|
+
channelId: sighting.channelId,
|
|
29
|
+
...(sighting.lastSeen === undefined ? {} : { lastSeen: sighting.lastSeen }),
|
|
30
|
+
});
|
|
31
|
+
present.add(sighting.conversationId);
|
|
32
|
+
}
|
|
33
|
+
if (opts.isRunning("telegram")) {
|
|
34
|
+
for (const chatId of await telegramAllowlist(opts)) {
|
|
35
|
+
addAllowlisted(out, present, `telegram:${chatId}`, "telegram");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (opts.isRunning("slack")) {
|
|
39
|
+
for (const channelId of await slackAllowlist(opts)) {
|
|
40
|
+
addAllowlisted(out, present, `slack:${channelId}`, "slack");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
function addAllowlisted(out, present, conversationId, channelId) {
|
|
46
|
+
if (present.has(conversationId)) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
present.add(conversationId);
|
|
50
|
+
out.push({ conversationId, channelId, fromAllowlist: true });
|
|
51
|
+
}
|
|
52
|
+
/** Allowlisted Telegram chat ids (empty when allow-all, disabled, or unavailable — no enumerable candidate). */
|
|
53
|
+
async function telegramAllowlist(opts) {
|
|
54
|
+
try {
|
|
55
|
+
const adapter = await loadTelegramModule();
|
|
56
|
+
const config = await adapter.loadTelegramAdapterConfig({ env: opts.input.env, jsonPath: opts.input.configPath });
|
|
57
|
+
return config.enabled && !config.allowAllChats ? config.allowedChatIds : [];
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
opts.logger?.warn?.("notify destinations: telegram allowlist unavailable.", { reason: reasonOf(error) });
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Allowlisted Slack channel ids (empty when allow-all, disabled, or unavailable). */
|
|
65
|
+
async function slackAllowlist(opts) {
|
|
66
|
+
try {
|
|
67
|
+
const adapter = await loadSlackModule();
|
|
68
|
+
const config = await adapter.loadSlackAdapterConfig({ env: opts.input.env, jsonPath: opts.input.configPath });
|
|
69
|
+
return config.enabled && !config.allowAllChannels ? config.allowedChannelIds : [];
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
opts.logger?.warn?.("notify destinations: slack allowlist unavailable.", { reason: reasonOf(error) });
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function reasonOf(error) {
|
|
77
|
+
return error instanceof Error ? error.message : String(error);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=notify-destinations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-destinations.js","sourceRoot":"","sources":["../src/notify-destinations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps a message the agent POSTED (`channelId` + Slack `ts`) back to the
|
|
3
|
+
* conversation that produced it, so a later in-thread reply can be resolved to
|
|
4
|
+
* that conversation and continue its history/session.
|
|
5
|
+
*
|
|
6
|
+
* Why this exists: a scheduled/proactive post (e.g. a daily digest) runs under a
|
|
7
|
+
* synthetic conversationId (e.g. `scheduled-scan`) and posts via
|
|
8
|
+
* `slack_send_message`, which registers no `slack:` conversation. When the user
|
|
9
|
+
* replies, the Slack adapter derives `slack:<channel>:<posted-ts>` — an id with no
|
|
10
|
+
* history. This index closes that gap: the producer records `(channel, ts) →
|
|
11
|
+
* producing conversationId`; the consumer (inbound dispatch) looks it up and
|
|
12
|
+
* aliases the reply onto the producing conversation.
|
|
13
|
+
*
|
|
14
|
+
* Storage is an append-only JSONL file inside the run-artifact dir. Append-only
|
|
15
|
+
* keeps cross-process writes safe: the `slack_send_message` child process and the
|
|
16
|
+
* adapter both only ever append (small `O_APPEND` writes are atomic), and only the
|
|
17
|
+
* single adapter process compacts. A `.jsonl` file is ignored by the
|
|
18
|
+
* `.summary.json` artifact scanners (see `seen-conversations.ts`), so it never
|
|
19
|
+
* collides with run-artifact tooling.
|
|
20
|
+
*/
|
|
21
|
+
export declare const POSTED_MESSAGE_INDEX_FILENAME = "posted-message-index.jsonl";
|
|
22
|
+
export interface PostedMessageEntry {
|
|
23
|
+
/** Slack channel/DM id the message was posted to. */
|
|
24
|
+
readonly channelId: string;
|
|
25
|
+
/** Slack message timestamp returned by `chat.postMessage`. */
|
|
26
|
+
readonly ts: string;
|
|
27
|
+
/** Producing conversationId, de-bucketed to its base form. */
|
|
28
|
+
readonly conversationId: string;
|
|
29
|
+
/** ISO timestamp of when the entry was written. */
|
|
30
|
+
readonly writtenAt: string;
|
|
31
|
+
}
|
|
32
|
+
/** The single index-file path both producer and consumer agree on. */
|
|
33
|
+
export declare function resolvePostedMessageIndexPath(artifactDir: string): string;
|
|
34
|
+
/** Strip a trailing daily-rollover bucket so the stored id is the base producing id. */
|
|
35
|
+
export declare function basePostedConversationId(conversationId: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Record that `conversationId` posted a message at `(channelId, ts)`. Best-effort:
|
|
38
|
+
* a failed index write must never fail the Slack post, so callers should not await
|
|
39
|
+
* this in a way that surfaces its errors — it swallows them. The stored
|
|
40
|
+
* conversationId is de-bucketed so the consumer can let the responder re-bucket to
|
|
41
|
+
* the reply's own day (consistent with daily session rollover).
|
|
42
|
+
*/
|
|
43
|
+
export declare function appendPostedMessage(indexPath: string, entry: {
|
|
44
|
+
channelId: string;
|
|
45
|
+
ts: string;
|
|
46
|
+
conversationId: string;
|
|
47
|
+
}, now?: () => Date): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Resolve the producing conversationId for a posted message, newest write wins.
|
|
50
|
+
* Returns `undefined` when the file is missing or has no matching entry, so the
|
|
51
|
+
* caller falls back to the default (a fresh `slack:` conversation) — no regression.
|
|
52
|
+
*/
|
|
53
|
+
export declare function lookupProducingConversation(indexPath: string, channelId: string, ts: string): Promise<string | undefined>;
|
|
54
|
+
/**
|
|
55
|
+
* Bound file growth by rewriting the index with only the newest `maxEntries`
|
|
56
|
+
* (by write time, de-duped to the newest entry per `channel+ts`). Consumer-only —
|
|
57
|
+
* a single process compacts, via temp-file + rename so a concurrent append is
|
|
58
|
+
* never interleaved with a partial rewrite. Best-effort.
|
|
59
|
+
*/
|
|
60
|
+
export declare function compactPostedMessageIndex(indexPath: string, maxEntries?: number): Promise<void>;
|
|
61
|
+
//# sourceMappingURL=posted-message-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posted-message-index.d.ts","sourceRoot":"","sources":["../src/posted-message-index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AAO1E,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,sEAAsE;AACtE,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wFAAwF;AACxF,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EAChE,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB7B;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,MAAoC,GAC/C,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|